使用gettext和.po文件时组合键和全文

时间:2013-04-01 12:56:42

标签: localization internationalization gettext po

我正在考虑gettext and .po files创建一个多语言应用程序。我的理解是,.po文件msgid是来源,msgstr是翻译。因此,我看到了两种定义msgid的方法:

使用全文(例如"My name is %s.\n")具有以下优势:

  • 致电gettext时,您可以清楚地看到将要发生的事情 翻译
  • 翻译.po文件更容易,因为它们 包含要翻译的实际内容

使用具有以下优点的密钥(例如my-name %s):

  • 当源文本很长时(例如关于公司的段落),gettext调用更简洁,使您的视图更清晰
  • 更容易维护多个.po文件和视图,因为密钥更改的可能性更小(例如,company-description的密钥远不如实际公司描述更改)

因此我的问题:
是否有办法处理gettext.po文件,这些文件可以结合两种方法的优点,即:
- gettext次呼叫键的使用权 翻译人员是否能够查看需要翻译的全文?

2 个答案:

答案 0 :(得分:6)

gettext旨在将英文文本翻译成其他语言,这就是您应该使用它的方式。不要将它与钥匙一起使用。如果需要键,请使用其他技术,例如关联数组。

我管理了两个大型开源项目(50种语言,5000种翻译),一种使用密钥方法,一种使用gettext方法 - 我再也不会使用密钥方法了。

缺点包括将英文文本的更改传播到其他语言。如果你改变了

msg_no_food = "We had no food left, so we had to eat the cats"

msg_no_food = "We had no food left, so we had to eat the cat's"

新文本的含义完全不同 - 那么如何确保其他翻译无效和更新?

你提到过长文本会让你的脚本难以阅读。解决方案可能是将它们放在一个单独的脚本中。例如,将其放在主代码中

print help_message('help_no_food')

并且有一个只提供帮助消息的脚本:

switch ($help_msg) {
...
case 'help_no_food': return gettext("We had no food left, so we had to eat the cat's");
...
}

gettext的另一个问题是当你有一整页要翻译时。也许是一个包含大量嵌入式图像的网站上的宣传册页面。如果您为具有长文本的语言(例如德语)留出了大量空间,则在短文本的语言(例如中文)上将有很多空格。因此,您可能会为每种语言使用不同的图像/布局。

由于这些数量往往很少,因此通常更容易完全实现这些外部gettext。 e.g。

brochure-view.en.php
brochure-view.de.php
brochure-view.zh.php

答案 1 :(得分:2)

我刚回答了一个类似的(更老的)问题here

简短版本:

PO文件格式非常简单,因此可以从另一个工作流程生成PO / MO文件,从而实现您所要求的灵活性。 (你的开发人员需要标识符,你的翻译人员需要单词)

您可以自行推出此解决方案,或使用基于云的应用程序(如Loco)管理您的翻译,并在您的开发人员需要时导出带有标识符的Gettext文件。