到目前为止,我没有问题使用gettext
本地化字符串,除非字符串包含变量。我按照这个excellent tutorial的步骤进行了操作,但每当我尝试在这个函数上应用它时,我就遇到了麻烦。
/**
* @ http://us.php.net/manual/en/function.time.php#71342
*/
function time_ago($timestamp, $recursive = 0)
{
$current_time = time();
$difference = $current_time - $timestamp;
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array(1, 60, 3600, 86400, 604800, 2630880, 31570560, 315705600);
for ($val = sizeof($lengths) - 1; ($val >= 0) && (($number = $difference / $lengths[$val]) <= 1); $val--);
if ($val < 0) $val = 0;
$new_time = $current_time - ($difference % $lengths[$val]);
$number = floor($number);
if($number != 1)
{
$periods[$val] .= "s";
}
$text = sprintf(_("%d %s ago"), $number, $periods[$val]);
if (($recursive == 1) && ($val >= 1) && (($current_time - $new_time) > 0))
{
$text .= time_ago($new_time);
}
return $text;
}
我messages.po
的字符串如下所示:
msgid "%d second ago"
msgid_plural "%d seconds ago"
msgstr[0] "Vor einer Sekunde"
msgstr[1] "Vor %d Sekunden"
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Vor einer Minute"
msgstr[1] "Vor %d Minuten"
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Vor einer Stunde"
msgstr[1] "Vor %d Stunden"
# and so forth…
不幸的是,这些字符串不会被翻译,而所有其他字符串(没有变量)都可以完美地工作。我在这里做错了什么?
答案 0 :(得分:0)
我认为你有一点错字:
$text = sprintf(_("%d %s ago", $number, $periods[$val]));
....应该是:
$text = sprintf(_("%d %s ago"), $number, $periods[$val]);
否则您试图在目录中找到3 days ago
。
如果你有这个:
_("%d %s ago")
...字符串ID必须完全匹配:
msgid "%d %s ago"
您似乎已经拆分了三个不同的字符串(从gettext的角度来看)与此无关:
msgid "%d second ago"
msgid "%d minute ago"
msgid "%d hour ago"
为了能够使用这些ID,您需要将该确切文本传递给_()
:
sprintf(_(sprintf('%%d %s ago', $periods[$val])), $number)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// This itself prints: %d days ago
但有一点问题:如果您使用变量向_()
发出呼叫,您将无法自动更新目录,并且您必须手动添加和删除字符串。