【Godot】POファイルを使った多言語対応

複数行を扱うのに便利な多言語フォーマットのpoファイルを、手動で作る方法です。

作成日: 2024-07-16

Godot記事一覧

目次

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ファイルの編集

空行に続けて、msgidmsgstrを書くことで、定義を作成できます。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.poen.poを選択して、追加します

以上で設定完了です。ラベルなどのテキストにmsgidに設定した文字列が現れたら、それを現在のロケールに対応したmsgstrに自動的に置き換えられます。

スクリプトからのロケールの変更

言語設定には、TranslationServerクラスを使います。

現在のロケールの取得

現在の言語のロケールを取得するには、次のようにします。

var current_locale : String = TranslationServer.get_locale()

Godotでは、デフォルトでOSの言語が自動的に適用されます。日本語環境であれば、日本語が設定されます。

ロケールの比較

これで、ja-JPen-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の公式ドキュメントの手順で進めるとよいでしょう。

参考URL

Godot記事一覧