Unityのローカライズを自動化した話
某Unity製のアプリをリリースする直前で言語設定がおかしいことが判明。
UnityかXcodeのデフォルトの設定が
「en」
になっていたので、どうにかこうにかスクリプト側から
「ja_JP」
に変更できないかってことで、「Info.plist」を直接書き換えるようなスクリプトを書きました。
using System.IO; using System.Xml; using System.Xml.XPath; using UnityEditor; using UnityEditor.Callbacks; using UnityEngine; /// <summary> /// Unityビルド後言語設定をするクラス /// </summary> public class LocalizePostprocessor { /// <summary> /// 単体テスト用 /// </summary> [MenuItem("Tools/Localize")] public static void Exec() { Debug.Log("call"); // 自分のファイルパス(フルパスで記述する必要有り var path = "D:/workspace/trunk/program/client/unity/app/iOS"; // Postprocessorのインスタンス作成 var instance = new LocalizePostprocessor(); // ビルド後の処理を単体実行 instance.OnPostProcessBuildiOS(path); } /// <summary> /// ビルド後直接呼ばれる /// </summary> /// <param name="target"></param> /// <param name="path"></param> [PostProcessBuild(1)] public static void OnPostProcessBuild(BuildTarget target, string path) { // iOSビルド時のみ実行 if (target == BuildTarget.iPhone) { // Postprocessorのインスタンス作成 var instance = new LocalizePostprocessor(); // ビルド後の処理を単体実行 instance.OnPostProcessBuildiOS(path); } } /// <summary> /// iOS版ビルド後の処理 /// </summary> /// <param name="path"></param> public void OnPostProcessBuildiOS(string path) { // .plistのパス作成 string file = Path.Combine(path, "Info.plist"); // ファイル存在確認 if (!File.Exists(file)) { Debug.LogWarning("file not exist"); return; } // xml読み込み XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(file); // CFBundleDevelopmentRegion変更 XPathNavigator navigator = xmlDocument.CreateNavigator(); XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable); foreach (XPathNavigator nav in navigator.Select("//string", manager)) { if (nav.Value == "en") { nav.SetValue("ja_JP"); } } xmlDocument.Save (file); } }
一応できた!ってことで公開。 これよりスマートな方法があれば教えていただけるととてもうれしいです!