(Я видел Другой вопросы, но их ответы мне не помогли)
У меня есть приложение, которое использует php gettext для переводов и работает в течение многих лет над OSX и FreeBSD. Когда я попытался перенести его на Debian 7.6 32bit (Linux debian32bit 3.2.0-4-686-pae #1 SMP Debian 3.2.60-1+deb7u3 i686 GNU/Linux
) все работает, кроме переводов. У меня проблема с однострочником CLI:
env LANG=nl_NL.UTF-8 php -r 'var_dump(bindtextdomain("foo","locale")); var_dump(textdomain("foo")); var_dump(getenv("LANG")); var_dump(_("low"));'
locale/nl/LC_MESSAGES/foo.mo
содержит голландский перевод low
т.е. laag
На OSX Maverick:
string(34) "/Users/foobar/workspace/bar/locale"string(5) "foo"string(11) "nl_NL.UTF-8"string(4) "laag" <-- Success!
На FreeBSD 10 64bit:
string(24) "/usr/local/foobar/locale"string(5) "foo"string(11) "nl_NL.UTF-8"string(4) "laag" <-- Success!
Однако на Debian 7:
string(19) "/home/foobar/locale"string(5) "foo"string(11) "nl_NL.UTF-8"string(3) "low" <-- Failure!
php-gettext установлен:
$ php -i | egrep -i 'PHP version|gettext'
PHP Version => 5.4.4-14+deb7u14
gettext
GetText Support => enabled
locale -a
дает:
C
C.UTF-8
en_US.utf8
nl_NL.utf8
POSIX
Поэтому я попробовал nl_NL.utf8 вместо nl_NL.UTF-8: тот же результат.
Я пытался положить foo.mo
файл под locale/nl_NL/LC_MESSAGES
, тот же результат.
Я пытался использовать абсолютный путь для locale
вместо пути относительный путь к текущему рабочему каталогу, тот же результат.
Я в недоумении здесь. Любые предложения о том, как поступить?
Оказывается, я не заметил переменную среды LANGUAGE
, который имеет приоритет над LANG
и был установлен на моей машине Debian, но не на других.
Когда программа ищет значения, зависящие от локали, она делает это в соответствии со следующими переменными среды в порядке приоритета:
- ЯЗЫК
- LC_ALL
- LC_xxx, в соответствии с выбранной языковой категорией: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, …
- LANG
Кроме того, в моем минимальном примере, setlocale
должен быть вызван, чтобы заставить его работать одинаково на всех машинах. (Я сделал это в своем исходном коде, но почему-то не нужно было заставлять gettext работать на других моих машинах, поэтому я оставил его).
Итак, в конце концов, на всех машинах работает следующее:
php -r 'var_dump(putenv("LANGUAGE=nl_NL.UTF-8")); var_dump(bindtextdomain("foo","locale")); var_dump(textdomain("foo")); var_dump(setlocale(LC_ALL,"nl_NL.UTF-8")); var_dump(_("low"));'
Других решений пока нет …