ひつまぶし

主にメモと雑記と小ネタ。勉強会のレポートとかも時々。

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);
    }
}

一応できた!ってことで公開。 これよりスマートな方法があれば教えていただけるととてもうれしいです!