え!!5分で38言語対応を!? できらあっ!【AutoLocalization】

※ ただし、下準備は終わっているものとする

対象読者

・とりあえずアプリを多言語対応してみたい人
・翻訳精度はあまり求めない人
・GoogleSpreadSheet の GOOGLETRANSLATE 関数を知らない人

はじめに

こんにちは。Jaol-Industry の Jaol です。
個人でアプリ開発をしております。

みなさん、開発順調ですか?
開発が終わり、リリースする際に悩む点のひとつに配信対象国があります。

せっかく完成したのだから世界中の国々を対象にリリースしたい! でも言語が日本語しか対応していない。。。 と悩まれている方も多いと思います。

そこで今回ご紹介するアセットがこちら
AutoLocalize

AutoLocalization


こちらのアセットはUnity技術ブログで有名な kan さんが作られたアセットです。kan さん自身がご説明されているのでとてもわかりやすい。そしてセール無しで定価でもとても安い。

Windowsで開発される場合は以下の対応をしないと言語ファイルを修正しても再読込してくれないので対応が必要です。
ここで結構ハマること多いです。言語ファイル閉じないとUnityがアクセスできない現象も起こったりします。

下準備

0からやっていきましょう。新規プロジェクトでスタートします。
翻訳するためのドロップダウンリストとテキストを用意します。

テレビのテスト放送画面みたい

AutoLocalizationをUnityにインポートすると以下のようにAssets配下に表示されます。
LocalizationDataという言語ファイルを開きます。

以下のような感じで編集します。空文字などが入っているセルなどがあるとうまく読み込めない(言語ファイルを修正してもコードが更新されない)みたいなので、うまく読み込めていなければ空白のセルを改めて削除してみてください。
言語ファイルを保存するとUnityにてコンパイルが走り、自動でコードが生成されるはずです。

とりあえず日本語、英語、中国語をお試しで設定してみます。

翻訳対象のテキストに Text Localizer を Add Component します。
ちなみにInspectorからではなく、ソースコードから設定することも可能です。

Text.text = LocalizationData.Entity.GetLocalizedText(LocalizedTextKey.設定したい翻訳対象キー);

以下の DropDownScript.cs をドロップダウンに Add Component します。

using AutoLocalization;
using UnityEngine;
using UnityEngine.UI;

public class DropDownScript : MonoBehaviour
{
    public enum EmLanguageType
    {
        emNone = 0,
        emJapanese = 1,
        emEnglish = 2,
        emChinese = 3,
        emSize = 4
    }

    void Start()
    {
        Dropdown dropdown = this.GetComponent<UnityEngine.UI.Dropdown>();

        // リスナに登録
        dropdown.onValueChanged.AddListener(delegate {
            LocalizationData.Entity.ChangeLanguage((AvailableLanguage)dropdown.value);
        });

        // enum を設定
        for (long lIdx = 0; lIdx < (long)EmLanguageType.emSize; lIdx++)
        {
            string sEnumName = EmLanguageType.GetName(typeof(EmLanguageType), lIdx);
            sEnumName = sEnumName.Substring(2, sEnumName.Length - 2);
            Dropdown.OptionData item = new Dropdown.OptionData { text = sEnumName };
            dropdown.options.Add(item);
        }
    }
}

実行すると以下のようになります。

翻訳すると文字の長さが変わり、翻訳した文字が表示されなくなることもあるので Inspector で Text の BestFit にチェックを入れておきましょう。
長さがまちまちだと文字ごとにサイズがガチャガチャするのでテキストオブジェクトの Width, Height に気をつけてください。

下準備はこれで終わりです。

本題:38言語対応する

ここからが本題ですが、なぜ38言語かについて。

まず、Unityが取得できる実行環境の言語は42言語あります。
SystemLanguage – Unity スクリプトリファレンス

そして、今回 GoogleSpreadSheet の GoogleTranslate 関数を使うので、GoogleTranslate 関数の対応言語と照らし合わせたところ38言語でした(UnityおよびGoogleの対応言語が増えてる可能性があるので情報が古いかもしれません)。

では GoogleSpreadSheet にアクセスしてみましょう。
https://docs.google.com/spreadsheets/

新しいシートを作成し、以下の関数を利用します。
GOOGLETRANSLATE(“Hello World”,”en”,”es”)
GOOGLETRANSLATE – ドキュメント エディタ ヘルプ

お試しで作った表に、言語の列を追加し、あとは関数に任せると以下のようにまとめて一気に翻訳できます。

設定したものが以下となります。
日本語から他の言語に翻訳するよりも英語から他の言語に翻訳したほうが精度高いかな? という憶測からソース言語は英語にしています。
https://docs.google.com/spreadsheets/d/1VVV7-FdnTc581m38-8Lk798pKeuL5OiZWw_D74dh8Dc/edit?usp=sharing

あとは上記で変換されたテキストを言語ファイルに貼り付け、ドロップダウンを翻訳言語数に対応させれば完了です。

    public enum EmLanguageType
    {
        emNone = 0,
        emJapanese = 1,
        emEnglish = 2,
        emChinese = 3,
        emKorean = 4,
        emAfrikaans = 5,
        emArabic = 6,
        emBulgarian = 7,
        emCatalan = 8,
        emCzech = 9,
        emDanish = 10,
        emGerman = 11,
        emGreek = 12,
        emSpanish = 13,
        emEstonian = 14,
        emBasque = 15,
        emFinnish = 16,
        emFrench = 17,
        emHebrew = 18,
        emSerboCroatian = 19,
        emHungarian = 20,
        emIndonesian = 21,
        emIcelandic = 22,
        emItalian = 23,
        emLithuanian = 24,
        emLatvian = 25,
        emDutch = 26,
        emNorwegian = 27,
        emPolish = 28,
        emPortuguese = 29,
        emRomanian = 30,
        emRussian = 31,
        emSlovak = 32,
        emSlovenian = 33,
        emSwedish = 34,
        emThai = 35,
        emTurkish = 36,
        emUkrainian = 37,
        emVietnamese = 38,
        emSize = 39
    }

タイトル画面で実行環境の言語を取得し設定すると良いでしょう。

        for (long lIdx = 0; lIdx < (long)EmLanguageType.emSize; lIdx++)
        {
            string sEnumName = ConstMgr.Em_LanguageType.GetName(typeof(EmLanguageType), lIdx);
            sEnumName = sEnumName.Substring(2, sEnumName.Length - 2);

            // 実行環境の言語を取得
            string deviceLanguage = Application.systemLanguage.ToString();

            // 実行環境の言語と対応する言語があればデフォルト言語として設定
            if (deviceLanguage == sEnumName)
            {
                LocalizationData.Entity.ChangeLanguage((AvailableLanguage)lIdx);
            }
        }

短時間で一気に多言語対応する方法は以上です。

最初に下準備は終わっているものとすると記載しましたが、翻訳対象のテキストが多いとその分Inspectorやスクリプトでの設定箇所が増えるので、その部分に時間がかかります。

あと気をつけるべき点ですが、テキスト内に数値を入れたいときがあります。
“主人公は敵から 50 のダメージを受けた” といった場合、数値が入る箇所が言語によって異なるので、”主人公が敵から受けたダメージ量 : 50″ のように数値を最後に持っていくなど工夫する必要があります。


ちなみに私はウキウキで38言語対応したらドロップダウンリストがバナーに引っかかりAdMobから配信停止されたことがあるので、ドロップダウンと下部バナーについては皆様気をつけてください。

おまけ:多言語対応してみた結果

開発したアプリ紹介も兼ねてご紹介します。

CityGuardians

対応言語は日本語、英語、中国語(簡体字)、韓国語の4言語。
(not set) はおそらくリリース時にテストされてる Google の中の人。
簡体字でクリア画面シェアしていただいたユーザさんいらっしゃったので一応クリアできるレベルでは翻訳できている?

VibitLink

対応言語はこの記事と同様に38言語。
CityGuardians が Japan 80%に対してこちらは50%なので効果あったのかな?
CPU 対戦の他に Photon でリアルタイムオンライン対戦を実装したけど、同じタイミングでアクティブユーザ二人になることが殆どないので申し訳ない。。。

コンビニ錬金術師

こちらは日本語のみ対応。
チュートリアル入れるためにストーリー要素入れたらテキスト量が多くなってしまったので翻訳は現在未定。
Japan 90%ぐらいだけど、翻訳したらバラけるかな? といったところ。

ちなみに日本でしかリリースしてないはずなんだが。。。不思議だなぁ。。。
※ AdMobは反応してくれているようなので良し

一通り多言語対応の結果書いてみて思ったんですが、日本でプロモーション頑張れば頑張るほど日本のユーザ増えて相対的に海外のユーザ減るんでそのせいかも? レビューサイトにレビュー依頼とか頑張ったのはコンビニ錬金術師ですし、CityGuardiansもTwitterで固定ツイートしてたし、ViBitLinkは試しリリースみたいな感じであまりプロモーションしてなかったので。。。

最後に

いかがでしたか?(言いたかった)

言語ファイルを一括で多言語対応するのは GoogleSpreadSheet を使えば一瞬で終わるのですが、一つ一つのテキストに Inspector やコードで言語設定するのに時間がかかります。
新機能入れるときに翻訳対応しないとなーって思うとやはりコストは増えますね(そういうとき面倒なので簡単な名称は英語にしちゃったりします)。

多言語対応した感想ですが、やはり海外でプロモーションしないとアプリ自体の知名度がないので遊ばれないですね。かと言ってプロモーションの前段階として翻訳が要るので海外でのプロモーションは次のステップかな。


最後までお読みいただきありがとうございました。
現場からは以上です!!!11

Asset

Posted by jaol-industry