【问题标题】:Proper localization of a WinForms applicationWinForms 应用程序的正确本地化
【发布时间】:2009-08-09 11:44:47
【问题描述】:

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

基本上,我想要的是:

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

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

  • 我必须自己滚动吗?
  • 或者框架中已经有什么东西了?

.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 localization Framework...

【问题讨论】:

  • 不太确定您是否要求“适当”的“非常自定义”的本地化方式。
  • “每个表单一个 .resx,每个语言和程序集一个附属程序集”方法有什么问题?这就是 .NET 的工作方式——如果您不喜欢这样,恐怕您将不得不自己编写大量代码。
  • 错误意味着“每个表单一个 .resx”(对于不属于表单的所有内容至少有一个)呈指数增长而不是线性增长,每种语言一个程序集只是额外的如果仅在应用程序的新版本中允许新的/更正的本地化,则混乱。另见redsolo.blogspot.com/2006/11/localisation-gone-wrong-in-c.html
  • 嗯,这是标准的 .NET 做事方式,因此,您可以在框架中支持这些东西。如果您想要完全不同的东西,您只能靠自己,并且必须创建大量“管道”软件才能获得 .NET 框架已经提供的功能。我认为这是一项艰巨的任务,如果你想把所有的时间和精力都花在“以其他方式”上,我会认真重新考虑......
  • @MichaelStum - 从技术上讲,它的增长 geometrically 不是指数级的。 :) 语言的数量是乘数,而不是指数。 :) :) REASON 每个表单每个语言都有一个 resx 是,对于特定语言,表单大小可能必须更改,控件位置可能必须更改,图标可能必须更改, 基本上任何关于表单的可能都必须根据每种语言进行更改。所以RESX文件必须乘以不管。该表单的字符串与特定于该表单的所有其他内容位于同一文件中。

标签: c# .net winforms localization .net-framework-version


【解决方案1】:

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

这就是我们的做法:

  1. 使用默认语言(英语)创建我们所有的表单和 UI。

  2. 将我们所有的内部字符串放入资源文件中(不直接与自定义错误消息和对话框标题等表单相关联的内容)

在完成大部分工作和测试后,我们将其本地化。

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

  2. 对于其他每种语言,我们更改了表单上的“语言”属性。我们选择了每种语言的基本版本,例如:“Spanish”而不是“Spanish (Chile)”等,因此我认为它适用于每种“Spanish”方言。

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

然后,对于 8 种语言,每种形式有 8 个 .resx ,通用字符串有 8 个 .resx 。编译后,输出文件夹包含我们正在创建的 .dll,然后是每种语言的子文件夹,其中包含 .resources.dll。

我们能够在设计器中测试 UI 的版本,只需更改语言属性以检查我们的字符串和布局是否正确。

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

我们不需要为表单加载编写任何自定义调整

【讨论】:

  • 抱歉,我不推荐这种技术。当需要在表单上添加、删除或移动字段时,这将成为维护的噩梦。
  • 遗憾的是,在大多数情况下,这 IS 是 MSDN 推荐的用于 WinForms 本地化的内容。 :(msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx
  • 这是微软推荐的做法,太可怕了。
  • 在第一步中,您可以通过检查您的neutral language setting 来确定您的默认(备用)语言。在 WinForms 应用程序中,“中性语言”的默认值为“(None)”。本地化应用程序时,应将“(None)”更改为列表框中提供的多种语言之一(例如,“English (美国)”。)
  • @RenniePet 我不明白。如果您删除表单上的字段,则其相应的资源也将被删除。重命名也是如此。我将这种技术用于需要支持 3 种语言的应用程序(其中一种只是中性语言,不会被使用)。唯一乏味的一点是必须每次都“选择”要更改本地化的表单和语言,但它只适用于 imo。
【解决方案2】:

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

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

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

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

马克

【讨论】:

  • 这个软件创建了一个卫星,而 OP 说他不想要任何卫星文件。
  • 是的,我知道 - 我试图证明,也许在适当的工具支持下,卫星组装方法毕竟不是那么糟糕。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      您的要求:

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

      在 vanilla Visual Studio 的 IDE 中不可行。

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多