サードパーティ製MODの翻訳
導入
この文書は、Cataclysm: Bright Nights (C:BN) におけるMODの翻訳ワークフローを設定し、運用する方法について簡単に説明することを目的としています。
MODのローカライゼーションには、ゲームは GNU gettextに類似したカスタムのローカライゼーションシステムを使用しており、GNU gettext の MOファイルと互換性があります。
Transifex や、gettext をサポートするその他のプラットフォームやソフトウェアを使用することも可能ですが、この文書では Poedit およびコマンドラインの GNU gettext utilitiesを使用した作業例のみを記載します。
PO/POT/MOファイルや、GNU gettext ユーティリティを使用した作業方法についてさらに詳細な説明が必要な場合は、GNU gettext manualを参照してください。
Cataclysm: Bright Nights およびそのMODの文字列を翻訳するための一般的なヒントについては、 translation APIを参照してください。
簡単な用語集
POT ファイル
Portable Object Template ファイル (.pot)。
MODの JSON および Lua ソースファイルから抽出された元の英語の文字列を含むテキストファイルです。POTファイルは、任意の言語の空の POファイルを作成したり、既存の POファイルを更新したりするために使用されるテンプレートです。
PO ファイル
Portable Objectファイル (.po)。
単一の言語に対応する翻訳済み文字列を含むテキストファイルです。POファイルは、翻訳者が作業する対象であり、MOファイルにコンパイルされるものです。
MO ファイル
Machine Objectファイル (.mo).
単一の言語に対応する翻訳済み文字列を含むバイナリファイルです。MOファイルは、ゲームがロードする対象であり、翻訳済み文字列を取得する場所です。
ワークフローの概要
最初の翻訳ワークフローは以下のとおりです。
- MODのJSONおよびLuaソースファイルから文字列を抽出し、POTファイルを作成する
- このPOTファイルから、対象言語のPOファイルを作成する
- POファイルを翻訳済み文字列で埋める
- POファイルをMOファイルにコンパイルする
- MOファイルをMODファイル内に配置する
MODは時間の経過とともに変更され、それに伴い文字列も変更される可能性があります。既存の翻訳を更新する手順は以下のとおりです。
- MODの JSON およびLuaソースファイルから文字列を抽出し、新しいPOTファイルを作成する
- 新しい POTファイルを使用して、既存の POファイルを更新する
- POファイル内で、新しい翻訳済み文字列を追加または既存の翻訳済み文字列を編集する
- POファイルを MOファイルにコンパイルする
- 古い MOファイルを新しいバージョンに置き換える
どちらのワークフローでも、ステップ1を実行するには、文字列抽出のための環境をセットアップする必要があります(下記参照)。
ステップ2〜4は、MODの作者、保守担当者、または翻訳者のいずれかによって、翻訳ソフトウェアを使用して実行できます。
文字列抽出のための環境のセットアップ
polib および luaparser モジュールがインストールされた Python 3 が必要です (pip を介して利用可能)。
文字列抽出用スクリプトは、リポジトリの lang サブディレクトリにあります。
extract_json_strings.py- 主な文字列抽出ルーチンdedup_pot_file.py- 最初のスクリプトによって生成された POTファイルのエラーを修正extract_mod_strings.bat(Linux/MacOS の場合はextract_mod_strings.sh) - 他の2つのスクリプトを自動化
文字列の抽出
これら3つのスクリプトを MODのフォルダにコピーし、以下の手順を実行します。
- Windows の場合、
extract_mod_strings.batをダブルクリック - Linux/MacOS の場合、ターミナルを開き
./extract_mod_strings.shを実行
プロセスがエラーなしで完了した場合、MODフォルダ内に extracted_strings.pot ファイルを含む新しい lang フォルダが表示されます。
新しい POファイルの作成
POファイルを作成する前に、言語 ID を選択する必要があります。
data/raw/languages.json を開いて、ゲームがサポートしている言語のリストを確認してください。
このリストでは、各エントリが ln_LN の形式で独自の ID を持っています。ここで ln は言語を、
LN はダイアレクト(方言)を決定します。正確な言語とダイアレクトの一致には完全な ln_LN を使用するか、ダイアレクトに関係なくゲームに MOファイルを使用させたい場合は ln を使用できます。
Poedit
- Poedit で POTファイルを開く
- 「新しい翻訳を作成」ボタン(下部に表示されるはず)を押す
- 言語選択ダイアログで、選択した言語 ID を入力する
- ファイルを
path/to/mod/lang/LANG.poとして保存します。ここでLANGは選択した言語 ID と同じです。
msginit
msginit -i lang/index.pot -o lang/LANG.po -l LANG.UTF-8 --no-translator
ここで LANG は選択した言語 ID です。
既存の POファイルの更新
Poedit
- Poedit で POファイルを開く
翻訳->POTファイルから更新...を選択し、新しい POTファイルを選択- ファイルを保存
msgmerge
msgmerge lang/LANG.po lang/index.pot
POファイルの MOファイルへのコンパイル
Poedit
- Poedit で POファイルを開く
- MOファイルが UTF-8 を使用してエンコードされていることを確認します (デフォルトでそうなっているはずですが、
翻訳->プロパティ->"翻訳プロパティ" タブ->文字符号化法で再確認できます)。 - デフォルトでは、POファイルが保存されるたびに Poedit は自動的に MOファイルにコンパイルしますが、
ファイル>MOにコンパイル...を介して明示的に実行することもできます。
msgfmt
msgfmt -o lang/LANG.mo lang/LANG.po
MOファイルを MODに追加
MODファイルディレクトリ内に lang ディレクトリを作成し、そこに MOファイルを配置します。
mods/
YourMod/
modinfo.json
lang/
es.mo
pt_BR.mo
zh_CN.mo
注釈: POT/POファイルを同じ lang サブディレクトリに保存すると、管理が容易になる場合があります。ゲームはこれらのファイルを無視するため、MODフォルダ構造は次のようになります。
mods/
YourMod/
modinfo.json
lang/
extracted_strings.pot
es.po
es.mo
pt_BR.po
pt_BR.mo
zh_CN.po
zh_CN.mo
その他の注釈
JSONと同様に、MOファイルに任意の場所や名前を使用することはできますか?
できません。ゲームは、modinfo.json で指定された MODの path ディレクトリ(指定されていない場合、path は MODのディレクトリと一致します)の lang サブディレクトリ内にある特定の名前を持つ MOファイルを探します。
ただし、どのMODでも、他のMODの翻訳ファイルを自動的に使用してその文字列を翻訳しようとします。これにより、他の MOD(または MODコレクション)専用の「翻訳パック」MODを作成することが可能になります。
実行中のゲームでの翻訳のリロード
デバッグメニューを開き、情報...->翻訳をリロードを選択すると、ゲームはディスクからすべての MOファイルをリロードします。
これにより、翻訳者が MOファイルをコンパイルする手段を持っていれば、翻訳された文字列がゲーム内でどのように見えるかを簡単に確認できます。
Poedit を使用したワークフローの例:
- 文字列を翻訳する
- Ctrl+S を押す
- Alt+Tab でゲームに切り替える
- デバッグメニューを介して翻訳ファイルをリロードする
- ゲームが翻訳された文字列を表示する
MOファイルのロード順序
MOファイルのロード順序は次のとおりです。
- 最初に、そして常に、UI、ハードコードされた機能、ベース「MOD」(
data/json/)、およびリポジトリ内の MODの翻訳文字列を含むベースゲームの MOファイルがロードされます。 - 次に、MODの MOファイルが MODのロード順序と同じ順序でロードされます。
ダイアレクト(方言)
MOファイルをロードするとき、ゲームはまず、名前が正確な言語とダイアレクトに一致するファイルを探します。そのようなファイルが存在しない場合は、ダイアレクトのないファイルを探します。
たとえば、Español (España) を使用している場合、選択順序は次のとおりです。
es_ES.moes.mo
また、Español (Argentina) を使用している場合、選択順序は次のとおりです。
es_AR.moes.mo
したがって、正確な翻訳ファイルが存在しない場合、es.mo はスペイン語のどちらのダイアレクトでもロードされます。
2つ以上の MODが同じ文字列に対して異なる翻訳を提供している場合はどうなりますか?
その場合、ゲームは次のルールセットに従って使用する翻訳を選択します。
- 文字列 A の翻訳に複数形があるが、文字列 B の翻訳に複数形がない場合、翻訳 A が単数形と複数形の両方に使用されます。
- 翻訳 A と B の両方に複数形がある場合(または両方にない場合)、最初にロードさ れた翻訳が使用されます(MOロード順序を参照)。
ベースゲームのものとは異なる翻訳を使用したい場合、または他のMODからの文字列と競合させたくない場合は、対応する JSONオブジェクト内の文字列に翻訳コンテキストを追加してください (どのフィールドが翻訳コンテキストをサポートしているかについては こちらを参照してください)。
参考となる、MOD翻訳を実装したプルリクエスト
https://github.com/cataclysmbnteam/Cataclysm-BN/pull/505