「Unity/多言語化」の版間の差分

提供: 初心者エンジニアの簡易メモ
ナビゲーションに移動 検索に移動
編集の要約なし
 
(同じ利用者による、間の26版が非表示)
1行目: 1行目:
==ダウンロード==
[[Unity/多言語化/全体]]
https://learn.unity.com/tutorial/recorded-video-session-localization-tools/?tab=detail#5c7f8528edbc2a002053b671
<pre>
LocalizationData.cs
LocalizationManager.cs
StartupManager.cs
LocalizedText.cs
LocalizedTextEditor.cs
</pre>


==翻訳ファイルサンプル==
[[Unity/多言語化/Androidのアプリ名]]
Assets/StreamingAssets/localizedText_ja.json
<pre>
{
  "items":[
    {"key":"title","value":"タイトル1"},
    {"key":"edit","value":"編集1"}
  ]
}
</pre>
Assets/StreamingAssets/localizedText_en.json
<pre>
{
  "items":[
    {"key":"title","value":"title1"},
    {"key":"edit","value":"edit1"}
  ]
}
</pre>


==上記DLしたファイル設定とカスタマイズ==
[[Unity/多言語化/iOSのアプリ名]]
LocalizationData.cs
<pre>
[System.Serializable]
public class LocalizationData
{
    public LocalizationItem[] items;
}


[System.Serializable]
[[Unity/多言語化/公式多言語]]
public class LocalizationItem
{
    public string key;
    public string value;
}
</pre>
LocalizationManager.cs
<pre>
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;
    }
}
</pre>
StartupManager.cs
<pre>
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");
    }
 
}
</pre>
LocalizedText.cs
<pre>
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;
        }
        Debug.Log("LocalizedText key=" + key);
        text.text = str;
    }
 
}
</pre>
LocalizedTextEditor.cs
<pre>
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 ();
    }
}
</pre>
LocalizationManagerStarter.cs
<pre>
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;
    }
}
</pre>
==設置方法==
#起動sceneに適当に空のGameObjectを作る
#そこにLocalizationManagerとLocalizationManagerStarterを貼り付ける
#翻訳したいTextオブジェクトにAddComponentsでLocalizedTextを選択しKeyにjsonのkeyに指定したtitle1などと入れる。
 
無事翻訳できた。
 
==アプリタイトル多言語==
Assets/Plugins/Android/res/values-ja/strings.xml
<pre>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">タイトル1</string>
</resources>
</pre>
 
==Androidの場合は読み込めない==
StreamingAssetsではAndroidの場合は読み込めないのでResourcesに移動する必要がある。
 
参考:https://teratail.com/questions/169361
 
==参考==
https://www.growthsoftware.jp/unity-multilang/
 
https://qiita.com/chocho/items/c32e75bf498d8beec08f

2022年8月16日 (火) 17:01時点における最新版