聲明:html
- 最後更新時間:2019年3月13日
- 爲保證時效性,持續更新地址爲:iOS應用本地化
一. 語言配置
不管本地化文本、圖片、xib/storyboard,都須要配置本地化的語言,操做步驟如圖:python
點擊「+」以後彈出對話框如圖:git
Main.storyboard和LaunchScreen.storyboard至少選擇一個,若是選擇的文件無用,那麼在Finish以後刪除便可。不然添加語言配置不成功。github
二. 應用程序名稱
- 在語言配置好以後,新建資源文件(文件名必須爲InfoPlist.strings):Xcode -> File -> New File -> Resource -> Strings File。
- 本地化資源文件:選中InfoPlist.strings文件 -> File Inspection(Xcode右側面板的文件檢查器) -> Localize 如圖:
- 生成相應的語言文件:選中InfoPlist.strings文件 -> File Inspection(Xcode右側面板的文件檢查器) -> 勾選相應的語言文件,InfoPlist.strings下會多出相應的語言文件 如圖:
- 在相應的語言文件中添加本地化的文本(key/value形式), 如圖:
- App啓動時根據系統語言加載相應語言的InfoPlist.strings, 本地化處理過的文本能夠進行相應語言的顯示。
- 若是前5步以後仍不能達到效果,編輯Info.plist,添加一個新的屬性Application has localized display name, 設置其類型爲Boolean,並將其value設置爲YES。
三. 文本
- 在語言配置好以後,新建資源文件(文件名:系統默認Localizable.strings):Xcode -> File -> New File -> Resource -> Strings File,文本顯示時,默認文件名用NSLocalizedString(key, comment),若是自定義文件名需用NSLocalizedStringFromTable(key, tbl, comment),其中tbl即爲文件名。
- 本地化資源文件:選中Localizable.strings文件 -> File Inspection(Xcode右側面板的文件檢查器) -> Localize 如圖:
- 生成相應的語言文件:選中Localizable.strings文件 -> File Inspection(Xcode右側面板的文件檢查器) -> 勾選相應的語言文件,Localizable.strings下會多出相應的語言文件 如圖:
- 在相應的語言文件中添加本地化的文本(key/value形式), 如圖:
- 項目中應用:NSLocalizedString(key, comment)或者NSLocalizedStringFromTable(key,文件名, comment),key即Localizable.strings中本身定義的key,comment即備註,可爲nil。如圖
- App啓動時根據系統語言加載相應語言的Localizable.strings, 本地化處理過的文本能夠進行相應語言的顯示。系統根據某個key在Localizable.strings獲取對應的字符串時,若是沒有找到,那麼就會以key做爲value返回。
- Edit Scheme -> Options -> Application Language 能夠修改此項目的語言環境,不須要每次修改設備的語言環境。如圖:
四. 圖片
因爲iOS中不支持Assets.xcassets的本地化,圖片的本地化主要有兩種方式:①本地化圖片名字,② 本地化圖片文件shell
-
本地化圖片名字(參考本地化文本),代碼以下:segmentfault
NSString *imageName = NSLocalizedString(@"icon", nil);
UIImage *image = [UIImage imageNamed:imageName];
-
本地化圖片文件app
- 本地化資源文件:選中圖片 -> File Inspection(Xcode右側面板的文件檢查器) -> Localize 如圖:
- 生成相應的語言文件:選中圖片文件 -> File Inspection(Xcode右側面板的文件檢查器) -> 勾選相應的語言文件,圖片文件下會多出相應的語言文件 如圖:
- 選中圖片文件 -> Show In Finder,發現本地化的文件根據語言類型分別在不一樣的目錄中,針對圖片能夠進行替換
- 圖片替換以後,啓動時會根據語言環境加載相應的圖片資源。
- Edit Scheme -> Options -> Application Language 能夠修改此項目的語言環境,不須要每次修改設備的語言環境。如圖:
五. 啓動圖
iOS 啓動圖配置有三種方式:①導入圖片文件,而且配置Info.plist,② Launch Image Source (Assets),③ LaunchScreen File。可是第② 種暫不支持本地化。啓動圖可行的兩種方式,都依賴於Info.plist文件的配置。工具
-
引入圖片文件且配置Info.plist測試
- 首先將Launch Screen File置空,而且不選擇Launch Image Source (Asset)
- 此方法相似圖片的本地化(本地化圖片文件),額外的須要在Info.plist文件中配置,
- 圖片規格和plist配置結構(類比Assets中的 Launch Image),能夠在Assets中配置Launch Image後,App運行時打印Info.plist 查看 ,舉例以下::
<key>UILaunchImages</key>
<array>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>bubble_mine_green</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{414, 736}</string>
</dict>
</array>
注意:目前手機只有iPhone plus(5.5)和iPhone X 額外支持橫屏啓動圖配置,其它設備默認加載豎圖,具體查看Assets中的LaunchImages可配置的啓動圖。ui
-
LaunchScreen File
- 本地化LaunchScreen.storyboard,相似本地化圖片文件步驟,經測試此方法不可行(不能根據系統語言環境自動加載對應的本地化文件),猜想蘋果不同意不支持本地化,普通的xib/storyboard文件也不支持圖片的本地化(參見下一節:六. xib/storyboard)。
-
建立兩個LaunchScreen.文件,一個文件名爲LaunchScreen-English,一個文件名LaunchScreen-Chinese,參考應用程序名稱本地化,在InfoPlist.strings 配置Info.plist,以下:
"UILaunchStoryboardName" = "LaunchScreen-Chinese";
"UILaunchStoryboardName" = "LaunchScreen-English";
六. xib/storyboard
本地化XXX.storyboard,操做步驟與本地化圖片文件相同,可是storyboard內容的本地化發現只支持文本,而且xib/storyboard 元素較多,內容也較複雜。每次控件內容的修改都要同步到其它語言環境上。整理方法以下:
- 能夠在修改Base環境界面上的元素以後(最好暫存一下,以防後續操做失敗),先勾選掉其它語言環境的文件,再勾選切換從新生成(Replace file)storyboard,可是須要從新填寫每種語言的本地化文本。如圖
-
能夠Base文件中查看ObjectID,在原來語言文件的基礎之上,對新添加控件依據格式進行補充整理:
/* Class = "UILabel"; text = "Label"; ObjectID = "fSz-Ci-UcW"; */
"fSz-Ci-UcW.text" = "Label";
-
終端利用工具ibtool,此方法相似第1條的從新勾選Replace file,都須要從新填寫本地化文本
- 進入Base.lproj文件的目錄:
-
用命令行工具ibtool根據Base文件產生一個.strings文件,對比新的.strings文件,在原來語言文件的基礎之上,對新添加控件依據格式進行補充整理,命令舉例以下:
ibtool Main.storyboard --generate-strings-file ./temp.strings
- 修改.strings文件中的字符串,相似從新填寫本地化文本的操做
-
用命令行工具ibtool根據字符串文件從新生成對應語言的storyboard,命令舉例以下
ibtool --strings-file temp.strings --write ../zh-Hans.lproj/Main.storyboard Main.storyboard
-
利用腳本保持Base和其它語言環境的本地化UI元素一致:腳本文件
此方法參考文章,在TARGETS -> Build Phases -> Run Script(沒有能夠左上角「+」)增添腳本代碼:
python 腳本本地路徑() storyboard/xib路徑(會自動遍歷和查找子目錄)
- 連接到代碼中利用代碼本地化(相似文本本地化)
七. 後記
工程目錄:每種語言都有本身的文件夾xx.lproj,加載資源時從相應語言文件夾下加載。
本地化官方文檔地址