1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google翻訳を用いたJsonの翻訳

Last updated at Posted at 2021-05-08

きっかけは・・・

Tribal Hunterという膨らまし系ゲームを、へたっぴなりにやっているのですが。
英語しかなく、英語が弱いオイラでは、ストーリーが良く分かりません。
アプリ構造を眺めてみると、翻訳者さん用に、Json形式でスクリプトが組まれているのを発見したので。
スクリプト内容を1行づつGoogle翻訳に投げつけて、随時翻訳していくスクリプトを組んでみました、とさ。

実行画面

こんな感じになりますよ。
tri_tran2.png
ちょっと改造してやれば、いわゆる「言語ファイルが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 を使用しました。

transtest.pl
$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ゴシック」などに設定し、日本語が表示できるようにしてください。
なお、コマンドプロンプトの出力結果はあくまでも参考です。

で、使えたのか

無理でした・・・。
ゲーム内フォントに、日本語が定義されていないらしくてね。
フォント入れ替えが出来るかどうか、問い合わせてみたいと思います、、、しょぼーん。

tri_fnt.png

以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?