iOS本地化(國際化)

本地化.gif

1、介紹

國際化(Internationalization)是指應(yīng)用程序在運(yùn)行的時候岭辣,可以根據(jù)客戶端請求來自的國家/地區(qū)吱晒,語言的不同而顯示不同的界面。根據(jù)用戶的語言設(shè)置沦童,展示不同的應(yīng)用程序名稱仑濒,不同的圖片,應(yīng)用的描繪語言搞动。

1.1躏精、iOS本地化的思路

把程序的標(biāo)簽,提示信息鹦肿,圖片等(所有的包含文字的內(nèi)容)放在一個資源文件夾中矗烛,程序需要支持哪些國家,語言環(huán)境,就提供對應(yīng)的資源文件瞭吃。

本地化思路.png

NSLocale:特定的國家區(qū)域的語言環(huán)境碌嘀。

NSLocale *local = [NSLocale currentLocale];//獲取當(dāng)前的語言環(huán)境  
NSString *string = local.localeIdentifier; // 獲取當(dāng)前的應(yīng)用程序的語言

NSLocalizedString(<#key#>, <#comment#>):根據(jù)key來獲取國際化的語言設(shè)置信息。
為了實(shí)現(xiàn)本地化歪架,必須提供程序所需要的資源文件股冗。資源文件的內(nèi)容是很多的鍵值對(key-value),其中key是程序編寫時需要使用到的,value是應(yīng)用程序界面展示時便顯出的內(nèi)容和蚪。

資源文件的名稱通常是localizable.strings. 

1.2止状、本地化文件夾

本地化文件夾的命名有著嚴(yán)格的規(guī)范,本地化文件夾一般有兩種形式攒霹。(創(chuàng)建項目之后怯疤,打開項目工程在finder中顯示,都會有一個Base.lproj文件 里面包含launch 和main的故事板)催束。在iOS系統(tǒng)中集峦,簡體中文的代號是zh-Hans。繁體中文的代號為zh-Hant抠刺。英文的代號為en塔淤。
1、langauge-country.lproj
2速妖、langauge.lproj
語言和國家/區(qū)域都是不可變的高蜂,必須是iOS支持的語言。
注意:Base.lproj是一個典型的本地化文件夾买优,只不過它為所有的語言提供環(huán)境提供服務(wù)妨马,所以它是所有的語言環(huán)境最后的選擇挺举。Base.lproj文件夾下默認(rèn)保存了Main.storyBoard文件杀赢。主故事板可以為所有語言環(huán)境提供界面。

本地化文件.png

查看國際上不同國家和語言的編碼網(wǎng)址

國際上的國家和語言編碼.png

獲取iOS支持的所有語言和國家湘纵,需要通過NSLocale的availableLocaleIdentifiers類方法獲取脂崔。這個方法返回一個NSArray集合,然后遍歷這個集合來獲取iOS支持的NSLocale的標(biāo)識字符串梧喷。

//獲取所有的本地化標(biāo)識字符串
NSArray *locale =   [NSLocale availableLocaleIdentifiers];
   for (NSString *locl in locale) {
         NSLog(@"%@",locl);
   }

運(yùn)行結(jié)果(部分打印結(jié)果):

部分語言和國家編碼.png

2砌左、應(yīng)用程序的本地化主要包括應(yīng)程序名稱本地化,storyBoard本地化铺敌,圖片本地化汇歹,字符串本地化。

2.1應(yīng)用程序名稱本地化

 Bundle name 簡單來說就是 App 安裝到 iOS 機(jī)子里的 App 文件夾名偿凭。
 Executable name  –  執(zhí)行程序名产弹,默認(rèn)與 PRODUCT_NAME 一致。
 Bundle display name  –  真正顯示到用戶屏幕上的 App 名稱弯囊。
在模擬器/真機(jī)上顯示的名字是由Bundle Display Name決定的痰哨。默認(rèn)情況下Bundle Display Name就等同于Product Name胶果。

Bundle name – is folder name, where your app (including executable file and all resources) will be stored (Cool Program.app). Executable name – is a program binary name, i.e. Cool Program.app/CoolProgram Bundle display name – is what will be shown on iPhone screen, for example Cool Prog (since Cool Program probably will not fit on Springboard). And, Apple claims, that Bundle Display name must correspond to Bundle name, i.e. you cannot use bundle name TheApplication, and bundle display name Something Other
在部分情況下如果Product Name為中文字符,會導(dǎo)致編譯運(yùn)行在真機(jī)時斤斧,第一次必報 Could not inspect the application package. 錯誤早抠,這個可以參考《使用 Xcode6 在 iOS8 設(shè)備上調(diào)試報錯 Could not inspect the application package》。

2.2注意:

遇到了這種情況撬讽,將Product Name設(shè)置成為了英文名蕊连,而將Bundle Display Name設(shè)置為中文名。
參考stackOverFlow:Bundle Name, Executable Name, Product Name…anything else?

2.3實(shí)現(xiàn)步驟游昼。

2.3.1咪奖、打開Xcode, 選中項目文件夾下的project圖標(biāo)酱床,再選中文件Dock目錄中的project圖標(biāo)羊赵。

操作步驟1.png

2.3.2、選中project面板上的info選項

2.3.3扇谣、選擇簡體中文Chinese(Simplified,China)(zh-Hans-CN)

2.3.4昧捷、在Xcode界面上使用快捷鍵 Command + N 新建文件 Resource中選擇 Strings File

2.3.5、命名為 InfoPlist.strings罐寨,然后創(chuàng)建靡挥。(即為項目添加一份本地化資源文件)

操作步驟2.png

2.3.6、選中InfoPlist.strings文件鸯绿,打開Xcode家岔氣面板跋破,找到其中的Localization選項。

2.3.7瓶蝴、選中Chinese(Simplified,China)添加中文的本地化(選中English添加英文的本地化)

Snip20161229_3.png

2.3.8毒返、選中檢查面板的Localization,勾選??Base既可以添加Base的本地化文件。(勾選??English既可以添加English的本地化文件舷手。)

2.3.9拧簸、選擇Xcode的info.plist ,顯示原始鍵值對(Show Raw Keys/Values)

獲取原始鍵值對.png

2.3.10男窟、在English的InfoPlist.strings文件中盆赤,配置 CFBundleDisplayName

CFBundleDisplayName = "locale"; // 一定要設(shè)置分號 并且不要在字符串前面添加@符號

2.3.11、在Chinese(Simplified,China)的InfoPlist.strings中配置CFBundleDisplayName

CFBundleDisplayName = "本地化"; // 一定要設(shè)置分號 并且不要在字符串前面添加@符號

如果模擬器的語言設(shè)置是英文歉眷,將會看到應(yīng)用的顯示名稱為“Locale”牺六。語言設(shè)置為簡體中文是,將會看到應(yīng)用的顯示名稱為@"本地化"汗捡∈缂剩【模擬器的Home鍵--->command + shift + H返回到應(yīng)用程序列表。設(shè)置(Settings)----》通用(Gneral)------》語言和區(qū)域(Langauge and Rigion)--------》區(qū)域(Rigion) -------》對應(yīng)的語言------》Done(確定)】。模擬器在運(yùn)行時可能看不到最新的應(yīng)用名稱庸追,這是因?yàn)槟M器有時候會緩存一些信息霍骄。這就需要我們把模擬器上已經(jīng)運(yùn)行的應(yīng)用程序卸掉【選中模擬器中應(yīng)用程序圖標(biāo),長按淡溯,點(diǎn)擊應(yīng)用程序圖標(biāo)左上角的?】读整,重新運(yùn)行一次。

