WinForms应用程序的正确本地化

问题描述 投票:35回答:5

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

基本上,我想要的是:

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

我见过的大多数解决方案都有一个.resx文件per Form和/或外部附属程序集。

  • 我必须自己动手吗?
  • 或者框架中已经有东西吗?

.net Framework 3.5 SP1,如果有关系。

编辑:

在大多数情况下,Visual Studio已经为我想要的提供了支持,但是有两个问题。当我将Form.Localizable设置为true时,会得到很好的Designer支持,但是每resx会生成一个Form。在InitializeComponent中手动覆盖它的想法失败了,因为它是设计者编写的代码,将被定期覆盖。

理论上,我只想:

  • a)覆盖ComponentResourceManager的创建,以将其指向我的全局resx
  • b)将对ApplyResources的调用更改为以CultureInfo作为第三个参数的重载。

似乎我必须向我的构造函数添加一个函数调用,该函数在InitializeComponent()之后被调用并覆盖其行为。这似乎效率极低,但是当Visual Studio警告触摸InitializeComponent()时,它是正确的。

此刻,我确实是在滚动自己的WinForms localization Framework ...

c# .net winforms localization .net-framework-version
5个回答
18
投票

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

这是我们的工作方式:

  1. 以默认语言英语创建我们所有的表单和UI。

  2. 将我们所有的内部字符串放入资源文件中(这些东西不直接绑定到自定义错误消息和对话框标题等形式上)

一旦完成大部分工作和测试,我们便将其本地化。

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

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

  3. 然后,我们遍历每个控件,翻译其文本并根据需要调整大小。这样就为每种语言和表单组合创建了一个.resx。

然后,我们剩下8种语言,每种格式分别为8 .resx和普通字符串为8 .resx。编译后,输出文件夹包含我们正在创建的.dll,然后是每种语言的子文件夹,其中包含.resources.dll。

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

总而言之,一旦我们头脑清醒,这是非常容易且无痛的。

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


4
投票

我在问一个关于ASP.NET的类似问题,并得到了一个第一答案-该工具及其工作流程也可能对您有用-看一下:Lingobit Localizer

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

[对于Winforms来说,看起来很有希望-自己还没有使用过。

这里是extensive list of potential .NET localization tools-不确定,它们的工作原理和覆盖范围-请看一下,也许您会找到想要的东西。

马克


3
投票

这是一个巨大的主题,有很多方法可以实现您想要的。该框架确实提供了基础,但是完整的解决方案需要您自己实现某些元素。

例如,默认框架实现是为每个资源创建一个.resx文件。在ASP.Net中,这意味着每个用户/服务器控件或页面。这不会使其易于维护,如果要将资源移至数据库,则需要实现自己的提供程序。

我对Winforms的了解有限,但是如果您使用的是Silverlight或WPF,请在以下位置阅读Guy Smith-Ferrier在该主题上的著作:他还提供了一些工具集,可以使您的生活更轻松:http://www.guysmithferrier.com/category/Internationalization.aspx

我以前和他一起工作过,从来没有遇到过对这个主题有更深入了解的人。


3
投票

我没有针对您的第一个和第二个要求的解决方案,但是请记住,本地化表单并不像翻译每个单词那样简单。您需要检查每个翻译的文本是否适合其各自的控件。另外,也许您有一个图标或图像需要在另一种文化中进行更改。

关于第三点,您可以使用以下几行手动更改语言:

http://www.dotneti18n.com/Downloads.aspx

1
投票

您要的是:

  1. 没有卫星资源文件
  2. 每个表单仅一种尺寸和控件位置。
  3. 可执行文件中嵌入的许多语言。

在香草Visual Studio的IDE中不可行。

它需要做一些定制工作,基本上完成所有这些步骤:

  • 获取处理TMX资源文件的自定义资源管理器。
  • 将所有可本地化的字符串放入TMX文件中。
    • 在您的项目中为该TMX文件提供嵌入式资源。
  • 在您的Form构造函数中,创建您的TMX ResourceManager,从嵌入的资源中加载TMX文件。
  • 在您的代码中,使用tmx ResourceManager而不是默认的ResourceManager来获取本地化的字符串。
    • 让表单使用默认的ResourceManager来获取除字符串之外的所有设计器内容。
  • 使用新的语言翻译使您的TMX文件更加生动。
    • 可以在下一个版本的项目中添加更多内容,只需在编译之前将它们添加到此TMX文件中即可。

资源:(无论如何,都不是详尽的清单)

© www.soinside.com 2019 - 2024. All rights reserved.