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