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

时间:2011-09-22 11:34:02

标签: perl localization gettext

我们有一个使用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 个答案:

答案 0 :(得分:1)

locale“”(空字符串)表示系统区域设置。 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') }

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

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

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

答案 1 :(得分:0)

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

现在系统真的应该$LANG设置合理的默认值。获取系统管理员将其放入/etc/profile或系统范围的shell默认值所需的任何位置。