【发布时间】: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