最近真是超級忙凄硼!接到了很多零散的小任務(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文件時的語言顯示自点。
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國際化的文字顯示為英文喧锦。
4.啟動圖
啟動圖國際化的方法有兩種,一種是在Info.plist中添加圖片(需要導(dǎo)入的圖片較多)抓督,一種是添加不同的storyboard分別調(diào)用(需要導(dǎo)入的圖片少些)燃少。操作很簡單,但是我在實際使用中遇到了兩個問題花費了一些時間铃在,問題將附于下方做一些簡述阵具。
4.1 圖片+Info.plist使啟動圖國際化
這個方法同樣可以用作App中圖片的國際化,但是我比較習(xí)慣把圖片導(dǎo)入Assets.xcassets中使用定铜,因此在圖片國際化中沒有做介紹阳液。這個方法主要是在Info.plist中直接配置啟動頁的參數(shù)來展示啟動圖,下方附上官方的文檔揣炕。
首先取消默認(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國際化
官方文檔中有圖有真相地描述過啦!
7. 總結(jié)
iOS的項目國際化中并沒有什么難點踩衩,主要是找到的一些描述比較含糊或者不全嚼鹉。
國際化其實就是為各個語言單獨創(chuàng)建一份資源,通過名稱為*.lproj文件夾來保存驱富。在勾選需要的語言后锚赤,Xcode會自動創(chuàng)建對應(yīng)的文件,修改其中的值即可萌朱。