Перевод php gettext не работает в Debian

(Я видел другие вопросы, но их ответы мне не помогли)

У меня есть приложение, которое использует 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 вместо относительного пути к текущему рабочему каталогу, результат тот же.

Я здесь в растерянности. Есть предложения о том, как действовать?


person Roel Harbers    schedule 13.10.2014    source источник


Ответы (1)


Оказывается, я не заметил переменную окружения LANGUAGE, которая имеет приоритет над LANG и была установлена ​​на моей машине Debian, но не на других.

Из документации по gettext:

Когда программа ищет значения, зависящие от локали, она делает это в соответствии со следующими переменными среды в порядке приоритета:

  1. ЯЗЫК
  2. LC_ALL
  3. LC_xxx, согласно выбранной категории языкового стандарта: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, ...
  4. 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"));'
person Roel Harbers    schedule 14.10.2014