3咱娶、圖片的本地化

3.1米间、拖入一張照片到iOS項目中。(需要??Copy items if needed 和 Create groups 還有Add To Targets)

Snip20161229_16.png

3.2膘侮、在項目中選中圖片屈糊,打開Xcode右側(cè)的文件檢查面板,找到其中的Localization選項琼了。

3.3逻锐、在對應(yīng)的對話框中選擇Chinese(Simplified,China),那么圖片會被添加到zh-Hans-CN.lproj文件夾中雕薪。

3.4昧诱、同理把對應(yīng)的圖片(英語語言的圖片、基礎(chǔ)語言的圖片(中文的應(yīng)用程序就選擇中文的圖片))添加到對應(yīng)的本地化文件夾中所袁。(XXXX.lproj文件夾)

需要注意的是圖片的名稱需要時相同的盏档。

4、文本的本地化(字符串的本地化操作)

4.1燥爷、和之前創(chuàng)建InfoPlist.strings文件相同蜈亩,不同的是文件名稱為Localizable.strings。

補(bǔ)充:也可以通過genstrings命令來生成資源文件前翎,這種方式創(chuàng)建的資源文件會自動包含應(yīng)用程序需要用到的所有的key【啟動OS X系統(tǒng)的終端窗口稚配,使用cd命令進(jìn)入到iOS項目所在目錄執(zhí)行這個命令∮闾睿】

