Gettext工具使用一种语言的翻译作为另一种语言翻译的关键

时间:2014-06-19 08:44:09

标签: php localization internationalization gettext

是否有工具可以执行我在问题标题中提出的建议?请考虑以下情况:msgid"%s minutes left",英语中的msgstr是相同的,另一种语言中的msgstr"bla %s bla"。营销人员决定使用英文字符串"%s minutes left, hurry up!"。我该怎么办?一方面,我可以更改msgid。从好的方面来看,语言翻译需要更新;但字符串更改需要开发人员更新源文件,这对于开发人员的时间来说并不是很好用,因为有很多功能要实现且时间不足。另一方面,翻译人员可以用英语更新msgstr,以匹配营销人员的请求,但是如何通知翻译他们必须更新翻译?此外,他们所看到的只是msgid,它没有改变。那么如何告诉他们实际的字符串是什么?

感谢任何可以提供帮助的人。

2 个答案:

答案 0 :(得分:2)

这是一种常见的情况,无论好坏,都非常适合Gettext的预期工作流程。

正常的工作流程是:

source code > extract to POT > generate PO > translate PO

对源文本的修改将是:

edit source > extract new POT > merge into PO > review fuzzy strings

msgmerge命令行工具允许您将修改后的POT文件与已翻译的PO文件合并。这将标记任何将其源语言更改为模糊的翻译,这意味着翻译人员可能希望再次检查他们的翻译是否仍然准确。

msgmerge old.po changes.pot -o new.po

POEdit程序还通过“从POT更新”菜单选项具有此功能,我怀疑这可能是在后台使用msgmerge程序。

正如@deceze指出的那样,使用“机器ID”将源字符串与翻译分开并可以避免此类问题。虽然这是其他许多本地化平台的工作原理,但Gettext的工作方式却并非如此(方形挂钩,圆孔等)。

或许值得一提的是,您可以使用“提取的评论”功能向翻译人员传达更多信息。在PO / POT文件中,它们用“#。”前缀表示。 xgettext程序从源代码中提取这些内容,但您也可以手动维护它们。

例如,如果您想维护英文PO文件(供营销人员编辑)并在代码中使用机器ID,您可以这样:

#. %s minutes left
msgid "time-nag-minutes-left"
msgstr "%s minutes left, hurry up!"

第1行是显示初始英语的原始源代码注释,第二行是您的计算机ID,第三行是您的营销人员编辑“翻译”而无需再次编辑源代码。

我不推荐这个 - 它是非标准的,你的翻译可能会习惯于Gettext按照预期的方式工作。这是一个选择。

答案 1 :(得分:1)

使用gettext,您有两个选择:

  1. 在源中使用“string id”并提供PO文件中的所有UI文本。 E.g:

    msgid "FRONTPAGE_SALES_CALL_TO_ACTION"
    msgstr "Buy now, buy often!"
    

    这样做的好处是,您可以纯粹通过编辑PO文件来更改UI文本,而无需触摸代码。它的缺点是,您的用户会在UI中看到缺少翻译的废话,并且UI代码更抽象/无意义,并且可能使得使用/原型正确等更难。它还引入了与翻译人员合作的复杂性,正如你自己提到的那样。

  2. 在代码中使用文字UI文本,并仅在PO文件中为其提供翻译。

    在这种情况下,应该有源语言的PO文件,其中每个msgidmsgstr都相同。这只是多余的。

    如果你正在使用这种风格(显然你是这样),那么任何实际的文本更改都必须在源头进行。源代码是您的规范UI;如果您正在更改消息的含义,那么它实际上是UI中的更改,因此需要更新UI代码。然后使用xgettext(或类似工具)将更改与PO文件同步,将更改传播到所有翻译文件并标记更改的字符串以进行翻译(如果可用,甚至提取现有翻译)。

  3. 你不应该养成做2的习惯,但要把它当成1.这会导致很多困惑的 WTF?!时刻。

    如果要启用“前端人员”来更改文本而无需触摸复杂的源代码,则需要将前端代码与后端代码更好地分离。这不一定是gettext的任务,而是更好的模板系统或更好的MVC分离。