2011-09-22 69 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