Objective-C語言使用 genstrings *.m 命令
swift語言使用 genstrings *.swift命令

4.2药有、分別對應(yīng)的文件夾中寫入對應(yīng)的文本內(nèi)容。注意苹丸,zh-Hans-CN.lproj和en.lproj兩個文件中的key需要保持一致。

/* 
  Localizable.strings
  名稱本地化
 Localizable.strings(Chinese(Simplified))
*/
"loacl" = "我們 我們都是好孩子";
/* 
  Localizable.strings
  名稱本地化
 Localizable.strings(English)
*/
"loacl" = "Hello苇经! we are good boys";

4.3赘理、獲取key所對應(yīng)的內(nèi)容∩鹊ィ【在這里key最好定義成一個宏商模,避免在書寫的時候出現(xiàn)錯誤】

self.iconView.image = [UIImage imageNamed:@"1.png"];
self.nameLabel.text = NSLocalizedString(@"loacl", @"這是一個注釋的內(nèi)容");

注意:當(dāng)故事板是以Main.strings的樣式展示的時候需要選擇Main.storyBoard的格式才會正常顯示。

不正常展示.png

解決辦法

IB類型.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市施流,隨后出現(xiàn)的幾起案子响疚,更是在濱河造成了極大的恐慌,老刑警劉巖瞪醋,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿晕,死亡現(xiàn)場離奇詭異,居然都是意外死亡银受,警方通過查閱死者的電腦和手機(jī)践盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宾巍,“玉大人咕幻,你說我怎么就攤上這事《ハ迹” “怎么了肄程?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長选浑。 經(jīng)常有香客問我绷耍,道長,這世上最難降的妖魔是什么鲜侥? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任褂始,我火速辦了婚禮,結(jié)果婚禮上描函,老公的妹妹穿的比我還像新娘崎苗。我一直安慰自己,他們只是感情好舀寓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布胆数。 她就那樣靜靜地躺著,像睡著了一般互墓。 火紅的嫁衣襯著肌膚如雪必尼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天篡撵,我揣著相機(jī)與錄音判莉,去河邊找鬼。 笑死育谬,一個胖子當(dāng)著我的面吹牛券盅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膛檀,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼锰镀,長吁一口氣:“原來是場噩夢啊……” “哼娘侍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泳炉,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤憾筏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后花鹅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧腰,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年翠胰,在試婚紗的時候發(fā)現(xiàn)自己被綠了容贝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡之景,死狀恐怖斤富,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锻狗,我是刑警寧澤满力,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站轻纪,受9級特大地震影響油额,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刻帚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一潦嘶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崇众,春花似錦掂僵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眯漩,卻和暖如春芹扭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赦抖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工舱卡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摹芙。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓灼狰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浮禾。 傳聞我的和親對象是個殘疾皇子交胚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容