本文以 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