1

我不知道如何正確使用NSNumberFormatter的以下情況,並妥善保持本地化/國際化。國際化的數量和數量

輸出英文:

0 bananas 
1 banana 
5 bananas 

我應該怎麼做妥善保管國際化/本地化?

回答

4

複數國際化是一個難題。我不是專家,但各種語言除了英語簡單的「1是單數,其他都是複數」之外,有多種複數形式。一些語言對於0,1,2,3和> 3具有不同的形式。鑑於語言的複雜性,可能會有更復雜的方案。

可可的任何內容,包括NSNumberFormatter,除了NSLocalizedString和朋友的正常字符串本地化之外,不提供任何幫助。因此,您可以使用NSLocalizedString,例如「0香蕉」,「1香蕉」,「2香蕉」,「3香蕉」和「%d香蕉」等。然後,使用開關加載您想要格式化的香蕉的實際數量。

另一種方法是踢和使用像「香蕉:%d」的字符串。

或者,您可以通過爲0,1和> 1提供本地化字符串來組合技術,並建議翻譯人員在他們的語言不符合他們的語言時,切換到平底風格。

1

肯回答的很好。

我想補充一點。

第一次近似,最好給翻譯者提供完整的短語,因爲語言之間的語法差異很大。但這還不夠。您必須準備好處理來自翻譯小組的一些請求。以法語爲例,這艘船被翻譯成le bateau,這架飛機變成了l'avion(而不是le avion)。很多時候,翻譯人員會使用技巧來避免這種情況,引入特殊情況,但這並非總是可行,也不可取。

與翻譯團隊一起尋找最佳解決方案,並將具體案例推廣到所有語言,只要您可以使代碼保持語言中立。代碼中幾個相同的字符串比語言特定的情況要好。

隨着時間和經驗,你會習慣這個。我在許多語言本地化的軟件上工作了10多年(我認爲在7到23之間,並不完全確定23周左右)。你會知道事情變得有問題的地方以及關於這些語言的一些細節。順便說一句,沒有太多問題:複數,流派,收縮是最常見的。格式通常由系統區域設置API處理。這非常有趣!

0

我剛剛發佈了JJPluralForm,這是Mozilla的PluralForm的改編。因此,您不必擔心所有if-else,switch-case代碼在您的代碼中進行本地化,隨着您的本地化數量的增長,這將變得無法維護(俄語有3個複數規則,阿拉伯語有6個等等)。

[[JJPluralForm sharedManager] pluralStringForNumber:numberOfBananas 
            withPluralForms:NSLocalizedString(@"N_BANANAS_PLURAL_STRING", @"") 
            localizeNumeral:YES]; 

每個本地化:

喜歡的東西,你給的例子可以與處理。字符串文件然後將N_BANANAS_PLURAL_STRING本地化爲複數形式的分號分隔列表。對於英語,那將是"%@ banana;%@ bananas"

查看該項目瞭解更多詳情。