きっかけは・・・
Tribal Hunterという膨らまし系ゲームを、へたっぴなりにやっているのですが。
英語しかなく、英語が弱いオイラでは、ストーリーが良く分かりません。
アプリ構造を眺めてみると、翻訳者さん用に、Json形式でスクリプトが組まれているのを発見したので。
スクリプト内容を1行づつGoogle翻訳に投げつけて、随時翻訳していくスクリプトを組んでみました、とさ。
実行画面
こんな感じになりますよ。
ちょっと改造してやれば、いわゆる「言語ファイルがUTF-8な1行1要素のスクリプト」系には、汎用的に使えると思います。
Google Apps Scriptの準備
以下URLを参考に、Google Apps Scriptを組みました。
https://qiita.com/satto_sann/items/be4177360a0bc3691fdf
上の記事の内容をそのままGoogleAppsScriptにコピーして。
一度「実行」して(呼び出し関数名の変更のため)。
デプロイ→ウェブアプリ→アクセスできるユーザーを「全員」にすればOK!。
データ構造
Tribal Hunterでは、以下ディレクトリに英語のスクリプトが展開されています。
*Stramからインストールした場合
*まあ環境によりパスは変わります、適当に探してみてください
C:\Program Files (x86)\Steam\steamapps\common\Tribal Hunter\Resources\ScriptData\eng
内容はJsonで、左ハッシュ、右内容の単純なものです。
ハッシュ、及び内容が「EOF」のものは、まあファイル終了を意味しているようです。
データハンドリング
作業用ディレクトリを作り、上記「eng」ディレクトリをコピーします。
また、翻訳スクリプト出力用に、「output」ディレクトリを作成します。
翻訳スクリプト
まあサクっと作りたかったので。
perlで組みました。
Windows10の、コマンドプロンプトで動作します。
Activeperl ActivePerl-5.20.2.2002-MSWin32-x64-299195 を使用しました。
$engdir = "./eng/";
$outputdir = "./output/";
$logfile = "./translatelog.txt";
$transurl = "https://script.google.com/macros/s/[[MASK]]/exec";
$translang = "ja";
$curlcommand = "curl -s -L ";
opendir (DIR,$engdir);
(@dirarray) = readdir (DIR);
closedir (DIR);
open (LOG,">>$logfile");
foreach $dirline (@dirarray) {
$dirline =~ s/[[:cntrl:]]//g;
if ($dirline !~ /txt/) {
next;
}
$basefile = $engdir . $dirline;
$outputfile = $outputdir . $dirline;
print "targetfile: $basefile\n";
open (INPUT,$basefile);
(@basearray) = (<INPUT>);
close (INPUT);
$outputdata = "";
foreach $baseline (@basearray) {
if ($baseline =~ /\"(.+)\": \"(.+)\"/) {
$targethash = $1;
$targetstring = $2;
$translatestring = "";
if ($targetstring ne "EOF"){
$encodedtargetstring = '"' . $targetstring . '"';
$encodedtargetstring =~ s/([^0-9a-zA-Z])/"%".uc(unpack("H2",$1))/eg;
$encodedtargetstring =~ s/ /+/g;
$commandline = $curlcommand . $transurl . "?text=". $encodedtargetstring . '^&source=en^&target=' . $translang;
for $i (1..5) {
(@commandresultarray) = `$commandline`;
$commandresultdata = "";
foreach $commandresultline (@commandresultarray) {
$commandresultdata .= $commandresultline;
if ($commandresultline =~ /\"code\":200/) {
if ($commandresultline =~ /\"text\":\"(.+)\"/) {
$translatestring = $1;
last;
}
}
}
if ($translatestring ne "") {
last;
}
print "$commandresultdata\nFailed!. retry... ( $i )\n";
sleep (5);
}
if ($translatestring ne "") {
$translatestring =~ s/\\\"//g;
$translatestring =~ s/「//g;
$translatestring =~ s/」//g;
$baseline = "\t\t" . '"' . $targethash . '": "' . $translatestring . '",' . "\n";
print "$dirline\t$targethash\t$targetstring\t$translatestring\n";
print LOG "$dirline\t$targethash\t$targetstring\t$translatestring\n";
}
}
}
$outputdata .= $baseline;
}
print "outputfile: $outputfile\n";
open (OUTPUT,">$outputfile");
print OUTPUT $outputdata;
close (OUTPUT);
}
変数
変数名 | 目的 |
---|---|
$engdir | engディレクトリ |
$outputdir | 出力ディレクトリ |
$logfile | ログファイル |
$transurl | GoogleAppsScriptのURLを指定 |
$translang | 翻訳先の言語を指定 |
$curlcommand | curlコマンド、及びオプションを指定 |
出力結果
まあこうなりました。
http://kei.eucaly.net/temp/tribalhunter_trans_ja.zip
ログファイルを参照することで、翻訳の対照が出来ます。
このままだと意味は分かるが最低限なので、それっぽい修正の叩きにでもなればいいな、と。
API呼び出し制限
どうやら1日の呼び出し回数が決まってるみたいで、1回は上限に引っかかります。
引っかかった場合は、エラーが出力されるので、複数日に分けてスクリプトを実行してみて下さい。
その際、engディレクトリ下のファイルを日毎に入れ替える必要があります。
他環境、他言語での留意点
翻訳結果の囲み除去
Google翻訳は、翻訳結果を囲んで出力します。
日本語の場合は「」で囲みます。
他言語翻訳の場合、囲み文字が異なる可能性があります。
perlスクリプト内以下が、囲み除去です。
$translatestring =~ s/「//g;
$translatestring =~ s/」//g;
bash ( Linux )使用時の変更点
スクリプト内でcurlを呼び出していますが、Windowsとbashでは、エスケープコマンドが違います。
bashの場合、以下のような書き方になります。
$commandline = $curlcommand . $transurl . "?text=". $encodedtargetstring . '\&source=en\&target=' . $translang;
まあつまり、「&」をエスケープする必要があり、Windowsはエスケープ文字が「^」、bashは「\」なのです。
Windows8.1以前で使用する場合
curlがOSに付属していない為、別途インストール、もしくはwgetなどの代替が必要です。
Windows環境で、コマンドプロンプトの出力結果が文字化けする場合
「chcp 65001」を実行し、言語をUTF-8にしてください。
また、コマンドプロンプトのフォントを「MSゴシック」などに設定し、日本語が表示できるようにしてください。
なお、コマンドプロンプトの出力結果はあくまでも参考です。
で、使えたのか
無理でした・・・。
ゲーム内フォントに、日本語が定義されていないらしくてね。
フォント入れ替えが出来るかどうか、問い合わせてみたいと思います、、、しょぼーん。
以上です。