應用程序本地化

一、簡介

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

* 如果要添加本地化功能,需要為每種支持的語言創建一個子目錄,稱為”本地化文件夾”,通常使用.lproj作為拓展名

* 當本地化的應用程序需要載入某一資源時,如圖像、屬性列表、nib文件,應用程序會檢查用戶的語言和地區,并查找相匹配的本地化文件夾。如果找到了相應的文件夾,就會載入這個文件夾中的資源

? 當前項目環境為Xcode8.3.1、iOS9.3,涉及的代碼請參考例子YDLocal,暫時還沒有整理

? 本文博客參考了M了個J的應用程序本地化千葉的應用本地化,在此表示感謝。

二、默認的效果圖

工程目錄結構

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

現在想在中文語言環境下,換另一套實現,其中包括:

* 更改nib文件中的文字(nib本地化)

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

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

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

三、本地化前的準備

其實就是先創建好中文的本地化文件夾(zh-Hans.lproj),讓應用程序支持中文語言環境

選擇當前需要本地化的資源(下面這個圖是我偷懶,借用別人的,可能跟以后版本的xcode不一樣,以當前版本為準,比如我在例子中使用Xcode8.2.1在創建簡體中文本地化時只能本地化main.storyboard文件)

選擇Finish后,會發現硬盤上多了一個中文的本地化文件夾zh-Hans.lproj,至于Base.lproj文件夾是英文的本地化文件夾,創建項目時默認就有的(這兩個文件夾在未導入工程,存在于實體文件夾中)。(說明:下面這個圖是我偷懶,借用別人的,可能跟以后版本的xcode不一樣,以當前版本為準,比如我在例子中使用Xcode8.2.1在創建簡體中文本地化時只能本地化main.storyboard文件)

需要說明的是:

1、項目創建默認使用的是Base的本地化。而PROJECT->Info->”Use Base Internationalization”選項選中則為“Base本地化”創建Main.storyboard和LaunchScreen.stroyboard,默認情況下這個選項就是勾選的。 當我去掉勾時會刪除Main.storyboard和LaunchScreen.stroyboard。

2、將storyboard本地化后有的同學可能在zh-Hans中生成的不是xxx.storyboard而是xxx.strings,有兩種方法可以解決,一是去掉Base這個本地化(也就是上文中PROJECT->Info->”Use Base Internationalization”這個勾),二是本地化時自己選擇,如下圖:

3、至于本地化出來的xxx.strings文件也是關于storyboard本地化的一種方法,但是這種方法只能修改控件的title,所以我這里沒有使用這個本地化方法來舉例

準備工作做完后,就可以開始展開本地化工作了

四、nib文件的本地化

項目中選中MJViewController.xib后點擊xib右側菜單中的“show the file inspector”欄目中的Localize...按鈕,創建該xib的base、zh-Hans的本地化,創建后文件左邊多了個可以展開的三角形,展開可以發現分別都有2個版本的文件

打開MJViewController.xib(Chinese)文件,修改里面的文字信息(這里不修改圖片)

五、應用程序名稱本地化(Info.plist本地化)

知識背景:Info.plist中有個叫CFBundleDisplayName的key決定了應用程序的名稱

1、為Info.plist添加Application has localized display name字段,賦值為YES,讓應用程序支持名稱本地化,Info.plist就會去InfoPlist.strings加載CFBundleDisplayName這個key對應的字符串。(這里需要注意不能直接本地化Info.plist,因為這樣做之后Info.plist文件會存在各自的本地化文件夾中(像en.lproj)中,這樣系統會報Info.plist文件不存在的問題,雖然可以去指定Info.plist文件的位置,但是這樣就不能實現本地化的目的了)

2、新建InfoPlist.strings文件,選中InfoPlist.strings后點擊其右側菜單中的“show the file inspector”欄目中的Localize...按鈕,創建該InfoPlist.strings文件的base、zh-Hans的本地化,創建后InfoPlist.strings文件左邊多了個可以展開的三角形,展開可以看到對應base、zh-Hans的兩個文件。

3、在對應的InfoPlist.strings文件中添加各自的應用名

在InfoPlist.strings(English)中添加如下:

CFBundleDisplayName="Localization";

在InfoPlist.strings(Simplified)中添加如下:

CFBundleDisplayName="本地化";

六、圖片本地化

1、對工程中的圖片本地化(這里演示本地化home.png,nib文件中登錄按鈕下面的房子圖片)

1)、單擊選中home.png,后點擊其右側菜單中的“show the file inspector”欄目中的Localize...按鈕,創建該home.png文件的base、zh-Hans的本地化,創建后home.png文件左邊多了個可以展開的三角形,展開可以看到對應base、zh-Hans的兩個文件。

2)、查看下硬盤中home.png的情況

3)、而且項目中的home.png左邊也多了個可以展開的三角形,展開可以發現有2個版本的文件

4)、用預先準備好的另外一張圖片替換zh-Hans.lproj實體文件夾中的home.png

注意:本地化完圖片文件,記得Clean一下項目,而且最好先刪除應用程序,再重新安裝

2、使Assets.xcassets或者Images.xcassets管理的圖片本地化

因為iOS暫不支持.xcassets的本地化,所以這里需要結合字符串的本地化來處理。首先,在.xcassets中放入兩張圖片,并命名為image1、image2;然后,在各自的Localizable.strings中將兩個圖片指定給同一個key,如下

在Localizable.strings(English)文件加入:

"imageName" = "image1";

在Localizable.strings(Chinese)文件加入:

"imageName" = "image2";

最后通過key獲取圖片真實的名字,但是缺點在于xib中無法直接使用這種本地化的圖片啊!

七、字符串的本地化

1.創建一個字符串資源文件

2.文件名最好是Localizable.strings,如果使用其他文件名,使用字符串時的調用會有些區別

3.為Localizable.strings添加多語言支持(跟上面圖片本地化類似),選中Localizable.strings文件,查看右上角的視圖

4.查看下硬盤中Localizable.strings的情況

5.而且項目中的Localizable.strings左邊也多了個可以展開的三角形,展開可以發現有2個版本的文件

6.在Localizable.strings(English)文件加入:

Tip="Tip";

Ok="Ok";

7.在Localizable.strings(Chinese)文件加入:

Tip="提示";

Ok="好的";

8.在代碼中使用NSLocalizedString(key, comment)來讀取本地化字符串,key是Localizable.strings文件中等號左邊的字符串,comment純粹是注釋

NSString *tip = NSLocalizedString(@"Tip", nil);

NSString *ok = NSLocalizedString(@"Ok", nil);

如果沒有對字符串進行本地化 或者 找不到key對應的值,NSLocalizedString將直接返回key這個字符串

注意:如果你的字符串資源文件名不是Localizable.strings,如mj.strings,那么你就得使用NSLocalizedStringFromTable()來讀取本地化字符串:

NSLocalizedStringFromTable(@"Tip", @"mj", nil);

補充:生成字符串資源文件的另一種方式(通過終端命令)==請參考開篇提到的博客

八、其他文件的本地化

跟六中圖片本地化的原理是一樣的,重復六中的每個步驟即可

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

推薦閱讀更多精彩內容