MRが楽しい

MRやVRについて学習したことを書き残す

MRTKとUnity Localizationを使ってHoloLens2アプリをローカライズする

本日は Unity と HoloLens の技術調査枠です。
HoloLens2アプリでUnity Localizationを使ってローカライズする方法を記事にします。

前提条件

MRTK を用いて HoloLens2 向けアプリのプロジェクトを作成します。
MRTK を使った基本プロジェクトの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

Unity Localization のセットアップ手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

MRTKのボタンコンポーネントローカライズ設定を行う

MRTK のボタンコンポーネントローカライズ設定を行ってみます。
以下の通り、MRTK のボタンプレハブを配置したサンプルシーンを作成しました。

[Localization Scene Controls]ウィンドウで[Track Changes]にチェックを入れてローカライズ設定を保存します。
この状態でボタンプレハブの Button Config Helper コンポーネントの[MainLabelText]を編集します。

以下の通り、Button Config Helper コンポーネントに対して編集を行ってもローカライズ設定が保存できました。

因みに Game Object Localizer コンポーネントは実際に文字列を設定している TextMeshPro コンポーネントを持つオブジェクトの方に追加されています。

シーンを再生して動作を確認します。
MRTK のボタンプレハブでもロケールに応じて文字列を変更することができました。


実機での動作

本アプリを HoloLens2 にデプロイして起動します。
このとき、HoloLens2 でアプリの言語設定を「日本語」にしていても英語のロケールで実行されてしまいます。

HoloLens2のロケール判定

これは UWP アプリでは CultureInfo.CurrentUICulture の判定が DefaultContext.Languages コレクションの最初の値で固定されているためです。
UWP アプリでもシステムの言語設定に合わせてロケールを切り替えるため、以下のスクリプトを追加して Application.systemLanguage の値を元にスクリプトから直接ロケールを変更するようにしました。
・LocaleChanger.cs

using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;

public class LocaleChanger : MonoBehaviour
{
    async void Start()
    {
        // Application.systemLanguage の文字列が Japanese ならばロケールを ja に切り替える
        LocalizationSettings.SelectedLocale = Locale.CreateLocale(
            Application.systemLanguage.ToString().StartsWith("Japanese") ?
                "ja" : "en");
        
        // 変更を待機する
        await LocalizationSettings.InitializationOperation.Task;
    }
}

スクリプトを適当なオブジェクトに設定してアプリを再デプロイします。
以下の通り、日本語のロケールに切り替わることが確認できました。

HoloLens2でのロケール切り替え

HoloLens2でアプリのロケールを切り替えたい場合は[設定]アプリを起動し、[時刻と言語]から[言語]タブを開きます。
[アプリとWebサイト]を選択して、[優先する言語]の順番を入れ替えて優先するロケールを切り替えられます。

例えば、この項目を 英語 -> 日本語 の順に並び替えると、取得できる Application.systemLanguage が変わるため、アプリのロケールが切り替わります。