iOS 需求 多语言(国际化)App开发 源码
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
前言
某些公司希望App支持的多语言文件弄到线上去,通过下载多语言文件的方式或者通过接口请求json数据回来,进行多语言显示的方式,解决多语言的问题. 经过自己在网上查阅过很多资料跟我自己想的都是一致的,无论是下载文件读取,还是请求接口,都是返回json的形式,然后我去github搜索相关的SDK,也是使用json的方式来实现多语言数据的使用.
不能解决的问题
另外.其实多语言弄到线上去,最大的一个帮助就是,更新内容的时候,直接可以热更新,不需要重新提交审核,其实并不能完全很好的解决全部问题,
1.主要是app有新的页面(功能)开发,就需要有新增的字段,也是需要重新提交审核.(只能解决原有的字段内容更新)
2.如果从线上下载多语言的字段,为了防止下载失败,通常都会在项目放入一份多语言的json文件进行备份.而且要跟线上的保持一致.如果是这样的话,线上的那份就多此一举了.本地本身有一份跟线上的一模一样,就没有必要从网上拿,如果本地不备份存在安全隐患,万一接口访问失败,整个app有很大的影响
能解决的问题
1.如果字段的内容是由不同不部门或者受到区域限制的问题,可能放到线上,其他人修改比较方便
2.如果发现内容有问题,需要及时更改及时使用,需要等待审核这段时间.
多语言代码逻辑图
github上有一个DialectSDK,是用于多语言的开发,通过下载json文件,进行保存,可以加载本地的多语言文件保存到缓存中使用.从github下载是有问题的,上面源码的链接是已经修改好的
该第三方的思路是对的,符合公司的需求,但是该第三方下载下来,语法编译不通过,修改之后才能够进行使用,多语言文件的使用逻辑有问题,需求进行修改才能正常使用,我对该SDK已经修改好了
使用
从缓存中加载数据
Dialect 每次启动通过load方法读取
判断某个语言是否有数据
[Dialect localizationDictionaryForTable:@"en"]
加载本地文件并保存
NSData *enData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"json"]];
NSDictionary *enJson = [NSJSONSerialization JSONObjectWithData:enData options:NSJSONReadingMutableContainers error:nil];
[Dialect setMainLocalizationDictionary:enJson table:@"en" update:NO storeOnDisk:YES];
读取字段数据
[Dialect stringFor:@"message" table:@"zh"];
更新数据并保存
NSData *enData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"updateEn" ofType:@"json"]];
NSDictionary *enJson = [NSJSONSerialization JSONObjectWithData:enData options:NSJSONReadingMutableContainers error:nil];
[Dialect setMainLocalizationDictionary:enJson table:@"en" update:YES storeOnDisk:YES];