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

Localization 使用gettext和.po文件时组合键和全文,localization,internationalization,gettext,po,Localization,Internationalization,Gettext,Po,我正在寻找创建一个多语言应用程序。我的理解是,.po文件中的msgid是源代码,msgstr是翻译。因此,我看到了定义msgid的两种方法: 使用全文(例如,“我的名字是%s.\n”)具有以下优点: 当调用gettext时,您可以清楚地看到即将发生的事情 翻译 翻译.po文件更容易,因为它们 包含要翻译的实际内容 使用具有以下优点的密钥(例如,我的名字%s): 当源文本较长时(例如,关于公司的段落),gettext调用更简洁,从而使视图更清晰 更易于维护多个.po文件和视图,因为密钥不太可

我正在寻找创建一个多语言应用程序。我的理解是,
.po
文件中的
msgid
是源代码,
msgstr
是翻译。因此,我看到了定义
msgid
的两种方法:

使用全文(例如,
“我的名字是%s.\n”
)具有以下优点:

  • 当调用
    gettext
    时,您可以清楚地看到即将发生的事情 翻译
  • 翻译
    .po
    文件更容易,因为它们 包含要翻译的实际内容
使用具有以下优点的密钥(例如,
我的名字%s
):

  • 当源文本较长时(例如,关于公司的段落),
    gettext
    调用更简洁,从而使视图更清晰
  • 更易于维护多个
    .po
    文件和视图,因为密钥不太可能更改(例如
    公司描述的密钥
    更改的可能性远小于实际公司描述)
因此我的问题是:
是否有一种方法可以处理
gettext
.po
文件,从而可以结合这两种方法的优点,即:
-使用键进行
gettext
调用

-翻译人员查看需要翻译的全文的能力?

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

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

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

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

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

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

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
我刚刚回答了一个类似的问题

简短版本:

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


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

关于无效性的观点很好。您建议的备选方案(使用
开关
示例)添加了一个附加层,这基本上是我希望从翻译格式中得到的,即使用
1键/id
,以保持视图更简洁和易于维护,
2源
,以确保我们拥有用于失效的确切源代码,和
3-翻译
。你知道有没有翻译格式有这样的结构吗?正如我所说的,如果可能的话,我会避开关键点。根据我的经验,这使得读取/调试代码变得更难,而不是更容易。我只使用它们(通过一个开关间接地)作为帮助文本,不管怎样,帮助文本往往位于代码的其余部分之外。PO格式很好,因为它被翻译人员(而不是开发人员)广泛使用和理解,而且有很多工具可以让他们的工作更轻松。我完全理解你的意思,但有一件事我无法理解:当你需要翻译整个段落(例如公司历史)时:您是否在
gettext
调用中使用整个英文段落?听起来很可怕,在我看来,做
gettext('company-history')
@Max会更有意义。我不喜欢使用字符串作为键,因为没有编译时检查键是否确实存在(“神奇字符串”)。有没有办法将
gettext
与PHP的
define
功能结合使用?这样,如果密钥不存在(IDE自动完成也不错),就会出现错误。我站在你这边,所以不太客观地接受你的答案,但我真的相信这是正确的做法:保留
PO
,因为它使用广泛且易于操作,构建任何中间步骤来创建它们,并在应用程序中使用它们:这样每个人都会感到高兴,并且您也会继续依赖其他人使用的东西(当然,自定义层除外)。
brochure-view.en.php
brochure-view.de.php
brochure-view.zh.php