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

Max*_*Max 8 localization gettext internationalization po

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

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

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

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

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

因此我的问题是:
有没有一种方法可以使用gettext和.po文件,它们可以结合两种方法的优点,即: -
用于gettext调用的密钥用于
翻译者查看需要翻译的全文?

fis*_*est 6

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

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

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

msg_no_food = "We had no food left, so we had to eat the cats"
Run Code Online (Sandbox Code Playgroud)

至

msg_no_food = "We had no food left, so we had to eat the cat's"
Run Code Online (Sandbox Code Playgroud)

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

您提到了长文本,使您的脚本难以阅读.解决方案可能是将它们放在一个单独的脚本中.例如,将其放在主代码中

print help_message('help_no_food')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

brochure-view.en.php
brochure-view.de.php
brochure-view.zh.php
Run Code Online (Sandbox Code Playgroud)

  • 我完全明白你在说什么,但有一件事我无法理解:当你需要渲染整个段落的翻译时(例如公司历史):你在`gettext中使用整个英文段落吗? `打电话?对我来说听起来很可怕,IMO做`gettext('company-history')会更有意义 (3认同)

Tim*_*Tim 3

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

简洁版本:

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

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