繁体   English   中英

gettext 如何处理动态内容?

[英]How does gettext handle dynamic content?

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

我想到了2个案例。

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

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

谢谢

您最好的选择是使用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); ?>

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

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

<?php

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

然后让 poEdit 解析misctranslations.php 然后您就可以使用<?php echo gettext($data['name']); ?>输出类别名称翻译<?php echo gettext($data['name']); ?> <?php echo gettext($data['name']); ?>

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

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

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

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

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

我的 2 美分。

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

@Julian

我认为你的方法在实践中不会很好。 想象一下,你在代码中移动了一些功能。 行号不同,文件名也可能不同。

我认为管理翻译ID更改的唯一智能方法是尝试在.po文件中找到类似的ID。 编辑器可以显示将新翻译文本与现有翻译文本合并的建议,如果它们非常相似并且代码中保存的行号中没有翻译字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM