iOS項目國際化對【名詞復數】的處理方法
iOS項目國際化過程中對【名詞復數】的處理方法和對其他文字的處理方法有些不同之處,這篇文章將從下面幾個方面講解一下項目中怎么處理名詞復數。
- .stringsdict
到公眾號【iOS開發棧】學習更多SwiftUI、iOS開發相關內容。
錯誤的名詞復數處理方式
iOS項目國際化主要是對項目中用到的文字進行本地化語言處理,這個方面的知識在前面幾篇文章都有涉及,比如 蘋果官方的iOS App國際化工作流 、 使用Xib使App完成國際化功能 。
普通文本可以大致看作1對1的翻譯,比如說“iOS開發棧”->“iOS developers stack”,這種一對一的翻譯通過 .strings 文件可以處理。
名詞復數的多語言處理是更加復雜的翻譯,因為不同的語言對不同數量的表達方式都不一樣。分別以英文、中文表達【iOS開發棧】公眾號有幾個粉絲為例:
不同語言對不同數量的表達可以參考 Language Plural Rules
如果要用 .strings 文件來處理名詞復數的話,大概會寫出這樣的代碼:
- /* 偽代碼 */
- let fans = ...
- if fans == 0 {
- NSLocalizedString("zero fans number of my offical account", comment: "The Fans Number of 【ios開發棧】is zero")
- } else if fans == 1 {
- NSLocalizedString("one fans number of my offical account", comment: "The Fans Number of 【ios開發棧】is one")
- } else {
- NSLocalizedString("other fans number of my offical account", comment: "The Fans Number of 【ios開發棧】is other")
- }
如果每個用到名詞復數的地方都這樣寫的話,項目中就會充斥著這種膠水代碼,非常不利于維護。為了避免這種做法,我們可以利用Xcode自帶的 .stringsdict 文件。
stringsdict
.stringsdict 文件就是專門用來處理名詞復數的plist文件。
創建 .stringsdict 文件
- Localizable.stringsdict
stringsdict 文件解析
左邊是一個空的stringsdict文件,右邊是用公眾號粉絲數為例的stringsdict文件。
- Localized String Key 是一個文字常量,用在 NSLocalizedString 宏里面用來匹配多語言翻譯,如 NSLocalizedString("fans number of my official account", comment: "The Fans Number of 【ios開發棧】") 。項目中有多少個需要翻譯的名詞復數就要有多少個Localized String Key。
- Localized Format Key 對應的是包含名詞復數的句子,其中的數字和名詞在 %#@ 和 @ 中間。
- VARIABLE 用 %#@ 和 @ 之間的代替。這是一個鍵值對,內容就是VARIABLE在不同數量下的表示規則。
- NSStringFormatSpecTypeKey 指定復數規則的類型,固定為 NSStringPluralRuleType 表示復數規則類型。
- NSStringFormatValueTypeKey 用來表示不同的數字類型,比方說整型是%d,無符號整型%u,具體可以查看 String Format Specifiers
- zero / one / two / few,many / other 不同數量下名詞復數的表現方式,有些語言只有其中幾個比如漢語基本所有數量都可以用一種方式來表達(1個、2個、100個),英語有兩種(one fan/many fans),更多的語言可以查看 Language Plural Rules 。
實戰經驗
- Localized Format Key 是一個語句,其中可以包含1個或1個以上的復數,每個都用 %#@ 和 @ 包圍。
- 每增加一個需要翻譯的名詞復數就要增加一個 Localized String Key 。
- 設置 .stringsdict 文件的多語言
- Localizable.stringsdict
- the File inspector
上面是在中英文下對 iOS開發棧有n個粉絲 和 iOS開發棧有n篇文章和m次分享 的翻譯。對這兩個翻譯的使用方法如下:
- let fansNumLocalizableString = NSLocalizedString("fans num in my offical account", comment: "The Fans Number of 【ios開發棧】")
- let fanNumStr = String.localizedStringWithFormat(fansNumLocalizableString, 3)
- let offcialAccountInfo = NSLocalizedString("official account info", comment: "")
- let accountInfoStr = String.localizedStringWithFormat(offcialAccountInfo, 10, 5)
到公眾號【iOS開發棧】學習更多SwiftUI、iOS開發相關內容。
總結
通過這篇文章我們了解了為什么要對名詞復數的國際化進行單獨處理,和stringsdict文件的用法,相信你已經對名詞復數的國際化有所了解,現在就去動手試試吧~