使用gettext和Locale :: TextDomain在Perl中进行本地化,如果Locale :: TextDomain不可用则使用回退

Jak*_*ski 8 perl localization gettext internationalization

在" 关于国际化的Perl中的状态 "建议使用博客帖子从2009年4月26日地点:: TextDomain模块从在Perl本地化/国际化的libintl-perl的分布.此外,我必须使用gettext,并且Locale :: Messages/Locale :: TextDomain中的gettext支持比Locale :: Maketext中的gettext仿真更自然.

GNU gettext手册中" 15其他编程语言 " 一章中的" 15.5.18 Perl " 小节说:

可移植性

libintl-perl软件包与平台无关,但不属于Perl核心.如果目标系统上没有安装软件包,程序员负责提供所需功能的虚拟实现.

但是examples/hello-perlgettext源中的两个示例都没有(一个使用较低级别的Locale :: Messages,一个使用更高级别的Locale :: TextDomain)包括检测包是否安装在目标系统上,如果不是,则提供虚拟实现.

什么是复杂的问题(关于检测是否安装了包)是Locale :: TextDomain联机帮助页的以下片段:

概要

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

use Locale::TextDomain qw (my-package);
Run Code Online (Sandbox Code Playgroud)

用法

至关重要的是要记住您使用"概要"部分中指定的Locale :: TextDomain(3),这意味着您必须使用它,而不是需要它.与其他模块相比,该模块的行为完全不同.

您能否告诉我如何检测目标系统上是否存在libintl-perl,以及如果未安装虚拟防护实现,如何提供?或者举例说明这样做的程序/模块?

dax*_*xim 7

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;
}
Run Code Online (Sandbox Code Playgroud)

说明:userequire在编译时跟随import,并且可以将其拆分以强制在运行时执行.