首页 文章

最初设置$ LANG时,Locale :: TextDomain失败

提问于
浏览
1

我们有一个使用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";

如果我们正在指定LANGUAGE,为什么还需要初始$ LANG集?

运行'Ubuntu 10.04.2 LTS'和Locale :: TextDomain 1.20

2 回答

  • 1

    区域设置“”(空字符串)表示系统区域设置 . setlocale()的所有已知Un * x实现都使用环境变量来设置语言环境 . 您在调用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()以避免与POSIX.pm中的setlocale()发生名称冲突 .

    从libintl-perl 1.22开始,您还可以切换到“哑”gettext后端:

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

    "dumb"后端从不困扰调用setlocale()来查找当前的语言环境设置,但只检查环境变量 . 有关此方法的优缺点,请参阅http://search.cpan.org/dist/libintl-perl/lib/Locale/gettext_dumb.pm . 最大的缺点是C代码不尊重这个,所以$!例如,不会使用配置的语言 .

    或者,您可以切换到'gettext_pp'后端,就像上面针对'gettext_dumb'所描述的那样 . 这将强制使用gettext运行时的纯Perl实现 . 这样做的主要优点实际上是更容易调试 . 但是C实现也存在细微差别 .

    请注意:您应该记住,环境变量LANGUAGE是GNU扩展,可能无法在非GNU环境中工作 .

  • 0

    $LANG 是大多数Unixy系统中使用的系统范围的默认变量 . $LANGUAGE 用于更具体的目的 .

    如今系统真的应该有一个合理的默认值 . 获取sysadmin将其放入 /etc/profile 或系统范围的shell默认值所需的任何位置 .

相关问题