標籤:
一、簡介
* 使用本地化功能,可以輕鬆地將應用程式翻譯成多種語言,甚至可以翻譯成同一語言的多種方言 * 如果要添加本地化功能,需要為每種支援的語言建立一個子目錄,稱為”本地化檔案夾”,通常使用.lproj作為拓展名 * 當本地化的應用程式需要載入某一資源時,像、屬性列表、nib檔案,應用程式會檢查使用者的語言和地區,並尋找相匹配的本地化檔案夾。如果找到了相應的檔案夾,就會載入這個檔案夾中的資源 * 為了節約時間我就以李明傑老師的部落格上進行修改說明(有點懶,不過程式員不喜歡偷懶怎麼能寫出好東西呢是吧!,再說李明傑老師講解得很不錯,我也是為了更好的說明,同時防止在梳理知識的時候有遺漏才這麼做的-.-)
二、建立項目 工程目錄結構
運行(因為沒有使用本地化功能,所以不管使用者選擇什麼語言環境,啟動並執行效果都是一樣的)
現在想在中文語言環境下,換另一套實現,其中包括: * 更改storyboard檔案中的文字(nib本地化,storyboard也是nib的一種)
* 更改登入按鈕下面的圖片(圖片本地化)
* 更改對話方塊中的文字(Tip和Ok)(字串本地化)
* 更改應用程式名稱(應用程式名稱本地化,即本地化Info.plist檔案)
三、本地化前的準備
其實就是先建立好中文的本地化檔案夾(zh-Hans.lproj),讓應用程式支援中文語言環境 首先注意這裡的勾選,我們來看看此時的專案檔 其中Base.lproj就是指的勾選的本地化,也就是說我們項目建立預設使用的是Base的本地化。這也是為什麼每次建立項目Main.storyboard會在一個Base.lproj的檔案夾中的原因。同時滑鼠指的是系統預設建立的一個英文本地化配置。這裡為了不影響說明我們去掉這個勾選,只用中文和英文本地化來進行說明(這裡的Base表示什麼語言模式是可以通過更改應用的語言環境做修改的有興趣的同學可自己研究)。當我去掉勾時會刪除Main.storyboard和LaunchScreen.stroyboard,因此我們需要先在英文換件中添加這兩個檔案然後再去掉Base,具體辦法就是選中Main.storyboard,勾選的English即可 進入正題:因為英文Localization系統已經幫我們建立好了,我們在這裡只需要建立中文Localization即可 選擇Finish後我們的專案檔結果為: zh-Hans.lproj檔案夾已經為我們建立好了,與en.lproj檔案夾一樣包含一個Main.storyboard表示在中文環境會啟用這裡面的資源。(有的同學在這步可能在zh-Hans中產生的不是Main.storyboard而是Main.strings,這時候需要自己選擇:至於這裡的.strings檔案,個人猜測應該是nib的代碼模式,這裡也沒有深究後續再補上吧。) 同時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="本地化";
六、圖片本地化
(這裡示範本地化home.png,nib檔案中登入按鈕下面的房子圖片)
用上面添加InfoPlist.strings的方法添加該圖片的本地化,分別為英文和中文環境添加home.png檔案
查看下專案檔中home.png的情況
在代碼中使用[UIImage imageNamed:@"home.png"]; 即可
注意:本地化完圖片檔案,記得Clean一下項目,而且最好先刪除應用程式,再重新安裝
七、字串的本地化
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純粹是注釋
如果沒有對字串進行本地化 或者 找不到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),這裡說明一下,現在Xcode 6以後就不推薦使用genstrings,不知此使用批量的轉化,而且還得一個一個的往本地檔案中產生。但是單個的處理還是沒問題的
genstrings ViewController.m -o en.lproj
如果使用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.中文環境下
iOS應用本地化