WinForms应用程序的正确本地化

Mic*_*tum 35 .net c# localization winforms

我有一个WinForms应用程序,我想将其翻译成多种语言.但是,我没有任何本地化WinForms应用程序的经验,我发现有关此主题的非常矛盾的信息.

基本上,我想要的是:

  • 在源代码中,我只想要每种语言一个文件
  • 这个文件在编译时被编译到主应用程序中 - 构建应用程序后没有附属程序集或外部数据文件
  • 用户可以选择语言,我不需要/想要基于操作系统的自动检测
  • 这应该主要包含字符串和整数,但也包含CultureInfo

我见过的大多数解决方案要么每个表单都有一个.resx文件和/或外部附属程序集.

我必须自己动手吗?或者框架中有什么东西吗?

.net Framework 3.5 SP1如果重要的话.

编辑:在大多数情况下,Visual Studio已经提供了我想要的支持,但有两个问题.当我将Form.Localizable设置为true时,我有这个很好的设计器支持,但是这会为每个表单生成一个resx.在InitializeComponent中手动覆盖它的想法失败了,因为它是经常被覆盖的设计者编写的代码.从理论上讲,我只想a)覆盖ComponentResourceManager的创建,将其指向我的全局resx,b)将对ApplyResources的调用更改为将CultureInfo作为第三个参数的重载.

好像我必须在我的构造函数中添加一个函数调用,该函数调用在InitializeComponent()之后调用并覆盖它的行为.这似乎非常低效,但Visual Studio在警告触摸InitializeComponent时是正确的.目前,我确实正在推出自己的WinForms本地化框架......

Cha*_*e A 18

我刚刚完成了一个类似问题的C#.Net 3.5项目.我们正在为8种语言(包括英语)的现有多语言应用程序编写WinForms插件.

这就是我们这样做的方式:

  1. 使用默认语言English创建所有表单和UI.

  2. 将所有内部字符串放在资源文件中(不直接绑定到自定义错误消息和对话框标题等表单的​​内容)

完成大部分工作和测试后,我们对其进行了本地化.

  1. 每个表单都有一个.resx文件,但这是空的.我们将属性'Localizable'设置为true,.resx文件中填充了按钮大小和字符串等内容.

  2. 对于其他每种语言,我们都更改了表单上的"语言"属性.我们选择了每种语言的基本版本,例如:'西班牙语'而不是'西班牙语(智利)等,以便它适用于每种'西班牙语'方言,我想.

  3. 然后我们浏览了每个控件,翻译了它的文本并调整了大小,如果需要的话.这为每种语言和表单组合创建了一个.resx.

然后我们留下了8种语言,每种形式8个.resx,一般字符串8个.resx.编译时,输出文件夹中包含我们正在创建的.dll,然后是每种语言的子文件夹,其中包含.resources.dll.

我们只需更改language属性就可以测试设计器中UI的版本,以检查我们是否有正确的字符串和布局.

总而言之,一旦我们了解它,它就非常容易和无痛.

我们不需要对表单加载进行任何自定义调整

  • 对不起,我不推荐这种技巧.当需要在表单上添加,删除或移动字段时,它变成了维护噩梦. (6认同)
  • 遗憾的是,在大多数情况下,这个**是**MSDN为WinForms本地化推荐的内容.:( https://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx (6认同)
  • @RenniePet 我不明白。如果删除表单上的字段,则其相应的资源也会被删除。重命名时也会发生同样的情况。我正在将这种技术用于需要支持 3 种语言的应用程序(其中一种只是中性语言,不会使用)。唯一乏味的一点是每次都必须“选择”您想要更改本地化的表单和语言,但在我看来它就可以了。 (2认同)

mar*_*c_s 4

我问了一个关于 ASP.NET 的类似问题,并得到了第一个答案 - 这个工具及其工作流程可能也适合你 - 看看:Lingobit Localizer

它似乎能够加载您的 Winforms 应用程序,并允许您开始翻译标签等,并在执行此操作时查看表单。还有许多其他功能,例如增量翻译和翻译记忆库(如果您一遍又一遍地使用相同的术语)。

看起来很有前途(对于 Winforms)——不过我自己还没有使用过它。

这里有一个广泛的潜在 .NET 本地化工具列表- 不确定它们的工作效果如何以及它们涵盖的内容 - 看一下,也许您会找到您正在寻找的东西。

马克