自作ゲーム『パンダがまわれば地球がまわる』において、100以上の言語への対応と各国のユーザーによる翻訳データ修正システムを実装したので、その経緯や実装方法、今後の課題等についてまとめておきます。
なお、コード解説やサービス登録の手順等は省かせていただきますのでご理解下さい。

ローカライズしようと思った理由
自分のゲームを世界中の人に遊んでもらいたいと考え、取り組みを行うことにしました。
今後の自作品もなるべく多くの地域の方に遊んでもらえればと思っており、そのための準備・実験的な意味合いもあります。

ユーザー翻訳システムの概要
ユーザー翻訳システムは、ゲームを遊んでくれたユーザー自身に翻訳を行ってもらうことを目的としたものです。
今回のゲームのローカライズは大部分をGoogle翻訳によって行うため、正確とは言えない表現が多く含まれます。そういった不正確な部分をユーザー自身に修正してもらうために導入することにしました。
翻訳フォームから訂正データを送信してもらい、データを反映させて修正していく仕組みになっています。
翻訳フォームの実装については、後にもう少し詳しく書きたいと思います。
Screenshot_20180501-062938
スプレッドシートによるテキストの管理
パンダがまわれば~はもともとUnity一週間ゲームジャムのために作ったゲームで、多くの変数や定数をコード上に直書きしていたため、テキスト毎にIDを振り直し、ID毎に対応した文字列を呼び出す仕組みを作りました。
この際、言語コードで呼び出される文字列を切り替えることができるようにしました。
言語コードには色々な形式がありますが、Google翻訳を使用することを考え基本的にGoogleの言語コードに従うことにしました。

Google Web Interface and Search Language Codes
https://sites.google.com/site/tomihasa/google-language-codes

テキストの管理はGoogleスプレッドシートで行うことにします。
スプレッドシートならネットへの接続があればどこでも編集が可能なのと、翻訳関数が用意されているからです。
スプレッドシート
言語毎に列を作り、キョウウンさん(@KyunghunL)にお願いしていた韓国語と、各言語への翻訳元となる英語以外の言語については各セルに以下のようなコードを入力し、自動翻訳されるようにしました。
=googletranslate(E163, "en", P$2)
この例だとE163の部分が翻訳対象セル、P$2は言語コードの記述されたセルです。
なお、Google翻訳のサイトの結果と上記のコードで得られる結果は異なります。
いくつか見てみると、サイトの方が自然な翻訳が多いように感じるので、大切なところはサイトの翻訳を参照したほうがいいと思います。
スプレッドシート翻訳
NCMBによるデータ受け取り
ユーザーから送信されたデータの受け取りは、ニフクラ mobile backendを使うことにしました。
適切かどうか分かりませんが、UnityのプラグインがNCMBとなっているので、以降NCMBと略します。

NCMBは登録後すぐに使える手軽なサービスで、とりあえず以下のようにコード中に記載するだけで、送信されたデータを受け取ることができました。
ncmb
送信されたデータは以下のように表示されます。定義の必要もないため、人によっては不安になるかもしれませんが、とにかく手軽に扱えるサービスです。
translation

翻訳フォームの実装
スプレッドシートでのデータ管理と、NCMBによる受け取りの目処が立ったので、翻訳フォームを実装していきます。
スプレッドシートでは各単語を羅列していますが、これをUIやストーリー等にカテゴライズし、カテゴリごとに内容の閲覧・修正をできるようにしました。
Screenshot_20180501-062938
なお、パンダがまわれば~はエンディングや2周目以降の要素もあるため、翻訳フォームにおいても最初の段階では表示されないようにし、それぞれクリア後に表示されるようにしました。
テキストデータのダウンロード
NCMBに送信されたデータは手動でスプレッドシートにコピペしてCSVファイルを作るという形にしています。
なお、今回は自動的にデータを適用するのではなく、手動でデータを更新することにしました。ユーザーに任せた場合、不適切な言葉が送信・登録されてしまう可能性もあり、通報ボタンの実装なども検討しなくてはいけなくなるためです。

作成されたCSVファイルはサーバーに置き、ゲーム起動時や一定時間毎にバージョンチェックを行う仕組みになっています。
パンダがまわれば~の翻訳テキストのデータ量は最終的に1.4MB程度で、それほど大きいサイズではありませんが、海外の地域によってはバカにならない通信量になる可能性もあるので、自動的にダウンロードするかどうかを設定できるようにしました。
DcfdVhIU8AIClcL
また、翻訳に協力してくれたユーザーへの感謝の印として、エンディングでクレジット掲載することにしました。
Screenshot_20180519-170901
ゲーム内のテキスト表示
テキストを表示する際に困ったのは以下の二点です。
・フォントをどうするか?
・言語によって文字列の長さが違いすぎる点

