小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
前言
问题:中文可以解析,英文无法解析。后来发现是存储英文的文件内容太长了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逆向
,只为你呈现有价值的信息,专注于移动端技术研究领域。