移动端访问不佳,请访问我的个人博客

最近项目本地化,需要支持多国语言,下面将本地化的步骤记录下来,方便查找使用,步骤很简单,有些地方也有坑,希望大家看后少走弯路~~

什么是本地化

本地化说直白点就是多语言开发,通过系统语言来判断应用使用的哪种语言,实现应用的本地化开发

本地化处理需要处理的文件

  • 本地化应用程序的info.plist
  • 本地化字符串处理(项目中所涉及的字符串)
  • 本地化图片
  • XIB和storyboard的本地化处理
  • 其他文件,比如csv等等

让我们的项目支持本地化

首先我们只有设置成支持多语言了,我们才能在展示项目名称和项目中的字符串等将语言进行切换,具体操作如下图所示:

在如上图所示的地方添加你需要支持的语言就行了,我这里是添加了简体汉语和英语

如何判断当前系统使用的语言

我们使用Locale这个类来判断当前的系统语言,方法:

//获取当前的locale
let locale = Locale.current
//返回本地语言环境的语言代码,或者如果没有零
//例如,对于地区“zh-Hant-HK”,返回“zh”
let languageCode = locale.languageCode
//返回该地区代码的语言环境,或者如果没有零
//例如,对于地区“zh-Hant-HK”,返回“HK”
let regionCode = locale.regionCode

同过以上的代码基本上能清楚的知道当前系统的使用的语言

获取系统支持的所有语言

同样我们也是通过Locale来获取系统支持的所有语言

//返回可用“语言环境”标识符的列表
let availableList = Locale.availableIdentifiers
//返回一个可用“语言环境”语言代码的列表
let languageCodeList = Locale.isoLanguageCodes
//返回一个可用“语言环境”地区代码的列表
let languageCodeList = Locale.isoRegionCodes

如何本地化info.plist

1.首先我们建一个名称叫InfoPlist.strings的本地化文件,记住名称必须叫InfoPlist.strings

2.选择让InfoPlist.strings支持的语言,如下图所示:

3.在InfoPlist.strings分别写入你想本地化的值,如下图所示 (格式如下所示,以分号结尾):



如何获得info.plist中对应的Key

我们可以通过打开info.plist的源码来获取到对于的Key值,如下图所示 :

本地化字符串处理

本地化字符串处理原理上跟infoPlist的处理差不多,只是我们需用配合一个方法来使用它:

let str = NSLocalizedString("需要本地化的字符串", comment: "")

默认使用NSLocalizedString这个方法时我们是获取mainBundle中一个名字叫Localizable.strings的本地化文件,所以我们一般只需要建一个名字叫Localizable.strings的文件即可,方法步骤跟建立infoPlist.strings类似(传送门

使用自定义的本地化文件

使用自定义的本地化文件也很容易,也是之前的方法,我们只需要多填一些参数就可以了:

//返回一个本地化的字符串,默认使用main bundle,如果没有指定一个
public func NSLocalizedString(_ key: String, tableName: String? = default, bundle: Bundle = default, value: String = default, comment: String) -> String

以上就是NSLocalizedString这个方法的所有参数,其中的tableName就是本地化文件的名称,默认就是Localizable.strings,自定义的话只需要建立一个新的,然后名称填你自己建立的本地化文件即可.

XIB和storyboard的本地化处理

XIBstoryboard的方法也很简单,跟本地放字符串类似,不过是本地化的XIB文件,如下图所示:

XIBstoryboard的本地化又两种方式,如上图所示,一种是以本地化文件的方式实现,就是以.strings的本地化文件;另外一种是以XIBstoryboard的方式展示,具体如下图所示 :

本地化图片和其他文件

对于本地化图片和其他文件就比较费劲一点了,因为Xcode中图片并没有支持本地化,我们只有通过代码判断来决定使用相对于的本地化图片和文件了,判断方法的传送门

本地化中所遇到的问题

在本地化中必须谨记一个问题,就是必须按本地化文件的格式来写入文件,因为本地化文件并不能检查出你分号后面是否多多余的字符串,造成的后果就是本地化文件失效!!

借鉴了许多大神的博客,总结了一篇比较全的,希望大家能学到东西,又什么疑问可以留言,谢谢大家的阅读~

iOS开发进阶 - 项目的本地化处理(多语言开发)的更多相关文章

  1. HTML5游戏开发进阶指南

    <HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.)    译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...

  2. OpenDaylight开发hello-world项目之功能实现

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  3. OpenDaylight开发hello-world项目之代码框架搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  4. OpenDaylight开发hello-world项目之开发环境搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  5. OpenDaylight开发hello-world项目之开发工具安装

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  6. Kotlin开发springboot项目(一)

    Kotlin开发springboot项目(一) Kotlin语言与Xtend语言有很多相似之处 为什么会存在这么多JVM语言? 现存的语言提供了太过受限制的功能,要不就是功能太过繁杂,导致语言的臃肿和 ...

  7. 10个Spring Boot快速开发的项目,接私活利器(快速、高效)

    本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...

  8. 从零开始搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  9. 安装Go语言及搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

随机推荐

  1. Python全栈day18(迭代器协议和for循环工作机制)

    一,什么是迭代和递归 递归和迭代都是循环的一种. 简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保 ...

  2. 【转】Keepalived无法绑定VIP故障排查经历

    一 故障描述 我在台湾合作方给定的两台虚拟机上部署HAProxy+Keepalived负载均衡高可用方案.在配置完Keepalived后,重新启动Keepalived,Keepalived没有绑定VI ...

  3. 并发编程 - io模型 - 总结

    1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...

  4. Pandas 如何通过获取双(多)重索引获取指定行DataFrame数据

    图片看不清楚的话,可以右键选择:“在新标签页中打开图片(I)” 参数 df.loc[(a,b),c]中第一个参数元组为索引内容,a为level0索引对应的内容,b为level1索引对应的内容 因为df ...

  5. wait_event族函数浅析

    2017-06-03 周末闲暇无事,聊聊内核中的wait_event*类函数的具体实现,等待事件必定涉及到某个条件,而这些函数的区别主要是等待后唤醒的方式……直奔主题,上源码 wait_event_i ...

  6. Mysql中字段类型之时间戳大坑2

      本文的内容依旧是讨论mysql字段类型为时间戳timestamp的问题,在遇到了之前的那个问题之后,今天测试人员又给我提了一个bug,是在前端页面提交会议表单的时候,选择了一个会议时间(2059年 ...

  7. Spring-BeanFactory容器

    Spring的BeanFactory容器 这是Spring中最简单地容器,它主要的功能是为依赖注入(DI)提供支持.这个容器接口在org.springframework.beans.factory.B ...

  8. vs开发nodejs系列之 修改新建js文件的模板

    文件位置 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Microsoft ...

  9. linux使用nohup命令后台运行程序

    在linux服务器上搭建web服务器,用ssh客户端登陆后使用./startservice.sh脚本启动服务,但是当ssh断开连接后起的服务也会停掉. 这时可以用nohup ./startservic ...

  10. UVA10954:Add All(优先队列)

    题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68990#problem/O 题目需求:在数组中拿出两个数相加,再把结果放回数组中再 ...