PHP:本地化包含变量的字符串
到目前为止,我使用PHP:本地化包含变量的字符串,php,localization,gettext,php-gettext,Php,Localization,Gettext,Php Gettext,到目前为止,我使用gettext对字符串进行本地化没有问题,除非字符串包含变量。我遵循了下面的步骤,但每当我尝试将其应用于此函数时,我都会遇到麻烦 /** * @ http://us.php.net/manual/en/function.time.php#71342 */ function time_ago($timestamp, $recursive = 0) { $current_time = time(); $difference = $current_time
gettext
对字符串进行本地化没有问题,除非字符串包含变量。我遵循了下面的步骤,但每当我尝试将其应用于此函数时,我都会遇到麻烦
/**
* @ 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;
}
不幸的是,这些字符串不能被转换,而其他所有字符串(没有变量)都可以完美地工作。我做错了什么?我想你有点打字错误:
$text = sprintf(_("%d %s ago", $number, $periods[$val]));
。。。。应该是:
$text = sprintf(_("%d %s ago"), $number, $periods[$val]);
否则,您将试图在目录中查找3天前的
如果您有:
_("%d %s ago")
。。。字符串ID必须与以下内容完全匹配:
msgid "%d %s ago"
您似乎已将其拆分为三个不同的字符串(从gettext的角度来看),这三个字符串与此无关:
msgid "%d second ago"
msgid "%d minute ago"
msgid "%d hour ago"
要能够使用这些ID,您需要将准确的文本传递到\(
):
不过有一点问题:如果您使用变量调用\(
),您将无法自动更新目录,您必须手动添加和删除字符串。这是我在写下此问题时的一个打字错误。还没有翻译。
msgid "%d second ago"
msgid "%d minute ago"
msgid "%d hour ago"
sprintf(_(sprintf('%%d %s ago', $periods[$val])), $number)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// This itself prints: %d days ago