【问题标题】:Combining keys and full text when working with gettext and .po files使用 gettext 和 .po 文件时组合键和全文
【发布时间】:2013-03-22 13:19:55
【问题描述】:

我正在寻找 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 呼叫的键
- 译者能否看到需要翻译的全文?

【问题讨论】:

    标签: localization internationalization gettext po


    【解决方案1】:

    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
    

    【讨论】:

    • 关于失效的好点。您建议的替代方案(使用switch 示例)添加了一个附加层,这基本上是我想要的翻译格式,即拥有1 - key/id 以保持视图更简洁和易于维护,@987654328 @ 以确保我们拥有用于失效的确切来源,以及 3 - translation。您知道是否有任何翻译格式具有这种结构?
    • 正如我所说,如果可能的话,我会尽量远离钥匙。以我的经验,它使阅读/调试代码变得更加困难——而不是更容易。我只使用它们(间接通过开关)作为帮助文本,无论如何它往往位于代码的其余部分之外。 PO 格式很棒,因为它被翻译人员(而不是开发人员)广泛使用和理解,并且有很多工具可以让他们的工作更轻松。
    • 我完全理解您在说什么,但有一件事我无法理解:当您需要翻译整个段落(例如公司历史)时:您使用gettext 通话中的整个英文段落?对我来说听起来很可怕,IMO 这样做会更有意义gettext('company-history')
    • @Max 我不喜欢使用字符串作为键,因为没有编译时检查键是否确实存在(“魔术字符串”)。有没有办法将 gettext 与 PHP 的 define 功能一起使用?这样一来,如果密钥不存在(以及体面的 IDE 自动完成),就会出现错误。
    【解决方案2】:

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

    短版:

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

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

    【讨论】:

    • 我站在你这边,所以接受你的答案并不太客观,但我真的相信这是要走的路:保持PO,因为它被广泛使用且易于操作,构建任何东西从中创建它们并在您的应用程序中使用它们的中间步骤:这样每个人都很高兴并且您继续依赖其他人使用的东西(显然您的自定义层除外)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2021-03-11
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多