在我們的 42 種語言中,有 14 種語言的「one」複數形式不僅僅用於數字 1

語言

應用程式的字串「One habit left today」有一個複數對應字串「%d habits left today」。Android 會根據類別在兩者之間選擇:英文對 1 使用「one」,對其他所有數字使用「other」。在俄文中,類別「one」用於 1、21、31、41 等數字。我們的翻譯檢查曾在同一天兩次出錯,一次是漏判,一次是誤判。

它拒絕了正確的翻譯

11 月 2 日,我們再次對範例應用程式執行翻譯套件。對於俄文的「one」,模型寫出「Осталась %d привычка на сегодня」:即「%d habit left today」,包含數字。我們的檢查將其與英文的「one」形式比較,發現英文沒有的 %d,並將其視為虛構的佔位符而拒絕。模型是對的。剩餘 21 個習慣的使用者會看到這個形式,因此它必須顯示數字。我們修改了檢查規則:形式可以加入英文「other」形式所使用的計數。下一次執行寫出了範例的全部 350 個字串。

它會通過的錯誤翻譯

相同的檢查卻讓相反的情況通過。如果模型寫出「Осталась одна привычка」(「one habit left」),字串中沒有遺失任何內容,因此通過檢查,而剩餘 21 個習慣的使用者會被告知他們只剩一個。舊規則允許任何「one」形式省略數字,因為在英文中「one」僅指 1。

現在檢查規則知道每個類別涵蓋哪些數字,資料來自 CLDR,即 Android 和 ICU 使用的 Unicode 複數規則。涵蓋多個數字的類別形式必須顯示數字。僅涵蓋單一數字的類別形式可以省略數字:德文的「one」僅指 1,因此「Noch eine Gewohnheit」在那裡是正確的。

「one」不僅僅是 1 的情況

在 Babel 2.10 所知的 41 種目標語言中,有 14 種語言的「one」涵蓋的數字不僅僅是 1:

在 ICU 訊息中,其自身的分支會改變這一點。若訊息中包含 =0{…},法文的「one」就僅剩 1,檢查規則會將此納入考量。

與 Android 自身的字串進行核對

在推出這條規則之前,我們先在 Android 框架字串中的複數訊息上執行它:涵蓋我們 39 種語言的 897 個翻譯。它沒有標記出任何問題。Google 的譯者將數字放在涵蓋多個數字的每個分支中,包括俄文的「one」分支,即使英文為 1 單獨設立了一個分支也是如此。當我們手動將數字從一個俄文「one」分支中移除後,檢查結果顯示該形式也用於 21、31、41 和 51。

這條規則位於 translation-checks 1.2.0 中,在 GitHub 上免費提供,適用於 ICU 訊息;也位於 Polyglot 1.2.0 中,同時適用於 Android 複數形式和 ICU 訊息。我們本週新增的其他檢查項目,請見 關於其他文字系統字母的說明。

已更新: