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

Php Gettext工具使用一种语言的翻译作为另一种语言翻译的关键,php,localization,internationalization,gettext,Php,Localization,Internationalization,Gettext,有没有一个工具可以实现我在问题标题中的建议?考虑下面的场景,其中 MSGID是代码>“%s分钟”[/COD],英语中的 MSGSTR < /代码>是相同的,并且 MSGSTR < /代码>在另一种语言中是“BLA%S BLA”< /代码>。市场营销部的人认为,英文字符串应该是,“%s分钟后,快点!”。我该怎么办?一方面,我可以更改msgid。从好的方面来看,很明显,语言的翻译需要更新;但是字符串更改需要开发人员更新源文件,这听起来不像是很好地利用了开发人员的时间,因为有太多的功能需要实现,而且时

有没有一个工具可以实现我在问题标题中的建议?考虑下面的场景,其中<代码> MSGID<代码>是代码>“%s分钟”[/COD],英语中的<代码> MSGSTR < /代码>是相同的,并且<代码> MSGSTR < /代码>在另一种语言中是<代码>“BLA%S BLA”< /代码>。市场营销部的人认为,英文字符串应该是
,“%s分钟后,快点!”
。我该怎么办?一方面,我可以更改
msgid
。从好的方面来看,很明显,语言的翻译需要更新;但是字符串更改需要开发人员更新源文件,这听起来不像是很好地利用了开发人员的时间,因为有太多的功能需要实现,而且时间很短。另一方面,翻译人员可以用英语更新msgstr,以符合营销人员的要求,但我如何通知翻译人员他们必须更新其翻译?此外,他们所看到的是未更改的
msgid
。那么我如何告诉他们实际的字符串是什么呢


感谢所有能够提供帮助的人。

使用gettext,您有两个选择:

  • 在源代码中使用“字符串ID”,并在PO文件中提供所有UI文本。例如:

    msgid "FRONTPAGE_SALES_CALL_TO_ACTION"
    msgstr "Buy now, buy often!"
    
    这样做的好处是,您可以通过编辑PO文件来更改UI文本,而无需触摸代码。它的缺点是,用户会因为缺少翻译而在UI中看到无意义的内容,UI代码更抽象/无意义,可能会使正确使用/原型变得更困难等。正如您所提到的,它还带来了使用翻译器的复杂性

  • 在代码中使用文本UI文本,并且仅在PO文件中为其提供翻译

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

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

  • 你不应该养成做某事的习惯。但是把它当作1。那会导致很多混乱的WTF?!接下来的几分钟


    如果您想让“前端人员”能够在不接触复杂源代码的情况下更改文本,那么您需要更好地将前端代码与后端代码解耦。这不一定是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工作流。(基本上是你自己提到的问题的大局。)此外,换句话可能会让你重新思考