Локализация в Perl с помощью gettext и Локали:: TextDomain, с нейтрализацией, если Локаль:: TextDomain не доступен

"На состоянии i18n в Perl" сообщение в блоге с 26 апреля 2009 рекомендует использовать Локаль:: модуль TextDomain от libintl-perl распределения для l10n / i18n в Perl. Кроме того, я должен использовать gettext так или иначе и поддержку gettext в Локали:: сообщения / Локаль:: TextDomain является более естественным, чем в gettext эмуляции в Локали:: Maketext.

Подраздел "15.5.18 Perl" в главе "15 Других Языков программирования" в GNU gettext руководство говорит:

Мобильность

libintl-perl пакет независим от платформы, но не является частью ядра Perl. Программист ответственен за обеспечение фиктивной реализации необходимых функций, если пакет не установлен в целевой системе.

Однако ни один из двух примеров в examples/hello-perl в gettext источниках (одно использование понижают Локаль уровня:: сообщения, одна использующая высокоуровневая Локаль:: TextDomain), включает обнаружение, если пакет установлен в целевой системе и обеспечении фиктивной реализации, если это не.

Что усложняет ситуацию (относительно обнаружения, если пакет установлен, или не) следующий фрагмент Локали:: страница справочника TextDomain:

РЕЗЮМЕ

use Locale::TextDomain ('my-package', @locale_dirs);

use Locale::TextDomain qw (my-package);

ИСПОЛЬЗОВАНИЕ

Крайне важно помнить использование Локали:: TextDomain (3), как указано в разделе "SYNOPSIS", который означает Вас, должны использовать его, не потребовать его. Модуль ведет себя вполне по-другому по сравнению с другими модулями.

Вы могли сказать мне, как нужно обнаружить, если libintl-perl присутствует в целевой системе, и как обеспечить макет fallthrough реализация, если это не установлено? Или дайте примеры программ / модули, которые делают это?

8
задан Jakub Narębski 6 June 2010 в 19:01
поделиться

1 ответ

В руководстве по gettext неверно говорится, что для вас недопустимо требовать предварительное условие CPAN . В мире Perl это делают все, и благодаря инфраструктуре и инструментальной цепочке CPAN все работает отлично. В худшем случае вы можете связать нужные вам зависимости.

Прямой ответ на ваш вопрос:

use Try::Tiny;
try {
    require Locale::TextDomain;
    Locale::TextDomain->import('my-package', @locale_dirs);
} catch {
    warn 'Soft dependency could not be loaded, using fallback.';
    require inc::Local::Dummy::Locale::TextDomain;
}

Объяснение: use просто require во время компиляции, за которым следует import , и это приемлемо для разделите его, чтобы заставить его выполняться во время выполнения.

7
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: