2011-09-22 74 views
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"; 

为什么我们需要有一个初步$ LANG如果我们指定的语言呢设定?

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

回答

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') } 

“哑巴”后端从来没有困扰到调用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

虽然这个答案确实阐明了一些事情,但我应该注意到$ ENV {LANGUAGE} *的上述设置可以工作,但只有当预先存在LANG被设置了。 我的问题是为什么需要设置LANG,当gettext然后忽略LANG并使用我设置的LANGUAGE env时。 我不相信这个答案是答案,但我可能误解了。 – Steven

+1

Locale :: TextDomain(和很多其他软件)只是使用libc调用setlocale()以及setlocale()的工作方式完全依赖于系统。对于GNU系统,东西在ABOUT-NLS中进行了解释,该文件包含在每个国际化的GNU软件包中。最新版本可以在这里找到:http://git.savannah.gnu.org/cgit/gettext.git/tree/gettext-runtime/ABOUT-NLS请参阅第1.2部分的第4段,以获得对您问题的回答。而且,我同意,L *环境的混乱远不是用户友好的。 –

0

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

系统这几天真的应该有$LANG设置为合理的默认值。让系统管理员把它放在/etc/profile或它需要用于系统范围的shell默认值的地方。

+0

作为一个修复,我们确保系统都有一个他们应该做的默认语言环境,仍然不能解释为什么Locale :: TextDomain/gettext需要默认才能改变它。 – Steven

+0

@史蒂文 - 这样想:主要语言是法语的人也可以说英语。不过,他们大多用法语思考。 '$ LANG'是全球主要的系统语言,'$ LANGUAGE'则是特定情况下的重写。 – frezik

+1

我理解LANG和LANGUAGE之间的区别,那不是问题 – Steven