在C#/WinForms中制作多语言应用的最佳实践是什么?

96

我一直在研究如何在C#中制作适用于多种语言的应用程序,因为我需要处理一个需要这样做的小项目。我基本上找到了两种方法:

第一种方法是将表单的Localizable属性设置为true,设置语言属性,填写所有标签等内容,就可以完成了。我认为这种方法的主要缺点是:如何让其他不属于表单的东西适应多种语言(例如弹出窗口、日志文件或窗口等)。

第二种方法是创建资源文件,例如“Lang.en-us.resx”和每种语言都有一个,“Lang.nl-nl.resx”,并填充字符串。IDE似乎会自动生成一个类,所以在代码中我只需使用Lang.SomeText即可。我认为这种方法最大的缺点是:对于每个表单,我需要在代码中自己设置所有标签和其他标题(而且似乎不能与这些资源进行数据绑定)。

然而,我相信还有其他方法可以实现多语言应用程序。

那么,什么是最佳实践?对于小型应用程序(几个表单、数据库连接等),哪种方法最简单?而对于大型应用程序,哪种方法规模更大?


3
我注意到,那些不具建设性的问题(或其他“不适用于SO”的类型)是最有价值的问题之一 :) 这个问题也是一个好问题(我认为投票证明了这一点)。以下是如何使用多语言插件进行多语言支持的示范 https://www.youtube.com/watch?v=SNIyP1QQdVs - Prokurors
1
有时候在互联网上整合所有知识碎片真的很难,我现在觉得这个问题非常宝贵。当然,有时关闭软性问题不如保持开放更具建设性,我认为这是其中之一。 :) - user1881400
3个回答

21

我一直在为多语言应用程序使用资源文件。
网络上有很多关于如何使用它们的文章。

我使用过两种不同的方式:

  • 每个窗体一个资源文件
  • 全局资源文件

每个窗体一个资源文件的实现更容易,你只需要在资源文件中输入值,但是我发现这种方法更难维护,因为标签分散在整个应用程序中。

全局资源文件允许你将所有标签(图像等)集中在一个文件中(每种语言一个),但这意味着需要在窗体加载时手动设置标签。这个文件也可以用于错误信息等。

这是一个品味问题...

最后一点,我用英语和法语编写程序,我使用“en”和“fr”,而不是“en-US”和“fr-FR”。不要把事情复杂化,英语的不同方言(美国英语、英式英语、澳大利亚英语等)之间的差异很少,可以只使用一个(对于法语也是一样)。


2
有时候你需要担心方言的问题。例如,繁体中文(台湾)和简体中文(中国大陆)的汉字完全不同。 - MarkJ
1
@MarkJ MSDN文档提到繁体中文和简体中文不是方言(国家/地区),而是中性文化。MSDN:“中性文化是与语言相关而不是与国家/地区相关的文化。具体文化是与语言和国家/地区相关的文化。例如,“fr”是中性文化,“fr-FR”是具体文化。请注意,“zh-CHS”(简体中文)和“zh-CHT”(繁体中文)是中性文化。” - broadband
我最近在 链接 的帮助下完成了这个任务,但该链接没有提到以下两步骤:
  1. 单击所有的 .resource 文件并将 "Build Action" 属性设置为 "Content"。
  2. 单击所有的 .resource 文件并将 "Copy to Output Directory" 属性设置为 "Copy Always"。
- Sourav
1
@Kiquenet 对于一个完整(包含代码)的答案,包括.NET广泛支持,请参见:https://dev59.com/tnRC5IYBdhLWcg3wOOP1#35813707 - CularBytes

10

我最近编写了一个同时支持德语和英语的程序。我惊讶地发现,如果我简单地将我的英文资源命名为LanguageResources.resx,而将我的德语资源命名为LanguageResources.de.resx,则会自动选择正确的语言。 ResXFileCodeGenerator 为我处理了一切。

需要注意的是,两个文件中的字段是相同的,尚未输入德语字段的任何内容都将显示为英语,因为在默认情况下,最不具体的文件是默认文件。查找字符串时,它从最具体的文件(例如 .de-DE.resx)到最不具体的文件(例如 .resx)。

要获取您的字符串,请使用 ResourceManager.GetString 或 ResourceManager.GetObject 调用。应用程序应该免费为您提供 ResourceManager。


6
为了帮助其他可能在最后一篇文章发布后(已经过去1年)看到这篇文章的人,我是一款专业的本地化产品的作者,它使整个翻译过程变得非常容易。它是Visual Studio插件,可以从任意解决方案中提取所有“.resx”字符串,并将它们加载到一个单独的文件中,可以使用免费的独立应用程序进行翻译(翻译人员可以从我的网站下载)。同样的插件还可以将翻译后的字符串导入回您的解决方案。非常易于使用,具有许多内置保护措施、许多功能和在线帮助(您不需要太多帮助)。请参见http://www.hexadigm.com

1
这应该作为 Visual Studio 的本地功能添加进去! 非常棒的软件! - Caverna
非常感谢(感激不尽)。我在开始这个产品之前就已经同意你的看法了(大约10年前),但如果微软今天实施它,那将使我的业务无法继续。 :) - Larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接