我们正在使我们的网站变得国际化,允许多种语言。
我看过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中处理翻译的最佳方法是什么?
由于
答案 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上有一些网站。我们将使用相同的属性名称格式。