ios-多语言版本开发(三)(转载)
写在前面
iOS 多语言版本的开发(二)中我们实现了如何让用户自己去切换系统语言的功能,我们还写了Demo 以供辅助学习;但是,继以上两篇文章都是建立在项目刚刚启动或启动不久,项目中存在的中文字符串还不是很多,手动改起来也还可以接受; 那么问题来了,如果项目已经竣工或者已经迭代几个版本了,那该如何实现了?手动改起来也不太现实,耗时耗力不讨好的手动,在这里就不用考虑了。 不让考虑,是因为我有更简单快捷高效的方法,让我慢慢与您道来;
如何辨别项目中的中文字符串?
既然要替换项目中使用到的中文字符串,那么前提就必须要先找到这些个字符串,然后将这些字符串,替换成我们定义的宏, 为了替换方便,可将这些字符串自身作为key
, 这里不理解的不要紧,下面我还会讲到。 既然是辨别中文字符串,那也就是说在项目文件中进行匹配查找,说到匹配,那就需要正则表达式了,用正则表达式匹配Xcode中的使用的中文字符串,使用(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")\s*
即可, 打开你的Xcode 试试看,切记find 后面的选项要选择 Regular Expression
, 默认选中的是Text
, 如图
如何取出识别到的中文字符串?
我们已经知道如何识别项目中的字符串了,但是如何取出来使用呢? 这就需要遍历项目中所有的指定后缀(e.g: .h、.m等)的文件,然后利用正则表达匹配所有使用到的中文字符串,并写入文件中。
为了方便起见,我将此过程写了一个Mac客户端小应用,可直接将选中的项目中所有的中文字符串,导出到指定的路径下;
该应用还可以选择对于重复出现的中文字符串进行处理,以及还可以将中文字符串导出为繁体; 小应用更值得关注的是它导出的文件,可以直接拿来当做多语言文件中的key=value
使用,非常简单,喜欢的可以去下载看看, 含有源码的哦;小应用运行图如下:
如何使用取出的中文字符串?
已经拿到取出的中文字符串文件,这个文件是可以直接拿来用做多语言文件使用的,小应用导出的文件,只可以用于中文以及繁体多语言文件,而对于其他的语言,就需要你拿着导出的文件,找你们公司的翻译人员,进行翻译; 拿繁体版来举个例子,导出来的繁体文件如下(收留我App导出的文件):
这个繁体文件,可以直接作为繁体多语言使用,如何想要翻译成英文,可以将此文件拷贝一份,交给翻译人员,让其翻译。翻译的时候,你一定要给翻译人员沟通好,让其只翻译value
, 也就是图中=
后面双引号中的内容,格式什么的也不要让他乱改,否则容易出现问题,导致key与value对不上号。 一切沟通妥当后,等翻译把文件给你后,直接将文件中的内容,复制到多语言文件的英语文件中即可;
如何将项目中的中文字符串进行替换
多语言文件已经配置完成,到了这里,那么问题来了,我们只是取出项目中使用的中文字符串,然后将字符串封装成多语言文件,但是对于项目中使用的中文字符串依然还是中文字符串,我们还并没有进行替换处理。当然,这一步我们是不能够忘了,由于是替换项目中所有的使用中文字符串,我们还是谨慎为好,首先将你的项目进行备份、备份、备份,非常重要的事情说三篇,切记一定要备份。备份好后,我们就可以开始替换工作了,没有备份的不要往下看了,赶紧备份去;
假设你已经备份好了,你就可以开始替换工作了,前面我们说过让中文字符串自身作为key
进行替换,之所以让其自身作为key, 是因为这样可以大大减轻替换的困难度,而且还有利于代码的可读性,基本上算是保持原有代码;既然要替换项目中的使用中文字符串,就要用到Xcode 自带的字符串替换功能,首先还需要使用正则表达式(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")\s*
,匹配出项目中使用的中文字符串,然后在对其进行替换处理。
由于我们在iOS 多语言版本的开发(二)中,对取key对应的语言内容,进行了宏的封装, 这里我们可以将匹配到的使用中文字符直接替换成我们定义的宏的使用
#define ASLocalizedString(key) [NSString stringWithFormat:@"%@", [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"ASLocalized"]]
以上是宏的定义,我们需要将字符串进行替换成宏的使用,如:
替换前是这样的_lbl.text = @"我是多语言";
替换后_lbl.text = ASLocalizedString(@"我是多语言")
替换规则如图:
这次选中的是Replace
, 不是Find
。按图中所示,选择完毕后,点击ReplaceAll
, 会出来一个弹框,不用管它直接继续,即可,然后你在看项目中使用到的中文字符串是否已经替换掉了,到这里基本上大功告成了;
遗留问题
1、正则表达式,不懂得可以先照文章里写就行,然后再去学习下,这里有篇基础文章
2、ASLocalizedString(key) , 该宏使用面积广,可以将其定义成公共头文件中,然后用时引用头文件即可,也可将文件封装进pch文件中,这样无需使用头文件接口使用
3、替换后,可能会有些地方报错,command + b 编译下,看看报错的地方,进行相应修改即可。
报错原因:
a. 可能是你定义的常量字符串;
b. 可能是定义的宏;
c. 可能是替换后没有换行;
基本上报的错误很明显,进行修改即可;
4、在迭代版本中,再次使用中文字符串,就需要使用ASLocalizedString(key)
, 来代替了,然后再多语言文件中,进行key=value
配置;
ios-多语言版本开发(三)(转载)的更多相关文章
- iOS-多语言版本开发(二)(转载)
题记 iOS 多语言版本的开发(一) 中我们完成了让应用跟随系统语言进行切换,而用户自己却不能切换的功能,也基本上算是实现了多语言版本:可是,对于某些应用来说,实现跟随系统语言切换的同时, 也想要 ...
- 玩转iOS开发:iOS中的GCD开发(三)
上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- android 多语言版本开发
最近项目中用用到语言切换功能,第一想到的就是资源文件,没错. 在资源文件中新建一个文件夹values-en,en表示英语,有一些还细化到地区,如values-en-rUS 即美国地区的英语,r是必需的 ...
- iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
一:尾随系统切换语言 1>创建好项目project后, 新建一个多语言文件: 2>加入要设置的语言类型: 3>加入成功 细心的朋友可能会发如今English后面写的是3 Files ...
- iOS-多语言版本的开发(一)(转载)
引言 多语言 & 本地化,随你怎么叫,道理差不多:一个App 要想走出国门,只支持一种语言是不能够的,也是不可能的,多元化世界已经融入我们的生活,对于一些应用,开发多语言版本,已经是不可避免 ...
- iOS开发三步搞定百度推送
iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...
- Scala 基础(三):Scala语言快速开发入门
1.Scala执行流程分析 2.Scala程序开发注意事项(重点) Scala源文件以 “.scala" 为扩展名. Scala程序的执行入口是main()函数. Scala语言严格区分大小 ...
- 使用Xamarin实现跨平台移动应用开发(转载)
刚在朋友圈看到张善友,转发的一条分享“使用Xamarin实现跨平台移动应用开发”,写的确实很详细得体,从收费到开源,这段时间xamarin受到不少质疑,如此文http://blog.csdn.net/ ...
随机推荐
- iOS开发-UIImageView的contentMode属性
UIImageView 的contentMode这个属性是用来设置图片的显示方式,如居中.居右,是否缩放等,有以下几个常量可供设定:UIViewContentModeScaleToFillUIView ...
- Android的Fragment中onActivityResult不被调用
1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法. 2.检查Fragment中的startActivityForResult的调用方式. 请确保不要使 ...
- LINUX分辨率修改
上次说过了如何搭建LINUX虚拟机环境,但是完成之后存在很多问题,屏幕分辨太小就是其中之一. 为了让各位能有一个舒心的工作环境,现在就教给大家LINUX系统更改屏幕分辨率的两个办法. 一.鼠标操作 1 ...
- 手机CPU天梯图2018年5月最新版
话不多说,以下是2018年5月最新的手机CPU天梯图精简版,由于最近一两个月,芯片厂商发布的新Soc并不不多,因此这次天梯图更新,主要是来看看今年主流手机厂商都流行使用哪些处理器. 手机CPU天梯图2 ...
- IOS设计模式第十篇之命令行设计模式
命令行设计模式: 命令设计模式将一个请求或行动作封装为对象.这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面.苹果 苹果公司实现这种模式使用Target-Acti ...
- Objective-c官方文档 怎么自定义类
通过类别来给已经存在的类添加方法来实现自定义类 如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情.最简单的方法是用类别. 这个语法有点想类的接口描述但 ...
- 【.netcore学习】.netcore添加到 supervisor 守护进程自启动报错
配置 supervisor [program:HelloWebApp] command=dotnet run directory=/home/python/dotnet/myweb/mywebapi ...
- LeetCode - 637. Average of Levels in Binary Tree
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...
- MFC onpaint() ondraw()
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. OnPaint()是CWnd的类成员,负责响应WM_PAIN ...
- [转]OpenStack Neutron解析
1.为什么还需要linux bridge的部署方式? 2.哪一个网桥起着交换机的作用? 3.neutron如何实现私有网络的隔离 =================================== ...