我有一个WinForms应用程序,我想将其翻译成多种语言。但是,我没有任何本地化WinForms应用程序的经验,我发现有关此主题的非常矛盾的信息。
基本上,我想要的是:
我见过的大多数解决方案都是每个表单和/或外部附属程序集都有一个.resx文件。
我必须自己动手吗?或者框架中是否有东西?
.net Framework 3.5 SP1,如果重要的话。
编辑:在大多数情况下,Visual Studio已经提供了我想要的支持,但有两个问题。当我将Form.Localizable设置为true时,我有这个很好的设计器支持,但是这会为每个表单生成一个resx。在InitializeComponent中手动覆盖它的想法失败了,因为它是经常被覆盖的设计者编写的代码。从理论上讲,我只想a)覆盖ComponentResourceManager的创建,将其指向我的全局resx,b)将对ApplyResources的调用更改为将CultureInfo作为第三个参数的重载。
似乎我必须在我的构造函数中添加一个函数调用,该函数调用在InitializeComponent()之后调用并覆盖它的行为。这似乎非常低效,但Visual Studio在警告触摸InitializeComponent时是正确的。目前,我确实正在推出自己的WinForms本地化框架......
答案 0 :(得分:17)
我刚刚完成了一个类似问题的C#.Net 3.5项目。我们正在为8种语言(包括英语)的现有多语言应用程序编写WinForms插件。
我们就是这样做的:
使用默认语言English创建所有表单和UI。
将所有内部字符串放在资源文件中(不直接绑定到自定义错误消息和对话框标题等表单上的内容)
完成大部分工作和测试后,我们对其进行了本地化。
每个表单都有一个.resx文件,但这是空的。我们将属性'Localizable'设置为true,.resx文件中填充了按钮大小和&字符串。
对于其他每种语言,我们都更改了表单上的“语言”属性。我们选择了每种语言的基本版本,例如:'西班牙语'而不是'西班牙语(智利)等,以便它适用于每种'西班牙语'方言,我认为。
然后我们浏览了每个控件,翻译了它的文本并调整了大小,如果需要的话。这为每种语言和表单组合创建了一个.resx。
然后我们留下了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)
你要求的是什么:
在vanilla Visual Studio的IDE中无法实现。
它需要的是一些定制工作,基本上完成所有这些步骤:
资源:(不是详尽的清单,无论如何)
答案 5 :(得分:0)
正确的做法是,假设您要添加 Arabic
支持女巫是 RightToLeft
语言: