12

在php中(或者可能是一般的gettext),当gettext看到动态内容的变量时会做什么?

我有2个案例。

1)假设我有<?=$user1?> poked John <?=$user2?>。也许在某些语言中,单词的顺序是不同的。gettext 是如何处理的?(不,我不是在建立 facebook,这只是一个例子)

2)假设我将一些类别存储在数据库中。它们很少,但它们存储在数据库中。如果我这样做会发生什么<?php echo gettext($data['name']); ?> ?我希望翻译人员也翻译这些类别名称,但必须在数据库本身中完成吗?

谢谢

4

3 回答 3

21

您最好的选择是使用sprintf()功能。然后,您将使用printf符号来处理字符串中的动态内容。这是我不久前在这里找到的一个函数,可以为您轻松处理这个问题:

function translate()
{
    $args = func_get_args();
    $num = func_num_args();
    $args[0] = gettext($args[0]);

    if($num <= 1)
      return $args[0];

    return call_user_func_array('sprintf', $args);

}

现在例如 1,您希望将字符串更改为:

%s poked %s

您将translate()像这样输入到函数中:

<?php echo translate('%s poked %s', $user1, $user2); ?>

translate()您将使用 poEdit解析所有函数。然后将字符串翻译"%s poked %s"成您想要的任何语言,而无需修改%s字符串占位符。这些将在translate()函数输出时分别用 user1 和 user2 替换。sprintf()您可以在 PHP 手册中阅读更多内容以了解更高级的用法。

对于问题 #2。您需要创建一个 poEdit 可以解析包含类别名称的静态文件。例如misctranslations.php

<?php

_('Cars');
_('Trains');
_('Airplanes');

然后有 poEdit 解析misctranslations.php。然后,您将能够使用输出类别名称翻译<?php echo gettext($data['name']); ?>

于 2009-11-20T21:47:10.857 回答
5

为了建立一点马克所说的...上述解决方案的唯一问题是静态列表必须始终手动维护,如果您在所有其他字符串之前添加一个新字符串或者您完全更改现有字符串,软您用于翻译的可能会混淆新字符串,并且您可能会丢失一些翻译。

我实际上正在写一篇关于此的文章(时间太短,无法很快完成!)但我提出的答案是这样的:

Gettext 允许您存储字符串出现在 .po 文件内的代码中的行号。如果您完全更改字符串,.po 编辑器将知道该字符串不是新字符串,而是旧字符串(感谢行号)。

我对此的解决方案是编写一个脚本来读取数据库并创建一个包含所有 gettext 字符串的静态文件。Mark 的解决方案最大的不同是让数据库上的主键(我们称之为 ID)与新文件中的行号匹配。在这种情况下,如果您完全更改了一个原始翻译,行仍然是相同的,您的翻译软件将识别字符串。

当然,可能会有更新和更智能的 .po 编辑器,但至少如果你的编辑器给你带来了新字符串的麻烦,那么这将解决它们。

我的 2 美分。

于 2010-01-20T20:57:45.110 回答
4

如果您的代码中有某处: <?=sprintf(_('%s poked %s'), $user1, $user2)?> 并且您的一种语言需要交换参数,那非常简单。只需像这样翻译您的代码: msgid "%s poked %s" msgstr "%2$s translation_of_poked %1$s"

于 2016-12-15T13:35:29.940 回答