KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

【Unity】多言語対応を行うときに動的に言語表示を切り替える方法

本記事では、UnityのLocalizationという機能を用いて多言語対応を行う際に、ソースコードから動的に表示言語を切り替える方法に関して記載します。

本記事での目的

多言語に対応したUIを容易に作成するためにUnityではLocalizationというアセットが用意されています。

Unityのインスペクターから「Localize String Event」コンポーネントを設定して多言語対応を行うという方法もありますが、設計上どうしてもソースコード上で言語切り替えを行いたいという場面もあります。

docs.unity3d.com

Web検索やチャットAIを使って調べてみると様々な情報が見つかりますが、筆者はLocalizationSettings.SelectedLocaleChangedというイベントを用いるとシンプルで良いと考えています。

そこで本記事ではこのイベントの使い方の使用例を紹介します。

Localizationの環境構築の方法に関しては、下記のテックブログをご覧いただくと理解が深まると考えています。

tech.kentem.jp

多言語対応のためのサンプルUI

今回は下記に示すようにドロップダウンとボタンから構成されるUnityEngineのUIを作成します。

ドロップダウンには「日本語」と「English」の2つの選択肢が記されています。

ドロップダウンの値を切り替えることでボタンの言語が切り替わります。

そしてこのボタンをクリックするたびにボタンの文字列が動的に変化するようにしています。

ソースコードの作成

ドロップダウンの作成

ではまずドロップダウンの設定を行います。

OnValueChangedメソッドでは、日本語用の設定の追加で設定された言語リストの中で、引数に指定された順番の言語で表示する処理を行っています。

using System.Linq;
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

public class SampleDropdown : MonoBehaviour
{
    private void Start()
    {
        this.GetComponent<Dropdown>().onValueChanged.AddListener(OnValueChanged);
    }

    private void OnValueChanged(int index)
    {
        LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales.ElementAt(index);
    }
}

ボタンの作成

では次にボタンの作成を行います。

初期表示の処理、ボタンをクリックした時の処理、言語切り替えの処理を行っています。

言語が切り替わったことを受け取る仕組みとして冒頭にも紹介したイベントを用いています。

using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.SmartFormat;
using UnityEngine.UI;

public class SampleButton : MonoBehaviour
{
    private int _clickedCount = 0;

    private void Start()
    {
        // テキストの初期表示
        UpdateText(LocalizationSettings.SelectedLocale);
        // ボタンがクリックされたら数を増やす
        this.GetComponent<Button>().onClick.AddListener(OnClick);
        // 言語の切り替えを行う
        LocalizationSettings.SelectedLocaleChanged += UpdateText;
    }

    private void OnClick()
    {
        this._clickedCount++;
        UpdateText(LocalizationSettings.SelectedLocale);
    }

    private void UpdateText(Locale locale)
    {
        var table = LocalizationSettings.StringDatabase.GetTable("TextTable");
        var value = table.GetEntry("SampleText").Value;
        var args = new { count = _clickedCount };
        var formatter = Smart.CreateDefaultSmartFormat();
        this.GetComponentInChildren<Text>().text = formatter.Format(value, args);
    }
}

テキストの更新方法

テキストはLocalizationSettings.SelectedLocaleChangedという、言語を切り替えたことを示すイベントが呼ばれたらUpdateTextメソッドで更新を行っています。

Localization Tablesの中からGetTableの引数で指定されたテーブルの情報と、GetEntryの引数で指定されたkeyを元に各言語での表示方法を取得してきます。

Table名に「TextTable」、Keyに「SampleText」を指定してします。

次に、System.String.Formatと同じように、書式指定子内の波括弧で囲われた変数に入る値として、クリック回数を代入します。

最後に、System.String.Formatに似た書式指定子であるSmartStringというUnityのLocalizationの機能を用いて文字列を作成し、Textコンポーネントに代入しています。

SmartStringを用いると数値から判断して表示する文字列を生成することが可能になります。

例えば{count:choose(1|2):once|twice|{count} times} clicked.という文字列にした場合を考えます。

この場合、一つ目の波括弧ではクリック回数が代入されます。

二つ目の波括弧では、クリック回数が1回であれば"once"、2回であれば"twice"、それ以外であれば"(数値) times"になるようになっています。

結果

これらのソースコードを保存し、実行すると冒頭の写真に示しているように

  • 日本語と英語を切り替えられる

  • ボタンをクリックした回数を選択中の言語に適した形式で表示される

ようになります。

SerializeFieldを用いるなどの対応をしている場合がありますが、この仕組みを用いるとインスペクターの値を参照する必要がなくなるので管理しやすくなると考えています。

また、他の方法と比べて簡潔なソースコードで必要十分な実装が可能であると考えています。

多言語切り替えを行う場合には使ってみることをおすすめします。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp