Php gettext如何处理动态内容?

Php gettext如何处理动态内容?,php,internationalization,gettext,Php,Internationalization,Gettext,在php(或者一般来说是gettext)中,当gettext看到动态内容的变量时,它会做什么 我有两个案子要办 1) 假设我戳了约翰一下。也许在某些语言中,单词的顺序是不同的。gettext如何处理这个问题?(不,我不是在建facebook,那只是一个例子) 2) 假设我在数据库中存储了一些类别。它们很少,但它们存储在数据库中。如果我这样做会发生什么?我希望翻译人员也能翻译这些类别名称,但是否必须在数据库中完成 谢谢您最好的选择是使用sprintf()函数。然后使用printf符号来处理字符串中

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

我有两个案子要办

1) 假设我戳了约翰一下。也许在某些语言中,单词的顺序是不同的。gettext如何处理这个问题?(不,我不是在建facebook,那只是一个例子)

2) 假设我在数据库中存储了一些类别。它们很少,但它们存储在数据库中。如果我这样做会发生什么?我希望翻译人员也能翻译这些类别名称,但是否必须在数据库中完成


谢谢

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

}
将其输入到
translate()
函数中,如下所示:

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

然后让poEdit parse
miscstranslations.php
。然后,您就可以使用

输出类别名称翻译,以马克所说的内容为基础。。。上述解决方案的唯一问题是必须始终手动维护静态列表,如果在所有其他字符串之前添加新字符串,或者完全更改现有字符串,则用于翻译的软件可能会混淆新字符串,并且可能会丢失一些翻译

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

<?php echo translate('%s poked %s', $user1, $user2); ?>
Gettext允许您存储字符串在.po文件中的代码中出现的行号。如果完全更改字符串,.po编辑器将知道该字符串不是新的,而是旧的(由于行号)

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

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


我的2美分。

如果您的代码中有以下内容:

其中一种语言需要交换参数,这很简单。只需像这样翻译代码:

msgid“%s”已插入%s
msgstr“%2$s翻译\u的\u插入%1$s”

案例1更容易处理:
。您不需要额外的函数,poedit仍将像其他任何函数一样解析出字符串。如果您正在翻译“%s poked%s”,当两个用户都用相同的占位符标记时,如何交换他们的名称?在某些语言中,主题在对象之前。
%s
只应使用一次,多次使用:
%1$s
%2$s
。此问题的读者可能还对“如何在gettext.po文件中指定有序变量”感兴趣:
<?php

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