iOS 代码,xib,storyboard全自动国际化

iOS国际化彻底指南

看完这篇文章你能够解决国际化的绝大部分问题,而且本人重写了前人的脚本;能够实现代码,xib,storyboard的自动国际化。自动新增,删除文字,项目中的全部内容,不须要再手动维护,新项目简单国际化,老项目轻松国际化。项目地址前端

我试图用XCodeEditor来实现一个mac应用,让咱们的国际化彻底不用在项目中操做,单个语言文件没问题,可是由于多个国际化语言的文件引用关系始终不能正确设置,因此没有成功,若是有mac开发的大佬或者对project.pbxproj 这个文件工程核心文件结构有了解的同窗;能够联系我一块儿实现这个项目python

若是有不清楚的地方,欢迎联系我补充。git

国际化的基本姿式

一个项目要国际化,首先要在project 的 build settings 中添加须要的语言:github

这里是选择整个项目要支持的语言,点+号选择你须要的就行了。

Xib和stroyboard国际化

若是是新项目,我强烈建议你劲量多的使用 xib 和 stroyboard 来构建项目,由于若是你遇到了要支持阿拉伯地区的语言,他们的习惯是从右到左的,也就是系统的RTL(rignt to left)。整个界面都须要镜像翻转,那时候系统提供的方法只支持xib 和stroyboard 。你若是用的纯代码写死,那么会麻烦不少。后端

xib和SB要国际化,其实很简单;只须要在相应的文件中选择。bash

点击Localization,选择相应的语言,系统就会自动修改项目的实际文件结构:

会出现如下的项目样子:服务器

这里要注意下,系统自动生成的文件中会出现已经在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 目录中去。

个人脚本已经处理了细节问题,再也不须要手动维护。国际化只须要填空就行了。

图片,影视频国际化

这部分国际化很简单:

  1. 代码部分 和在代码的文字部分同样,只要取好key,而后在不一样的语言中写好相应的名字就能够。
  2. xib和SB部分 在项目中专门创建一个文件目录放置图片。而后和xib,sb同样。在右侧文件资源监控器中点Localization,而后在项目实际目录中修改就行了。

图片,视频,音频没有区别。

系统权限国际化---InfoPlist

系统权限部分生成多语言文件部分和其余的没有区别,你只须要在生成的文件中:

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);
    复制代码
    • 请检查你是否有python3环境,mac系统自带python2.7环境;我使用的是python3.7。
    • 不要使用压缩包,直接clone项目,而后取项目中的ZPPScript文件。 太晚了,以后慢慢更新。
相关文章
相关标签/搜索