最近真是超級忙!接到了很多零散的小任務,終于都快結束啦,抽個空做些總結記錄。
本文主要涉及iOS的國際化,網上雖然有很多相關的文章,但是仔細閱讀下來感覺都不太全面,因此重開一篇總結,記錄項目中遇到的所有要點,demo見最下方鏈接。
1. App名稱國際化
2. 圖片、文字國際化
3. 強制默認顯示某種語言
4. 啟動圖國際化
5. iOS10所需的權限配置國際化
6. xib/storyboard國際化
7. 總結
1.App名稱國際化
非常簡單地按步驟修改就可以了。
PROJECT-Info-Localizations中點擊下方的小“+”,添加需要添加的語言,本文中以簡體中文和英文為例。(國際化的所有操作,都需要這一步作為前提。)
添加以InfoPlist.string為名稱的string文件。查到的資料都說需要名稱一模一樣才能使用,沒試過其他的名字。
選中新建好的InfoPlist.string,點擊Localize按鈕,添加語言。
完成上一步驟后在右邊勾選所需要語言,Xcode會自動創建對應的string文件。
分別在對應的string文件中填寫App名稱就可以了。
*關于Bundle name和Bundle display name:
stackoverflow.com/questions/9667582/bundle-name-and-bundle-display-name
就顯示來說,Bundle display name關系著icon下方的App名稱文本顯示,而Bundle name則作為存儲App的文件夾名稱,并沒有什么影響。
*用以上方法修改App名稱的一個問題:
如果系統為有對應string文件的語言時,可以正常顯示。
如果系統為無對應string文件的語言時,刪除App重裝后會跟隨設定的開發語言顯示;直接修改系統語言時會跟隨上一次有對應string文件時的語言顯示。
2.圖片、文字
仍是非常簡單地按照步驟修改即可。
首先創建一個string文件,名稱為Localizable.string。
選中Localizable.string,點擊右邊的Localize按鈕,在彈框的下拉菜單中隨便選一個需要添加string文件的語言,確認。(操作同InfoPlist.string的)
右邊的小勾要點上,勾選了之后Xcode才會自動創建對應的string文件。
在對應的語言的Localizable.string文件中添加對應的圖片名稱和文本內容。
"mainImage" = "mainImage_cn";//等號左邊為代碼需要調用的key,右邊為對應的中文圖片名稱value。
"mainText" = "Chinese";//等號左邊為代碼中需要調用的key,右邊為對應的中文文本value。
最后,只要在代碼中需要顯示圖片和文字的部分使用Foundation框架中的NSLocalizedString(key, comment)調用即可。
// 程序將根據第一個參數去對應語言的文件中取對應的值,第二個參數將轉化為字符串文件里的注釋,可以傳nil,也可以傳空字符串@""。
//#defineNSLocalizedString(key,comment) [[NSBundle mainBundle] localizedStringForKey:(key)value:@""table:nil]
//圖片調用
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:NSLocalizedString(@"mainImage", nil) ]];
//文本調用
textLabel.text = NSLocalizedString(@"mainText", nil);
修改語言后的顯示:
*以上的操作后,代碼中文字和圖片的國際化已經完成了,但是在更換系統語言后會遇到一些問題。
我的項目中只做了簡體中文和英文的語言設置,如果系統語言為日文時安裝App,App中語言會根據我設置的開發語言顯示為英文。如果在App已安裝后更改系統語言為日文,則會跟隨App上一次的語言設置作相同的顯示。這樣并不符合我的項目需求,因此我加入了下方的第三部分。
3.強制默認顯示某種語言
我的項目需求:在系統語言選定為中文時,App語言為中文,其他情況下全部作英文顯示。
因此需要添加系統語言讀取,經過判斷后直接調用我需要的某種語言對應的值來顯示。
//在Appdelegate.m中添加系統語言檢測與賦值
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
if ([language hasPrefix:@"zh"]) {//檢測開頭匹配,是否為中文
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];//App語言設置為中文
}else{//其他語言
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];//App語言設置為英文
}
//在需要的部分添加手動選取語言的宏,并調用得到對應的值
//宏
#define Localized(key)? [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Localizable"]
//調用
forceLabel.text = Localized(@"forceText");
選定系統語言為中文,安裝App并運行(顯示結果為圖1),之后修改系統語言為日文(顯示結果為圖2),使用NSLocalizedString國際化的文字顯示為中文,使用自定義宏Localized國際化的文字顯示為英文。
4.啟動圖
啟動圖國際化的方法有兩種,一種是在Info.plist中添加圖片(需要導入的圖片較多),一種是添加不同的storyboard分別調用(需要導入的圖片少些)。操作很簡單,但是我在實際使用中遇到了兩個問題花費了一些時間,問題將附于下方做一些簡述。
4.1 圖片+Info.plist使啟動圖國際化
這個方法同樣可以用作App中圖片的國際化,但是我比較習慣把圖片導入Assets.xcassets中使用,因此在圖片國際化中沒有做介紹。這個方法主要是在Info.plist中直接配置啟動頁的參數來展示啟動圖,下方附上官方的文檔。
首先取消默認的啟動圖,將TARGET-General-Launch Screen File中默認的LaunchScreen去掉,留空。
導入準備好的啟動圖,這里我做了3.5、4、4.7、5.5英寸的。之后選中圖片,點擊Localize按鈕,這個步驟和string文件的操作一樣,四個圖片都要做。
右鍵點擊設置好的片,選中Show in Finder。下圖中,en.lproj中保存的是英文版的啟動圖,zh-Hans.lproj保存的是中文的啟動圖。把準備好的對應的圖片修改名稱后拖入就行了,圖片名稱一定要和工程中導入的一樣。
圖片準備完畢之后,將Info.plist以源碼的形式打開,或者是直接在屬性列表中點擊“+”添加對應的屬性。
Source Code中對應的代碼:(demo的Sourcecode Codes中有)
Property List中對應的列表:
刪除原先安裝的App,重新安裝后即可看到效果。
運行后如果看不到啟動圖更換效果,請刪除App后重新運行。
4.2 storyboard+InfoPlist.string使啟動圖國際化
首先創建作為啟動頁的storyboard,分別命名區分。我設置的名字是LaunchImage_En和LaunchImage_Ch,名字自己分得清就可以啦。
storyboard中添加ViewController,勾選Is Initial View Controller(中英文的啟動頁都需要勾選),添加啟動圖,添加約束占滿屏。
設置好后在Info.plist中添加啟動圖名稱。值我填了項目默認的LaunchScreen,但是并不用它作為啟動圖,后面還要手動賦值。
右鍵點擊Show Raw Keys/Values看一下key。并在InfoPlist.string中手動將一開始創建的兩個中英文啟動圖的storyboard值賦進。
storyboard更改啟動圖國際化完成。
下面是一開始做國際化時遇到的關于啟動圖的兩個問題。
*想要看到啟動圖的效果,必須刪除原有App后重新安裝。查找了一些相關的資料后發現,啟動圖的資源只會保留一份,在已有的情況下不會重新生成,根據蘋果的用戶交互指引,該頁面是在程序加載時顯示的,不建議動態修改。在比較了一些其他的App,例如QQ、DJI GO、淘寶、微博等,有些啟動圖使用的是可以在不同語言系統下共用的圖片,其他的也并沒有做動態修改。
*使用storyboard修改啟動圖時一定要記得在Info.plist中添加Launch screen interface file base name,不然無法顯示啟動圖,運行后會看到App的icon變成了啟動圖,App的視圖大小也會有問題。
5. iOS10所需的權限配置
同storyboard設置啟動圖國際化。
首先在Info.plist中添加好權限后右鍵,選擇Show Raw Keys/Values看一下key。
把key復制進InfoPlist.string中分別寫好對應的中英文描述即可。
6. xib/storyboard國際化
官方文檔中有圖有真相地描述過啦!
7. 總結
iOS的項目國際化中并沒有什么難點,主要是找到的一些描述比較含糊或者不全。
國際化其實就是為各個語言單獨創建一份資源,通過名稱為*.lproj文件夾來保存。在勾選需要的語言后,Xcode會自動創建對應的文件,修改其中的值即可。