PHP本地化最佳实践? gettext的?

时间:2010-05-07 18:51:18

标签: php localization internationalization gettext

我们正在使我们的网站变得国际化,允许多种语言。

我看过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中处理翻译的最佳方法是什么?

由于

3 个答案:

答案 0 :(得分:14)

您基本上问了并回答了自己的问题,答案可能只是对PO文件的工作方式有了更好的了解。

在PO文件中,您有一个msgid和一个msgstr。 msgid是PHP文件中的msgstr取代的值,具体取决于本地化。

现在你可以让msgid成为你想要的任何东西,你可以很好地做到:

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

然后你永远不会在源代码中再次触摸此字符串,只能通过PO文件编辑字符串。

所以基本上你的问题的答案是你为字符串应该说的内容制作gettext值标识符,但翻译人员通常使用默认语言文件文本作为转换的基础,而不是标识符本身。

我希望这很清楚。

答案 1 :(得分:9)

我知道答案已被接受,上述答案很好。但是在使用Gettext时,使用thing.stuff.widget这样的永久机器式键存在另一个问题。

虽然使用永久密钥是一种更好的开发方法,但Gettext并未针对该工作方式进行设置,这会使您的工作流程复杂化。

如果您提供的译员的PO文件中填充了密钥来代替源文本,他们可能不知道英文应该是什么。因此,您必须为他们提供包含源语言翻译的第二个文件,以便与之进行比较。不是世界末日,而是更加繁琐,而不是如何设计Gettext。 (方形钉,圆孔等..)

我认为PO作为PHP翻译的文件格式非常好,特别推荐如果你不使用具有良好l10n模块的框架,但这并不意味着它对工作流和你的翻译有好处过程

我建议你到达一个工作流程,允许程序员使用永久密钥,翻译人员使用单词,并在另一端提供MO文件。请查看Loco以获得一个解决方案。

或者使用允许使用键和单词的不同临时文件格式。 TMX就是一个例子。如果您仍想在运行时使用Gettext,可以convert the files

答案 2 :(得分:7)

目前,我正在处理同样的问题。 gettext的常见做法是使用英文文本作为关键字。最近,我们的复制编辑器改变了一大堆英文文本(其他语言很难触及)所以我们必须更改所有PO文件的所有源代码。

我们正在切换到中性密钥。因为我们已经在Java上有一些网站。我们将使用相同的属性名称格式。