iOS開發(fā)技巧-國際化(Localization),只看一篇就夠了

最近真是超級忙凄硼!接到了很多零散的小任務(wù)铅协,終于都快結(jié)束啦,抽個空做些總結(jié)記錄摊沉。

本文主要涉及iOS的國際化狐史,網(wǎng)上雖然有很多相關(guān)的文章,但是仔細(xì)閱讀下來感覺都不太全面说墨,因此重開一篇總結(jié)骏全,記錄項目中遇到的所有要點,demo見最下方鏈接尼斧。

1. App名稱國際化

2. 圖片姜贡、文字國際化

3. 強制默認(rèn)顯示某種語言

4. 啟動圖國際化

5. iOS10所需的權(quán)限配置國際化

6. xib/storyboard國際化

7. 總結(jié)


1.App名稱國際化

非常簡單地按步驟修改就可以了。

PROJECT-Info-Localizations中點擊下方的小“+”棺棵,添加需要添加的語言楼咳,本文中以簡體中文和英文為例。(國際化的所有操作烛恤,都需要這一步作為前提爬橡。)


添加以InfoPlist.string為名稱的string文件。查到的資料都說需要名稱一模一樣才能使用棒动,沒試過其他的名字糙申。


選中新建好的InfoPlist.string,點擊Localize按鈕船惨,添加語言柜裸。


完成上一步驟后在右邊勾選所需要語言,Xcode會自動創(chuàng)建對應(yīng)的string文件粱锐。


分別在對應(yīng)的string文件中填寫App名稱就可以了疙挺。


*關(guān)于Bundle name和Bundle display name:

stackoverflow.com/questions/9667582/bundle-name-and-bundle-display-name

就顯示來說,Bundle display name關(guān)系著icon下方的App名稱文本顯示怜浅,而Bundle name則作為存儲App的文件夾名稱铐然,并沒有什么影響蔬崩。


*用以上方法修改App名稱的一個問題:

如果系統(tǒng)為有對應(yīng)string文件的語言時,可以正常顯示搀暑。

如果系統(tǒng)為無對應(yīng)string文件的語言時沥阳,刪除App重裝后會跟隨設(shè)定的開發(fā)語言顯示;直接修改系統(tǒng)語言時會跟隨上一次有對應(yīng)string文件時的語言顯示自点。

設(shè)定開發(fā)語言


2.圖片桐罕、文字

仍是非常簡單地按照步驟修改即可。

首先創(chuàng)建一個string文件桂敛,名稱為Localizable.string功炮。


選中Localizable.string,點擊右邊的Localize按鈕术唬,在彈框的下拉菜單中隨便選一個需要添加string文件的語言薪伏,確認(rèn)。(操作同InfoPlist.string的)


右邊的小勾要點上粗仓,勾選了之后Xcode才會自動創(chuàng)建對應(yīng)的string文件嫁怀。


在對應(yīng)的語言的Localizable.string文件中添加對應(yīng)的圖片名稱和文本內(nèi)容。

"mainImage" = "mainImage_cn";//等號左邊為代碼需要調(diào)用的key潦牛,右邊為對應(yīng)的中文圖片名稱value眶掌。

"mainText" = "Chinese";//等號左邊為代碼中需要調(diào)用的key,右邊為對應(yīng)的中文文本value巴碗。


最后朴爬,只要在代碼中需要顯示圖片和文字的部分使用Foundation框架中的NSLocalizedString(key, comment)調(diào)用即可。

// 程序?qū)⒏鶕?jù)第一個參數(shù)去對應(yīng)語言的文件中取對應(yīng)的值橡淆,第二個參數(shù)將轉(zhuǎn)化為字符串文件里的注釋召噩,可以傳nil,也可以傳空字符串@""逸爵。

//#defineNSLocalizedString(key,comment) [[NSBundle mainBundle] localizedStringForKey:(key)value:@""table:nil]

//圖片調(diào)用

UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:NSLocalizedString(@"mainImage", nil) ]];

//文本調(diào)用

textLabel.text = NSLocalizedString(@"mainText", nil);

修改語言后的顯示:


*以上的操作后具滴,代碼中文字和圖片的國際化已經(jīng)完成了,但是在更換系統(tǒng)語言后會遇到一些問題师倔。

我的項目中只做了簡體中文和英文的語言設(shè)置构韵,如果系統(tǒng)語言為日文時安裝App,App中語言會根據(jù)我設(shè)置的開發(fā)語言顯示為英文趋艘。如果在App已安裝后更改系統(tǒng)語言為日文疲恢,則會跟隨App上一次的語言設(shè)置作相同的顯示。這樣并不符合我的項目需求瓷胧,因此我加入了下方的第三部分显拳。



