写在前面
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对应的语言内容,进行了宏的封装, 这里我们可以将匹配到的使用中文字符直接替换成我们定义的宏的使用
#defineASLocalizedString(key)[NSStringstringWithFormat:@"%@",[[NSBundlebundleWithPath:[[NSBundlemainBundle]pathForResource:[NSStringstringWithFormat:@"%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"appLanguage"]]ofType:@"lproj"]]localizedStringForKey:(key)value:niltable:@"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配置;