本文以 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 = newCultureInfo("zh-CN");
Thread.CurrentThread.CurrentUICulture = newCultureInfo("zh-CN");
當然,簡單使用的話,我們可以透過檢查作業系統的區域設定,如果是中文則使用中文,否則使用英文。這裏我們需要使用
System.Globalization.CultureInfo
類來獲取當前的區域設定。
CultureInfo currentCulture = CultureInfo.CurrentCulture;
if (currentCulture.TwoLetterISOLanguageName == "zh")
{
Thread.CurrentThread.CurrentUICulture = newCultureInfo("zh-CN");
Thread.CurrentThread.CurrentCulture = newCultureInfo("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