"На состоянии 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 реализация, если это не установлено? Или дайте примеры программ / модули, которые делают это?
В руководстве по 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
, и это приемлемо для разделите его, чтобы заставить его выполняться во время выполнения.