Locale :: TextDomain завершается ошибкой, если $ LANG изначально не установлен - PullRequest
1 голос
/ 22 сентября 2011

У нас есть система перевода, которая использует perl Locale :: TextDomain / gettext. У нас проблема с локализацией в одной системе, а не в другой.

Единственное заметное отличие состоит в том, что переменная окружения LANG равна 'en_GB.UTF-8' в рабочей системе, а LANG не определяется в нерабочей системе. Неработающая система не имеет / etc / default / locale

экспорт LANG на сломанной системе заставляет его работать, а сброс на работающей системе - на слом.

Следующий скрипт демонстрирует:

#!/usr/bin/perl

use strict;
use warnings;

use Locale::TextDomain ('appdomain', '/path/to/language/folders');
use POSIX (':locale_h');

setlocale(LC_ALL, '');
$ENV{'LANGUAGE'} = 'it';

print __('Back'), "\n";

Зачем нужен начальный набор $ LANG, если мы все равно указываем LANGUAGE?

Запуск Ubuntu 10.04.2 LTS и Locale :: TextDomain 1.20

Ответы [ 2 ]

1 голос
/ 21 сентября 2016

Языковой стандарт "" (пустая строка) обозначает системный языковой стандарт.Все известные реализации * * x метода setlocale () используют переменные окружения для установки локали.Вы устанавливаете переменную среды после вызова метода setlocale (), и поэтому она игнорируется.

Locale :: TextDomain здесь не терпит неудачу.Это ошибка конфигурации.

Существует несколько подходов к решению таких проблем.Если вы знаете язык, который хотите использовать, вы можете разрешить libintl-perl выполнять тяжелые действия:

use Locale::Util qw(set_locale);

set_locale(LC_MESSAGES, 'pt', 'BR', 'utf-8');

В вызове set_locale () будут использованы все известные соглашения для идентификаторов языковых стандартов для установки языка на португальский.'pt' для Бразилии ('BR').Он также попытается выбрать локаль UTF-8.См. http://search.cpan.org/dist/libintl-perl/lib/Locale/Util.pm#FUNCTIONS для получения дополнительной информации!Имя set_locale () было намеренно выбрано, чтобы избежать конфликта имен с setlocale () из POSIX.pm.

Начиная с libintl-perl 1.22, вы также можете переключиться на "тупой" бэкэнд gettext:

use Locale::Messages qw(select_package);

BEGIN { Locale::Messages->select_package('gettext_dumb') }

«Тупой» сервер никогда не беспокоится о вызове setlocale (), чтобы найти текущие настройки локали, а только проверяет переменные среды.Пожалуйста, смотрите http://search.cpan.org/dist/libintl-perl/lib/Locale/gettext_dumb.pm за и против этого подхода.Самый большой недостаток в том, что код C не учитывает это, так что $!Например, не будет использовать настроенный язык.

В качестве альтернативы вы можете переключиться на бэкэнд 'gettext_pp', как описано выше для 'gettext_dumb'.Это приведет к использованию чистой реализации Perl среды выполнения gettext.Основным преимуществом этого является то, что его легче отлаживать.Но есть и небольшие отличия от реализации на Си.

Примечание: вы должны иметь в виду, что переменная среды LANGUAGE является расширением GNU и может не работать в среде без GNU.

0 голосов
/ 22 сентября 2011

$LANG - общесистемная переменная по умолчанию, используемая в большинстве систем Unixy.$LANGUAGE - для более конкретных целей.

Системы в наши дни действительно должны иметь $LANG с разумным значением по умолчанию.Заставьте сисадмина поставить его в /etc/profile или там, где это необходимо для общесистемных настроек оболочки по умолчанию.

...