iOS应用本地化

字节云航
• 阅读 7440

声明:

  • 最后更新时间:2019年3月13日

一. 语言配置

无论本地化文本、图片、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,加载资源时从相应语言文件夹下加载。

本地化官方文档地址

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
Java日期时间API系列23
  有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59。下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第一天开始时间,当前月最后一天结束时间,上个月第一天开始时间,上个月最后一天结束时间,某个指定月的起始结束时间等等。其中月份最后一天往往因为月份不同和
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这