2017年1月29日日曜日

Theme Hospital + CorsixTH 0.6 ゲームテキストの和訳

誰からも望まれていませんし、例によって需要もあるとは思えませんが、Theme Hospital + CorsixTH 0.6 ゲームテキストを日本語に訳してみました。
  • 日本語化済みファイルはこちら
    クリックいたしますと、ja_JP.lua というファイルがダウンロードされます。
    ご利用にはファイルを CorsixTH/lua/language ディレクトリにコピーしてゲームを起動し、設定から日本語を選択してください。
  • 作業シートはこちら
    機械翻訳がほとんどですので、原文と比較したり自分流に訳す場合にコピーしてご利用ください。
です。よろしければご利用ください。

以上です。

以下たわごとです。

いつだったか、相当前にOriginからのプレゼントということで無料配布されていたテーマホスピタルというゲームがあったのを思い出して、先の金曜日、初めて起動してみました。

まーなんというか、さすがに古いゲームだけあって画面は小さいし文字も汚いし英語だし、ということで起動直後にそっと閉じてしまいました。

しかしながら、せめて日本語化できれば違う印象を持つかもしれないと思いまして、ざっくりgoogleで検索したところ、本体の日本語化はないようですが、こちらのMiyaoka Noteさんというサイトで紹介されている自称"re-implement the game engine of Theme Hospital"とはばかりなく言い切るCorsixTHという存在を知りました。Miyaoka Noteさんは2012年にCorsixTHの日本語化を行なっておいでで、その成果物はgithubで公開なさっておいでです。

そこで、これは渡りに船、とばかりにさっそく使用させていただいたのですが、あまりゲーム内テキストが日本語化されません。

ちょっと失礼ではありますが正直がっかりして、せっかくいただいたので言語定義体をエディタで見てみると、これって定義体というよりLua言語で書かれたプログラムで、文字列を直接の変数に突っ込んでるという強烈な仕様だということを知ってびっくりしました。
これはおそらく、言語ファイルを作成された後で参照される変数名が変わったとか、いろいろあったのでせっかくの日本語データがゲームに反映されないのかもしれません。

とは申せ、仕組みとしては変数の値を変えるだけ、という設計方針はわかりましたので、それなら変数名と代入されている英文が分かれば全翻訳可能という理屈になります。単純明快です。

そこで、毒を食らわば皿まで、ではありませんが、土曜日にちょっとやってみようと思い立ちました。

で、そうなると、今度はどうやって訳元の英文データを入手すればいいのかを調べてみますと、公式で解説されていましたので、さっそく生成してみますと、Luaではテーブルというようですが、表現形式としてはC言語でいう構造体のような感じで定義されており、一つ一つ構造体名とメンバ名にバラすのもまとめるのも簡単なスクリプトを書けばすぐできるということが分かりました。

なぜバラバラにしようとするかというと、私がこれまで行ってきたゲームなどの翻訳シートと同一の形式にし、かつ訳文と原文をいつでも対比できる形式に変換したいからです。

この形式のメリットは、原文と訳文が一対一で参照や再翻訳がしやすく、しかも原文を複数行、まとめてgoogle翻訳さんやWeblio翻訳さんなどにコピーすれば、訳文がたちまち得られ、しかも翻訳結果は加工しなくてもそのままシートにキッチリ再ペーストできるという点にあります。
それに、ソースを直接いじるよりもはるかに作業がしやすい。いちいちソース単位でコミットしなくてもセル単位で更新履歴が残ります。これはきわめて大きなメリットです。

翻訳結果があまりにも頓珍漢だったら多少は手を入れますが、原則として一度シート化してしまえば、この通り私はせいぜいコピーとペーストしかすることがありません。

結果として土曜日中にluaソースから英文と変数名が対になったTSVファイルを作って、またluaソースへと戻す2本のスクリプトを書き、あとはただコピー&ペーストを繰り返すだけで完了し、日曜日にはある程度プレイして確かめることも含めて「概ねできました、よければどうぞ」などと言えてしまう寸法です。
本当にgoogle翻訳さんをはじめ、機械翻訳を使わせてくださる各社には感謝に堪えません。

折角Miyaoka Noteさんがおつくりになられたデータが現にあるのだから擦り合わせて取り込もうとも思ったのですが、どのバージョン用のデータかわからない、ほとんどゲームをやっておらずどの文章がどこで表示されるべきとされていたのか調べてすり合わせるよりgoogle翻訳にコピペしたほうが早い、といった理由で現時点では反映しておりません。
著作権の問題もありますし、公開するデータとして使用するには適さないということもあります。

ところで、CorsixTH側の問題なのですが、表示したい文字列が長すぎると、ゲームがクラッシュします

正確には、クラッシュというよりは間抜けにも64bitアプリなので際限なくメモリをどんどん食いつぶしていって、最後にはスラッシングを起こしてOSを巻き込んでくれます。

原因は単純で、すぐにわかりました。

横文字文化圏の人には単語ごとに空白を入れない言語があるということを知らないのでラインブレーク処理が完全に抜け落ちていて、できるわけがないのにどうにかしてワードラップできないかと延々処理を続けるからです。まあ、世の中にはマルチバイト文字があるということすら想定していないスバラシイ人たちも大勢いるわけで、この程度はどうというこたあありませんわね。Capitalism Labもそいつで苦労しましたし。

そんなわけで、訳文を自前で修正なさる方は表示される領域の大きさに合わせて自前でホワイトスペースを入れ、CorsixTHがラッピングできるようにしてやらなければなりません。

シートから作ったTSVからのluaソース生成スクリプトにはその辺を考慮したコードが入っており、スクリプトは冒頭にリンクいたしました作業シートにて「スクリプト2」として公開しておりますので、よろしければご利用いただければ幸いです。

作業シートには、クラッシュとなる原因となる訳文を特定する方法なども記載しておりますので、そちらもよろしければご参考に供せれば幸いです。

それにしても、機械翻訳でも何でも、母国語となるとドーンと印象が変わりますねぇ。
和訳が簡単そうだからという理由で手を付けてみましたが、ゲームも実際に面白そうです。
これからちょいちょい、プレイしてみたいと思います。

以上、駄文にお付き合いいただきまして、誠にありがとうございました。

2 件のコメント:

  1. 所持していないゲームではありますが、大変興味深い記事でした。
    楽しく読ませて頂きました。

    返信削除
  2. 有り難く使わせてもらっています
    最新の0.63もお願いしたいです…(小声)

    返信削除