iOS應用本地化國際化


最近接觸到iOS應用本地化的相關使用,於是花了點時間研究了一下,下面把成果分享給大家。

一、簡介
  • 使用本地化功能,可以輕松地將應用程序翻譯成多種語言,甚至可以翻譯成同一語言的多種方言

  • 如果要添加本地化功能,需要為每種支持的語言創建一個子目錄,稱為”本地化文件夾”,通常使用.lproj作為拓展名
  • 當本地化的應用程序需要載入某一資源時,如圖像、屬性列表、nib文件,應用程序會檢查用戶的語言和地區,並查找相匹配的本地化文件夾。如果找到了相應的文件夾,就會載入這個文件夾中的資源
 
二、創建項目
 
工程目錄結構

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

 

現在想在中文語言環境下,換另一套實現,其中包括:
  * 更改storyboard文件中的文字(nib本地化,storyboard也是nib的一種)

  * 更改登錄按鈕下面的圖片(圖片本地化)

  * 更改對話框中的文字(Tip和Ok)(字符串本地化)

  * 更改應用名稱(應用名稱本地化,即本地化Info.plist文件)

 

三、本地化前的准備

其實就是先創建好中文的本地化文件夾(zh-Hans.lproj),讓應用程序支持中文語言環境
 
 
 
其中Base.lproj就是指的勾選的本地化,也就是說我們項目創建默認使用的是Base的本地化。這也是為什么每次創建項目Main.storyboard會在一個Base.lproj的文件夾中的原因。同時鼠標指的是系統默認創建的一個英文本地化配置(里面有兩個文件正好跟Base.lproj中的對應,目前可以理解Base也是英文的一種本地化)。這里為了不影響說明我們去掉這個勾選,只用中文和英文本地化來進行說明。當我去掉勾時會刪除Main.storyboard和LaunchScreen.stroyboard,因此我們需要先在英文換件中添加這兩個文件然后再去掉Base,具體辦法就是選中Main.storyboard,勾選下圖的English這兩個文件就會拷貝一份到en.lproj中。
 
 
我們來看此時的項目文件結構
 
 
進入正題:因為英文Localization系統已經幫我們創建好了,我們在這里只需要創建中文Localization即可
 
 
 
選擇Finish后我們的項目文件結果為:
 
 zh-Hans.lproj文件夾已經為我們創建好了,與en.lproj文件夾一樣包含一個Main.storyboard表示在中文環境會啟用這里面的資源。這里有的同學可能在zh-Hans中生成的不是Main.storyboard而是Main.strings,這是因為你沒有去掉Base這個本地化(也就是上文中的勾),不過這時候也可以自己選擇:
 
 
至於這里的Main.strings文件也是關於storyboard本地化的一種方法。需要我們先在nib中添加好控件弄好布局以后在執行本地化,然后Main.strings中就會生成類似字符串本地化(后面會介紹,因為這種方法只能修改控件的title,所以我這里沒有使用這個來說明)一樣的文件,修改對應的地方就可以修改storyboard中的控件title了
/* 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";

同時Xcode中的Main.storyboard左邊會出現一個三角,展開可以發現分別都有2個版本的文件。到此我們的項目就支持英文和中文環境了,本地化准備完畢
 

四、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);

 

 補充:生成字符串資源文件的另一種方式(通過終端命令genstrings,可以自行補充)

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.中文環境下

 

最后給大家推薦一篇不錯的本地化博客,提供給大家參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM