2012-03-12 54 views
2

域名我的意思是gettext域。我有這樣的代碼在PHP應用程序的gettext中使用多個域

$domain = "default"; 
$locale = 'en_US'; 
putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
bindtextdomain($domain, 'my_path'); 
bind_textdomain_codeset($domain, 'UTF-8');  
textdomain($domain); 

那麼它將使用my_path的/ EN_US/LC_MESSAGES/default.po

但我想使用超過1個文件,所以我可以覆蓋覆蓋默認值。 po 與另一個po文件如admin.po,blog.po等

+1

「override」是什麼意思?你想在兩個.po文件中定義相同的「msgid」? – 2012-03-12 14:07:02

+0

我想他總是想加載default.mo,但也想加載頁面特定的mo文件。這在我看來完全沒有必要,並且會讓整個應用程序變得更加複雜,而沒有真正的收益。你也不能在不同的po文件中重用字符串。例如,如果你在「admin.po」中有一個字符串「cancel」,你以後也需要在「blog.po」中,你必須複製它們,或者將它們移動到default.po等等。這麼複雜。 .. – 2012-03-12 14:14:40

+0

我不明白什麼*域*的意思,爲什麼我們需要域。你能給出一些解釋或相關鏈接嗎? – cuixiping 2015-11-06 04:23:11

回答

0

AFAIK,gettext旨在每個應用程序只使用一個POT文件,但具有ton of utilities to manipulate them。這php.net comment有一個很好的竅門,允許您在腳本的不同位置使用不同的文本域。它會自動記住你使用的最後一個文本域是什麼。

14

首先定義所有您的域名是這樣的:

bindtextdomain('domain1', DIR_LOCALE); 
bindtextdomain('domain2', DIR_LOCALE); 
bindtextdomain('domain3', DIR_LOCALE); 
textdomain('domain1'); // set default domain for _() function 

現在,如果你想從不同的域搶串,你會使用兩種dgettext()dcgettext()(如果不從LC_MESSAGES)來檢索只是來自不同的指定域的單個字符串。例如:

echo dgettext('domain2', "msgid"); 
+0

這應該被接受爲答案!奇蹟般有效! – aurora 2013-10-17 11:21:58

+0

是否需要定義DIR_LOCALE2的目錄結構,如「loc2/en_US/LC_MESSAGES/default.po」 「loc3/en_US/LC_MESSAGES/default.po」 – SarwarCSE 2013-11-11 08:05:06

+0

如何將多個mo文件加載在一起,如果每個文件都有不同的msgid。每個gettext都爲此提供支持嗎? – 2014-01-24 13:57:14

相關問題