Artstageで多言語対応を行うにあたって、アプリ内文言を各言語に翻訳したエクセルデータを作る必要がありました。

もちろん私は色んな言語の通訳なんてできませんし、通訳を頼むアテもありません。

よって、Google翻訳を使おうと決めました。

機械翻訳なんかでいいのか?と思われるかもしれませんが、Google翻訳は2年前にディープラーニングを使った高精度な翻訳エンジンに切り替わり、劇的に読みやすい翻訳をしてくれるようになりました。

私はそれまではYahoo翻訳をアテにしましたが、あまりのクオリティ向上に速攻でGoogle翻訳に乗り換えました。

それに海外製のソフトウェアを使ってても、雑な日本語でも無いよりはありがたいと感じますし、そういうノリでやっていきます。

とは言え、文言を一つ一つGoogle翻訳で翻訳してエクセルに打ち込んでいくのは手間がかかって面倒くさいです。

そこでググッてみると、Google スプレッドシートなら一発でセルを翻訳してくれる関数(GOOGLETRANSLATE)があるとの事。

これは素晴らし~と思ったら、なんとこの関数だとディープラーニング高精度翻訳エンジンじゃない翻訳になっちゃうそうです。

ディープラーニング以前のGoogle翻訳と言えばかなり残念な感じの奴です。

困ったな~とググッたら、Google Apps Script の LanguageAppというAPIを使えば高精度な翻訳ができるそうです!

Google Spreadsheet の googletranslate 関数の代わりに LanguageApp を使うワークシート関数を作ってイケてる翻訳ができるようにする

これで英語から日本語とかドイツ語、フランス語に一発翻訳できるようになりました。

やったぜ。

しかし運用しているうちに問題が出てきました。

上記リンクの記事だとスプレッドシートのカスタム関数として実装してますが、この方法だと翻訳結果が保持されないのでスプレッドシートを開きなおしたりするたびに再び関数が実行されます。

そしてLanguageAppのAPIがジャブジャブ叩かれてしまい、すぐに「1日のtranslateの制限回数に達しました」みたいなエラーが出て、丸一日待たないと復帰しない問題に直面しました。

なのでカスタム関数じゃなくてメニューコマンドとして手動で実行して選択中のセルを翻訳する感じのスクリプトを書きました。

B列に英語の文言が入っていて、C列以降に英語から翻訳した翻訳文章が入る感じです。どの言語に翻訳するかは各列の1行目に国コード(たとえば日本語なら”ja”)を入力して指定します。

こんな感じです。

新しく文言を追加したいだけなのにシート開いただけで全部のセルが再翻訳走った挙句API制限に引っかかって全部のセルがエラー表示になっちゃうみたいな事態を回避できるようになりました。

ただし、手動で更新する形になったので、英語だけ文言を更新したけど翻訳の更新するの忘れたって事が無いように注意が必要です。

ちなみに、完成した翻訳エクセルファイルをUnityアプリで読み込むには、テラシュールブログさんのエクセルインポーターを使わせていただきました。

【Unity】Excel Importer Maker、xlsxに対応

死ぬほど便利です。

後はUnityでApplication.systemLanguageでパソコンの設定言語を取得して、それに応じて文言切り替えとかしてやればOKです。

【追記:2019/01/03】スクリプト実行時間6分制限を回避する

上記のスクリプトを運用している内に、また新しい問題が発生しました。

スクリプトの実行時間の最大6分制限に引っかかってしまう問題です。

1箇所翻訳する度に1秒のスリープを挟む必要があるので、360個のセルを翻訳した時点で6分経過してスクリプトが止まってしまいます。

回避策をググッたところ、スクリプトの中で自分自身を定期実行トリガーに登録して5分毎にスクリプトを中断→再開を繰り返す方法があるようです。

Google Apps Script で6分以上の処理をする

こちらの記事を参考にしてスクリプトを改良しました。

解説すると、GoogleAppScriptではPropertiesを使って変数を文字列に保存できます。(Unityで言うとPlayerPrefs)

Propertiesにどのセルまで処理が終わったかを保存しておくことで、トリガーでスクリプト再開した時に続きから処理を行うことができます。

面倒なのがトリガーから呼ばれた場合のスクリプトからはgetActiveSheetなどが使えず、選択範囲も取得できません。

なので、最初に選択範囲もPropertiesに保存しておく必要があります。トリガーからアクティブシートを取得できるように、シートのIDやシート名も同様にPropertiesに保存しておきます。

これで360個以上のセルを一度に処理できるようになりましたが、1日のtranslate実行回数制限の制約は依然としてあるので、制限に引っかかった時点でスクリプトは止まってしまいますのでご承知おきを。