是否有工具可以执行我在问题标题中提出的建议?请考虑以下情况:msgid
为"%s minutes left"
,英语中的msgstr
是相同的,另一种语言中的msgstr
为"bla %s bla"
。营销人员决定使用英文字符串"%s minutes left, hurry up!"
。我该怎么办?一方面,我可以更改msgid
。从好的方面来看,语言翻译需要更新;但字符串更改需要开发人员更新源文件,这对于开发人员的时间来说并不是很好用,因为有很多功能要实现且时间不足。另一方面,翻译人员可以用英语更新msgstr,以匹配营销人员的请求,但是如何通知翻译他们必须更新翻译?此外,他们所看到的只是msgid
,它没有改变。那么如何告诉他们实际的字符串是什么?
感谢任何可以提供帮助的人。
答案 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,您有两个选择:
在源中使用“string id”并提供PO文件中的所有UI文本。 E.g:
msgid "FRONTPAGE_SALES_CALL_TO_ACTION"
msgstr "Buy now, buy often!"
这样做的好处是,您可以纯粹通过编辑PO文件来更改UI文本,而无需触摸代码。它的缺点是,您的用户会在UI中看到缺少翻译的废话,并且UI代码更抽象/无意义,并且可能使得使用/原型正确等更难。它还引入了与翻译人员合作的复杂性,正如你自己提到的那样。
在代码中使用文字UI文本,并仅在PO文件中为其提供翻译。
在这种情况下,不应该有源语言的PO文件,其中每个msgid
和msgstr
都相同。这只是多余的。
如果你正在使用这种风格(显然你是这样),那么任何实际的文本更改都必须在源头进行。源代码是您的规范UI;如果您正在更改消息的含义,那么它实际上是UI中的更改,因此需要更新UI代码。然后使用xgettext
(或类似工具)将更改与PO文件同步,将更改传播到所有翻译文件并标记更改的字符串以进行翻译(如果可用,甚至提取现有翻译)。
你不应该养成做2的习惯,但要把它当成1.这会导致很多困惑的 WTF?!时刻。
如果要启用“前端人员”来更改文本而无需触摸复杂的源代码,则需要将前端代码与后端代码更好地分离。这不一定是gettext的任务,而是更好的模板系统或更好的MVC分离。