2012-08-25 59 views
12

參見_n();功能的本實施例中(http://codex.wordpress.org/Function_Reference/_n):多個複數形式中的gettext()

sprintf(_n('%d comment.', '%d comments.', $number, 'text-domain'), $number);

在英國

1 Comment 
2 Comments 
在語言如波蘭語

有不同的圖案和複數形式:

1 Komentarz 
2 Komentarze 
3 Komentarze 
4 Komentarze 
5 Komentarzy 
6 Komentarzy 
... 
21 Komentarzy 
22 Komentarze 
23 Komentarze 
24 Komentarze 
25 Komentarzy 
... 
31 Komentarzy 
32 Komentarze 
... 
91 Komentarzy 
92 Komentarze 
... 
111 Komentarzy 
112 Komentarzy (!) 
... 
121 Komentarzy 
122 Komentarze 

我正在尋找一些方法來讓翻譯人員設置自己的模式,如果他們的語言支持多個複數形式。你能想到任何創造性的PHP方法來做到這一點?

一些解決方案,我能想到的(但仍譯者不能設置任何模式):

if($number == 1){ 
    $message = __(‘1 Komentarz’ , ‘text-domain’); 
}else if($number == 2){ 
    $message = __(‘2 Komentarze’ , ‘text-domain’); 
}else if($number == 3){ 
    $message = __(‘3 Komentarze’ , ‘text-domain’); 
} 

編輯:我發現這個在PO文件波蘭:"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"但我還是不明白如何編寫_n();函數來支持。

回答

13

首先,您的語言環境的文件需要有多種定義。正如您在問題中所添加的,在波蘭語中,您可能會看到

"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 

或(domain_name)-pl.po文件中的類似定義。

然後,您需要準備.po文件中的「%d評論」/「%d評論」的翻譯。例如,

msgid "%d Comment" 
msgid_plural "%d Comments" 
msgstr[0] "%d Komentarz" 
msgstr[1] "%d Komentarze" 
msgstr[2] "%d Komentarzy" 

請.po文件到文件的.mo和地點編譯到相應的文件夾。 (如語言/(域名)-pl.mo

在WordPress(插件/主題我假設)的代碼,你可以這樣調用它,

for ($i=1;$i<15;$i++) { 
    printf(_n("%d Comment", "%d Comments", $i, "(domain_name)"), $i);echo "<br />"; 
} 
printf(_n("%d Comment", "%d Comments", 112, (domain_name)"), 112);echo "<br />"; 

那當然設置的WordPress的語言環境波蘭在WP-config.php文件,

define ('WPLANG', 'pl'); 

你應該可以看到正確的複數形式的結果

+0

你的答案在很大程度上是正確的(除非你不需要爲() - 它會工作只用'_n();'即使它理論上只支持兩種複數形式)。我昨天發現它:)謝謝! – Atadj

+1

for循環僅顯示包含更多數字的生成文本。 – akky

0

我想我找到了一種方法來做我想做的事。 POEdit應用程序允許您使用可在設置中指定的模式創建多個複數形式。

譯員必須自己編碼模式(請參閱我的問題中的波蘭語模式)。我還在研究這個問題,但如果任何人有類似的問題,那麼它是一個良好的開端:http://www.poedit.net/trac/wiki/Doc/PluralForms