3.強制默認(rèn)顯示某種語言

我的項目需求:在系統(tǒng)語言選定為中文時,App語言為中文搓萧,其他情況下全部作英文顯示杂数。

因此需要添加系統(tǒng)語言讀取宛畦,經(jīng)過判斷后直接調(diào)用我需要的某種語言對應(yīng)的值來顯示。

//在Appdelegate.m中添加系統(tǒng)語言檢測與賦值

NSArray *languages = [NSLocale preferredLanguages];

NSString *language = [languages objectAtIndex:0];

if ([language hasPrefix:@"zh"]) {//檢測開頭匹配揍移,是否為中文

[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];//App語言設(shè)置為中文

}else{//其他語言

[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];//App語言設(shè)置為英文

}

//在需要的部分添加手動選取語言的宏次和,并調(diào)用得到對應(yīng)的值

//宏

#define Localized(key)? [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Localizable"]

//調(diào)用

forceLabel.text = Localized(@"forceText");


選定系統(tǒng)語言為中文,安裝App并運行(顯示結(jié)果為圖1)羊精,之后修改系統(tǒng)語言為日文(顯示結(jié)果為圖2)斯够,使用NSLocalizedString國際化的文字顯示為中文囚玫,使用自定義宏Localized國際化的文字顯示為英文喧锦。

圖1
圖2



4.啟動圖

啟動圖國際化的方法有兩種,一種是在Info.plist中添加圖片(需要導(dǎo)入的圖片較多)抓督,一種是添加不同的storyboard分別調(diào)用(需要導(dǎo)入的圖片少些)燃少。操作很簡單,但是我在實際使用中遇到了兩個問題花費了一些時間铃在,問題將附于下方做一些簡述阵具。



4.1 圖片+Info.plist使啟動圖國際化

這個方法同樣可以用作App中圖片的國際化,但是我比較習(xí)慣把圖片導(dǎo)入Assets.xcassets中使用定铜,因此在圖片國際化中沒有做介紹阳液。這個方法主要是在Info.plist中直接配置啟動頁的參數(shù)來展示啟動圖,下方附上官方的文檔揣炕。

developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html

首先取消默認(rèn)的啟動圖帘皿,將TARGET-General-Launch Screen File中默認(rèn)的LaunchScreen去掉,留空畸陡。


導(dǎo)入準(zhǔn)備好的啟動圖鹰溜,這里我做了3.5、4丁恭、4.7曹动、5.5英寸的。之后選中圖片牲览,點擊Localize按鈕墓陈,這個步驟和string文件的操作一樣,四個圖片都要做第献。


右鍵點擊設(shè)置好的片贡必,選中Show in Finder。下圖中痊硕,en.lproj中保存的是英文版的啟動圖赊级,zh-Hans.lproj保存的是中文的啟動圖。把準(zhǔn)備好的對應(yīng)的圖片修改名稱后拖入就行了岔绸,圖片名稱一定要和工程中導(dǎo)入的一樣理逊。


圖片準(zhǔn)備完畢之后橡伞,將Info.plist以源碼的形式打開,或者是直接在屬性列表中點擊“+”添加對應(yīng)的屬性晋被。


Source Code中對應(yīng)的代碼:(demo的Sourcecode Codes中有)


Property List中對應(yīng)的列表:


刪除原先安裝的App兑徘,重新安裝后即可看到效果。


運行后如果看不到啟動圖更換效果羡洛,請刪除App后重新運行挂脑。



4.2 storyboard+InfoPlist.string使啟動圖國際化

首先創(chuàng)建作為啟動頁的storyboard,分別命名區(qū)分欲侮。我設(shè)置的名字是LaunchImage_En和LaunchImage_Ch崭闲,名字自己分得清就可以啦。


storyboard中添加ViewController威蕉,勾選Is Initial View Controller(中英文的啟動頁都需要勾選)刁俭,添加啟動圖,添加約束占滿屏韧涨。


設(shè)置好后在Info.plist中添加啟動圖名稱牍戚。值我填了項目默認(rèn)的LaunchScreen,但是并不用它作為啟動圖虑粥,后面還要手動賦值如孝。


右鍵點擊Show Raw Keys/Values看一下key。并在InfoPlist.string中手動將一開始創(chuàng)建的兩個中英文啟動圖的storyboard值賦進(jìn)娩贷。

