声明: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,加载资源时从相应语言文件夹下加载。
本地化官方文档地址