WinForms应用程序的正确本地化

时间:2009-08-09 11:44:47

标签: c# .net winforms localization

我有一个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本地化框架......

6 个答案:

答案 0 :(得分:17)

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

我们就是这样做的:

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

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

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

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

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

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

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

      我们能够通过更改语言属性来检查设计器中UI的版本,以检查我们是否具有正确的字符串&布局。

      总而言之,一旦我们了解它,它就非常轻松无痛。

      我们不需要对表单加载

      进行任何自定义调整

答案 1 :(得分:4)

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

它似乎能够加载您的Winforms应用程序,并允许您开始翻译您的标签等,并在您执行时查看表单。许多其他功能,如增量翻译和翻译记忆(如果你反复使用相同的术语)。

看起来非常有前景(对于Winforms) - 但是我自己并没有使用它。

这是一个extensive list of potential .NET localization tools - 不确定,它们的工作情况和覆盖的内容 - 看看,也许你会找到你想要的东西。

马克

答案 2 :(得分:3)

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

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

我对Winforms的熟悉程度有限,但如果您使用的是Silverlight或WPF,那么请阅读Guy Smith-Ferrier关于该主题的工作:http://www.guysmithferrier.com/category/Internationalization.aspx。他还有一些工具集可以让您的生活更轻松:http://www.dotneti18n.com/Downloads.aspx

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

答案 3 :(得分:2)

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

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

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 

答案 4 :(得分:1)

你要求的是什么:

  1. 没有卫星资源文件
  2. 每个表单只有一个尺寸和控件位置。
  3. 可执行文件中嵌入了大量语言。
  4. 在vanilla Visual Studio的IDE中无法实现。

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

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

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

答案 5 :(得分:0)

正确的做法是,假设您要添加 Arabic 支持女巫是 RightToLeft 语言:

  1. 双击表单
  2. 设置可本地化的道具。为真
  3. 更改语言道具。到阿拉伯语 //这将自动打开一个新版本的表单,以便您可以自定义。
  4. 设置 RightToLeft 属性。对
  5. 设置 RightToLeftLayout 道具。为真
  6. 开始重命名控件并保存表单。
  7. 处理代码中的消息/错误 // 抱歉,我现在没有快速的解决方案,请尝试复制它们并 If/Else 当前本地。