8

我正在查看用于创建多语言应用程序的gettext文件.po我的理解是,.po文件msgid中是源,msgstr是翻译。因此,我看到了两种定义方式msgid

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

  • 打电话gettext时可以清楚地看到要翻译的内容
  • 翻译文件更容易,.po因为它们包含要翻译的实际内容

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

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

因此我的问题是:
有没有一种方法可以结合两种方法的优点来处理文件gettext.po即:
- 使用键来gettext调用
- 翻译人员能够看到需要翻译的全文?

4

2 回答 2

6

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

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

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

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 之外完全实现这些通常更容易。例如

brochure-view.en.php
brochure-view.de.php
brochure-view.zh.php
于 2013-04-02T07:32:24.387 回答
3

我刚刚在这里回答了一个类似的(更老的)问题。

简洁版本:

PO 文件格式非常简单,因此可以从另一个工作流生成 PO/MO 文件,从而满足您的要求。(您的开发人员需要标识符,您的翻译人员需要文字)

您可以自己推出这个解决方案,或者使用像Loco这样的基于云的应用程序来管理您的翻译并在您的开发人员需要时导出带有标识符的 Gettext 文件。

于 2013-06-05T09:20:50.850 回答