iOS學習(六十五)添加國際化 / 本地化以及多語言問題(文檔方向)

對app添加多語言十分簡單,按照以下步驟即可:

Part 1. 代碼中的國際化

第一步: 創(chuàng)建Strings File文件(Resource -> Strings File)

創(chuàng)建國際化文件

文件名稱必須為Localizable.strings

注意文件名稱

第二步: 點擊國際化按鈕

點擊按鈕

出現國際化選項即可:


國際化類型

第三步: 添加語言 (工程文件 -> Project -> 添加)

國際化是針對于項目而非Target

添加新語言

選擇需要添加的語言:

選擇語言.png

選擇需要國際化的內容:

選擇內容

注意: 如果是先執(zhí)行第三步糠溜,那么這里沒有第三個選項苗分。

點擊Finish后供鸠,可以看到localizable文件多了一個下拉文件

localizable

第四步: 添加國際化Key-Value

Key-Value

在代碼中使用NSLocalizedString(@"Key1", @"這是一個說明")即可讓該字符串替換為國際化字符串

Part 2. 項目配置中的國際化

項目配置和代碼國際化十分相似豫柬,創(chuàng)建Strings File文件锌钮,必須命名為InfoPlist桥温。選中文件,點擊右側Localize ...按鈕開啟國際化即可轧粟。此步驟參考Part 1 中的配置方式即可策治。

這里特殊的地方是,需要國際化的是特殊的Key兰吟,這些Key 的查看方式如下:

使用source code 方式打開info.plist文件

這里<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-GBen_GB集畅, 那這兩個的區(qū)別是什么近弟?

1. 首先要明確Language IDLocale 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 IDlocale ID 并不是獨立的浸遗,是互相包含的一種關系。

故箱亿,可以通過調用不同的API獲取不同的值跛锌,再根據各自的特點進行解析。

比如:
[NSLocale currentLocale]獲取到的就是local相關:

[NSLocale currentLocale]

[[NSBundle mainBundle] preferredLocalizations]獲取到的就是language ID 相關:

[[NSBundle mainBundle] preferredLocalizations]

三届惋、統(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]方法描述的文檔中,我們找到了上述官方文檔的地址:

Language and Locale IDs

一般說來脑豹,都是先看Xcode自帶的文檔說明郑藏,往往在其中就會帖一些網頁文檔的地址,網頁版的文檔往往更全面晨缴。

參考文檔:

  1. About Internationalization and Localization(多語言官方文檔)

  2. 3分鐘實現iOS語言本地化/國際化(圖文詳解)

  3. iOS國際化實踐(包含資源文件國際化)

  4. iOS本地化與國際化最佳實踐译秦。該文章中使用了Xcode導出/導入國際化文件以及storyboard國際化預覽的步驟。可作為參考筑悴。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末们拙,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子阁吝,更是在濱河造成了極大的恐慌砚婆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件突勇,死亡現場離奇詭異装盯,居然都是意外死亡,警方通過查閱死者的電腦和手機甲馋,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門埂奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定躏,你說我怎么就攤上這事账磺。” “怎么了痊远?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵垮抗,是天一觀的道長。 經常有香客問我碧聪,道長冒版,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任逞姿,我火速辦了婚禮辞嗡,結果婚禮上,老公的妹妹穿的比我還像新娘哼凯。我一直安慰自己欲间,他們只是感情好楚里,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布断部。 她就那樣靜靜地躺著,像睡著了一般班缎。 火紅的嫁衣襯著肌膚如雪蝴光。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天达址,我揣著相機與錄音蔑祟,去河邊找鬼。 笑死沉唠,一個胖子當著我的面吹牛疆虚,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼径簿,長吁一口氣:“原來是場噩夢啊……” “哼罢屈!你這毒婦竟也來了?” 一聲冷哼從身側響起篇亭,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缠捌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后译蒂,有當地人在樹林里發(fā)現了一具尸體曼月,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年柔昼,在試婚紗的時候發(fā)現自己被綠了哑芹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捕透,死狀恐怖绩衷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情激率,我是刑警寧澤咳燕,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站乒躺,受9級特大地震影響招盲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嘉冒,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一曹货、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讳推,春花似錦顶籽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至究驴,卻和暖如春镊绪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洒忧。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工蝴韭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熙侍。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓榄鉴,卻偏偏與公主長得像履磨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庆尘,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容