我们有一个使用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
发布于 2016-09-22 00:40:04
区域设置"“(空字符串)表示系统区域设置。所有已知的setlocale()的Un*x实现都使用then环境变量来设置区域设置。您在调用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开始,您还可以切换到"dumb“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环境中不起作用。
发布于 2011-09-22 21:21:42
$LANG是在大多数Unixy系统中使用的系统范围的默认变量。$LANGUAGE用于更具体的目的。
如今的系统确实应该将$LANG设置为合理的默认值。让系统管理员将其放入/etc/profile或系统范围的外壳默认设置所需的任何位置。
https://stackoverflow.com/questions/7514071
复制相似问题