2009-08-09 65 views
31

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

+1

不是很确定,如果你要求的 '适当的'为一种“非常习惯”的本地化方式。 – 2009-08-09 11:59:19

+1

“每个表格一个.resx,每个语言和组件的一个卫星组件”有什么问题?这就是.NET的工作原理 - 如果你不喜欢这样,恐怕你必须自己推出很多代码。 – 2009-08-09 12:00:06

+2

错误的意思是,“一个.resx per form”(对于所有不是表格的组成部分,至少有一个)成倍增长,而不是线性增长,如果新的/更正的本地化是每个语言一个汇编只是更多的混乱只允许应用程序的新版本。另请参阅http://redsolo.blogspot.com/2006/11/localisation-gone-wrong-in-c.html – 2009-08-09 12:06:58

回答

4

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

它似乎能够加载您的Winforms应用程序,并允许您开始翻译您的标签等,并看到形式,而你这样做。许多其他功能,如增量翻译和翻译记忆(如果您反复使用相同的术语)。尽管如此,看起来很有前途(对于Winforms) - 我自己并没有使用它。

下面是extensive list of potential .NET localization tools - 不确定,他们的工作情况以及他们的工作情况 - 看一看,也许你会找到你要找的东西。

Marc

+0

那么这个软件创建一个卫星,OP说他不想要任何卫星文件。 – 2009-08-09 12:05:32

+1

是的,我知道 - 我试图证明可能有适当的工具支持,但卫星组装方法毕竟不是那么糟糕。 – 2009-08-09 13:26:08

3

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

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

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

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

2

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

对于您的观点三,你可以通过下面的代码手动更改语言:

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

我刚刚完成了一个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。

我们能够通过更改语言属性来检查设计器中UI的版本,以检查我们是否具有正确的字符串&布局。总而言之,一旦我们头脑清醒,这很容易,也很轻松。

我们并不需要编写任何自定义调整的形式加载

+4

对不起,但我不能推荐这种技术。当需要在表单上添加,删除或移动字段时,它成为维护噩梦。 – RenniePet 2014-05-20 13:42:53

+5

不幸的是,大多数情况下,这**是** MSDN推荐用于WinForms本地化的内容。 :(https://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx – 2015-05-13 13:10:45

+1

这是微软推荐的方式,它是可怕的。 – 2016-04-17 23:42:20

1

你所要求的:

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

在vanilla Visual Studio的IDE中不可行。

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

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

资源:(不是一个详尽的列表,以任何方式)