До сих пор у меня не было проблем с локализацией строк 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…
К сожалению, эти строки не переводятся, тогда как все остальные (без переменных) работают отлично. Что я здесь не так делаю?
Я думаю, у вас есть небольшая опечатка:
$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
Небольшая ошибка, хотя: если вы звоните _()
используя переменные, вы не сможете обновлять каталоги автоматически, и вам придется добавлять и удалять строки вручную.
Других решений пока нет …