看完这篇文章你能够解决国际化的绝大部分问题,而且本人重写了前人的脚本;能够实现代码,xib,storyboard的自动国际化。自动新增,删除文字,项目中的全部内容,不须要再手动维护,新项目简单国际化,老项目轻松国际化。项目地址前端
我试图用XCodeEditor来实现一个mac应用,让咱们的国际化彻底不用在项目中操做,单个语言文件没问题,可是由于多个国际化语言的文件引用关系始终不能正确设置,因此没有成功,若是有mac开发的大佬或者对project.pbxproj 这个文件工程核心文件结构有了解的同窗;能够联系我一块儿实现这个项目python
若是有不清楚的地方,欢迎联系我补充。git
一个项目要国际化,首先要在project 的 build settings 中添加须要的语言:github
若是是新项目,我强烈建议你劲量多的使用 xib 和 stroyboard 来构建项目,由于若是你遇到了要支持阿拉伯地区的语言,他们的习惯是从右到左的,也就是系统的RTL(rignt to left)。整个界面都须要镜像翻转,那时候系统提供的方法只支持xib 和stroyboard 。你若是用的纯代码写死,那么会麻烦不少。后端
xib和SB要国际化,其实很简单;只须要在相应的文件中选择。bash
会出现如下的项目样子:服务器
这里要注意下,系统自动生成的文件中会出现已经在xib或者SB 中使用的字符;可是只会生成在你点击Localization那一个时刻已经有了的字符,若是你持续开发。又添加删除了控件,那么不会自动生成。只有取消该部分国际化,而后再把这种语言打钩,选择上以后才会生成新的文件,而且会覆盖掉你以前已经写好的国际化文件。本脚本已经解决这个问题,再也不须要手动维护。解决原理是:微信
ibtool --generate-stringsfile MyNib.strings MyNib.nib
复制代码
ibtool这个小工具,系统自带。能够自动把xib或者sb 生成一个.stings文件。python2.7
代码部分的国际化,只有一个办法就是使用系统的国际化宏:工具
NSLocalizedString("这里是须要国际化的字符",comment: "这里是注释")
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
...
/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1);
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
复制代码
NSLocalizedStringFromTable(key, tbl, comment) 这种方式比较少用,由于这个tbl就是tbl.strings的名字,在代码部分使用了宏以后。你还须要生成资源文件.strings:
你生成这个文件的时候,输入的文件名若是是 Localizable 那么你就使用第一个宏,若是你输入了别的名字,那么你就应该使用 NSLocalizedStringFromTable(key, tbl, comment)。其中的tbl就是你输入的文件名称。 提示:你能够在每个.m文件须要国际化的字符里这样写:
button.titleLabel.text = NSLocalizedString(@"可能性测试", “xxxxx.m”);
复制代码
以后在生成的国际化语言中,你会发现这个国际化的注释会生成。当须要翻译的文字太多时,方便查找是哪一个页面的字符。
这里有一个小技巧,无论你是新老项目;你均可以使用正则匹配来查找项目中全部没有国际化的字符:
@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
NSLocalizedString($0, nil)
复制代码
这样就能够快速查找项目中使用了@“中文”这样格式的字符,替换为系统的宏。一键替换所有,而后使用个人脚本就能够全自动管理代码部分的国际化字符。
个人python脚本只支持第一种方式的宏,只要你实现了这个宏。那么个人脚本就支持全自动导入,自动添加,删除。建议在comment部分写上文件名,若是你有了上千个须要翻译的文字,那么文件很大的时候。方便你定位具体的字符。 个人实现原理是借助了:
genstrings -o .m en.lproj
复制代码
genstrings 系统自带,能够把一个文件使用了宏的字符,生成对应的文件到 en.lproj 目录中去。
个人脚本已经处理了细节问题,再也不须要手动维护。国际化只须要填空就行了。
这部分国际化很简单:
图片,视频,音频没有区别。
系统权限部分生成多语言文件部分和其余的没有区别,你只须要在生成的文件中:
NSLocationAlwaysAndWhenInUseUsageDescription = “使用定位的描述”
复制代码
查找对应的权限名称,只须要选择showRaw就会出现:
好比进入调取相册页面,通信录页面,还有复制粘贴的系统提示等,这部分是跟着 CFBundleDevelopmentRegion 这个权限,系统开发语言走的。这个是系统默认语言。当什么都没有的时候,它就会是英文。若是你修改了。系统资源页面会根据你的修改生效。这里颇有意思,有两种选择方式:一种是选择国家,一种是选择具体的语言范围。这是两个概念!!若是你要修改默认开发语言,选择国际。若是你要修改系统资源页面,你要选择语言范围。好比:zh_CN
这部分没有什么特别的好办法,纯粹是两端协商实现。通常就两种:
1.后端彻底实现相应的语言提示返回给前端。 2.后端无论语言,返回一套本身规定的提示语言编号集合。前端根据这个编号提示相应的内容。
其实在iOS中国际化,就是切换不一样的语言资源,显示不一样的文件信息。而后系统用了一个Localizable的系统宏,来维护key/value的关系。系统中每一种语言对应一种bundle资源文件。当你在切换不一样语言的时候,就去找对应的语言包中的资源。因此咱们能够利用runtime动态加载不一样的bundle来实现语言的切换。在demo中有具体的使用例子。
这个部分通常只有两种实现方式:
1.微信的方式:切换bundle。
2.微博的方式:发送语言切换通知。
这部分讨论的文章已经很是多,而且很成熟了;我就不过多赘述。
1.阿拉伯地区支持RTL 通过实践,xib,sb系统提供了很好的方法。只须要用masony来修改代码部分写死的布局,就行了。
2.textView系统不支持 给textview写一个分类,不难。
3.AttributedString富文本国际化 这一部分有一点定制化的味道,仍是只有本身写分类。
若是没有生效?
button.titleLabel.text = NSLocalizedString(@"可能性测试", nil);
复制代码