💬

Godot Engineの翻訳機能を使う

2022/06/10に公開

Godot Engineで翻訳機能を使う上で、よくあるのはCSVだけどpoファイルを使ってやってみます。

まずは環境が必要

  1. pipのインストール
  2. gettextのインストール
  3. pybabelのインストール
  4. 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