storyboard更改啟動圖國際化完成第晰。


下面是一開始做國際化時遇到的關(guān)于啟動圖的兩個問題。

*想要看到啟動圖的效果育勺,必須刪除原有App后重新安裝但荤。查找了一些相關(guān)的資料后發(fā)現(xiàn),啟動圖的資源只會保留一份涧至,在已有的情況下不會重新生成腹躁,根據(jù)蘋果的用戶交互指引,該頁面是在程序加載時顯示的,不建議動態(tài)修改。在比較了一些其他的App南蓬,例如QQ纺非、DJI GO、淘寶赘方、微博等烧颖,有些啟動圖使用的是可以在不同語言系統(tǒng)下共用的圖片,其他的也并沒有做動態(tài)修改窄陡。

*使用storyboard修改啟動圖時一定要記得在Info.plist中添加Launch screen interface file base name炕淮,不然無法顯示啟動圖,運行后會看到App的icon變成了啟動圖跳夭,App的視圖大小也會有問題涂圆。



5. iOS10所需的權(quán)限配置

同storyboard設(shè)置啟動圖國際化们镜。

首先在Info.plist中添加好權(quán)限后右鍵,選擇Show Raw Keys/Values看一下key润歉。


把key復(fù)制進(jìn)InfoPlist.string中分別寫好對應(yīng)的中英文描述即可模狭。



6. xib/storyboard國際化

官方文檔中有圖有真相地描述過啦!

developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html



7. 總結(jié)

iOS的項目國際化中并沒有什么難點踩衩,主要是找到的一些描述比較含糊或者不全嚼鹉。

國際化其實就是為各個語言單獨創(chuàng)建一份資源,通過名稱為*.lproj文件夾來保存驱富。在勾選需要的語言后锚赤,Xcode會自動創(chuàng)建對應(yīng)的文件,修改其中的值即可萌朱。

demo地址:github.com/Linciay/TYLocalization

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宴树,一起剝皮案震驚了整個濱河市策菜,隨后出現(xiàn)的幾起案子晶疼,更是在濱河造成了極大的恐慌,老刑警劉巖又憨,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠霍,死亡現(xiàn)場離奇詭異,居然都是意外死亡蠢莺,警方通過查閱死者的電腦和手機寒匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏将,“玉大人锄弱,你說我怎么就攤上這事』霰铮” “怎么了会宪?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚯窥。 經(jīng)常有香客問我掸鹅,道長,這世上最難降的妖魔是什么拦赠? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任巍沙,我火速辦了婚禮,結(jié)果婚禮上荷鼠,老公的妹妹穿的比我還像新娘句携。我一直安慰自己,他們只是感情好允乐,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布矮嫉。 她就那樣靜靜地躺著牡辽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敞临。 梳的紋絲不亂的頭發(fā)上态辛,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音挺尿,去河邊找鬼奏黑。 笑死,一個胖子當(dāng)著我的面吹牛编矾,可吹牛的內(nèi)容都是我干的熟史。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窄俏,長吁一口氣:“原來是場噩夢啊……” “哼蹂匹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凹蜈,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤限寞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仰坦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體履植,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年悄晃,在試婚紗的時候發(fā)現(xiàn)自己被綠了玫霎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡妈橄,死狀恐怖庶近,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眷蚓,我是刑警寧澤鼻种,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站溪椎,受9級特大地震影響普舆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜校读,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一沼侣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歉秫,春花似錦蛾洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钞螟。三九已至,卻和暖如春谎碍,著一層夾襖步出監(jiān)牢的瞬間鳞滨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工蟆淀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拯啦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓熔任,卻偏偏與公主長得像褒链,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疑苔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫甫匹、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 4月13日微語簡報惦费,星期四兵迅,工作愉快,生活喜樂趁餐! 1喷兼、東南沿海高鐵調(diào)價 一等座最高漲幅超50% 有少量車次下調(diào)票價...
    驕傲的帆閱讀 202評論 0 1
  • 某: AM01:11 終于,終于是到了冬天嗎后雷。 天光一點點變得黯淡但安靜,空氣也逐漸是了清冷的模樣吠各。 不知道你還會...
    九微的一局棋閱讀 585評論 0 1
  • 這幾天審車的車子臀突,不是違章沒處理,就是證件不齊全贾漏,時間都耽擱了候学,有客戶要審車,在聯(lián)系的時候就應(yīng)該清楚明白的提醒客戶...
    捌柒玖零閱讀 124評論 0 0