Weblateでtextlintと連携し翻訳文のチェックを行う独自チェックです。
JTF日本語標準スタイルガイド(翻訳用)ルールセットおよび技術文書向けのtextlintルールプリセットを用いた翻訳文のチェックを行います。
(★=本リポジトリで実装しているコンポーネント)
flowchart RL
subgraph Weblate
direction TB
save@{ shape: hex, label: "①翻訳文保存など" }
--> check@{ shape: subproc, label: "②独自チェック\ntextlint_check ★" }
end
subgraph textlint_server ["textlintサーバー"]
direction BT
rc@{ shape: docs, label: "言語ごと設定ファイル\n(.textlintrc)" } --> textlint
subgraph Node.js
server@{ shape: subproc, label: "server.js★"} --④翻訳文、.textlintrcパス--> textlint
textlint -- ⑤チェック結果 --> server
end
end
Weblate -- ③翻訳文、言語コード --> textlint_server
textlint_server -- ⑥チェック結果 --> Weblate
Weblateの独自チェックとtextlintは、WeblateサーバーとNode.js(Express.js)間のHTTP通信で連携します。textlintはコマンドラインではなくNode.js内で直接実行されます。
- PaaS、SaaS上で動作するWeblateサーバーでの使用実績はありません。ご利用は自己責任でお願いいたします。
もし使用上の問題点や改善案がありましたら、Issuesから報告いただければ幸いです。 - 自己ホスト型でない場合などWeblateの利用形態によっては、本チェックを利用できない場合があります。
- 翻訳文ごとにチェックするため、コンポーネント内の翻訳文をまたいだチェック(「ですます調」、「である調」の統一チェックなど)には対応していません。
Dockerおよびcomposeを行うための環境を準備します。以下の環境でのみ動作確認を行っています。
- Podman Desktop 1.24.2 + Compose extension
- Podman 5.7.1(Podman Desktopに同梱)
- Weblate 5.15.2(Dockerfileでバージョンを指定したイメージを取得)
下記コマンドで本リポジトリの内容をチェックアウトします。
$ git clone http://github.com/h1data/weblate-check-textlintフォルダー構成を以下に示します。
root\
├─ textlint-server\ Node.jsコンテナ構成用フォルダー
│ ├─ textlint\
│ │ └─ ja\ 言語別設定フォルダー
│ │ └─ .textlintrc textlintチェックルール設定ファイル
│ ├─ Dockerfile Node.jsコンテナ構成ファイル
│ ├─ package.json 依存するJavaScriptライブラリを記載
│ └─ server.js サーバープログラム
├─ weblate\ Weblateコンテナ構成用フォルダー
│ ├─ customize\ 独自チェック用ソースフォルダー
│ │ └─ textlint\ (Weblateの/app/data/python/customizeに格納)
│ │ ├─ textlint_check.py 独自チェッククラス
│ │ └─ textlint_client.py textlintクライアントクラス
│ ├─ Dockerfile Weblateコンテナ構成ファイル
│ └─ settings-override.py 追加設定ファイル(追加チェッククラスを指定)
├─ docker-compose.yml コンテナ群構成ファイル
└─ environment 環境設定定義ファイル
コンテナ間で共有する環境変数を設定します。 本リポジトリでは、Docker compose for Weblateのenvironmentファイルに対し下記設定を追加しています。
# TextLint Server for Custom Check Setup
TEXTLINT_HOST=textlint
TEXTLINT_PORT=4000
TEXTLINT_PATH=/lint
TEXTLINT_LANGS=ja
TEXTLINTRC_PATH=/app/textlintTEXTLINT_HOST: textlintサーバーのホスト名を指定します。(既定値: textlint)
基本的にdocker-compose.ymlで指定するtextlintサーバーのサービス名になります。TEXTLINT_PORT: textlintサーバーのポート番号を指定します。(既定値: 3000)TEXTLINT_PATH: textlintサーバーのURLパスを指定します。(既定値: /lint)TEXTLINT_LANGS: チェック対象の言語コードをカンマ区切りで指定します。(既定値: ja)TEXTLINTRC_PATH: textlint用設定ファイルの格納パスです。(既定値: /app/textlint)
docker-compose.ymlのtextlintサービスで定義されているボリュームのtargetで指定したパスに合わせる必要があります。
textlint:
build:
context: ./textlint-server
dockerfile: Dockerfile
volumes:
- type: bind
source: ./textlint-server/textlint
target: /app/textlint # ←このパスに合わせるtextlint用の設定ファイルです。もし日本語以外のチェックを追加する場合は、textlint-server\textlint\(言語コード)\.textlintrcと言語ごとの設定ファイルを用意し、environmentファイルのTEXTLINT_LANGSに言語コードを追加します。(例: TEXTLINT_LANGS=ja,chz)
チェックルールを変更する場合、JTF日本語標準スタイルガイド(翻訳用)や技術文書向けのtextlintルールプリセットのルールの設定方法を参考に本ファイルを変更します。
本リポジトリの.textlintrcでは、Weblate標準の終止符の不一致チェックと内容が重複、あるいは競合する場合があるため以下のチェックを無効化しています。
- 技術文書向けのtextlintルールプリセット:文末の句点記号として「。」を使います (ja-no-mixed-period)
- 技術文書向けのtextlintルールプリセット:感嘆符!!、疑問符??を使用しない (no-exclamation-question-mark)
Note
本設定ファイルはtextlintサーバー(コンテナ)からホストのtextlint-server\textlint\ フォルダーの内容を直接参照します。
ホスト側の設定ファイルを変更した場合、次回のチェックから反映されます。
ルールセットを追加する場合は、textlint-server\package.jsonの更新とコンテナの再ビルドが必要です。
Docker compose for Weblateのdocker-compose.ymlを元に、単一のWeblate、textlintサーバーが同一ネットワーク上で動作するよう構成しています。 他の設定ファイルに合わせた記載となっていますが、内容を変更する場合にはWeblateドキュメントのDocker を使用したインストールを参照してください。
Docker を使用したインストールを参考にdocker-compose.ymlと同じフォルダーに作成し、環境や利用形態に応じてWeblateサービスのportsやWEBLATE_ADMIN_PASSWORDなどの設定を指定してください。
docker-compose.ymlがあるフォルダーで下記コマンドを実行し、コンテナ群を構成、起動します。
$ docker compose up --build -d起動完了後、http://localhost:(docker-compose.override.ymlで指定したポート)でWeblateの画面にアクセスできます。
textlintによるチェックを行いたいWeblateのプロジェクトもしくはコンポーネントに翻訳フラグcheck-textlintを設定してください。
Note
設定済みの翻訳フラグがある場合は、カンマつなぎで追加します。例:check-glossary,check-textlint
Tip
独自チェックの有効化やチェックルール変更後に既存の翻訳をすべて再チェックする場合は、Weblateコンテナ内のコンソールで下記コマンドを実行します。
$ weblate updatechecks --all環境変数で指定したホスト名、ポート番号、およびパスを元にしたURL(本リポジトリの既定ではhttp://textlint:3000/lint)で受け付けます。
POST方式でHTTPリクエストボディに翻訳文と言語コードをjsonで指定します。
{ text: "翻訳文を設定することができます。", lang: "ja" }
レスポンスボディにtextlintの結果がJSON形式で設定されます。
{
"messages":
[
{
"type":"lint",
"ruleId":"ja-technical-writing/ja-no-redundant-expression",
"message":"【dict2】 \"することができます\"は冗長な表現です。\"することが\"を省き簡潔な表現にすると文章が明瞭になります。\n解説: https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression#dict2",
"index":6,
"line":1,
"column":7,
"range":[6,7],
"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8}},
"severity":2,
"fix":{"range":[6,15],"text":"できます"}
},
...
],
"filePath":"input.md"
}チェックエラーを検出した場合、独自チェックはチェック応答内容からmessageとruleIdをエラー内容の表示に使用します。
【dict2】 "することができます"は冗長な表現です。"することが"を省き簡潔な表現にすると文章が明瞭になります。
解説: https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression#dict2 (ja-technical-writing/ja-no-redundant-expression)
実行時エラーが発生した場合はHTTP 500を返し、エラー内容をtextlintサーバーの標準出力に出力します。

