[英]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.