Unityで多言語化対応する方法を調べた

先日、GrowthSoftware初となるiOS向けのアプリ、「フェレットといっしょ」をリリースしました。

ひとまず日本のみの対応ということで、日本語版のみ対応となってます。

ところが、ありがたいことにアメリカ国内でダウンロードしてくれてる方がおられる・・・。これは英語版が必要だ!!ってなったので多言語化対応しようと思いました。

多言語化の方法

多言語化対応する方法を調べました。

こちらのQiitaを参考にさせてもらいました。大変参考になりました。ありがとうございます!!

Unityでローカライズしたい。Textの、多言語対応ってどうやるのかな。

この記事によると、Unityのチュートリアルに多言語化対応のサンプルがあって、使えるとのこと。というわけで、ありました。

Recorded Video Session: Localization Tools
https://learn.unity.com/tutorial/recorded-video-session-localization-tools?language=en

必要なソースコード

UnityのRecorded Video Session: Localization Toolsチュートリアルサイトから、チュートリアルの素材をダウンロードします。

チュートリアルサイトから、ソースファイルをコピーしてファイルに保存。

LocalizationData.cs
LocalizationManager.cs
StartupManager.cs
LocalizedText.cs
LocalizedTextEditor.cs

プロジェクトのScriptsフォルダに入れます。

読み込み元のJSONファイルを作る

チュートリアル素材を見るに、StreamingAssetsフォルダに言語ごとのjsonファイルを置く必要がありそうです。

ということでJSONファイルを作ります。どうせなら自動生成したいけどまた次の機会に・・・。

localizedText_jp.json

{
  "items":[
    {"key":"TITLE","value":"フェレットといっしょ"},
    {"key":"TOUCH_SCREEN","value":"TouchScreen"}
  ]
}

localizedText_en.json

{
  "items":[
    {"key":"TITLE","value":"We Love Ferret"},
    {"key":"TOUCH_SCREEN","value":"TouchScreen"}
   ]
}

localizedText_zh-Hans.json

{
  "items":[
    {"key":"TITLE","value":"与雪貂在一起"},
    {"key":"TOUCH_SCREEN","value":"触摸屏"}
   ]
}

localizedText_zh-Hant.json

{
  "items":[
    {"key":"TITLE","value":"與雪貂在壹起"},
    {"key":"TOUCH_SCREEN","value":"觸摸屏"},
   ]
}

せっかくなので中国語も。

JSONを読み込む

サンプルのLocalizationManagerを起動するためのスクリプトを作成します。
ついでにOSの使用言語に合わせて、使用する言語をここで切り替えることにしました。

LocalizationManagerStarter.cs

 using System.Collections;
 using UnityEngine;

namespace _Project.Scripts
{
    /// <summary>
    /// LocalizationManagerを起動するクラス。
    /// 同じオブジェクトにLocalizationManagerもつけておくとNullReferenceExceptionを避けれる。
    /// </summary>
    [DefaultExecutionOrder(-1)]
    public class LocalizationManagerStarter : MonoBehaviour
    {
        IEnumerator Start()
        {
            // OSの使用言語を取得します。
            var lang = Application.systemLanguage;
            string setlang = "";
            if (lang == SystemLanguage.Japanese)
            {
                setlang = "localizedText_ja.json";
            }
            else if (lang == SystemLanguage.ChineseSimplified)
            {
                setlang = "localizedText_zh-Hans.json";
            }
            else if (lang == SystemLanguage.ChineseTraditional)
            {
                setlang = "localizedText_zh-Hant.json";
            }
            else
            {
                setlang = "localizedText_en.json";
            }

            // 多言語化対応モジュールを初期化します。
            LocalizationManager.instance.LoadLocalizedText(setlang, setFont);
            while (!LocalizationManager.instance.GetIsReady()) yield return null;
        }
    }
}

あとはお好みのオブジェクトにLocalizationManagerStarter.csと LocalizationManager.csをアタッチしておけばOKです。

TextにLocalized Textをつける

多言語化するTextと一緒に、Localized Textスクリプトもアタッチしておきます。
さっきのJSONのキーを設定しておくと、表示時に差し替えてくれます。ラクチン。

あれ・・・中国語文字化けしてる・・・

文字化けの原因はフォントが対応してないから

日本語と英語までなら良かったんですが、日本語向けのフォントを使っていたので中国語の一部が化けちゃってます。
さすがにコレで多言語対応しました!!とは言えないので・・・対策します。

言語ごとにフォントを切り替える

各言語全てに対応したフォントは数少なく、フォントが縛られてしまう。
ならば各言語ごとにフォントをロードしてしまえ!!という考えで以下の改修をしました。

LocalizationManager.cs

使うフォントを覚えてもらうためのプロパティを追加します。

    public class LocalizationManager : MonoBehaviour {
        // 言語設定によって使用するフォントを記憶しておく。
        public Font LocalizedFont { get; set; }

LocalizationManagerStarter.cs

言語が選択された際にフォントを読み出すようにしました。
Assets/Resources/Fonts以下に読み出すフォントを配置します。
ひとまずm+フォントをお借りしました。

    /// <summary>
    /// LocalizationManagerを起動するクラス。
    /// 同じオブジェクトにLocalizationManagerもつけておくとNullReferenceExceptionを避けれる。
    /// </summary>
    [DefaultExecutionOrder(-1)]
    public class LocalizationManagerStarter : MonoBehaviour
    {
        IEnumerator Start()
        {
            // OSの使用言語を取得します。
            var lang = Application.systemLanguage;
            string setlang = "";
            Font setFont;
            if (lang == SystemLanguage.Japanese)
            {
                setlang = "localizedText_ja.json";
                setFont = Resources.Load<Font>("Fonts/mplus-1c-light"); 
            }
            else if (lang == SystemLanguage.ChineseSimplified)
            {
                setlang = "localizedText_zh-Hans.json";
                setFont = Resources.Load<Font>("Fonts/mplus-1c-medium");
                
            }
            else if (lang == SystemLanguage.ChineseTraditional)
            {
                setlang = "localizedText_zh-Hant.json";
                setFont = Resources.Load<Font>("Fonts/mplus-1c-medium"); 
            }
            else
            {
                setlang = "localizedText_en.json";
                setFont = Resources.Load<Font>("Fonts/mplus-1c-light"); 
            }

            // 多言語化対応モジュールを初期化します。
            LocalizationManager.instance.LoadLocalizedText(setlang, setFont);
            while (!LocalizationManager.instance.GetIsReady()) yield return null;
        }
    }

LocalizedText.cs

テキストといっしょにフォントもセットします。

     void Start () 
     {
         Text text = GetComponent<Text> ();
         text.text = LocalizationManager.instance.GetLocalizedValue (key);
         text.font = LocalizationManager.instance.LocalizedFont;
     }

あとは表示を確認してフォントが適用されていれば完了です。

まとめ

多言語化って難しい。

Leave a Reply

Your email address will not be published. Required fields are marked *