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

最近真是超級忙!接到了很多零散的小任務,終于都快結束啦,抽個空做些總結記錄。

本文主要涉及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國際化的文字顯示為英文。

圖1
圖2



4.啟動圖

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



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

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

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

首先取消默認的啟動圖,將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國際化

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

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



7. 總結

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

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

demo地址:github.com/Linciay/TYLocalization

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,813評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 4月13日微語簡報,星期四,工作愉快,生活喜樂! 1、東南沿海高鐵調價 一等座最高漲幅超50% 有少量車次下調票價...
    驕傲的帆閱讀 206評論 0 1
  • 某: AM01:11 終于,終于是到了冬天嗎。 天光一點點變得黯淡但安靜,空氣也逐漸是了清冷的模樣。 不知道你還會...
    九微的一局棋閱讀 610評論 0 1
  • 這幾天審車的車子,不是違章沒處理,就是證件不齊全,時間都耽擱了,有客戶要審車,在聯系的時候就應該清楚明白的提醒客戶...
    捌柒玖零閱讀 127評論 0 0