iOS小知识:解决部分英文国际化没有生效的问题(一个语言对应多个字符串资源文件的方案)

2,096 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金

前言

问题:中文可以解析,英文无法解析。后来发现是存储英文的文件内容太长了class/consts/Localizable/en.lproj/Localizable1.strings

自己测试发现一个.strings文件最多支持44426字符,超出部分就无法解析。

原因:由于存储国际化英文字符串的.string文件长度受限,需修改逻辑拆分子文件存储。

解决方案:分开多个文件存储英文key,修改解析key顺序的代码逻辑

在这里插入图片描述 注意事项:倘若字符串资源文件名不是Localizable.strings,如KN.strings,那么你就得使用NSLocalizedStringFromTable()、NSLocalizedStringFromTableInBundle来读取本地化字符串:

更多内容请看这里: iOS APP 内的国际化切换(例子:登录界面切换中英文)

一个语言对应多个字符串资源文件的方案

因此存储英文key的.string文件内容过长,iOS无法解析。 解决方案:分开多个文件存储英文key,修改解析key顺序的代码逻辑 具体方案:分开多个文件存储英文key,修改解析key顺序的代码逻辑。先从Localizable.strings找,如果找不到就从Localizable1.strings找。

在这里插入图片描述

//程序的本地化,引用国际化的文件
#define QCTLocal(x, ...) HZLocalizedString(x, nil)

#define HZLocalizedString(key, comment)               HZLocalizedStringFromTable(key, @"Localizable", nil)
#define HZLocalizedStringFromTable(key, tbl, comment) [[HZLanguageManager defaultManager] stringWithKey:key table:tbl]


//————————————————
//版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

- (NSString*)NSLocalizedStringFromTableInBundleWithKey:(NSString *)key table:(NSString *)table{
    NSString* tmp = key;
    if(_bundle){
        
        tmp =NSLocalizedStringFromTableInBundle(key, table, _bundle, nil);

        if([tmp isEqualToString:key]){
            // 继续从备份表查找
            
            NSLog(@"开始从Localizable1 找key:%@", tmp);
            tmp =NSLocalizedStringFromTableInBundle(key, @"Localizable1", _bundle, nil);
//            NSLog([NSString stringWithFormat:@"结束从Localizable1 找key:%@",tmp]);
            NSLog(@"结束从Localizable1 找key:%@", tmp);


        }
    }
    return tmp;

    
    
    
}

- (NSString *)stringWithKey:(NSString *)key table:(NSString *)table
{
    //假如为跟随系统
    if (self.languageType==HZLanguageTypeSystem) {
        return  NSLocalizedString(key, nil);
    }
    
    //返回对应国际化文字
    if (_bundle) {// 修改成为,从另外一个文件找,先从文件找,如果找不到就从文件二找。
        //NSLocalizedStringFromTableInBundleWithKey
        return [self NSLocalizedStringFromTableInBundleWithKey:key table:table];
        return  NSLocalizedStringFromTableInBundle(key, table, _bundle, nil);
        
        
        
    }
    
    return NSLocalizedStringFromTable(key, table, nil);
}




see also

iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)

更多资讯和服务请关注#小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域。