PHP本地化最佳实践?gettext?

22

我们正在进行网站国际化,允许使用多种语言。

我研究了php的“gettext”,但是如果我理解正确,我认为存在一个很大的缺陷:

如果我的网页上有“Hello World”作为静态文本。我可以把这个字符串写成<?php echo gettext("Hello World"); ?>,使用工具生成po/mo文件。然后我会将该文件交给翻译人员进行处理。

几天后,我们想把英文文本更改为“Hello Small World”? 我需要更改gettext中的值吗?还是我需要创建一个英文PO文件并在其中进行更改? 如果您更改gettext,它将把它视为新字符串,您将立即失去当前的翻译...

在我看来,逐渐地,php文件的内容将无处不是旧文本。 或者可能需要告诉翻译人员“当您看到Hello World时,请翻译成Hello Small World”。

我不知道我是否感到困惑。

在其他编程语言中,我看到他们使用关键字,如web.home.featured.HelloWorld

在PHP中处理翻译的最佳方式是什么?

谢谢


答案取决于更改是否为逻辑更改。如果需要在所有翻译中更改消息,则应修改源代码中的原始消息。 如果只有英语版本的市场部门需要更改,您只需更改英语翻译即可。请注意,源代码应被视为“开发者英语”,并且应将“US English”和“British English”作为实际的“.po”文件。 - Mikko Rantalainen
3个回答

16

你本质上是在问自己的问题并回答了它,答案可能就在于更好地理解PO文件的工作原理。

在PO文件中,你有一个msgid和一个msgstr。msgid是将根据本地化替换为PHP文件中的msgstr的值。

现在你可以使这些msgid成为任何你想要的东西,你完全可以这样做:

<?php echo _("web.home.featured.HelloWorld"); ?>

然后在源代码中,您将不再触碰此字符串,您只能通过PO文件编辑字符串。

因此,基本上回答您的问题是,您可以使gettext值成为字符串应该表达的标识符,但翻译者通常使用默认语言文件的文本作为转换的基础,而不是标识符本身。

希望这很清楚。


如果无法找到给定语言的web.home.featured.HelloWorld,它会显示"web.home.featured.HelloWorld"还是该msgid的英文版本? - Nathan H
@nute:它将显示 web.home.featured.HelloWorld - Alix Axel
1
使用这种方法,我该如何显示:“显示%s到%s共%s个结果”(其中%s是一些变量)? - Nathan H
需要将变量传递到字符串的情况确实是一个问题。 如果您的应用程序需要广泛本地化,您可能想要编写自定义解决方案或查看具有本地化功能的框架(如Zend_Translate,yii-i18n等)。 - tplaner

9
我知道已经有一个答案被接受,上面的答案也很好。但是,在使用Gettext时,使用永久机器式密钥(例如thing.stuff.widget)还存在另一个问题。

虽然使用永久密钥是开发的更好方法,但是Gettext并没有设置这种工作方式,这可能会使您的工作流程变得更加复杂。

如果您向翻译人员展示了一个以密钥填充源文本的PO文件,他们可能不知道英文应该是什么。因此,您需要为他们提供第二个文件,其中包含源语言的翻译,以便进行比较。这并不是世界末日,但对于他们来说会更加繁琐,也不是Gettext设计的方式。(方形钉子,圆形孔等等。)

我认为,对于PHP中的翻译而言,PO作为文件格式是完全可以接受的,特别是如果您没有使用具有良好l10n模块的框架,但这并不意味着它对于工作流程和翻译过程是好的。

我建议您采用一种工作流程,使程序员可以使用永久密钥,翻译人员可以使用单词,并从另一端输出MO文件。查看Loco以获取一种解决方案。

或者使用不同的中间文件格式,允许使用密钥和单词。 TMX就是一个例子。如果您仍然希望在运行时使用Gettext,则可以转换文件

1
谢谢你的回答!我已经点赞了,因为我认为它对问题有所补充!然而,我感到困惑的是,你提供的所有链接似乎都指向与Loco相关的资产。你是否与Loco有关系?你能推荐其他解决方案吗?只是想获得一个公正的高层次了解现有的选择。谢谢! :) - rinogo
1
公平的问题。是的,我有关联。但我的回答是真诚地设计来帮助,因为我是一名PHP开发人员,自己也遇到过这些问题。我没有使用过类似的应用程序,但有很多。在谷歌上搜索“翻译管理”应该可以找到它们。 - Tim
感谢您的透明和帮助,Tim! :) - rinogo

7

目前,我正在处理相同的问题。Gettext 的常见做法是使用英文文本作为键。最近,我们的副本编辑更改了大量的英文文本(其他语言几乎没有被触及),因此我们必须更改所有源代码和 PO 文件。

我们正在切换到中性键。由于我们已经有一些 Java 网站,我们将使用相同的属性名称格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接