写在前面
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/ ...
随机推荐
-
Gym 100646 F Tanks a Lot RMQ
Problem F: Tanks a Lot Imagine you have a car with a very large gas tank - large enough to hold what ...
-
USB Keyboard Recorder
catalogue . 引言 . Device Class Definition for Human Interface Devices (HID) . USB HID Report Descript ...
-
为什么乱码:<;meta http-equiv=";content-type";>;前的非ANSI字符
为什么乱码:<meta http-equiv="content-type">前的非ANSI字符 浏览器检测网页字符集的默认顺序 浏览器的网页字符集检测顺序通常是: ch ...
-
类(class)能不能自己继承自己(转)
类(class)能不能自己继承自己不行,继承关系会出现环. 假设类A继承类A.那么要新建一个类A的对象,就必须先建立一个类A父类的对象.这是一个递归的过程,而且没有终止条件.会死循环的. 从编译的角度 ...
-
使用javaconfig配置freemarker
package com.yy.config; import org.springframework.context.annotation.Bean; import org.springframewor ...
-
odp.net连接方式,部署问题总结
一. 摘要 在C#开发的过程中,经常需要操作Oracle数据库,而实际在部署程序的时候,经常要根据系统环境(32.64bit).不安装Oracle客户端等等需求,而Odp.net 也没有完美兼容的 ...
-
Git branch 分支与合并分支
Git branch 分支 查看当前有哪些branch bixiaopeng@bixiaopengtekiMacBook-Pro xmrobotium$ git branch * master 新建一 ...
-
GBDT 将子树结果当成lr输出
http://scikit-learn.org/stable/auto_examples/ensemble/plot_feature_transformation.html#example-ensem ...
-
Kubernetes学习之路(十一)之Pod状态和生命周期管理
一.什么是Pod? Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP ...
-
Struts2框架基础概念总结
一.struts2框架 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的 ...