локализация — PHP: локализация строки, содержащей переменные

До сих пор у меня не было проблем с локализацией строк 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;
}

Струны из моего 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

Решение

Я думаю, у вас есть небольшая опечатка:

$text = sprintf(_("%d %s ago", $number, $periods[$val]));

…. должно быть:

$text = sprintf(_("%d %s ago"), $number, $periods[$val]);

В противном случае вы пытаетесь найти 3 days ago в каталоге.


Если у вас есть это:

_("%d %s ago")

… идентификатор строки должен точно соответствовать этому:

msgid "%d %s ago"

Вы, кажется, разбили это на три различных строки, которые (с точки зрения gettext) не связаны с этим:

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

Небольшая ошибка, хотя: если вы звоните _() используя переменные, вы не сможете обновлять каталоги автоматически, и вам придется добавлять и удалять строки вручную.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]