HoloLensでローカライズするシーンが出てきたため、
出来るかどうか試してみました。
HoloLensはまだ言語設定が英語しかサポートされていません。(2017年09月時点)
ストアにリリースして説明文をアプリ内で表示する際、やはりローカライズは必須です。
結論としてはタイムゾーンを取得してその設定が日本かどうかで判別するようにしました。
もっと良い方法があるかもしれませんが。。。
#環境
#サンプルコード
https://github.com/hirophilip/HoloLocalize
#実装イメージ
HoloLensでローカライズしてみた #HoloLens #HoloLensJP #MR pic.twitter.com/KskoWpfWqs
— がおまる@HoloLens研究者 (@gaomar) 2017年9月15日
#プロジェクト作成
新規でプロジェクトを作成し、MixedRealityToolkit-Unityを導入してください。
Hierarchyはこんな感じにしました。
- HoloLensCamera
- 3D Text
- 空のオブジェクト
###スクリプト作成
GSUtil.csというファイルを新規作成して、空のオブジェクトにアタッチしています。
ファイルの中身はこんな感じにしました。
具体的にはTimeZoneInfo
のIDを取得して中身がTokyo Standard Time
かどうかで判別しています。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GSUtil : MonoBehaviour {
private static GSUtil _Instance;
public bool isJapan = false;
public TextMesh helloText;
public static GSUtil Instance
{
get
{
if (_Instance == null)
{
_Instance = FindObjectOfType<GSUtil>();
}
return _Instance;
}
}
private void Awake()
{
// タイムゾーン取得Tokyo Standard Timeなら日本とする
#if UNITY_UWP
TimeZoneInfo timezone = TimeZoneInfo.Local;
if (timezone.Id.Equals("Tokyo Standard Time"))
{
isJapan = true;
}
else
{
isJapan = false;
}
#endif
// ローカライズファイル初期化
TextLocalizer.Init(isJapan);
}
// Use this for initialization
void Start () {
// Helloキーの値を取得する
helloText.text = TextLocalizer.Get("Hello");
}
// Update is called once per frame
void Update () {
}
}
###ローカライズファイル読み込みプログラム
次にローカライズしたファイルを読み込めるようにプログラムを作成します。
Resources
フォルダにそれぞれローカライズしたファイルを作成します。
ファイルの中身はこんな感じです。
※Helloの間はタブ文字(¥t)を入れてください
Hello Hello World!!
Hello こんにちは世界!
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public static class TextLocalizer {
// 文字列格納、検索用ディクショナリー
private static Dictionary<string, string> sDictionary = new Dictionary<string, string>();
/// <summary>
/// 文字列初期化
/// </summary>
/// <param name="isJapan">日本語かどうか</param>
public static void Init(bool isJapan)
{
// リソースファイルパス決定
string filePath;
if (isJapan)
{
filePath = "Text/japanese";
}
else
{
filePath = "Text/english";
}
// ディクショナリー初期化
sDictionary.Clear();
TextAsset csv = Resources.Load<TextAsset>(filePath);
StringReader reader = new StringReader(csv.text);
while (reader.Peek() > -1)
{
string[] values = reader.ReadLine().Split('\t');
sDictionary.Add(values[0], values[1].Replace("\\n", "\n"));
}
}
/// <summary>
/// 文字列取得
/// </summary>
/// <param name="key">文字列取得キー</param>
/// <returns>キーに該当する文字列</returns>
public static string Get(string key)
{
return sDictionary[key];
}
}
#まとめ
かなり強引のやり方でローカライズしてみました。
はやく日本語がサポートされてほしいですね。