Vui lòng sử dụng các chức năng ngettext
cho những thứ như thế này. Nó cho phép bạn xử lý chính xác với số nhiều bằng tiếng Anh và các ngôn ngữ khác , một lần và cho tất cả. Bạn sử dụng nó như thế này:
printf(ngettext("%d Comment", "%d Comments", $numComments), $numComments);
Chức năng ngettext
sẽ trả về chuỗi định dạng đầu tiên ("%d Comment"
) nếu có chỉ là một bình luận duy nhất và thứ hai định dạng string ("%d Comments"
) nếu có nhiều. Hàm printf
sẽ sau đó đặt số vào chuỗi.
này có vẻ như rất nhiều công việc, nhưng nó là rất mạnh mẽ: nó hoạt động với các ngôn ngữ có nhiều hơn một hình thức số nhiều - họ thực sự tồn tại (!). Hướng dẫn sử dụng PHP đưa ra một ví dụ cho từ "cửa sổ" trở thành "1 okno", "2 okna" và "5 oken" trong một số ngôn ngữ kỳ lạ mà tôi không nhận ra ...
Nếu bạn là hậu quả về việc sử dụng ngettext
thì người dùng tương lai của bạn từ các nước xa xôi sẽ rất biết ơn bạn :-)
Edit: Như đã đề cập trong các ý kiến, có một chức năng duy nhất để làm các việc trên:
function pluralize($num, $singleWord, $pluralWord) {
return printf(ngettext($singleWord, $pluralWord, $num), $num);
}
Theo mặc định, xgettext
sẽ không nhận ra chức năng mới này, nhưng bạn có thể thêm nó với --keyword
cờ. Cho một tập tin test.php
với
echo ngettext("foo", "foos", 1);
echo pluralize(2, "bar", "bars");
bạn có thể trích xuất các chuỗi với
xgettext --keyword=pluralize:2,3 test.php
Các kết quả messages.po
tập tin có mục như thế này:
#: test.php:7
msgid "foo"
msgid_plural "foos"
msgstr[0] ""
msgstr[1] ""
#: test.php:8
msgid "bar"
msgid_plural "bars"
msgstr[0] ""
msgstr[1] ""
Các dịch sẽ điền vào mỗi hình thức số nhiều và với dòng chính xác là hình thành "Dạng số nhiều" trong tiêu đề danh mục thư, bạn sẽ là khả năng để hỗ trợ tất cả các ngôn ngữ.
+1 Dành cho tên người dùng của bạn, vì nó cho tôi biết. Đó là một thông minh và tôi muốn được quan tâm đến việc biết bao nhiêu upvotes bạn đã cho rằng một mình. :) – Dusty
Tôi bị cám dỗ một nửa chỉ để chống lại tác động của những người upvote –