Godot Engineの翻訳機能を使う
Godot Engineで翻訳機能を使う上で、よくあるのはCSVだけどpoファイルを使ってやってみます。
まずは環境が必要
- pipのインストール
- gettextのインストール
- pybabelのインストール
- PoEditのインストール
めっちゃインストールしますが、気にせず進めます。
pipのインストールはPythonの環境なので割愛します。
事前準備
プロジェクトフォルダのサブフォルダとしてres:Resource/Translation
というフォルダを作成しました。
この中で作業します。
エクスプローラーのパスの部分でcmd
と入力してEnterを押すと、そのパスに移動した状態でコマンドプロンプトが立ち上がります。
gettextのインストール
Windowsではこちらからダウンロード・インストールします。
後でいろいろ使います。
pybabel(&babel-godot)のインストール
pip3 install babel babel-godot
pip
が実行できればこれでインストールは終わります。
検索用のファイル定義
公式ドキュメントではbabelrc
として定義されていますが、pybabel
でプロジェクトから翻訳対象の文言を検索するのに使う定義ファイルです。
[python: **.gd]
encoding = utf-8
[godot_scene: **.tscn]
encoding = utf-8
ファイル名はbabelrc
として、拡張子はないテキストデータにしました。
これで、スクリプト内と、シーン内に書かれた内容を検索対象に含めました。
potファイル(テンプレート)の作成
pybabel extract -F babelrc -k text -k LineEdit/placeholder_text -k tr -o godot-l10n.pot .
このままだとパスを指定していないので抽出されないですが、基本的なテンプレートだけできます。
poファイルの作成
msginit --no-translator --input=godot-l10n.pot --locale=ja
まずは日本語の翻訳データとしてja.po
を作ります。
翻訳データというか、キーの割り当て確認ためのデータにします。
バッチファイルの作成
pybabel extract --input-dirs ..\..\ -F babelrc -k text -k LineEdit/placeholder_text -k tr -o godot-l10n.pot
msgmerge --update --backup=none ja.po godot-l10n.pot
pause
--input-dirs
で抽出対象ディレクトリを指定して、後はプロジェクト内のtext
で指定しているものなどを翻訳対象として抽出します。
そして、抽出されたデータを、先程作ったja.po
にマージします。
PoEditをインストール
インストールしたら関連付けされるのでja.po
を開きます。
文字エンコード設定を変更する
翻訳>プロパティ
のウィンドウから文字符号化法
をUTF-8に変更します。
変更しないとGodotで読み込んだ時にエラーが出ます。
moファイルは不要なので出力しないようにする
ファイル>設定
のウィンドウから一般タブ>編集>保存する際にMOファイルを自動コンパイル
のチェックを外します。
Godot Engineでpoファイルを読み込む
プロジェクト>プロジェクト設定
からローカライズタブ>翻訳タブ>追加
で、作ったja.po
を読み込みます。
プロジェクト内のテキストの調整
そのまま日本語文字を入れておいたら勝手に翻訳してくれるのが楽だとは思いますが、色々不都合が出るので、プロジェクト内のテキストにはキーを入れるようにしています。
func _ready():
footer.set_key_help(tr("_KEY_System_Accept"), load("res://Resources/Textures/PadButtonA.png"))
footer.set_key_help(tr("_KEY_System_Back"), load("res://Resources/Textures/PadButtonB.png"))
tr()
で指定した文字は抽出対象担っているので、_KEY_System_Accept
は決定
という文字になります。
そのまま日本語を翻訳対象にすると、例えば色々なところで使っているニュアンスの違う「戻る」という文言が同じキーとみなされて分けるのに面倒くさいことになります。
おわりに
プロジェクトで何かを変更した際に、バッチファイルを実行するとプロジェクトでの変更が翻訳ファイルにマージされます。
poファイルが更新されると、PoEdit
を立ち上げていても自動更新してくれますので、編集も便利ですね。
ここからさらに自動化する事もできますが、個人的にはここまでで十分です。
Discussion