Minetestのゲームを翻訳するためのtemplate.txt抜き出しと翻訳したファイルをリネームするワンラインスクリプト

nogajun
nogajun

_ Minetestは、ゲームエンジンでMinetestのみでは遊べません。Minetestのゲームを遊ぶには、Luaで書かれた ゲーム を動かして初めてゲームとして遊べます。

そのMinetestのリファレンスゲームとして付属しているのが「Minetest game」です。よくリファレンスゲーム「Minetest game」を指して「Minetest」という人がいますが、それは間違いで「Minetest」と「Minetest game」は別のものです。

さて、MinetestとMinetest Gameの違いについて説明したところで翻訳の話です。

Minetest本体は、ある程度翻訳されています。しかし、Minetest付属のリファレンスゲームの「minetest_game」は、まったく翻訳されておらずゲーム内メッセージやアイテムは全部英語です。

翻訳していない理由はいろいろあると思いますが、一番の理由は面倒だからだと思います。

ゲームの実装は、メイン以外は機能ごとにmodとして実装されています。ゲームのmodsフォルダー以下にはフォルダーに分かれた各機能のmodが細かくあります。翻訳するテキストは、その細かく分かれたフォルダーのさらに中にあるlocaleフォルダーのtemplate.txtを翻訳します。

GUIのファイルマネージャーで細かく分かれたフォルダーを行ったり来たりしてファイルを翻訳するのは面倒なので、template.txtを同じフォルダー構造で抜き出すbashスクリプトとOmegaTで翻訳して生成した訳文ファイルをフォルダーの命名規則に則ってファイルのリネームをするbashスクリプトを書きました。

modsフォルダー内のtemplate.txtを同じフォルダー構造でコピーする

これはゲームの翻訳するファイルをディレクトリ構造そのまま抜き出してコピーするbashスクリプトです。

ゲームがある~/.minetest/games/(ゲーム)(flatpakでは~/.var/app/net.minetest.Minetest/.minetest/games/(ゲーム))フォルダーに移動して下の1行スクリプトを実行するとスクリプトで作成したtransolationフォルダーにフォルダー構造そのままでtemplate.txtだけ抜き出したフォルダーができます。

w="translation";mkdir -p ${w};for i in $(find ./mods/ | grep template.txt);do mkdir -p "${w}/$(dirname ${i#\./})" && cp -a "${i}" "${w}/${i#\./}"; done

翻訳は、作成されたtranslationフォルダーをまるごとをOmegaT翻訳プロジェクトのsouceフォルダーに移動して翻訳すればOK。

OmegaTで生成した訳文を命名規則に沿ってリネームする

OmegaTで翻訳すると翻訳プロジェクトのtargetフォルダーに訳文が生成されますが、訳文のファイル名がtemplate.txtのままです。それを翻訳ファイル名の命名規則に沿ってファイル名を変更するのがこのbashスクリプトです。

OmegaT翻訳プロジェクトのtargetフォルダーに移動して下のスクリプトを実行します。するとmodフォルダーの名前に従ってtemplate.txtがリネームされます。

for i in $(find ./mods/ | grep template.txt); do mv "$i" "$(dirname $i)/$(echo $i | cut -d'/' -f4).ja.tr" ;done

スクリプトでファイル名をリネームしたらtranslationフォルダーの中のフォルダー~/.minetest/games/(ゲーム)(flatpakでは~/.var/app/net.minetest.Minetest/.minetest/games/(ゲーム))にフォルダーごと上書きコピーすれば日本語メッセージを確認できます。