對app添加多語言十分簡單,按照以下步驟即可:
Part 1. 代碼中的國際化
第一步: 創(chuàng)建Strings File
文件(Resource -> Strings File)
文件名稱必須為Localizable.strings
第二步: 點擊國際化按鈕
出現國際化選項即可:
第三步: 添加語言 (工程文件 -> Project -> 添加)
國際化是針對于項目而非Target
選擇需要添加的語言:
選擇需要國際化的內容:
注意: 如果是先執(zhí)行第三步糠溜,那么這里沒有第三個選項苗分。
點擊Finish后供鸠,可以看到localizable文件多了一個下拉文件
第四步: 添加國際化Key-Value
在代碼中使用NSLocalizedString(@"Key1", @"這是一個說明")
即可讓該字符串替換為國際化字符串
Part 2. 項目配置中的國際化
項目配置和代碼國際化十分相似豫柬,創(chuàng)建Strings File
文件锌钮,必須命名為InfoPlist
桥温。選中文件,點擊右側Localize ...
按鈕開啟國際化即可轧粟。此步驟參考Part 1 中的配置方式即可策治。
這里特殊的地方是,需要國際化的是特殊的Key兰吟,這些Key 的查看方式如下:
這里<key>
標簽中的即是對應的Key:
Part 3. 多語言問題(接口國際化)
當和服務器進行交互的時候通惫,需要將對應的語言傳給服務器,此時混蔼,由于各端的差異(iOS履腋、Android、Web )通過系統(tǒng)方法獲取到同一種的語言字符串是略有差異的,此時遵湖,就需要對其進行約定悔政,統(tǒng)一處理。
一延旧、 獲取系統(tǒng)語言
通常谋国,我們通過以下代碼獲取當前系統(tǒng)語言:
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = languages.firstObject;
或者
NSString *preferredLanguage = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
preferredLang 即當前的系統(tǒng)語言。
二迁沫、 獲取語言誤區(qū)(語言不僅僅是語言芦瘾,包含語言+地區(qū))
通過代碼獲取語言時,往往看到這樣的:en-GB
和 en_GB
集畅, 那這兩個的區(qū)別是什么近弟?
1. 首先要明確Language ID
和Locale ID
的關系
官方文檔,一開始就給出了兩者的定義
Language IDs identify a language, dialect, or script and are used to name language-specific resource folders stored in the app bundle.
翻譯:
Language IDs 標識一種語言挺智、方言 或者(一種語言的)字母系統(tǒng) 并 用于 存儲 在應用程序包中 有特定語言命名的 資源文件夾中祷愉。
Locale IDs identify a set of regional conventions and are used in APIs—such as the NSLocale, NSDateFormatter, NSNumberFormatter, and NSCalendar classes—where region information is needed to format data.
翻譯:
Locale IDs 標識一組約定區(qū)域 并 用于需要 區(qū)域信息 格式化日期的 API(例如 NSLocale、NSDateFormatter赦颇、NSNumberFormatter 和 NSCalendar 類)中
OS X and iOS use standard language ID and locale ID formats that consist of language and region designators. For example, using a language combined with a region designator, a language ID can distinguish between different languages and regional dialects.
翻譯(機翻):
OS X 和 iOS 使用由語言和區(qū)域指示符組成的標準語言 ID 和區(qū)域設置 ID 格式二鳄。 例如,使用語言與地區(qū)指示符組合沐扳,語言 ID 可以區(qū)分不同的語言和地區(qū)方言泥从。
由此可見句占,bundle
中的那些xxx.lproj
文件的名稱xxx
, 就是Language ID
沪摄。其實這里說的不全,這里只是表明了應用程序包中纱烘,語言資源文件名稱(這里表述的不全杨拐,下文詳述)。
2. Language ID 詳述
文檔中有對Language ID
更全面的解釋:
A language ID identifies a language used in many regions, a dialect used in a specific region, or a script used in multiple regions.
To specify a language used in many regions, use a language designator by itself.
To specify a specific dialect, use a hyphen to combine a language designator with a region designator.
To specify a script, combine a language designator with a script designator.
For example, to specify common English, use the en language designator as the language ID. To specify the English language as it is used in the United Kingdom, use en-GB as the language ID.
中間三句擂啥,表明了language ID
的表述方式:
1. To specify a language used in many regions, use a language designator by itself.
要指定在許多地區(qū)使用的語言哄陶,請單獨使用語言指示符。
比如, 直接使用en
2. To specify a specific dialect, use a hyphen to combine a language designator with a region designator.
要指定特定方言哺壶,請使用連字符將語言指示符與地區(qū)指示符組合起來屋吨。
比如, 使用en-AU
,表示English as used in Australia(澳洲英語)
tips: hyphen 的意思是連接符山宾,即英文的中劃線至扰。
3. To specify a specific dialect, use a hyphen to combine a language designator with a region designator.
機翻:
要指定腳本,請將語言指示符與腳本指示符結合起來资锰。
比如敢课,使用zh-Hans
,表示Chinese in the simplified script (簡體中文)
結論:
language ID
是由語言
或者 語言-方言/script
或者 語言-地區(qū)
或者 語言-方言/script-地區(qū)
這樣的結構組成,中間使用連接符(英文中劃線)進行連接直秆。
eg:語言選簡體中文濒募,地區(qū)選英國,獲取到的語言就是zh-Hans-GB
圾结。
eg:語言選英語(英國)瑰剃,地區(qū)選美國,獲取到的語言就是en-GB
筝野。注意培他,這里是語言-方言/script
的結構。
因為打印[NSLocale currentLocale]
可以看到結果是en_US
遗座,這里可以看出地區(qū)是US舀凛。
eg:語言選英語,地區(qū)選中國途蒋,獲取到的語言就是en-CN
猛遍。
3. Locale ID 詳述
A locale ID identifies a specific region and its cultural conventions—such as the formatting of dates, times, and numbers.
To specify a locale, use an underscore character to combine a language ID with a region designator, as shown in Table B-5.
For example, the locale ID for English-language speakers in the United Kingdom is en_GB, while the locale for English-speaking residents of the United States is en_US.
中間的一句,表明了Locale ID
的表述方式:
使用英文下劃線_
連接語言和地區(qū)号坡。
結論:
locale ID
是由語言_地區(qū)
懊烤,這樣的結構組成,中間使用英文下劃線進行連接宽堆。
eg :語言選英語(英國)腌紧,地區(qū)選美國,獲取到的地區(qū)是en_US
畜隶。
3. 總結
看了文檔以后壁肋,感覺描述的仍然有些模棱兩可。不過籽慢,可以明確的是language ID
和 locale ID
并不是獨立的浸遗,是互相包含的一種關系。
故箱亿,可以通過調用不同的API獲取不同的值跛锌,再根據各自的特點進行解析。
比如:
[NSLocale currentLocale]
獲取到的就是local
相關:
[[NSBundle mainBundle] preferredLocalizations]
獲取到的就是language ID
相關:
三届惋、統(tǒng)一語言類型
通過以上幾點髓帽,獲取語言并處理采用如下方式即可:
NSString *preferredLanguage = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
preferredLanguage = preferredLanguage.lowercaseString;
// 特殊處理中文 簡體繁體
if ([preferredLanguage hasPrefix:@"zh-hans"]) {
// 簡體
preferredLanguage = @"cn";
} else if ([preferredLanguage hasPrefix:@"zh-hant"]) {
// 繁體
preferredLanguage = @"tw";
} else {
// 其他語言
preferredLanguage = [preferredLanguage componentsSeparatedByString:@"-"].firstObject;
}
if ([preferredLanguage isEqualToString:@"en"]) {
preferredLanguage = @"后臺英語字符串";
} else if ([preferredLanguage isEqualToString:@"fr"]) {
preferredLanguage = @"后臺法語字符串";
}
...
Part 4. 如何發(fā)現的文檔
在看[NSLocale availableLocaleIdentifiers]
方法描述的文檔中,我們找到了上述官方文檔的地址:
一般說來脑豹,都是先看Xcode自帶的文檔說明郑藏,往往在其中就會帖一些網頁文檔的地址,網頁版的文檔往往更全面晨缴。
參考文檔:
iOS本地化與國際化最佳實踐译秦。該文章中使用了Xcode導出/導入國際化文件以及storyboard國際化預覽的步驟。可作為參考筑悴。