距离上次发随笔已经过去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,之后,无论你手机系统切换成什么语言环境,奇怪的多语言问题都迎刃而解了。