PHP:本地化包含变量的字符串

时间:2014-09-24 15:45:24

标签: php localization gettext php-gettext

到目前为止,我没有问题使用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…

不幸的是,这些字符串不会被翻译,而所有其他字符串(没有变量)都可以完美地工作。我在这里做错了什么?

1 个答案:

答案 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

但有一点问题:如果您使用变量向_()发出呼叫,您将无法自动更新目录,并且您必须手动添加和删除字符串。