Вы должны включить Locale :: TextDomain с использованием вместо require, поскольку оно предназначено именно для этого случая, когда вам нужен ненавязчивый i18n для Perl, когда все, что нужно для интернационализации вашего кода Perl, это обменять:
print "Hello world!\n";
с этим:
use Locale::TextDomain qw (com.example.myapp);
print __"Hello world!\n";
В предварительно обработанных языках, таких как C, этого легче достичь. Почти все интернационализированные библиотеки C содержат #define
, например:
#define _(s) dgettext (GETTEXT_PACKAGE, s)
Это означает, что _("Hello world!\n")
расширяется до вызова функции, которая содержит текстовый домен вашего пакета. Исходники Perl не могут быть предварительно обработаны переносимым образом, и поэтому Locale::TextDomain
«злоупотребляет» механизмом импорта для этой цели использования прагмы, так что он может связать файл .pm с конкретным файлом .mo. Textdomain - основа имени файла .mo файлов, которые устанавливает ваш пакет.
Если вам не нравится такой подход, не используйте его. Вы также можете обойтись без него:
require Locale::Messages;
print Locale::Messages::dgettext ("com.example.myapp", "Hello world!\n");
Однако, Locale::TextDomain
популярен, потому что он делает то же самое гораздо менее навязчивым способом.
О зависимости от библиотеки, которая не является основной для Perl:
От того, принадлежит ли модуль Perl к ядру Perl, зависит от версии Perl. И каждый пользователь может установить другую версию основного модуля Perl поверх той, которая поставляется вместе с ней или его Perl. Следовательно, надежная конфигурация пакета всегда будет проверять требуемую версию библиотеки Perl, как если бы она проверяла требуемую версию любой другой библиотеки. Предполагая, что проверка на Perl такая же, как. проверка на наличие конкретной версии определенного модуля Perl - вот причина проблем.
Кстати, Try::Tiny
также не является частью ядра Perl. Возможно, это не лучший выбор для проверки наличия других модулей Perl. Если вы хотите проверить наличие libintl-perl, просто выполните perl -MLocale::TextDomain -e exit
в вашем скрипте configure и проверьте состояние выхода.