你如何管理字符串翻译流程?

时间:2008-10-10 12:42:18

标签: internationalization

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

添加新功能在某种程度上很麻烦。我们可以在实际编写UI代码之前考虑所需的所有字符串,但有时我们仍然需要添加新的字符串,因为修复了错误或者因为疏忽。

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

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

11 个答案:

答案 0 :(得分:13)

我不确定你正在进行国际化的平台。我之前已经就应用程序的最佳方式写了一个答案。见What do I need to know to globalize an asp.net application?

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

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

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

最后,对于需要重复和手动工作的任何其他过程,您的翻译答案都是相同的。自动化,自动化,自动化。自动化您可以做的每一件事。在这种情况下,复制并粘贴而不是您的朋友。

答案 1 :(得分:5)

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

答案 2 :(得分: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. 如果我错了,请有人纠正我。通过在静态实例化时将所有字符串加载到内存中(如示例中所示)将导致更快的加载时间,但代价是额外的内存使用量。我发现使用的额外内存量可以忽略不计,值得折衷。

答案 3 :(得分:2)

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

它并不是一个完美的解决方案,但它确实使我们能够将有关字符串的缺陷置于保留状态,直到下一个版本有正当理由。一旦字符串冻结发生,您还有一个有效的理由拒绝为“项目瞬间”决策添加全新功能。获得高级许可意味着中层管理人员没有权力改变你的规范:)

答案 4 :(得分:2)

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

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

- 亚当

答案 5 :(得分:2)

我们不仅使用数据库而不是自发的资源文件(我从未理解为什么人们使用类似管理的东西,当我们有这么好的工具来处理数据库时),但我们也避免了需要在应用程序中标记内容(忘记使用VB6 Forms中的数字标记控件始终是一个问题),方法是使用反射来标识转换控件。然后我们使用XML文件将控件转换为字典数据库中的短语ID。

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

此Google图书 - resource file management提供了一些不错的提示

您可以使用资源文件管理软件跟踪已更改的字符串并控制工作流程以使其翻译 - 否则您最终会陷入混乱和霸道的版本控制

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

http://www.sisulizer.com/

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

首先,如果缺少翻译,我会使用默认字符串。例如,英语或西班牙语的值。 其次,您可能需要考虑一个Web应用程序或类似的翻译人员使用。这需要预先提供一些资源,但至少你不需要发送文件,对于翻译者来说,显然哪些字符串是新的等等。