目次
Godotの多言語対応機能は、CSVファイルを使う方法と、GNUのgettextフォーマットであるPOファイル(あるいはMOファイル)を使う方法があります。前者は手軽ですが、複数行の文字列を扱うなら後者が向いています。
Godot4.0から、既存のシーンやGDScriptから文字列を切り出して、POファイルのテンプレートであるPOTファイルを自動生成する機能が追加されました。ただ、POTファイルから各言語用のPOファイルを作成するには、ツールのインストールが必要です。
POファイルはシンプルなテキストファイルなので、テキストエディターを使って手動で作れます。その方法を紹介します。
ファイルの作成
Godotプロジェクトの任意の場所に、言語ファイルを入れておくフォルダーを作成します。名前はなんでも構いませんが、Godotの公式ドキュメントでは、locale
というフォルダー名が推奨されています。対応するシーンがわかるcredits_locale
のようなフォルダー名もよさそうです。
poファイルを入れておくためのフォルダーを作成したら、その中に新規でテキストファイルを作成します。ファイル名は、言語コード.po
とします。日本語用のファイルならja.po
、英語用ならen.po
です。言語コードは、GODOT DOCS. Locale codesで確認できます。
poファイルを、VSCodeなどのテキストエディターで開いて、以下をコピペします。
#
# AUTHOR NAME <EMAIL@DOMAIN.COM>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Project Name\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Last Translator\n"
"Language-Team: none\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"PO-Revision-Date: 2024-07-15 21:30-0900\n"
msgid ""
msgstr ""
次の点に気をつけてください。
- 文字コードはUTF-8Nで保存
- 言語が日本語以外の場合は、
Language:
に続く文字を、該当する言語コード(英語ならen
)に変更する
それ以外の項目は、必要に応じて書き換えてください。そのままでも問題はありません。
#
からはじまる行はコメント行です。
poファイルの編集
空行に続けて、msgid
とmsgstr
を書くことで、定義を作成できます。msgid
が書き換え元となる文字列で、msgstr
が対応する翻訳文です。たとえば、TextにKEY_TITLE
と設定したラベルを「ゲームのタイトル」、KEY_START
と設定したラベルを「ゲーム開始!!」にしたければ、次のようにします。
#
# AUTHOR NAME <EMAIL@DOMAIN.COM>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Project Name\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Last Translator\n"
"Language-Team: none\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"PO-Revision-Date: 2024-07-15 21:30-0900\n"
msgid "KEY_TITLE"
msgstr "ゲームのタイトル"
msgid "KEY_START"
msgstr "ゲーム開始!!"
このようにして、必要な数だけ設定を追加していきます。
4,5行目のmsgidとmsgstrはシステムが使うので、変更せずにそのままにしておいてください。
複数行の対応
msgidとmsgstrのどちらも、行を複数に分けることができます。複数行にする場合は、次の行の先頭から"
ではじめます。
文中の改行は\n
で表します。
例えば、テキストにKEY_TITLEを設定したラベルに、2行のタイトルを表示したいなら次のようにします。
msgid "KEY_TITLE"
msgstr ""
"ゲームのタイトル\n"
"タイトルの2行目"
使う機会はないような気がしますが、msgidも同じルールで複数行にできます。
Godotへの適用
作成したpoファイルを、Godotのローカライズ設定に追加すれば、言語ファイルとして機能します。
- Godotエディターで、組み込みたいプロジェクトを開きます
- プロジェクトメニューからプロジェクト設定を開きます
- ローカライズの翻訳タブに切り替えて、追加ボタンをクリックします
- 追加したいpoファイル、例えば
ja.po
やen.po
を選択して、追加します
以上で設定完了です。ラベルなどのテキストにmsgidに設定した文字列が現れたら、それを現在のロケールに対応したmsgstrに自動的に置き換えられます。
スクリプトからのロケールの変更
言語設定には、TranslationServerクラスを使います。
現在のロケールの取得
現在の言語のロケールを取得するには、次のようにします。
var current_locale : String = TranslationServer.get_locale()
Godotでは、デフォルトでOSの言語が自動的に適用されます。日本語環境であれば、日本語が設定されます。
ロケールの比較
これで、ja-JP
やen-US
などが得られます。ロケールには、国文字列が加わる場合があります。そこで、直に文字列を比較するのではなく、TranslationServer.compare_locales()を使って比較します。
if TranslationServer.compare_locales(current_locale, "ja") > 0:
print("日本語です")
戻り値は、0から10まで一致度で返されます。0は不一致で、10が完全一致です。ロケールは、国を含んだり、含まなかったりするため、10かどうかだけで判定すると、期待した動作にならないことがあります。最大のものを選択するようなコードを用意すると確実そうです。
ロケールの設定
ロケールの設定は、次のようにします。
TranslationServer.set_locale("ja")
これを実行すると、即座に画面上の表示が対応言語のものに切り替わります。無効なロケールを設定すると、デフォルトの言語が設定されます。設定後に、現在のロケールを取得すれば、有効なロケールを取得できます。
まとめ
多言語用のデータであるpoファイルの作成方法を紹介しました。ここでは、CSVと同様にキー文字列を翻訳文に変換する方法を示しました。
poファイルは、冒頭の設定の文字列さえ用意すれば、あとは手動でmsgidとmsgstrを羅列すれば作れます。手動で作成するのは、それほど大変ではありません。
元のシーンを英語で作成しておいて、そこからPOTファイルを生成して、対応する翻訳データを設定する方法もあります。というか、そちらが本来の使い方です。その場合の進め方は、GODOTの公式ドキュメントの手順で進めるとよいでしょう。