我有一个WinForms
应用程序,我想将其翻译成多种语言。但是,我对本地化WinForms
应用程序没有任何经验,我发现与此主题非常矛盾的信息。
基本上,我想要的是:
strings
和ints
,但也应包含CultureInfo
我见过的大多数解决方案都有一个.resx
文件per Form
和/或外部附属程序集。
.net Framework 3.5 SP1
,如果有关系。
编辑:
在大多数情况下,Visual Studio已经为我想要的提供了支持,但是有两个问题。当我将Form.Localizable
设置为true
时,会得到很好的Designer
支持,但是每resx
会生成一个Form
。在InitializeComponent
中手动覆盖它的想法失败了,因为它是设计者编写的代码,将被定期覆盖。
理论上,我只想:
ComponentResourceManager
的创建,以将其指向我的全局resx
和ApplyResources
的调用更改为以CultureInfo
作为第三个参数的重载。似乎我必须向我的构造函数添加一个函数调用,该函数在InitializeComponent()
之后被调用并覆盖其行为。这似乎效率极低,但是当Visual Studio警告触摸InitializeComponent()
时,它是正确的。
此刻,我确实是在滚动自己的WinForms localization Framework
...
我刚刚完成了一个具有类似问题的C#.Net 3.5项目。我们正在为现有的8种语言(包括英语)的多语言应用程序编写WinForms插件。
这是我们的工作方式:
以默认语言英语创建我们所有的表单和UI。
将我们所有的内部字符串放入资源文件中(这些东西不直接绑定到自定义错误消息和对话框标题等形式上)
一旦完成大部分工作和测试,我们便将其本地化。
每个表单已经有一个.resx文件,但这是空的。我们将属性“ Localizable”设置为true,.resx文件中填充了按钮大小和字符串之类的内容。
对于其他每种语言,我们都更改了表单上的'Language'属性。我们选择每种语言的基本版本,例如:“西班牙语”而不是“西班牙语(智利)”等,以便我认为它适用于每种“西班牙语”方言。
然后,我们遍历每个控件,翻译其文本并根据需要调整大小。这样就为每种语言和表单组合创建了一个.resx。
然后,我们剩下8种语言,每种格式分别为8 .resx和普通字符串为8 .resx。编译后,输出文件夹包含我们正在创建的.dll,然后是每种语言的子文件夹,其中包含.resources.dll。
我们只需要更改language属性以检查我们是否具有正确的字符串和布局,就可以在设计器中测试UI的版本。
总而言之,一旦我们头脑清醒,这是非常容易且无痛的。
我们不需要对表单加载进行任何自定义调整
我在问一个关于ASP.NET的类似问题,并得到了一个第一答案-该工具及其工作流程也可能对您有用-看一下:Lingobit Localizer
它似乎能够加载Winforms应用程序,并允许您开始翻译标签等,并在执行过程中查看表单。还有许多其他功能,例如增量翻译和翻译记忆库(如果您一遍又一遍地使用相同的术语)。
[对于Winforms来说,看起来很有希望-自己还没有使用过。
这里是extensive list of potential .NET localization tools-不确定,它们的工作原理和覆盖范围-请看一下,也许您会找到想要的东西。
马克
这是一个巨大的主题,有很多方法可以实现您想要的。该框架确实提供了基础,但是完整的解决方案需要您自己实现某些元素。
例如,默认框架实现是为每个资源创建一个.resx文件。在ASP.Net中,这意味着每个用户/服务器控件或页面。这不会使其易于维护,如果要将资源移至数据库,则需要实现自己的提供程序。
我对Winforms的了解有限,但是如果您使用的是Silverlight或WPF,请在以下位置阅读Guy Smith-Ferrier在该主题上的著作:他还提供了一些工具集,可以使您的生活更轻松:http://www.guysmithferrier.com/category/Internationalization.aspx。
我以前和他一起工作过,从来没有遇到过对这个主题有更深入了解的人。
我没有针对您的第一个和第二个要求的解决方案,但是请记住,本地化表单并不像翻译每个单词那样简单。您需要检查每个翻译的文本是否适合其各自的控件。另外,也许您有一个图标或图像需要在另一种文化中进行更改。
关于第三点,您可以使用以下几行手动更改语言:
http://www.dotneti18n.com/Downloads.aspx
您要的是:
在香草Visual Studio的IDE中不可行。
它需要做一些定制工作,基本上完成所有这些步骤:
资源:(无论如何,都不是详尽的清单)
CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci;