通过 Method swizzing解决项目模块化后语言国际化的问题

来源:互联网 发布:c语言输出99乘法表 编辑:程序博客网 时间:2024/06/09 14:10

上篇文章中提到我们目前的工程用pod进行了模块化管理,当项目被拆分之后,资源文件、语言文件当然也要被拆分。

因为一开始以为和图片资源一样,不用特殊处理,最终会合并为一个car文件。拆分的时候就直接在每个模块下面建立一个语言文件,命名为:Localizable.strings。拆好一个模块之后,run起来发现大量的翻译丢失了,仔细检查之后发现,工程中的string文件并没有像想象中的那样合并起来,而是只打包了一份string文件进来,那这个问题就尴尬了,因为之前都是用的

NSLocalizedString(@"login_fail",@"登录失败"); 

这样的方式来进行翻译的,没有指定string的文件名,如果要改数量就比较巨大了。是时候祭出 Method swizzing,解决这一难题了。

首先第一步:检查NSLocalizedString这个宏定义对应的方法

[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
在哪些地方使用,交换之后会不会影响第三方库的语言问题。检查后发现项目中所使用的第三方库都是用bundle打包了自己的资源文件,不会用这个方法进行加载语言文件。 Method swizzing 是可以放心的用了。

第二步,将刚刚拆出来的文件重新命名,重新编译之后,解压发现.app中确实有了两个string文件。这一步也成功了

第三步,进行方法交换。上代码:

#import "NSBundle+ZATool.h"#import <objc/runtime.h>@implementation NSBundle (ZATool)+(void)load{      //需要交换的系统方法,类方法和对象方法使用的方法不同    Method  fromMethod = class_getInstanceMethod([self class], @selector(localizedStringForKey:value:table:));    //需要交换的自己写的方法    Method  toMethod = class_getInstanceMethod([self class], @selector(ZALocalizedStringForKey:value:table:));    //方法交换    method_exchangeImplementations(fromMethod, toMethod);}#pragma mark - 多语言方法实现-(NSString *)ZALocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName{    //语言文件数组    NSArray *array=@[@"CommonLocalizable",@"Localizable"];        if (!tableName || [array containsObject:tableName]) {        if (!tableName) {            tableName=@"CommonLocalizable";        }        //注意:方法交换是相互交换的,这里相当于是调的系统的翻译方法        NSString *string= [self ZALocalizedStringForKey:key value:value table:tableName];        if ([string isEqualToString:key]) {            //当取不到翻译字符串的时候,递归调用从下一个翻译文件中查找            NSInteger tag=[array indexOfObject:tableName];                        if (tag!=array.count-1) {                 tableName=array[tag+1];                //注意:方法交换是相互交换的,这里相当于是调的我们自己的翻译方法                string= [self localizedStringForKey:key value:value table:tableName];            }        }else{        }                return string;        }else    {        return  [self ZALocalizedStringForKey:key value:value table:tableName];    }  }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美团签约成功后怎么办 拍婚纱照笑不出来怎么办 长得丑拍婚纱照怎么办 失恋了怎么办才能最快走出来 眼镜大了往下掉怎么办 眼镜带着往下掉怎么办 眼镜腿松了怎么办妙招 眼镜框大了总掉怎么办 吃不下饭恶心想吐怎么办 买到苹果翻新机怎么办 欠装修款不给怎么办 老板欠工资跑了怎么办 挖机老板欠工资怎么办 欠工程款耍赖不给怎么办 辞工后不给工资怎么办 工伤仲裁后不给怎么办 离职后不给工资怎么办 离职了不发工资怎么办 饭店欠工资不给怎么办 单位欠工资不给怎么办 离职后工资不发怎么办 暑假工不给工资怎么办 暑假工工资不发怎么办 个人欠钱2万不还怎么办 快递发错地址了怎么办 香烟被快递扣了怎么办 买st股票退市了怎么办 av淘宝看不了了,怎么办 厨房通水道堵了怎么办 皮鞋大了不跟脚怎么办 敞口皮鞋穿大了怎么办 穿皮鞋老掉跟怎么办 皮鞋鞋垫不粘了怎么办 上海拍好车牌后怎么办 补好的牙齿碎了怎么办 狗死了埋浅了怎么办 公租房租满5年后怎么办 买的股票停盘了怎么办 央企重组后员工怎么办 a2奶粉喝了便秘怎么办 智能电表卡丢了怎么办