為.NET桌面應用添加國際化支持

2024年2月6日 19点热度 0人点赞

本文以 Snipping_OCR[1] 項目為例,介紹如何使用資源文件為.NET桌面應用添加國際化支持。

1. 引言

當前,不少企業都有開拓海外市場的意向,因此,為應用程序添加國際化支持是很有必要的。本文將介紹如何通過簡單的方法為.NET桌面應用添加國際化支持。

2. 添加國際化支持

在 .NET 的桌面應用中,我們可以通過資源文件 (.resx) 來實現國際化。最佳的做法是為每種語言創建一個資源文件,然後在代碼中根據當前的區域設置來選擇使用哪個資源文件。特別註意的是,不要對字符串或用戶界面資源進行硬編碼。關於.NET 本地化更多的相關信息,可以參考 本地化和全球化[2]

以下是通過資源文件 (.resx) 來實現國際化的步驟:

2.1 創建資源文件

首先需要在項目中創建一個資源文件,例如 Resources.resx,這將作為默認(英文)的資源文件。

創建資源文件

然後,你可以在這個文件中添加原來在界面中使用的字符串,比如:菜單,按鈕,標簽,對話框等等。

添加資源

接下來,創建另一個資源文件,例如 Resources.zh-CN.resx,這個文件將包含中文的資源。在這個文件中,你可以添加相同的名稱,但是值是中文的:

添加中文資源

2.2 使用資源

創建好兩個資源後,我們可以通過 Resources 類來訪問這些資源。比如,我們可以通過 Resources.ScreenOCR 來訪問 ScreenOCR 這個資源。在代碼中,我們可以這樣使用資源:

notifyIcon.ShowBalloonTip(2, Resources.ScreenOCR, Resources.HotkeyRegistrationFailed, ToolTipIcon.Info);

2.3 設置區域

.NET 會自動使用操作系統的區域設置,但是你也可以在代碼中手動設置。你可以使用 System.Globalization.CultureInfo 類來獲取或設置當前線程的區域設置。例如:

Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

當然,簡單使用的話,我們可以通過檢查操作系統的區域設置,如果是中文則使用中文,否則使用英文。這裡我們需要使用 System.Globalization.CultureInfo 類來獲取當前的區域設置。

CultureInfo currentCulture = CultureInfo.CurrentCulture;if (currentCulture.TwoLetterISOLanguageName == "zh"){ Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN"); Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");}else{ Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;}

3. 測試

修改完成後,我們可以在不同的區域設置下測試應用程序,以確保國際化功能正常工作。對於 Snipping_OCR 應用來說,主要的測試點是托盤得到右鍵菜單的國際化,以及熱鍵註冊失敗的提示信息的國際化。

測試

英文測試,這裡我直接祭出了 Windows 沙盒,因為我電腦沙盒中的區域設置默認是英文的:

英文測試

通過上面的截圖可以發現,本地直接運行顯示的中文。在沙盒中,托盤菜單的顯示界面已經變為英文的了。

最後

至此,我們已經了解了如何為.NET桌面應用簡單的添加國際化支持了。當然,國際化對軟件設計都提出了新的要求,不僅僅是語言的問題,還有時區、貨幣、數字格式等等。另外,也存在一些文化差異的問題,例如,不同國傢的人對於軟件的使用習慣也是不同的。因此,如果你的應用程序真的要開拓海外市場,那麼你可能需要考慮這些問題。

References

[1] Snipping_OCR: https://github.com/sangyuxiaowu/Snipping_OCR??wt.mc_id=DT-MVP-5005195
[2] 本地化和全球化: https://docs.microsoft.com/zh-cn/dotnet/standard/globalization-localization/?wt.mc_id=DT-MVP-5005195