前言
问题:中文可以解析,英文无法解析。后来发现是存储英文的文件内容太长了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] - (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); }