爲程序設定多語言版本

(1)一個多語言支持示例:

1、添加控制檯程序Localization,添加資源文件Res.resx,給資源文件添加字符串資源:Hello,值爲“你好”;

2、繼續添加資源Res.zh-CN.resx,添加字符串資源:Hello,值爲“你好哇”;

3、再添加資源Res.en-US.resx,添加字符串資源:Hello,值爲“Hi!”;

4、添加代碼:

static void Main(string[] args)
{
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
    //Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("zh-CN");
    Console.WriteLine(Res.Hello);
    Console.ReadKey();
}

根據設置可以不同語言顯示輸出;注意Res是自動生成的資源類(類似Form窗體)。Res.Hello可獲得Hello字符串指定語言結果,

它的定義是這樣:

/// <summary>
///   查找類似 你好 的本地化字符串。
/// </summary>
internal static string Hello {
    get {
        return ResourceManager.GetString("Hello", resourceCulture);
    }
}

5、編譯程序,系統自動根據資源文件的名稱生成3個本地化資源(其中Res.resx嵌入到主程序中):

en-US及zh-CN目錄均包含1個Localization.resources.dll,這是二進制本地化資源,它們是由3個resx資源文件(XML格式)分別生成Localization.Res.en-US.resources、Localization.Res.resources,Localization.Res.zh-CN.resources文件後,再生成dll的。可以在obj目錄找到這些中間文件。可通過resgen.exe將resx文件生成Localization.Res.resources等文件,再由al.exe生成Localization.resources.dll等文件(手動比較麻煩,可通過批處理來做),這些VS都幫你做了。具體可參考:

https://docs.microsoft.com/zh-cn/dotnet/api/system.resources.neutralresourceslanguageattribute?view=netframework-4.8

如果程序中指定的本地化資源無法找到(如刪除對應先前的代碼,刪除了en-US目錄的資源),則會使用嵌入主程序的資源。

(2)反編譯的情況處理:

有時候用反編譯工具(如dnspy)反編譯出來的程序們有1個形如Localization.Res.resources的文件和Localization.cs資源類,編譯後執行時會出現內部異常。因爲你把嵌入的資源從主程序中提取出來了,此時你沒有resx文件,無法再將資源嵌入到你的新程序。解決方法是修改Localization.cs文件:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            // global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Localization.Res", typeof(Res).Assembly);
            System.Resources.ResourceManager temp = System.Resources.ResourceManager.CreateFileBasedResourceManager(
        "Localization.Res", Directory.GetCurrentDirectory(), null);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

其中CreateFileBasedResourceManager方法是直接從Localization.Res.resources文件加載資源,參數"Localization.Res"去掉了其拓展名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章