NAME
App::Greple::xlate - greple のための翻訳サポートモジュール
SYNOPSIS
greple -Mxlate --xlate-engine gpt5 --xlate pattern target-file
greple -Mxlate --xlate-engine deepl --xlate pattern target-file
VERSION
Version 2.00
DESCRIPTION
Greple xlate モジュールは目的のテキストブロックを見つけ、それらを翻訳されたテキストに置き換えます。主要なエンジンは GPT-5.5(llm/gpt5.pm)で、llm コマンドを呼び出します。DeepL(deepl.pm)および従来の gpty ベースのエンジンも含まれています。
翻訳はファイルごとにキャッシュされるため、変更されていないテキストについてはコマンドを再実行してもコストはかかりません。文書が編集された場合、変更された段落だけが再度 API に送信されます。コンテキスト対応エンジンには、周囲の翻訳、変更箇所の周辺の生のソーステキスト、および編集された段落の以前のバージョンも渡されるため、新しい翻訳は確立済みの言い回しを維持します(--xlate-context-window を参照)。機密文字列は送信前に隠蔽できます("ANONYMIZATION AND TEMPLATES" を参照)。
Perlのpodスタイルで書かれた文書内の通常のテキストブロックを翻訳したい場合は、次のように greple コマンドを --xlate-engine gpt5 および perl モジュールとともに使用してください。
greple -Mxlate --xlate-engine gpt5 -Mperl --pod --re '^([\w\pP].*\n)+' --all foo.pm
このコマンドにおいて、パターン文字列 ^([\w\pP].*\n)+ は英数字および句読記号で始まる連続行を意味します。このコマンドは翻訳対象の領域をハイライト表示します。オプション --all は全文を出力するために使用します。
続いて選択領域を翻訳するために --xlate オプションを追加します。すると、所望のセクションを見つけて翻訳エンジンの出力で置き換えます。
デフォルトでは、原文と訳文は git(1) と互換性のある「コンフリクトマーカー」形式で出力されます。ifdef 形式を使うと、unifdef(1) コマンドで必要な部分だけを簡単に取得できます。出力形式は --xlate-format オプションで指定できます。
全文を翻訳したい場合は、--match-all オプションを使用します。これは、全文にマッチするパターン (?s).+ を指定するショートカットです。
コンフリクトマーカー形式のデータは、sdif コマンドに -V オプションを付けてサイドバイサイド表示することができます。文字列単位で比較しても意味がないため、--no-cdif オプションを推奨します。文字の色付けが不要な場合は、--no-textcolor(または --no-tc)を指定してください。
sdif -V --no-filename --no-tc --no-cdif data_shishin.deepl-EN-US.cm
NORMALIZATION
処理は指定した単位で行われますが、空でない複数行の連続したテキストの場合は、まとめて 1 行に変換されます。この操作は次のように行われます:
各行の先頭と末尾の空白を削除します。
行が全角の句読点で終わる場合は、次の行と連結します。
行が全角文字で終わり、次の行が全角文字で始まる場合は、行を連結します。
行末または行頭のいずれかが全角文字でない場合は、スペース文字を挿入して連結します。
キャッシュデータは正規化後のテキストに基づいて管理されるため、正規化結果に影響しない変更が行われても、キャッシュされた翻訳データは引き続き有効です。
この正規化処理は最初(0 番目)および偶数番目のパターンに対してのみ行われます。したがって、次のように 2 つのパターンが指定された場合、最初のパターンに一致するテキストは正規化後に処理され、2 番目のパターンに一致するテキストには正規化処理は行われません。
greple -Mxlate -E normalized -E not-normalized
したがって、複数行を 1 行にまとめて処理するテキストには最初のパターンを使用し、整形済みテキストには 2 番目のパターンを使用してください。最初のパターンに一致するテキストがない場合は、(?!) のような何にも一致しないパターンを使用します。
MASKING
ときどき、翻訳したくないテキストの一部があります。たとえば、Markdown ファイル内のタグなどです。DeepL は、そのような場合には除外したいテキスト部分を XML タグに変換してから翻訳し、翻訳完了後に元に戻すことを推奨しています。これをサポートするため、翻訳からマスクする部分を指定できます。
--xlate-setopt maskfile=MASKPATTERN
これは、ファイルの各行をMASKPATTERNとして正規表現として解釈し、それにマッチする文字列を翻訳して処理後に元に戻します。#で始まる行は無視されます。
複雑なパターンは、バックスラッシュで改行をエスケープして複数行に記述できます。
マスキングによってテキストがどのように変換されるかは、--xlate-mask オプションで確認できます。
マスキングはマークアップが翻訳されないように保護します。翻訳サービス自体から機密文字列を隠蔽するには、"ANONYMIZATION AND TEMPLATES"を参照してください。両方を併用できます。
このインターフェイスは実験的で、将来変更される可能性があります。
ANONYMIZATION AND TEMPLATES
機密性の高い文字列は、翻訳 API に送信される前に隠蔽し、出力で復元できます。匿名化ルールのソースは 3 種類あります: 辞書ファイル(--xlate-anonymize)、文書自体のインラインマーク(--xlate-anonymize-mark)、および YAML フロントマターの値(--xlate-frontmatter)です。各文字列は、送信中に <person id=1 /> のようなカテゴリタグに置き換えられます。隠蔽の対象は API 送信のみです。ローカルキャッシュファイルには復元されたプレーンテキストが保存されます。何が送信されるかを正確に確認するには、--xlate-dryrun を使用してください。
フォーム文書(四半期報告書など)では、アクターを最初に定義し、本文で参照します:
---
報告者: 山田太郎
発注会社: アクメ株式会社
---
本件について {{ 報告者 }} が調査を行った。
言語ごとにテンプレートを一度、--xlate-template(値をファイル内に保持する場合は --xlate-frontmatter も)で翻訳し、その後 pandoc-embedz スタンドアロンモードで各ケースをレンダリングします。外部設定の global: 配下の値は、翻訳 API にはまったく送信されません:
greple -Mxlate --xlate --xlate-engine=gpt5 --xlate-to=EN-US \
--xlate-template= --xlate-format=xtxt \
--match-paragraph --all --need=0 \
report-template.md > report-template.EN.md
pandoc-embedz --standalone report-template.EN.md \
-c case-123.yaml -o report-123.EN.md < /dev/null
インラインマークについては、マクロ定義設定を指定すると、同じ翻訳済みテンプレートで実名または墨消し版のいずれもレンダリングできます:
# macros.yaml # macros-redacted.yaml
preamble: | preamble: |
{% macro person(name) %}{{ name }}{% endmacro %}
{% macro person(name) %}(関係者){% endmacro %}
文書に embedz ブロックが含まれている場合は、それらを翻訳対象から除外します:
--exclude '^```embedz\n(?s:.*?)^```\n'
OPTIONS
- --xlate
- --xlate-color
- --xlate-fold
- --xlate-fold-width=n (Default: 70)
-
一致した各領域ごとに翻訳処理を呼び出します。
このオプションがない場合、greple は通常の検索コマンドとして動作します。したがって、実際の作業を行う前に、ファイルのどの部分が翻訳対象になるかを確認できます。
コマンド結果は標準出力に出るため、必要に応じてファイルにリダイレクトするか、App::Greple::update モジュールの使用を検討してください。
オプション --xlate は --color=never オプション付きで --xlate-color オプションを呼び出します。
--xlate-fold オプションを指定すると、変換後のテキストは指定した幅で折り返されます。デフォルト幅は 70 で、--xlate-fold-width オプションで設定できます。先頭に 4 桁分が突き出し用に予約されるため、1 行あたり最大 74 文字まで保持できます。
- --xlate-engine=engine
-
使用する翻訳エンジンを指定します。
現時点では、以下のエンジンが利用可能です。
gpt5: gpt-5.5 (via the
llmcommand)deepl: DeepL API (via the
deeplcommand)gpt3: gpt-3.5-turbo (legacy, via the
gptycommand)gpt4o: gpt-4o-mini (legacy, via the
gptycommand)
エンジンモジュールはまずバックエンド名前空間(
llm、次にgpty)で検索され、その後App::Greple::xlateの直下で検索されます。したがってgpt5はllmコマンドを呼び出すApp::Greple::xlate::llm::gpt5をロードし、一方gpt4oはApp::Greple::xlate::gpty::gpt4oにフォールバックします。特定のバックエンドを強制するには--xlate-setopt backend=gptyを使用してください。 - --xlate-labor
- --xlabor
-
翻訳エンジンを呼び出す代わりに、ユーザが手動で作業することを想定しています。翻訳対象のテキストを準備したら、クリップボードにコピーします。フォームに貼り付け、得られた結果をクリップボードにコピーし、リターンキーを押してください。
- --xlate-to (Default:
EN-US) -
ターゲット言語を指定します。LLM エンジンは、モデルが理解する任意の言語名またはコードを受け付けます。これは翻訳プロンプトに埋め込まれます。DeepL エンジン使用時は、
deepl languagesコマンドで利用可能な言語を取得できます。 - --xlate-from (Default:
ORIGINAL) -
conflict、colon、ifdef出力形式で原文に使用されるラベルです。DeepL エンジンでは、デフォルト以外の値もソース言語として渡されます。 - --xlate-format=format (Default:
conflict) -
原文と翻訳文の出力形式を指定します。
xtxt以外の以下の形式は、翻訳対象部分が行の集合であることを前提としています。実際には行の一部だけを翻訳することも可能ですが、xtxt以外の形式を指定しても意味のある結果にはなりません。- conflict, cm
-
原文と変換後のテキストを git(1) のコンフリクトマーカー形式で出力します。
<<<<<<< ORIGINAL original text ======= translated Japanese text >>>>>>> JA次の sed(1) コマンドで元のファイルを復元できます。
sed -e '/^<<<<<<< /d' -e '/^=======$/,/^>>>>>>> /d' - colon, :::::::
-
原文と翻訳文を Markdown のカスタムコンテナ形式で出力します。
::::::: ORIGINAL original text ::::::: ::::::: JA translated Japanese text :::::::上記のテキストは HTML では次のように変換されます。
<div class="ORIGINAL"> original text </div> <div class="JA"> translated Japanese text </div>コロンの数はデフォルトで 7 です。
:::::のようにコロンの並びを指定した場合は、7 個の代わりにそれが使用されます。 - ifdef
-
原文と変換後のテキストを cpp(1) の
#ifdef形式で出力します。#ifdef ORIGINAL original text #endif #ifdef JA translated Japanese text #endif日本語テキストのみを取り出すには、unifdef コマンドを使用します:
unifdef -UORIGINAL -DJA foo.ja.pm - space
- space+
-
元のテキストと変換後のテキストは、1行の空行で区切って出力されます。
space+の場合は、変換後のテキストの後に改行も出力します。 - xtxt
-
形式が
xtxt(翻訳済みテキスト)または不明な場合は、翻訳済みテキストのみが出力されます。
- --xlate-maxlen=chars (Default: 0)
-
一度にAPIへ送信するテキストの最大長を指定します。デフォルト値 0 はエンジン自身の制限を意味します: 無料のDeepLアカウントサービスでは、API 用は 128K(--xlate)、クリップボードインターフェイス用は 5000(--xlate-labor)です。Pro サービスを使用している場合は、この値を変更できる場合があります。
- --xlate-maxline=n (Default: 0)
-
一度にAPIへ送信するテキストの最大行数を指定します。
1行ずつ翻訳したい場合は、この値を 1 に設定します。このオプションは
--xlate-maxlenオプションより優先されます。 - --xlate-prompt=text
-
翻訳エンジンに送信するカスタムプロンプトを指定します。このオプションはLLMエンジン(
gpt3、gpt4o、gpt5)で利用できますが、DeepLでは利用できません。AIモデルに具体的な指示を与えることで、翻訳の動作をカスタマイズできます。プロンプトに%sが含まれている場合、それは対象言語名に置き換えられます。 - --xlate-context=text
-
翻訳エンジンに送信する追加のコンテキスト情報を指定します。このオプションは複数回使用して、複数のコンテキスト文字列を提供できます。コンテキスト情報は翻訳エンジンが背景を理解し、より正確な翻訳を行うのに役立ちます。
- --xlate-context-window=n
-
(Context-aware engines only, e.g.
gpt5on the llm backend) 変更されたブロックを再翻訳する際に参照コンテキストとして渡される周辺の翻訳済みブロック数(デフォルトは2)です。このコンテキストには、変更領域の周囲にある生のソーステキスト(見出し、リスト構造、キャプション)も含まれ、利用可能な場合は、キャッシュから復元された変更テキストの以前のバージョンも含まれるため、変更されていない表現が保持されます。コンテキスト対応翻訳を完全に無効にするには0に設定します。各変更領域はそれぞれ独自のAPI呼び出しで翻訳され、コンテキストによりシステムプロンプトへ最大約8000文字が追加される可能性があるため、コンテキスト対応翻訳は一貫性と引き換えに多少の追加コストを伴うことに注意してください。 - --xlate-cache-seed=file
-
新しい文書のキャッシュを別の文書のキャッシュファイルから初期化します。定期レポートに有用です。新しい号のキャッシュに前号のキャッシュをシードすることで、変更されていない段落は再翻訳されず、編集された段落は前号の表現を維持します。シードは対象キャッシュが空の場合にのみ使用され、それ以外の場合は警告とともに無視されます。デフォルトの
--xlate-cache=autoでは、シードを指定すると新しい文書のキャッシュファイルも作成されます。 - --xlate-anonymize=file
-
機密文字列を翻訳APIに送信する前に匿名化し、出力で復元します。辞書ファイルは項目ごとに1つのエントリを与えます。JSON(標準的で、機械生成可能)
[ { "category": "person", "text": "山田太郎" }, { "category": "company", "regex": "アクメ(株式会社)?" } ]または単純な行形式(regexの場合は
category pattern、/.../)で指定します。各項目は<person id=1 />のようなカテゴリタグに置き換えられます。同じ文字列には常に同じタグが割り当てられるため、モデルは誰が誰であるかを追跡できます。不明なJSONフィールドは無視されるため、生成器(たとえばエンティティを抽出するローカルLLM)は独自の注釈を追加できます。カテゴリlitは予約されています。ローカルキャッシュファイルには復元済みの平文が引き続き保存されます。秘匿対象はAPI送信のみです。辞書は外部ツールで生成できます。たとえば、機密エンティティを抽出するローカルモデルです。
llm -m <local-model> \ -s 'Extract sensitive entities as a JSON array of objects with "category" and "text" fields.' \ < report.md > report.anon.json greple -Mxlate --xlate-anonymize=report.anon.json ...ファイル内のUTF-8 BOMは許容されます。フロントマターの行形式における値は、値の後ではなく、それだけの行に限って末尾コメントを持つことができます。
- --xlate-anonymize-mark[=regex]
-
文書自体のインラインマークから匿名化エントリを収集します。最初の出現箇所を
{{ person("山田太郎") }}のようにマークすると、その文字列の文書全体のすべての出現箇所が匿名化されます。マーク自体はソースおよび翻訳内に残るため、文書はJinja2スタイルのマクロプロセッサでも処理できます(名前を表示または墨消しするようにpersonマクロを定義します)。カスタム regex には、(?<category>...)と(?<text>...)という名前付きキャプチャを含める必要があります。このような任意値オプションでは、後続のファイル引数が値として扱われることに注意してください。デフォルト表記を使用する場合は、
--xlate-anonymize-mark=(末尾に=を付けて)と書いてください。別の表記も設定できます。たとえば
@@person:NAME@@スタイルのマークには--xlate-anonymize-mark='@@(?<category>[a-z][a-z0-9_]*):(?<text>[^\n]+?)@@'、またはレンダリング済みMarkdownで不可視のままになるHTMLコメント形式などです。マーク規則は文書ごとに収集されます。ある入力ファイルでマークされた文字列は、同じ実行中の別ファイルでは秘匿されません(ファイル間で蓄積されるフロントマター値とは異なります)。 - --xlate-template[=regex]
-
テンプレート式(デフォルト: Jinja2
{{ ... }}、{% ... %}、{# ... #})を不透明なプレースホルダとして扱います。モデルにはそれらを変更せずにコピーするよう指示し、ブロックごとに、応答にまったく同じ式がそれぞれ同じ回数含まれていることを検証します。翻訳では対象言語の語順に合わせてそれらを並べ替えることが正当であるため、順序は変わる場合があります。式が壊れている場合は実行を中止します。キャッシュはチェックポイントされて凍結されるため、支払い済みのものが失われることはありません。このようなオプション値が任意のオプションでは、後続のファイル引数が値として扱われることに注意してください。デフォルトの表記を使用する場合は、
--xlate-template=(末尾に=を付けて)と書きます。 - --xlate-frontmatter
-
先頭の
---...---ブロックを YAML フロントマターとして扱います。翻訳およびフェーズ2のコンテキストスライスから除外し、そのフラットなkey: value値を安全策として匿名化ルール(カテゴリvar)に追加します。複数の入力ファイルがある場合、収集された値は蓄積されます(秘匿する側に倒します)。閉じる
---の後には必ず空行を残してください。段落スタイルのマッチパターンでは、フロントマターが本文テキストに直接続いていると、除外で抑制できないまたがりブロックが1つ形成されます(その場合は警告が出力されます)。値は引き続き匿名化されますが、フロントマター自体は翻訳に送信されます。 - --xlate-glossary=glossary
-
翻訳に使用する用語集IDを指定します。このオプションは DeepL エンジン使用時のみ有効です。用語集IDは DeepL アカウントから取得し、特定用語の一貫した翻訳を保証します。
- --xlate-dryrun
-
翻訳 API を呼び出さず、代わりに進捗表示を通じて、各ペイロードを送信されるとおり(匿名化およびマスキング後)正確に表示します。マシンから何が出ていくかを確認し、実行コストを見積もるのに有用です。
- --[no-]xlate-progress (Default: True)
-
STDERR 出力で翻訳結果をリアルタイムに確認します。
Fromペイロードは、匿名化およびマスキング後に送信されるとおりに表示されます。 - --xlate-stripe
-
App::Greple::stripe モジュールを使用して、マッチした部分をゼブラストライプ風に表示します。マッチ部分が背中合わせに連結している場合に有用です。
端末の背景色に応じてカラーパレットが切り替わります。明示的に指定したい場合は、--xlate-stripe-light または --xlate-stripe-dark を使用できます。
- --xlate-mask
-
マスキング機能を実行し、復元せずに変換後のテキストをそのまま表示します。
- --match-all
-
ファイル全体のテキストを対象領域として設定します。
- --lineify-cm
- --lineify-colon
-
cmおよびcolon形式の場合、出力は行ごとに分割して整形されます。したがって、行の一部のみを翻訳すると、期待どおりの結果が得られません。これらのフィルタは、行の一部のみを翻訳したことで破損した出力を、通常の行単位の出力に修正します。現在の実装では、1行の複数箇所が翻訳された場合、それらは独立した行として出力されます。
CACHE OPTIONS
xlate モジュールは、ファイルごとに翻訳のキャッシュテキストを保存し、実行前に読み込んでサーバーへの問い合わせのオーバーヘッドを排除できます。デフォルトのキャッシュ戦略 auto では、対象ファイルにキャッシュファイルが存在する場合にのみキャッシュデータを保持します。
--xlate-cache=clear を使用してキャッシュ管理を開始するか、既存のすべてのキャッシュデータをクリーンアップします。このオプションで実行すると、キャッシュファイルが存在しない場合は新規作成され、その後は自動的に維持されます。
COMMAND LINE INTERFACE
配布物に含まれるxlateコマンドを使えば、コマンドラインからこのモジュールを簡単に利用できます。使用方法はxlateのmanページを参照してください。
xlate コマンドは、--to-lang、--from-lang、--engine、--file などの GNU 形式のロングオプションをサポートします。xlate -h を使用して、利用可能なすべてのオプションを確認してください。
xlateコマンドはDocker環境と連携して動作するため、手元に何もインストールしていなくてもDockerが使える環境であれば利用できます。-Dまたは-Cオプションを使用してください。
Docker の操作はApp::dozoによって処理され、単独のコマンドとしても使用できます。dozoコマンドは、コンテナ設定を永続化するために.dozorc構成ファイルをサポートします。
また、各種ドキュメントスタイル向けのmakefileが提供されているため、特別な指定なしに他言語への翻訳が可能です。-Mオプションを使用してください。
Dockerとmakeオプションを組み合わせて、Docker環境でmakeを実行することもできます。
xlate -Cのように実行すると、現在の作業中のgitリポジトリをマウントしたシェルが起動します。
詳細は"SEE ALSO"セクションの日本語記事を参照してください。
EMACS
リポジトリに含まれるxlate.elファイルを読み込むと、Emacsエディタからxlateコマンドを使用できます。xlate-region関数は指定したリージョンを翻訳します。デフォルト言語はEN-USで、プレフィックス引数を付けて起動すると言語を指定できます。
ENVIRONMENT
- DEEPL_AUTH_KEY
-
DeepLサービスの認証キーを設定します。
- OPENAI_API_KEY
-
レガシーgptyエンジンで使用されるOpenAIの認証キー。
llmベースのgpt5エンジンもこの変数を読み取りますが、llm keys set openaiで保存されたキーも使用できます。 - GREPLE_XLATE_CACHE
-
デフォルトのキャッシュ戦略を設定します("CACHE OPTIONS"を参照)。
INSTALL
CPANMINUS
$ cpanm App::Greple::xlate
TOOLS
使用するエンジン用のコマンドラインツールをインストールします。gpt5エンジンにはllm、DeepLにはdeepl、レガシーGPTエンジンにはgptyを使用します。
https://github.com/DeepLcom/deepl-python
https://github.com/tecolicom/App-gpty
SEE ALSO
MODULES
App::Greple::xlate::llm, App::Greple::xlate::deepl
App::dozo - xlate がコンテナ操作に使用する汎用 Docker ランナー
RELATED MODULES
-
grepleマニュアルで対象テキストのパターンについての詳細を参照してください。--inside、--outside、--include、--excludeオプションを使用してマッチ範囲を制限します。
-
-Mupdateモジュールを使って、grepleコマンドの結果でファイルを修正できます。 -
sdifを使用すると、-Vオプションと並べてコンフリクトマーカー形式を表示できます。
-
Greple stripeモジュールは--xlate-stripeオプションで使用します。
RESOURCES
https://hub.docker.com/r/tecolicom/xlate
Dockerコンテナイメージ。
https://github.com/tecolicom/getoptlong
getoptlong.shライブラリは、xlateスクリプトおよびApp::dozoでのオプション解析に使用されます。-
gpt5エンジンがLLMモデルにアクセスするために使用する
llmコマンド。 https://github.com/DeepLcom/deepl-python
DeepLのPythonライブラリおよびCLIコマンド。
https://github.com/openai/openai-python
OpenAI Pythonライブラリ
https://github.com/tecolicom/App-gpty
OpenAIコマンドラインインターフェイス
ARTICLES
https://qiita.com/kaz-utashiro/items/1c1a51a4591922e18250
DeepL APIで必要な部分だけを翻訳して置換するGrepleモジュール(日本語)
https://qiita.com/kaz-utashiro/items/a5e19736416ca183ecf6
DeepL APIモジュールで15言語のドキュメントを生成(日本語)
https://qiita.com/kaz-utashiro/items/1b9e155d6ae0620ab4dd
DeepL APIによる自動翻訳Docker環境(日本語)
AUTHOR
Kazumasa Utashiro
LICENSE
Copyright © 2023-2026 Kazumasa Utashiro.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.