最近接觸到iOS應用本地化的相關使用,於是花了點時間研究了一下,下面把成果分享給大家。
-
使用本地化功能,可以輕松地將應用程序翻譯成多種語言,甚至可以翻譯成同一語言的多種方言
- 如果要添加本地化功能,需要為每種支持的語言創建一個子目錄,稱為”本地化文件夾”,通常使用.lproj作為拓展名
- 當本地化的應用程序需要載入某一資源時,如圖像、屬性列表、nib文件,應用程序會檢查用戶的語言和地區,並查找相匹配的本地化文件夾。如果找到了相應的文件夾,就會載入這個文件夾中的資源
-
當前項目環境為Xcode7.3、iOS9.3,涉及的代碼可以去我們github上下載:https://github.com/peanutNote/QYLocalization.git
- 為了節約時間本文大致基於李明傑老師的博客進行寫作

運行效果圖(因為沒有使用本地化功能,所以不管用戶選擇什么語言環境,運行的效果都是一樣的)



* 更改登錄按鈕下面的圖片(圖片本地化)
* 更改對話框中的文字(Tip和Ok)(字符串本地化)
* 更改應用名稱(應用名稱本地化,即本地化Info.plist文件)
三、本地化前的准備






/* Class = "UILabel"; text = "Password"; ObjectID = "6Jw-lK-yZp"; */ "6Jw-lK-yZp.text" = "Password"; /* Class = "UIButton"; normalTitle = "Login"; ObjectID = "M8g-w0-oLf"; */ "M8g-w0-oLf.normalTitle" = "Login"; /* Class = "UILabel"; text = "UserName"; ObjectID = "io8-3O-gpY"; */ "io8-3O-gpY.text" = "UserName";
)

四、nib文件的本地化
打開Main.storyboard(Simplified)文件,修改里面的文字信息(這里不修改圖片)
五、應用程序名稱本地化(Info.plist本地化)
知識背景:Info.plist中有個叫CFBundleDisplayName的key決定了應用程序的名稱
1.為Info.plist添加一個key-value,讓應用程序支持名稱本地化,Info.plist就會去InfoPlist.strings加載CFBundleDisplayName對應的字符串,(這里需要注意不能直接本地化Info.plist,因為這樣做之后Info.plist文件會存在各自的本地化文件夾中(像en.lproj)中,這樣系統會報Info.plist文件不存在的問題,雖然可以去指定Info.plist文件的位置,但是這樣就不能實現本地化的目的了,所以需要用到InfoPlist.strings文件)。
用這種方法分別為英文和中文本地化添加InfoPlist.strings文件並且在Info.plst中添加Application has localized display name字段,賦值為YES
在對應的InfoPlist.strings文件中添加各自的應用名
InfoPlist.strings(English):
CFBundleDisplayName="Localization";
在InfoPlist.strings(Simplifid):
CFBundleDisplayName="本地化";
六、圖片本地化
1.直接拖拽到項目的圖片本地化(這里演示本地化home.png,nib文件中登錄按鈕下面的房子圖片)
用上面添加InfoPlist.strings的方法添加該圖片的本地化,分別為英文和中文環境添加home.png文件
查看下項目文件中home.png的情況
在代碼中使用[UIImage imageNamed:@"home.png"]; 即可
注意:本地化完圖片文件,記得Clean一下項目,而且最好先刪除應用程序,再重新安裝
2.使用Assets.xcassets或者Images.xcassets管理圖片本地化
因為iOS暫不支持.xcassets的本地化,所以這里需要結合字符串的本地化來處理(這里也放在后面介紹)
七、字符串的本地化
1.創建一個字符串資源文件 文件名最好是Localizable.strings,如果使用其他文件名,使用字符串時的調用會有些區別
2.依舊按照上面的方法為Localizable.strings添加多語言支持
3.在Localizable.strings(English)文件加入:
Tip="Tip"; Ok="Ok"; "Please input your userName"="Please input your userName";
4.在Localizable.strings(Chinese)文件加入:
Tip="提示"; Ok="好的"; "Please input your userName"="請輸入用戶名";
5.在代碼中使用NSLocalizedString(key, comment)來讀取本地化字符串,key是Localizable.strings文件中等號左邊的字符串,comment純粹是注釋。同時上文中提到的.xcassets本地化也需要用到這個。首先添加各自的圖片並命名如:image1,image2,本地化一個字符串imageName用作圖片的名字,然后在各自的Localizable.strings中對應到各自的實際圖片名稱即可。
在Localizable.strings(English)文件加入:
"imageName" = "image1";
在Localizable.strings(Chinese)文件加入:
"imageName" = "image2";
如果沒有對字符串進行本地化 或者 找不到key對應的值,NSLocalizedString將直接返回key這個字符串
注意:如果你的字符串資源文件名不是Localizable.strings,如qy.strings,那么你就得使用NSLocalizedStringFromTable()來讀取本地化字符串:
NSLocalizedStringFromTable(@"Tip", @"qy", nil);
1.首先添加獲取字符串的代碼,比如在ViewController.m。(其實這里就是方便我們不用針對每一個需要本地化字符串的地方都去上面Localizable.strings文件中一一添加,我們只需要使用NSLocalizedString取字符串然后用genstrings命令就可以幫我們完善Localizable.strings文件啦)
NSString *tip = NSLocalizedString(@"Tip", @"dialog title"); NSString *ok = NSLocalizedString(@"Ok", @"dialog button");
2.打開終端,cd到項目文件夾下(包含en.lproj和zh-Hans.lproj,否則會報錯couldn't connect to output directory xx.lproj)
find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj // 注意*.m旁邊的引號,這個不可缺少,網上有很多這種命令是沒有加引號的,這樣執行會報錯xx.m: unknown primary or operator
如果使用NSLocalizedStringFromTable(key, tbl, comment)來獲取字符串,資源文件會以tbl參數作為文件名,比如
NSString *tip = NSLocalizedStringFromTable(@"Tip", @"qy", @"dialog title"); NSString *ok = NSLocalizedStringFromTable(@"Ok", @"qy", @"dialog button");
生成的資源文件為:qy.strings
4.將資源文件導入項目即可,然后打開資源文件,可以發現已經生成了key和comment
八、其他文件的本地化
跟六中圖片本地化的原理是一樣的,重復六中的每個步驟即可
九、最終效果演示
1.英文環境下
2.中文環境下
最后給大家推薦一篇不錯的本地化博客,提供給大家參考。