📝

Unity LocalizationのSmart Stringを使ってスクリプトから動的にローカライズテキストを変更する

2025/02/01に公開

はじめに

OSSのデスクトップマスコット「uDesktopMascot」を開発しています。

https://github.com/MidraLab/uDesktopMascot

こちらは多言語に対応したプロジェクトにしていくために、unityのLocalizationを使って多言語対応を行っています。

TMPにコンポーネントを付けたシンプルなローカライズ対応の方法を以下の記事にまとめています。

https://zenn.dev/midra_lab/articles/66d17069513dc1

LocalizationデータをGitHub Actions + openaiのapiを使って自動翻訳をするフローを記事にしています。合わせてローカライズ対応のワークフローとしてご覧ください

https://zenn.dev/midra_lab/articles/2a33206cd88276

デモ

(少しわかりずらいですが) 「新しい~」の文言の v{x.x.x}は、versionごとに動的に変更しています。

開発環境

  • Unity 6000.0.31f1(IL2CPP)
  • Localization 1.5.4

スクリプトからSmart Stringを使う

Localize Tablesの設定

以下のように必要データをLocalize Tablesに追加しているものとします。

Valueは 新しいVerのv{0}が\nリリースされています になります。

またSmart Stringを使う場合は、以下のようにValueの設定からSmartStringを有効にする必要があります。

テーブル名とキーから LocalizedString オブジェクトを作成

まずはローカライズのテーブルからkeyを指定して、ローカライズデータを取得します。

public static LocalizedString GetLocalizedStringFromTable(string tableName, string key, params object[] arguments)
{
    var localizedString = new LocalizedString(tableName, key);

    if (arguments != null && arguments.Length > 0)
    {
        localizedString.Arguments = arguments;
    }

    return localizedString;
}

LocalizedString オブジェクトからローカライズされた文字列を取得

ローカライズされた文字列の非同期取得で取得して、対象の言語に変更したい値を結合した文字列を返します。

        public static async UniTask<string> GetLocalizedStringAsync(LocalizedString localizedString, CancellationToken cancellationToken)
        {
            try
            {
                return await localizedString.GetLocalizedStringAsync().ToUniTask(cancellationToken: cancellationToken);
            }
            catch (Exception ex)
            {
                Log.Error("ローカライズ文字列の取得中にエラーが発生しました: " + ex.Message);
                return string.Empty;
            }
        }

使用例

使用例は以下のようになります。テーブル名(const定義)とkeyおよび変更したい値のlatestVersion を渡して、結果をテキストに入れて更新します

        private async UniTask SetMessage(string latestVersion,CancellationToken cancellationToken)
        {
            // LocalizationUtility を使用してローカライズされた文字列を同期的に取得
            string message = await LocalizationUtility.GetLocalizedStringAsync(TableName, "MSG_NEW_VERSION",cancellationToken, latestVersion);

            // メッセージテキストを更新
            messageText.text = message;
        }
MidraLab(ミドラボ)

Discussion