Php Gettext工具使用一种语言的翻译作为另一种语言翻译的关键
有没有一个工具可以实现我在问题标题中的建议?考虑下面的场景,其中<代码> MSGID<代码>是代码>“%s分钟”[/COD],英语中的<代码> MSGSTR < /代码>是相同的,并且<代码> MSGSTR < /代码>在另一种语言中是<代码>“BLA%S BLA”< /代码>。市场营销部的人认为,英文字符串应该是Php Gettext工具使用一种语言的翻译作为另一种语言翻译的关键,php,localization,internationalization,gettext,Php,Localization,Internationalization,Gettext,有没有一个工具可以实现我在问题标题中的建议?考虑下面的场景,其中 MSGID是代码>“%s分钟”[/COD],英语中的 MSGSTR < /代码>是相同的,并且 MSGSTR < /代码>在另一种语言中是“BLA%S BLA”< /代码>。市场营销部的人认为,英文字符串应该是,“%s分钟后,快点!”。我该怎么办?一方面,我可以更改msgid。从好的方面来看,很明显,语言的翻译需要更新;但是字符串更改需要开发人员更新源文件,这听起来不像是很好地利用了开发人员的时间,因为有太多的功能需要实现,而且时
,“%s分钟后,快点!”
。我该怎么办?一方面,我可以更改msgid
。从好的方面来看,很明显,语言的翻译需要更新;但是字符串更改需要开发人员更新源文件,这听起来不像是很好地利用了开发人员的时间,因为有太多的功能需要实现,而且时间很短。另一方面,翻译人员可以用英语更新msgstr,以符合营销人员的要求,但我如何通知翻译人员他们必须更新其翻译?此外,他们所看到的是未更改的msgid
。那么我如何告诉他们实际的字符串是什么呢
感谢所有能够提供帮助的人。使用gettext,您有两个选择:
msgid "FRONTPAGE_SALES_CALL_TO_ACTION"
msgstr "Buy now, buy often!"
这样做的好处是,您可以通过编辑PO文件来更改UI文本,而无需触摸代码。它的缺点是,用户会因为缺少翻译而在UI中看到无意义的内容,UI代码更抽象/无意义,可能会使正确使用/原型变得更困难等。正如您所提到的,它还带来了使用翻译器的复杂性msgid
和msgstr
都是相同的。那只是多余的
如果您使用这种样式(显然是这样),那么文本的任何实际更改都必须发生在源代码处。源代码是您的规范用户界面;如果要更改消息的含义,实际上是UI中的更改,因此需要更新UI代码。然后,您可以使用xgettext
(或类似工具)将更改与PO文件同步,从而将更改传播到所有翻译文件,并将更改后的字符串标记为翻译(甚至可以提取现有翻译(如果可用))如果您想让“前端人员”能够在不接触复杂源代码的情况下更改文本,那么您需要更好地将前端代码与后端代码解耦。这不一定是gettext的任务,而是更好的模板系统或更好的MVC分离。这是一种常见的情况,无论好坏,它几乎是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,第三行是您的营销人员编辑“翻译”,无需再次编辑源代码
我不建议这样做——这是非标准的,你的翻译人员可能会习惯于让文本按预期的方式工作。不过,这是一个选项。对于一个使翻译更容易的工具,您可以研究一下(因为您没有提到),但我认为它不能处理“您需要更改翻译,因为原文已更改”。谢谢您让我的陈述更清楚。我认为你对解耦的看法特别正确,但我认为在任何情况下,想要更改文本的人都需要在某个地方编辑模板文件,如果他们甚至不想编辑模板文件,开发人员必须这样做;你能同意吗?不管怎么说,你的回答也让我看到我的问题标题和问题的主体没有什么关系,我的坏。我认为我坚持使用(1)或(2),但是在任何情况下,在源语言中使用msgid以外的工具都是非常有用的。事实上,我想修正我的观点1:你永远不应该这样做,这不是PO文件的用途。因为如果你这样做,你就必须单独向翻译人员传达“FRONTPAGE\u SALES\u CALL\u to\u ACTION”应该说什么。译者不能凭自己的优点翻译这一信息。它破坏了整个gettext工作流。(基本上是你自己提到的问题的大局。)此外,换句话可能会让你重新思考