这篇文章上次修改于 840 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

如果你的程序需要提供不同语言的版本,比如中文和英文,那么你可能需要使用一种简便的方法来完成国际化。

这里介绍一种使用资源文件来完成国际化的方法,具体步骤如下:

  1. VS 中新建一个 WinForm 类型的项目
  2. 打开 Resources.resx 文件,如果 VS 没有自动生成该文件的话可以自己手动创建一个
  3. 在该资源文件中新增一个 FormCaption 的字符串资源,设置值为 你好世界
  4. 新建一个名为 Resources.en-US.resx 的资源文件,确保该文件位于 Properties 目录下
  5. 打开该资源文件,新增一个 FormCaption 的字符串资源,设置值为 Hello World
  6. 打开 Form1.cs 文件,在其构造函数中设置 Form 标题为刚新建的字符串资源

    Text = Resources.FormCaption
  7. 编译、运行项目,可以看到窗口标题为:你好世界。打开项目生成目录,可看到生成了一个名为 en-US 的文件夹,里面包含一个类似 WindowsFormsApp3.resources.dll 的资源文件
  8. 打开 Program.cs 文件,在 Main 方法最开头增加如下代码:

    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
  9. 再次编译、运行项目,发现窗口标题变为:Hello World,国际化工作完成。
  10. 可以尝试将 en-US 改为 zh,发现标题又变回中文了。

补充说明

  1. 一定要确保所有资源文件位于 Properties 目录下,我开始没放那里,一直不成功
  2. 只要在要国际化的窗口显示之前调用 Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US"); 即可实现显示指定的语言
  3. 还可使用 Resource.Embedder 将资源文件(Satellite Assemblies)嵌入主程序集,这样在项目生成目录就不会生成 en-US 等文件夹了,并且发布的时候也不需要这些文件夹。

    需要说明的是该库只对 .NetFramework 4.0 以上的项目生效。

    该库可通过 Nuget 添加,Github 主页为:https://github.com/MarcStan/Resource.Embedder

-- 完成于 2019/08/29 17:19:02