距离上次发随笔已经过去4年多了,笔者从校园走向社会也已3年,目前作为一名游戏开发人员开发维护一些出海游戏。出海避免不了国际化多语言,而其中遇到的问题在此表述一下,分享给大家。

    我们使用C#获取时间时,C#经常会携带CultureInfo信息,导致格式化的数据会针对不同的国家显示不同的格式:浮点数,德国的浮点数不是用小数点,而是用逗号来分隔的;再例如有些国家的时分秒,使用点号分隔的,而不是用冒号分隔的。

如果不处理的话,上传的数据格式将会给日志处理人员造成很大压力,他们要兼容N个情况,所以在游戏启动时,最好设置一下,使用一个统一的文化。

    思路有了,就落地该思路,然而Unity的C#并没有提供设置CultureInfo的接口,经过查询,在博客https://blog.csdn.net/snakorse/article/details/47681019中找到解决方案,可以通过反射的方式设置CultureInfo,那么就可以这么写代码:

    public static void LoadSetting()
    {
        //设置语言文化为统一不变的文化
        SetDefaultCulture(CultureInfo.InvariantCulture);
    }
    static void SetDefaultCulture(CultureInfo culture)
    {
        Type type = typeof(CultureInfo);

        try
        {
            type.InvokeMember("s_userDefaultCulture",
                                BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                                null,
                                culture,
                                new object[] { culture });

            type.InvokeMember("s_userDefaultUICulture",
                                BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                                null,
                                culture,
                                new object[] { culture });
        }
        catch { }

        try
        {
            type.InvokeMember("m_userDefaultCulture",
                                BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                                null,
                                culture,
                                new object[] { culture });

            type.InvokeMember("m_userDefaultUICulture",
                                BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                                null,
                                culture,
                                new object[] { culture });
        }
        catch { }
    }

在游戏一开始启动的时候调用 LoadSetting,之后,无论你手机系统切换成什么语言环境,奇怪的多语言问题都迎刃而解了。