Unity/多言語化
提供: 初心者エンジニアの簡易メモ
ダウンロード
LocalizationData.cs LocalizationManager.cs StartupManager.cs LocalizedText.cs LocalizedTextEditor.cs
翻訳ファイルサンプル
Assets/StreamingAssets/localizedText_ja.json
{ "items":[ {"key":"title","value":"タイトル1"}, {"key":"edit","value":"編集1"} ] }
Assets/StreamingAssets/localizedText_en.json
{ "items":[ {"key":"title","value":"title1"}, {"key":"edit","value":"edit1"} ] }
上記DLしたファイル設定とカスタマイズ
LocalizationData.cs
[System.Serializable] public class LocalizationData { public LocalizationItem[] items; } [System.Serializable] public class LocalizationItem { public string key; public string value; }
LocalizationManager.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class LocalizationManager : MonoBehaviour { public static LocalizationManager instance; private Dictionary<string, string> localizedText; private bool isReady = false; private string missingTextString = "Localized text not found"; // Use this for initialization void Awake () { if (instance == null) { instance = this; } else if (instance != this) { Destroy (gameObject); } DontDestroyOnLoad (gameObject); } public void LoadLocalizedText(string fileName) { localizedText = new Dictionary<string, string> (); string filePath = Path.Combine (Application.streamingAssetsPath, fileName); if (File.Exists (filePath)) { string dataAsJson = File.ReadAllText (filePath); LocalizationData loadedData = JsonUtility.FromJson<LocalizationData> (dataAsJson); for (int i = 0; i < loadedData.items.Length; i++) { localizedText.Add (loadedData.items [i].key, loadedData.items [i].value); } Debug.Log ("Data loaded, dictionary contains: " + localizedText.Count + " entries"); } else { Debug.LogError ("Cannot find file!"); } isReady = true; } public string GetLocalizedValue(string key) { string result = missingTextString; if (localizedText.ContainsKey (key)) { result = localizedText [key]; } return result; } public bool GetIsReady() { return isReady; } }
StartupManager.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class StartupManager : MonoBehaviour { // Use this for initialization private IEnumerator Start () { while (!LocalizationManager.instance.GetIsReady ()) { yield return null; } SceneManager.LoadScene ("MenuScreen"); } }
LocalizedText.cs
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class LocalizedText : MonoBehaviour { public string key; void Start () { Text text = GetComponent<Text> (); LocalizationManager manager = LocalizationManager.instance; if (manager == null) { return; } string str = manager.GetLocalizedValue(key); if (str == null) { return; } text.text = str; } }
LocalizedTextEditor.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; public class LocalizedTextEditor : EditorWindow { public LocalizationData localizationData; [MenuItem ("Window/Localized Text Editor")] static void Init() { EditorWindow.GetWindow (typeof(LocalizedTextEditor)).Show (); } private void OnGUI() { if (localizationData != null) { SerializedObject serializedObject = new SerializedObject (this); SerializedProperty serializedProperty = serializedObject.FindProperty ("localizationData"); EditorGUILayout.PropertyField (serializedProperty, true); serializedObject.ApplyModifiedProperties (); if (GUILayout.Button ("Save data")) { SaveGameData (); } } if (GUILayout.Button ("Load data")) { LoadGameData (); } if (GUILayout.Button ("Create new data")) { CreateNewData (); } } private void LoadGameData() { string filePath = EditorUtility.OpenFilePanel ("Select localization data file", Application.streamingAssetsPath, "json"); if (!string.IsNullOrEmpty (filePath)) { string dataAsJson = File.ReadAllText (filePath); localizationData = JsonUtility.FromJson<LocalizationData> (dataAsJson); } } private void SaveGameData() { string filePath = EditorUtility.SaveFilePanel ("Save localization data file", Application.streamingAssetsPath, "", "json"); if (!string.IsNullOrEmpty(filePath)) { string dataAsJson = JsonUtility.ToJson(localizationData); File.WriteAllText (filePath, dataAsJson); } } private void CreateNewData() { localizationData = new LocalizationData (); } }
LocalizationManagerStarter.cs
using System.Collections; using UnityEngine; [DefaultExecutionOrder(-1)] public class LocalizationManagerStarter : MonoBehaviour { IEnumerator Start() { 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 manager = LocalizationManager.instance; manager.LoadLocalizedText(setlang); while (!LocalizationManager.instance.GetIsReady()) yield return null; } }
設置方法
- 起動sceneに適当に空のGameObjectを作っる
- そこにLocalizationManagerとLocalizationManagerStarterを貼り付ける
- 翻訳したいTextオブジェクトにAddComponentsでLocalizedTextを選択しKeyにjsonのkeyに指定したtitle1などと入れる。