我有一个 WinForms
应用程序,想要将其翻译成多种语言。然而,我没有任何本地化 WinForms
应用程序的经验,并且对此主题有很多矛盾的信息。
基本上,我想要的是:
- 在源代码中,每种语言只需要一个文件。
- 编译时,该文件会被编译进主应用程序 - 不需要构建应用程序后再添加卫星程序集或外部数据文件。
- 用户可以选择语言,我不需要/不想要基于操作系统的自动检测。
- 这应该主要包含
strings
和ints
,但也包括CultureInfo
。
我看到的大多数解决方案都要么是每个 Form
一个.resx
文件,要么是外部卫星程序集。
- 我必须自己开发吗?
- 或者框架中已经有这样的东西了吗?
.net Framework 3.5 SP1
如果有关系的话。
编辑:
就大多数情况而言,Visual Studio 已经提供了我想要的支持,但是有两个问题。当我将 Form.Localizable
设置为 true
时,我有这个很好的 Designer
支持,但是这会生成每个 Form
一个.resx
文件。手动在 InitializeComponent
中覆盖它的想法会失败,因为它是由设计器编写的代码,会经常被覆盖。
理论上,我只想要:
- a) 覆盖创建
ComponentResourceManager
的操作,使其指向我的全局resx
;和 - b) 将对
ApplyResources
的调用更改为接受第三个参数为CultureInfo
的重载函数。
看起来我需要在构造函数中添加一个函数调用,该函数在InitializeComponent()
之后被调用并覆盖其行为。这似乎非常低效,但当Visual Studio警告不要修改InitializeComponent()
时是正确的。
目前,我正在开发自己的WinForms本地化框架
...
几何级数
增长而不是指数级别增长。 :) 语言的数量是一个乘数,而不是指数。 :) :) 每种语言每种表单都有一个resx
的原因在于,对于特定的语言,表单的大小可能需要更改,控件的位置可能需要更改,图标可能需要更改,基本上表单的任何内容可能需要按照每种语言的要求进行更改。因此,RESX文件必须相应增加。该表单中的字符串与该表单的其他所有特定内容都位于同一文件中。 - Jesse Chisholm