C# WinForms应用程序的正确本地化

C# WinForms应用程序的正确本地化,c#,.net,winforms,localization,.net-framework-version,C#,.net,Winforms,Localization,.net Framework Version,我有一个WinForms应用程序,我想把它翻译成多种语言。然而,我没有任何本地化WinForms应用程序的经验,我发现关于这个主题的信息非常矛盾 基本上,我想要的是: 在源代码中,每种语言只需要一个文件 此文件在编译时被编译到主应用程序中-生成应用程序后没有附属程序集或外部数据文件 用户可以选择语言,我不需要/想要基于操作系统的自动检测 这应该主要包含字符串和整数,但也包含文化信息 我见过的大多数解决方案都有一个.resx文件,每个表单和/或外部附属程序集 我必须自己滚吗 或者框架中已经有

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

基本上,我想要的是:

  • 在源代码中,每种语言只需要一个文件
  • 此文件在编译时被编译到主应用程序中-生成应用程序后没有附属程序集或外部数据文件
  • 用户可以选择语言,我不需要/想要基于操作系统的自动检测
  • 这应该主要包含
    字符串
    整数
    ,但也包含
    文化信息
我见过的大多数解决方案都有一个
.resx
文件,每个
表单和/或外部附属程序集

  • 我必须自己滚吗
  • 或者框架中已经有了什么东西
.netframework3.5sp1
如果有必要的话

编辑:

在大多数情况下,VisualStudio已经为我想要的东西提供了支持,但是有两个问题。当我将
Form.Localizable
设置为
true
时,我有一个很好的
Designer
支持,但这会为每个
表单生成一个
resx
。在
InitializeComponent
中手动覆盖它的想法失败了,因为它是设计器编写的代码,将定期被覆盖

理论上,我只想:

  • a) 覆盖
    组件ResourceManager
    的创建,将其指向我的全局
    resx
  • b) 将对
    ApplyResources
    的调用更改为将
    CultureInfo
    作为第三个参数的重载
似乎我必须向构造函数添加一个函数调用,该函数在
InitializeComponent()之后被调用,并重写其行为。这似乎效率极低,但Visual Studio警告触摸
InitializeComponent()
是正确的


目前,我正在推出自己的
WinForms本地化框架

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

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

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

这里有一个-不确定,他们如何工作,以及他们涵盖-看看,也许你会找到你要找的


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

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

我对Winforms的熟悉程度有限,但如果您使用Silverlight或WPF,请阅读Guy Smith Ferrier在以下主题上的工作:。他也有一些工具集,可以让你的生活更轻松:


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

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

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

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 
我刚刚完成了一个C#.NET3.5项目,但遇到了类似的问题。我们正在为一个现有的具有8种语言(包括英语)的多语言应用程序编写WinForms插件

我们就是这样做的:

  • 使用默认语言(英语)创建所有表单和UI

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

  • 一旦我们完成了大部分工作和测试,我们就将其本地化

  • 每个表单都有一个.resx文件,但该文件为空。我们将属性'Localizable'设置为true,.resx文件中填充了按钮大小和字符串等内容

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

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

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

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

    总的来说,一旦我们有了头脑,这是非常容易和无痛的


    我们不需要为表单加载编写任何自定义调整,您需要的是:

  • 没有卫星资源文件
  • 每个表单只有一个大小和控件位置
  • 可执行文件中嵌入了许多语言
  • 在vanilla Visual Studio的IDE中无法执行

    那会怎么样