23

我正在开发一个需要翻译成 30 种语言的软件项目。这意味着更改任何字符串都会产生相对较高的成本。此外,翻译不会一蹴而就,因为翻译包需要由不同的翻译人员完成,所以这可能需要一段时间。

不知何故,添加新功能很麻烦。在实际编写 UI 代码之前,我们可以想出所有需要的字符串,但有时由于错误修复或疏忽,我们仍需要添加新字符串。

所以问题是,你如何管理所有这些过程?关于如何减轻翻译对软件项目的影响的任何提示?如何统治弦乐,而不是让弦乐统治你?

编辑:我们正在使用 Java,所有字符串都使用资源包进行国际化,所以问题不在于国际化本身,而在于字符串的管理。

4

11 回答 11

13

我不确定您正在国际化的平台。我之前已经写过关于 il8n 应用程序的最佳方式的答案。请参阅全球化 asp.net 应用程序需要了解什么?

也就是说 - 自己管理翻译很困难。问题是您将在多个页面中使用相同的文本。但是,您的框架可能不支持仅在一个文件中包含那段文本(例如,asp.net 中的资源文件鼓励您为每种语言拥有一个资源文件)。

我们发现处理事物的方式是拥有一个翻译的中央数据库存储库。我们创建了一个小型 .net 应用程序来将翻译从资源文件导入到该数据库,并将翻译从该数据库导出到资源文件。因此,在构建过程中有一个额外的步骤来构建资源文件。

您将遇到的另一个问题是将翻译传递给您的翻译供应商并返回。有几种方法 - 看看您的翻译供应商是否愿意接受 XML 文件并返回格式正确的 XML 文件。这确实是最好的方法之一,因为它允许您自动导入和导出翻译文件。如果您的供应商允许,另一种选择是创建一个网站以允许他们编辑翻译。

In the end, your answer for translations will be the same for any other process that requires repetition and manual work. Automate, automate, automate. Automate every single thing that you can. Copy and paste is not your friend in this scenario.

于 2009-05-30T21:18:59.170 回答
5

Pootle是一个允许通过网络管理翻译过程的网络应用程序。

于 2009-05-30T21:12:38.573 回答
4

在国际化应用程序时需要考虑许多主要问题。

  • 并非所有字符串都是平等创建的。根据语言的不同,句子的长度可能会发生显着变化。在某些语言中,它可以是一半的长度,而在另一些语言中,它可以是三倍的长度。确保为您的 GUI 小部件设计有足够的空间来处理大于英文字符串的字符串。
  • 翻译人员通常不是程序员。不要期望翻译人员能够阅读和维护资源文件的正确文件格式。您应该设置一种机制,您可以将翻译后的数据往返从电子表格之类的东西转换到资源文件。一种可能性是将 XSL 过滤器与 Open Office 一起使用,以便您可以直接在电子表格应用程序中保存到资源文件。此外,翻译人员或翻译服务公司可能已经拥有自己的数据库,因此最好询问他们使用什么并编写一些工具来自动化。
  • 您将需要将数据附加到字符串- 不要假装您永远不需要,否则您将始终能够将字符串放在末尾。确保您有一个字符串格式化程序设置来替换字符串中的占位符。此外,请确保记录将为翻译人员替换的典型值。请记住,占位符的顺序在不同的语言中可能会发生变化。
  • 将您的 i8n 字符串变量命名为反映其含义的名称。您是否真的想在资源文件中查找数字以找出给定字符串的内容。开发人员依赖于能够读取代码中的字符串输出来提高效率,这比他们通常意识到的要高得多。
  • 不要害怕代码生成。在我当前的项目中,我编写了一个由 ant 调用的小型 Java 程序,它解析默认语言(主)资源文件的所有键,然后将键映射到本地化类中定义的常量。见下文。//---- 注释之间的行是自动生成的。每次添加字符串时,我都会运行生成器。


public final class l7d {
...normal junk

/** * Reference to the localized strings resource bundle. */ public static final ResourceBundle l7dBundle = ResourceBundle.getBundle(BUNDLE_PATH);

//---- start l7d fields ----\ public static final String ERROR_AuthenticationException; public static final String ERROR_cannot_find_algorithm; public static final String ERROR_invalid_context; ...many more //---- end l7d fields ----\ static {
//---- start setting l7d fields ----\ ERROR_AuthenticationException = l7dBundle.getString("ERROR_AuthenticationException"); ERROR_cannot_find_algorithm = l7dBundle.getString("ERROR_cannot_find_algorithm"); ERROR_invalid_context = l7dBundle.getString("ERROR_invalid_context"); ...many more //---- end setting l7d fields ----\ }

上述方法提供了一些好处。

  1. 由于您的字符串键现在被定义为一个字段,您的 IDE 应该支持它的代码完成。这将为您节省大量类型。每次要打印字符串时,查找每个键名并修复拼写错误真的很令人沮丧。
  2. 如果我错了,请有人纠正我。通过在静态实例化时将所有字符串加载到内存中(如示例中所示),将导致更快的加载时间,但会增加内存使用量。我发现使用的额外内存量可以忽略不计,值得权衡。
于 2008-11-10T10:13:34.710 回答
2

我从事的本地化项目有“字符串冻结”日期。在此之后,允许更改字符串的唯一方法是获得项目管理团队非常高级成员的许可。

这并不是一个完美的解决方案,但它确实使我们能够以正当的理由将有关字符串的缺陷搁置到下一个版本。一旦发生字符串冻结,您也有正当理由拒绝在“一时冲动”的决定中向项目添加全新功能。并且获得来自高层的许可意味着中层管理人员将无权更改您的规格:)

于 2008-10-10T12:49:18.400 回答
2

如果可用,请为此使用数据库。每个字符串都有一个 id,每种语言都有一个表,或者在一个列中包含所有语言的一个表(取决于访问站点的方式,性能决定了哪个更好)。这允许翻译人员进行更新,而无需尝试管理代码文件和版本控制细节。此外,运行关于未翻译内容的报告并跟踪自动翻译(引擎)与真正的人工翻译几乎是微不足道的。

如果没有数据库,那么我将每种语言都放在一个单独的文件中,以减少版本控制问题。但结构基本相同——每个字符串都有一个id。

-亚当

于 2008-10-10T12:51:44.900 回答
2

我们不仅使用了数据库而不是自吹自擂的资源文件(当我们拥有如此出色的数据库处理工具时,我一直不明白为什么人们会使用这样难以管理的东西),而且我们还避免了需要通过使用反射来识别要翻译的控件,在应用程序中标记事物(忘记在 VB6 Forms 中用数字标记控件总是一个问题)。然后我们使用一个 XML 文件将控件转换为字典数据库中的短语 ID。

尽管必须管理映射文件,但它仍然可以独立于构建过程进行管理,并且实际上可以由拥有数据库权限的最终用户进行应用程序的翻译。

于 2008-10-10T12:58:10.817 回答
1

到目前为止,我们提出的解决方案是在 Excel 中使用一个小型应用程序来读取所有属性文件,然后显示一个包含所有翻译的矩阵(语言作为标题,键作为行)。那时缺少什么是很明显的。这是发送给译者的。当它返回时,可以处理工作表以再次生成相同的属性包。到目前为止,它已经在一定程度上缓解了疼痛,但我想知道周围还有什么。

于 2008-10-10T12:54:30.887 回答
1

我放入了一个 makefile 目标,它可以找到所有 .properties 文件并将它们放入一个 zip 文件中以发送给翻译人员。我提出只给他们发送差异,但出于某种原因,他们每次都想要整个文件包。我认为他们有自己的系统来跟踪差异,因为他们根据从一次到下一次更改了多少字符串向我们收费。当我收到他们的交付时,我手动将他们的所有文件与之前交付的文件进行比较,以查看是否有任何意外发生变化 - 有一次所有 PT_BR(巴西葡萄牙语)字符串都发生了变化,结果他们使用了 PT_PT(葡萄牙语) 该批次的翻译器,不管 PT_BR 的顺序如何。

于 2008-10-10T12:56:54.173 回答
1

这本 google book -资源文件管理提供了一些很好的提示

您可以使用资源文件管理软件来跟踪已更改的字符串并控制工作流程以将它们翻译 - 否则您最终会陷入一团糟的冻结和专横的版本控制

一些做这种事情的工具 - 没有联系,我实际上没有使用它们,只是研究

http://www.sisulizer.com/

http://www.translationzone.com/en/products/

于 2009-02-07T15:15:32.787 回答
0

在 Java 中,国际化是通过将字符串移动到资源包中来实现的……翻译过程仍然漫长而艰巨,但至少它与生产软件、发布服务包等的过程分开了。有一点很有帮助的是一个 CI 系统,可以在任何更改时重新打包所有内容。我们可以在几分钟内测试并发布一个新版本,无论是代码更改、新语言包还是两者兼而有之。

于 2008-10-10T12:46:39.310 回答
0

对于初学者,我会使用默认字符串以防缺少翻译。例如,英语或西班牙语值。其次,您可能需要考虑使用 Web 应用程序或类似的东西供您的翻译人员使用。这需要一些预先的资源,但至少您不需要到处发送文件,而且对于翻译人员来说,哪些字符串是新的等会很明显。

于 2008-10-28T14:54:35.150 回答