【问题标题】:Globalize an existing Windows Forms application?全球化现有的 Windows 窗体应用程序?
【发布时间】:2010-12-03 22:16:53
【问题描述】:

我有一个使用 VS 2005 和 .net framework 2.0 开发的现有 winforms 应用程序。

现在我们需要全球化这个应用程序。这两个语言环境是德语和日语。

我知道我们可以使用表单的 localize 属性来创建本地化的表单资源,并且可以将其他资源文件用于消息框、异常等中使用的字符串。

我想知道全球化现有应用程序的最佳方法,我应该在每个表单上设置 localize 属性还是有一些工具可以提取标签名称和控件名称......日期格式需要考虑什么、货币等。

另外,我们在代码的某些地方使用了一些复合字符串来连接消息字符串,这些如何本地化?

在开始全球化活动之前,我们将把应用程序迁移到 VS 2008 和 .net framework 3.5。

【问题讨论】:

    标签: .net winforms internationalization globalization


    【解决方案1】:

    我只接触过 LTR 语言,还没有接触过日语。考虑到这一点,以下是我的一些最佳实践:

    • 将所有特定语言的编程字符串和字符串片段放入一个 .resx 文件(我喜欢每个对话框使用一个 .resx 文件),然后使用自动生成的类和属性调用字符串。您的代码中不应保留任何特定于语言的字符串(这意味着您的代码中几乎没有字符串,句号)。一个好的模式是将格式化字符串也放入 .resx,因为语言的语法会有所不同。
    • 在所有表单上将 Localizable 属性设置为 True,并直接在其中进行特定于语言的更改(使用 Language 属性)。
    • 设计您的表单,以便任何显示特定语言字符串的内容在需要的地方都有额外的空间(注意:德语比英语长)。 IMO,不必为了语言的基本变化而完全重新排列表格 - 不过可能必须使用日语等语言来完成。
    • 对于需要动态设置文本的标签等控件,请设置表单上的文本,以便您知道它只是一个标记。我为此使用“##”,这真的很突出。避免将文本设置为动态文本的“示例”,因为您永远不会记得仅通过查看表单来动态设置哪些控件。

    【讨论】:

    • 谢谢。如果某些内容发生更改或需要在资源文件中修改文本,我想知道这种方法的可维护性和可扩展性。或者如果我想将其扩展到另一种语言,如果应用程序已经在其中,它将如何实现生产?是否需要重新编译重新部署。
    • 使用这种方法,您必须重新编译并重新部署主可执行文件以进行添加和更改,是的。但是您必须使用任何简单的多语言实现重新部署 something。我不认为这是一个问题,因为语言字符串应该在它发布之前进行拼写/语法检查,并且添加客户想要的新语言应该是相对罕见的。
    • 我们的应用程序需要添加新的语言支持。所以如果应用程序除了语言没有变化,我们可以新建一个.resx文件,生成一个附属程序集,并把它放到适当的目录结构中。这不需要重新编译,对吗?另一个问题是输入的用户数据的翻译,如果我们有一些数据要在不同地区的用户之间共享,在哪里以及如何维护?
    • 您必须进行额外的抽象才能从附属程序集中检索字符串,但它应该以您想要的方式工作。 MSDN 可能对这种方法有一些提示。您还需要一种机制来允许用户从可用的语言中选择语言(或者它会在配置文件中)。用户数据的翻译是一个完全独立的讨论,您需要根据您的业务需求进行一些独立研究。
    【解决方案2】:

    最好在每个表单上设置本地化属性——这不仅会提取字符串,还会将各种组件的几何图形提取到基本的 .resx 文件中。对于指定的语言,组件的原始大小不太可能适合翻译。

    一般不建议用片段组成字符串,因为它们通常不会映射到不同语言的相同片段模式。使用格式化字符串 (String.Format) 来减少值,是的,但是任何依赖于原始语言的语法和句子顺序的东西都不太可能适合。

    【讨论】:

      【解决方案3】:

      如果您使用 Visual Source Safe 作为源代码控制(希望您不是),无论您做什么,不要在源代码本身中添加日语文本。尽管 Visual Studio 可以处理 unicode 源文件,但 VSS 不能很好地处理它们。

      我开发了一个将自身翻译成日语的应用程序,并且在源代码本身中包含日语(用于调用类似 MessageBox 的函数)损坏了文件,并且由于 VSS 是基于差异的,因此文件被损坏了一直回到原始签入版本。这种损坏的形式是大多数代码文件被转换为基于日文字符的乱码,这是因为 VSS 将基于 unicode 的 CS 文件(每个字符使用两个字节)的一部分移开了一个字节。

      修复这些文件需要大量的手工工作,我的老板在我的肩膀上盯着我,尖叫着说我们注定要失败,所以不要这样做。

      此外,这里还有几个关于此主题的其他 StackOverflow 问题:

      Best way to implement multi-language/globalization in large .NET project

      Best practice to make a multi language application in C#/WinForms?

      就个人而言,我更喜欢更简单的方法。在 Excel 或应用程序中需要翻译的每一段英文文本中创建一个列表(控制文本属性、在 MessageBox 函数中使用的字符串等),并将电子表格发送给您的翻译人员。在您的应用程序中,在每个表单的 Load 事件中调用一个方法,该方法遍历表单上的所有控件并将其 Text 属性更改为翻译后的值。将所有对 MessageBox 的调用替换为对转换要显示的文本的中间函数的调用,然后用翻译后的文本调用 MessageBox。

      使用内置的全球化方法需要大量工作,因为您必须手动创建每个全球化表单,然后手动将所有文本替换为翻译,而这项任务几乎需要程序员流利。我提到的方法是以编程方式完成的,不需要程序员精通翻译的语言。

      【讨论】:

      • 你应该对你的老板大喊大叫,因为你没有准备好备份。甚至用法语对他大喊大叫,配上日文字幕。
      • 我们确实有一个备份 - 它被称为“Visual Source Safe”。我从没想过这样的事情能够将存储库一直损坏到原始签入文件。
      • 你显然不懂备份的概念。
      • @Timmerz:你真的认为根据一个被抛弃的评论得出一个 17 年的编程老手不“理解备份的概念”的结论是明智的吗?或者你只是在练习做一个混蛋?因为我认为你不需要练习。
      • 我希望你立即被解雇。嚣张而没有多大意义。你为什么不看看这个链接? support.microsoft.com/kb/244016
      【解决方案4】:

      如果您希望社区为您本地化,请使用外部 XML 文件。 看http://www.codeplex.com/url2jpeg,这个开源项目就是这样本地化的,使用Reflection进行表单自动本地化。

      对于字符串,只需使用隐藏标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        相关资源
        最近更新 更多