声明:
- 最后更新时间:2019年3月13日
一. 语言配置
无论本地化文本、图片、xib/storyboard,都需要配置本地化的语言,操作步骤如图:
点击“+”之后弹出对话框如图:
Main.storyboard和LaunchScreen.storyboard至少选择一个,如果选择的文件无用,那么在Finish之后删除即可。否则添加语言配置不成功。
二. 应用程序名称
- 在语言配置好之后,新建资源文件(文件名必须为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的本地化,图片的本地化主要有两种方式:①本地化图片名字,② 本地化图片文件
本地化图片名字(参考本地化文本),代码如下:
NSString *imageName = NSLocalizedString(@"icon", nil); UIImage *image = [UIImage imageNamed:imageName];
本地化图片文件
- 本地化资源文件:选中图片 -> File Inspection(Xcode右侧面板的文件检查器) -> Localize 如图:
生成相应的语言文件:选中图片文件 -> File Inspection(Xcode右侧面板的文件检查器) -> 勾选相应的语言文件,图片文件下会多出相应的语言文件 如图:
选中图片文件 -> Show In Finder,发现本地化的文件根据语言类型分别在不同的目录中,针对图片可以进行替换
- 图片替换之后,启动时会根据语言环境加载相应的图片资源。
Edit Scheme -> Options -> Application Language 可以修改此项目的语言环境,不需要每次修改设备的语言环境。如图:
- 本地化资源文件:选中图片 -> File Inspection(Xcode右侧面板的文件检查器) -> Localize 如图:
五. 启动图
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可配置的启动图。
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,加载资源时从相应语言文件夹下加载。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。