まず、フォントについて。
アルファベット以外の文字のフォントを探すのは非常に手間がかかります。
手始めに中国語のフォントなども探してみたのですが、そもそもフォントの数が少なかったり、ライセンスを読むのが困難だったりと壁にぶち当たりました。
その中で、中国語のフォントについて書かれたブログによりGoogleのNoto Fontの存在を知りました。
様々な言語用のフォントが用意されていることと、Sans Blackが私の思っていたイメージに近かったので採用を決定しました。

Google Noto Fonts
使用に当たってのライセンスは各自ご確認下さい。

次に、テキスト表示の問題について。
Unityのテキストコンポーネントにはオブジェクトの大きさに合わせて文字の大きさを変えてくれるBest Fitという機能がありますが、これがなかなかの罠で、スペースがそれほど入らない文字(タイ語や日本語等)では、文字が必要以上に小さく表示されてしまいます。
textSize
これについては、以下のようなコードでRectTransformのサイズ内に収まる大きさになるまでフォントサイズを小さくしていくという、端末への負荷を考慮しない方法で強引に解決することにしました。
textSizeFit
thai
RtoLの言語への対応
アラビア語やヘブライ語など、右から左への順に表示される文字については、Arabic Support for Unityの導入を検討しましたが、複数行表示の際に発生する表示崩れに対応することができず同アセットの導入は諦めました。

Arabic Support for Unity

仕方ないので、困った時のテラシュールブログさんを参考にして、文字列を格納するオブジェクトを垂直軸で反転させた上で再度文字を反転させるという方法で解決することにしました。

【Unity】UIで表現するテキストを1文字ずつ”動かす” - テラシュールブログ

試しにRtLモードで日本語を表示すると、以下のようになります。
TextReverse
ストア情報について
ストア情報も、基本的にスプレッドシートで自動翻訳したものを使用しています。

App Storeの場合は更新情報とプロモーション用テキストの欄が毎回リセットされてしまうのが困りものです。
毎回入力するのが非常に面倒なため、スプレッドシートにApp Store用のタブを作成しました。
原本のシートを参照するため、後はストアの申請画面で順番にコピペすればいいだけなのでかなり楽になりました。
AppStoreTab
なお、Googleの更新情報は前回更新時のものを使用することができるのでApp Storeに比べるとだいぶ楽ですが、こちらもXMLコードをコピーすればいいようにしました(赤枠が生成されたXMLコード)。
GoogleXml
スクリーンショットのローカライズ
キョウウンさんに韓国語に対応したことを伝えたところ「スクリーンショットが英語のままではよくない」という指摘を受けました。
確かに、自分がアプリを探してインストールする時も、英語のスクショのものだと躊躇してしまうことがあります。
ということで、スクショも他言語対応することにしました。

とはいえ一々撮影するのも手間が膨大になってしまうので、Unityのエディタから一度ボタンを押せば勝手に言語を切り替えてスクショを取得できるようなスクリプトを作成しました。
1フレーム毎に言語を変更してスクショを書き出すという非常に単純な内容となっていますが、かなりの労力をセーブすることができました。
MultiScreenshot
ローカライズの反応・結果
ツイッターにも書きましたが、まずローカライズした次の日からGoogle Playのオススメの更新に掲載されたらしく、一番多い日で1日当たりのDL数が1200近くまで行きました。
とはいえ直後に1日30DL辺りまで急落し、スクショをローカライズしたところ1日200程度まで回復しました。現在は1日当たり100近辺をさ迷っています(^_^;)
DdFCyDmU8AA9-Cq
DL数そのものよりも嬉しかったのが、ユーザー翻訳機能を使ってくれる人が出てきたことです。
今のところ適当に入力されたものや、使い方を勘違いしているものが多いのですが、それでもやはり反応があるのは嬉しいことです。
なお、海外での広告収入や課金収入は極端に低い印象です。
課金についてはローカライズの質の問題も関係しているのかもしれませんが、広告収入は日本向けに比べて10分の1程度という感じですね(AdMobを使用しています)。
感想と今後の展望
今回ローカライズと翻訳機能を導入して最も強く感じたのは、最初にローカライズした状態で公開したほうがいいのではないかということです。
AndroidでもiOSでも、リリース時のダウンロード数が多い印象なので、そこを逃すのはもったいない感じがします。
ただ、本当に他の国でも初期段階に勢いがあるのかどうかは分からないため、次のアプリではローカライズした状態で公開を開始して試してみたいと思います。

率直に言うと労力に比べて現実的な利益は得られていないのが現状ですが、日本以外の国の方に遊んでもらうことには刺激や可能性を感じるので、今後更に磨きをかけて、より使いやすい形や受け入れられやすい形を目指したいと思っています。

最後になりますが、『パンダがまわれば地球がまわる』はユーザー翻訳機能以外にも、メッセージ送信機能や新しいストーリー「ギャル編」を含んだ大幅アップデートを行っておりますので、よろしければこの機会にぜひ遊んでみていただけるとありがたく思います。
長々とお付きあいいただき、大変ありがとうございました。
スクショ1
パンダがまわれば地球がまわる
iOS / Android