2012-08-25 30 views
12

Xem ví dụ này _n(); function (http://codex.wordpress.org/Function_Reference/_n):Nhiều hình thức số nhiều trong gettext()

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

bằng tiếng Anh:

1 Comment 
2 Comments 

bằng các ngôn ngữ như Ba Lan có một mô hình khác nhau và nhiều dạng số nhiều:

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 

Tôi đang tìm một số cách để cho phép người dịch thiết lập mẫu riêng của họ nếu ngôn ngữ của họ hỗ trợ nhiều dạng số nhiều. Bạn có thể nghĩ ra bất kỳ cách tiếp cận PHP sáng tạo nào để làm điều này không?

Một số giải pháp tôi có thể nghĩ đến (nhưng vẫn dịch sẽ không thể đặt bất kỳ mẫu):

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’); 
} 

EDIT: Tôi thấy điều này trong tập tin PO cho Ba Lan: "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" nhưng tôi vẫn không nhận được cách chuẩn bị chức năng _n(); để hỗ trợ điều đó.

Trả lời

13

Trước tiên, tệp ngôn ngữ của bạn cần có định nghĩa số nhiều. Khi bạn thêm vào câu hỏi, trong trường hợp Ba Lan, bạn có thể thấy

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

hoặc định nghĩa tương tự trong tệp (domain_name) -pl.po.

Sau đó, bạn cần chuẩn bị bản dịch cho "% d Nhận xét"/"% d Nhận xét" trong tệp .po. Ví dụ:

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

Vui lòng biên dịch .po tệp thành tệp .mo và đặt vào một thư mục thích hợp. (Ví dụ như ngôn ngữ/(domain_name) -pl.mo

Trong Wordpress của bạn (plugin/theme tôi giả sử) mã, bạn có thể gọi nó như thế này,

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 />"; 

thì tất nhiên thiết lập miền địa phương của WordPress để Ba Lan , trong wp-config.php,

define ('WPLANG', 'pl'); 

bạn sẽ thấy kết quả với hình thức số nhiều đúng

+0

câu trả lời của bạn là một phần lớn chính xác (ngoại trừ việc bạn không cần phải cho() -. nó sẽ làm việc chỉ với '_n();' ngay cả khi về mặt lý thuyết nó chỉ hỗ trợ hai dạng số nhiều). Tôi tìm thấy nó ra ngày hôm qua :) Cảm ơn! – Atadj

+1

Vòng lặp for chỉ để hiển thị các văn bản được tạo với nhiều số hơn. – akky

0

Tôi nghĩ mình đã tìm được cách để làm những gì mình muốn. Ứng dụng POEdit cho phép bạn tạo nhiều dạng số nhiều bằng cách sử dụng mẫu bạn có thể chỉ định trong cài đặt.

Dịch giả phải tự viết hoa văn (xem mẫu cho tiếng Ba Lan trong câu hỏi của tôi). Tôi vẫn đang nghiên cứu chủ đề đó nhưng nếu có ai có câu hỏi tương tự thì đó là một nơi tốt để bắt đầu: http://www.poedit.net/trac/wiki/Doc/PluralForms

Các vấn đề liên quan