Google翻訳を用いたJsonの翻訳

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

# 実行画面
こんな感じになりますよ。
![tri_tran2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216885/5bdc68e9-d6ac-fd2b-1128-7bb29990c241.png)
ちょっと改造してやれば、いわゆる「言語ファイルがUTF-8な１行１要素のスクリプト」系には、汎用的に使えると思います。

# 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 を使用しました。


```perl: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呼び出し制限
どうやら１日の呼び出し回数が決まってるみたいで、１回は上限に引っかかります。
引っかかった場合は、エラーが出力されるので、複数日に分けてスクリプトを実行してみて下さい。
その際、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216885/1c7e3eba-2375-e185-9fa5-89d72245dd8a.png)


以上です。