1. 程式人生 > 實用技巧 >C# 多語言國際化問題中的 CultureInfo

C# 多語言國際化問題中的 CultureInfo

距離上次發隨筆已經過去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,之後,無論你手機系統切換成什麼語言環境,奇怪的多語言問題都迎刃而解了。