У меня проблема с gettext в PHP. Подумайте о ситуации, когда слово или выражение на исходном языке может иметь разные значения.
Например: слово A
слово имеет два значения; один B
и один C
, В части сайта мы должны использовать B
, А в другой части мы должны использовать C
,
Когда мы пишем _('A')
Как мы можем получить B
или же C
? Должен быть надежный способ справиться с этим.
Gettext поддерживает так называемые контексты сообщения. PHP не имеет собственного метода для этого, но это может быть легко осуществлено.
Предполагая, что мы хотим использовать термин «сумма» в разных контекстах — в одном контексте это означает «количество элементов», в другом контексте — «сумма счета».
Работает в несколько этапов:
Во-первых: вместо использования gettext()
функция, вы бы использовали пользовательский; давай называть это contextGettext()
,
echo contextGettext('amount', 'count of items');
echo contextGettext('amount', 'invoice amount');
Этот метод выглядит так:
function contextGettext($string, $context)
{
// http://www.php.net/manual/de/book.gettext.php#89975
$contextString = "{$context}\004{$string}";
$translation = gettext($contextString);
return ($translation === $contextString) ? $string : $translation;
}
Обратите внимание \004
: Это разделитель, который отделяет идентификатор контекста от строки сообщения согласно спецификации gettext. (Ничего не нужно, чтобы действительно заботиться, просто чтобы знать фон.)
При сборе переводных струн с xgettext
инструмент, вы бы добавили следующее --keyword
аргумент для контекстно-зависимых строк:
xgettext … --keyword="contextGettext:2c,1" …
Ваш .po
файл будет иметь следующие записи:
msgctxt "count of items"msgid "amount"msgstr ""
msgctxt "invoice amount"msgid "amount"msgstr ""
После перевода каталога, генерации .mo
файлы и перезапустите ваш веб-сервер, ваше веб-приложение выведет правильные строки в правильном месте.
Других решений пока нет …