PHP Conference Japan 2024

ngettext

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ngettextgettext 的複數版本

描述

ngettext(字串 $singular, 字串 $plural, 整數 $count): 字串

gettext() 的複數版本。某些語言的複數訊息會根據數量而有不同的形式。

參數

singular

單數訊息 ID。

plural

複數訊息 ID。

count

用於決定相對應語法數量的數字(例如,項目計數)。

回傳值

根據數量 count,回傳由 singularplural 指定的訊息的正確複數形式。

範例

範例 #1 ngettext() 範例

<?php

setlocale
(LC_ALL, 'cs_CZ');
printf(ngettext("%d window", "%d windows", 1), 1); // 1 okno
printf(ngettext("%d window", "%d windows", 2), 2); // 2 okna
printf(ngettext("%d window", "%d windows", 5), 5); // 5 oken

?>

新增註解

使用者貢獻的註解 6 則註解

peter at ints dot net
15 年前
俄文範例
file.po
...
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
...
msgid "File"
msgid_plural "Files"
msgstr[0] "Файл"
msgstr[1] "Файла"
msgstr[2] "Файлов"
...

file.php
...
echo ngettext("File", "Files", $number);
...
tokul at users dot sourceforge dot net
17 年前
根據 GNU gettext 手冊,第三個參數是無號長整數。它必須是正數。如果 n 是負數,在某些語言中可能會被錯誤地評估。
Mike Robinson
11 年前
即使「hek at theeks dot net」的答案是有效的,我不建議使用他推薦的 abs() 方法。即使它是最常見的,但並非所有語言都將 (n != 1) 視為複數。其他語言則更為複雜,例如,以下是馬其頓語中如何判斷複數形式:

n==1 || n%10==1 ? 0 : 1

在阿拉伯語中,實際上有 5 種不同類型的複數形式

n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5

如果您只使用採用 (n != 1) 格式且 -1 為單數的特定語言,那麼請務必使用 abs(),但請小心,並且不要忘記在 3 年後將新語言添加到您的專案中時,您曾這樣做過。
kontakt at somplatzki dot de
17 年前
使用 ngettext 時,了解 .po 檔案的格式是很有幫助的。

msgid "item"
msgid_plural "items"
msgstr[0] "Produkt"
msgstr[1] "Produkte"

在 PHP 中:

echo ngettext('item', 'items', $number);
mike-php at emerge2 dot com
20 年前
GNU gettext 手冊的 10.2.5 節解釋了 ngettext 函式

https://gnu.dev.org.tw/software/gettext/manual/

(抱歉,新增註釋的功能讓我無法包含直接指向該手冊章節的完整網址。)
hek at theeks dot net
15 年前
請注意 GNU gettext API 與其 PHP 綁定之間的一個差異:接受 $count 參數的 GNU gettext 函式都期望(實際上,由於是編譯的 C 語言,因此需要)$count 為無符號整數,而 PHP 綁定則沒有此限制。

因此,PHP gettext 函式可以接受負數。這可能會造成一個惱人的後果,那就是 -1 會被視為複數,有些人覺得這樣沒問題,有些人則不這麼認為。(作為一個挑剔的英語母語人士,我個人的看法是「溫度是負一度華氏」和「四個蘋果減去五個蘋果剩下負一個蘋果」都是正確的,但其他人可能覺得「四個蘋果減去五個蘋果剩下負一個蘋果」聽起來比較好。)

重點:在將數字傳遞給 gettext 之前,您可能需要使用 abs($count)。

加分:如果您的應用程式包含使用者偏好設定,您可以提供使用者一個「將 -1 視為單數」的選項,然後根據每個使用者的偏好設定選擇將 $count 或 abs($count) 傳遞給 gettext。
To Top