iOS应用本地化

声明:

  • 最后更新时间:2019年3月13日
  • 为保证时效性,持续更新地址为:iOS应用本地化

一. 语言配置

无论本地化文本、图片、xib/storyboard,都需要配置本地化的语言,操作步骤如图:

《iOS应用本地化》

点击“+”之后弹出对话框如图:

《iOS应用本地化》

Main.storyboard和LaunchScreen.storyboard至少选择一个,如果选择的文件无用,那么在Finish之后删除即可。否则添加语言配置不成功。

二. 应用程序名称

  1. 在语言配置好之后,新建资源文件(文件名必须为InfoPlist.strings):Xcode -> File -> New File -> Resource -> Strings File。
  2. 本地化资源文件:选中InfoPlist.strings文件 -> File Inspection(Xcode右侧面板的文件检查器) -> Localize 如图:

    《iOS应用本地化》

  3. 生成相应的语言文件:选中InfoPlist.strings文件 -> File Inspection(Xcode右侧面板的文件检查器) -> 勾选相应的语言文件,InfoPlist.strings下会多出相应的语言文件 如图:

    《iOS应用本地化》

  4. 在相应的语言文件中添加本地化的文本(key/value形式), 如图:

    《iOS应用本地化》
    《iOS应用本地化》

  5. App启动时根据系统语言加载相应语言的InfoPlist.strings, 本地化处理过的文本可以进行相应语言的显示。
  6. 如果前5步之后仍不能达到效果,编辑Info.plist,添加一个新的属性Application has localized display name, 设置其类型为Boolean,并将其value设置为YES。

三. 文本

  1. 在语言配置好之后,新建资源文件(文件名:系统默认Localizable.strings):Xcode -> File -> New File -> Resource -> Strings File,文本显示时,默认文件名用NSLocalizedString(key, comment),如果自定义文件名需用NSLocalizedStringFromTable(key, tbl, comment),其中tbl即为文件名。
  2. 本地化资源文件:选中Localizable.strings文件 -> File Inspection(Xcode右侧面板的文件检查器) -> Localize 如图:

    《iOS应用本地化》

  3. 生成相应的语言文件:选中Localizable.strings文件 -> File Inspection(Xcode右侧面板的文件检查器) -> 勾选相应的语言文件,Localizable.strings下会多出相应的语言文件 如图:

    《iOS应用本地化》

  4. 在相应的语言文件中添加本地化的文本(key/value形式), 如图:

    《iOS应用本地化》
    《iOS应用本地化》

  5. 项目中应用:NSLocalizedString(key, comment)或者NSLocalizedStringFromTable(key,文件名, comment),key即Localizable.strings中自己定义的key,comment即备注,可为nil。如图

    《iOS应用本地化》

  6. App启动时根据系统语言加载相应语言的Localizable.strings, 本地化处理过的文本可以进行相应语言的显示。系统根据某个key在Localizable.strings获取对应的字符串时,如果没有找到,那么就会以key作为value返回。
  7. Edit Scheme -> Options -> Application Language 可以修改此项目的语言环境,不需要每次修改设备的语言环境。如图:

    《iOS应用本地化》

四. 图片

由于iOS中不支持Assets.xcassets的本地化,图片的本地化主要有两种方式:①本地化图片名字,② 本地化图片文件

  • 本地化图片名字(参考本地化文本),代码如下:

    NSString *imageName = NSLocalizedString(@"icon", nil);
    UIImage *image = [UIImage imageNamed:imageName];
  • 本地化图片文件

    1. 本地化资源文件:选中图片 -> File Inspection(Xcode右侧面板的文件检查器) -> Localize 如图:
      《iOS应用本地化》
    2. 生成相应的语言文件:选中图片文件 -> File Inspection(Xcode右侧面板的文件检查器) -> 勾选相应的语言文件,图片文件下会多出相应的语言文件 如图:

      《iOS应用本地化》

    3. 选中图片文件 -> Show In Finder,发现本地化的文件根据语言类型分别在不同的目录中,针对图片可以进行替换

      《iOS应用本地化》

    4. 图片替换之后,启动时会根据语言环境加载相应的图片资源。
    5. Edit Scheme -> Options -> Application Language 可以修改此项目的语言环境,不需要每次修改设备的语言环境。如图:

      《iOS应用本地化》

五. 启动图

iOS 启动图配置有三种方式:①导入图片文件,并且配置Info.plist,② Launch Image Source (Assets),③ LaunchScreen File。但是第② 种暂不支持本地化。启动图可行的两种方式,都依赖于Info.plist文件的配置。

  • 引入图片文件且配置Info.plist

    1. 首先将Launch Screen File置空,并且不选择Launch Image Source (Asset)
    2. 此方法类似图片的本地化(本地化图片文件),额外的需要在Info.plist文件中配置,
    3. 图片规格和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

    1. 本地化LaunchScreen.storyboard,类似本地化图片文件步骤,经测试此方法不可行(不能根据系统语言环境自动加载对应的本地化文件),猜测苹果不赞成不支持本地化,普通的xib/storyboard文件也不支持图片的本地化(参见下一节:六. xib/storyboard)。
    2. 创建两个LaunchScreen.文件,一个文件名为LaunchScreen-English,一个文件名LaunchScreen-Chinese,参考应用程序名称本地化,在InfoPlist.strings 配置Info.plist,如下:

      "UILaunchStoryboardName" = "LaunchScreen-Chinese";
      "UILaunchStoryboardName" = "LaunchScreen-English";

六. xib/storyboard

本地化XXX.storyboard,操作步骤与本地化图片文件相同,但是storyboard内容的本地化发现只支持文本,并且xib/storyboard 元素较多,内容也较复杂。每次控件内容的修改都要同步到其它语言环境上。整理方法如下:

  1. 可以在修改Base环境界面上的元素之后(最好暂存一下,以防后续操作失败),先勾选掉其它语言环境的文件,再勾选切换重新生成(Replace file)storyboard,但是需要重新填写每种语言的本地化文本。如图
    《iOS应用本地化》
  2. 可以Base文件中查看ObjectID,在原来语言文件的基础之上,对新添加控件依据格式进行补充整理:

    /* Class = "UILabel"; text = "Label"; ObjectID = "fSz-Ci-UcW"; */
    "fSz-Ci-UcW.text" = "Label";
  3. 终端利用工具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
  4. 利用脚本保持Base和其它语言环境的本地化UI元素一致:脚本文件
    此方法参考文章,在TARGETS -> Build Phases -> Run Script(没有可以左上角“+”)增添脚本代码:

    python  脚本本地路径()  storyboard/xib路径(会自动遍历和查找子目录)
  5. 链接到代码中利用代码本地化(类似文本本地化)

七. 后记

工程目录:每种语言都有自己的文件夹xx.lproj,加载资源时从相应语言文件夹下加载。

本地化官方文档地址

    原文作者:windtersharp
    原文地址: https://segmentfault.com/a/1190000013206628
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