iOS app内语言的切换
2018-04-22 本文已影响1109人
水煮杰尼龟
继上一篇文字,这次写一下app内切换语言。上一篇传送门iOS语言国际化
上周一个星期都不在状态,原来是感冒了,眼睛也不舒服,还上火,我丢· 我是干了什么啊· 心累。。。。。
回归正题
我的实现是这样的。
废话不多说,先上代码。(不对 先上图)
假装模仿一下支付宝切换语言
+ (void)initUserLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:UserLanguage];
if(string.length == 0)
{
//获取系统当前语言版本(中文zh-Hans,英文en)
NSArray *languages = [NSLocale preferredLanguages];
NSString *current = [languages objectAtIndex:0];
string = [self languageFormat:current];
//个人需求 目前就两种语言
if (![string isEqualToString:@"zh-Hans"]&&![string isEqualToString:@"en"]) {
string=@"en";
}
[def setValue:current forKey:UserLanguage];
[def synchronize];
}
//获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:string] ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundle
}
///语言和语言对应的.lproj的文件夹前缀不一致时在这里做处理
+ (NSString *)languageFormat:(NSString*)language {
if([language rangeOfString:@"zh-Hans"].location != NSNotFound)
{
return @"zh-Hans";
}
else if([language rangeOfString:@"zh-Hant"].location != NSNotFound)
{
return @"zh-Hant";
}
else
{
//字符串查找
if([language rangeOfString:@"-"].location != NSNotFound) {
//除了中文以外的其他语言统一处理@"ru_RU" @"ko_KR"取前面一部分
NSArray *ary = [language componentsSeparatedByString:@"-"];
if (ary.count > 1) {
NSString *str = ary[0];
return str;
}
}
}
return language;
}
首先初始化你的语言,存储到偏好设置。取不到对应的key 就用系统的语言。这边对获取到的语言做了一点小处理。
你可以在AppDelegate里初始化一下。
+ (NSString *)getStringByKey:(NSString *)key
{
if (![[LocalizationManager bundle] localizedStringForKey:key value:@"" table:nil]) {
return [[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil];
}
return [[LocalizationManager bundle] localizedStringForKey:key value:@"" table:nil];
}
需要语言国际化的字符串用这个方法来取值。
最后就是改变语言了。
+ (void)setUserlanguage:(NSString *)language{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//1.第一步改变bundle的值
NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:language] ofType:@"lproj" ];
bundle = [NSBundle bundleWithPath:path];
//2.持久化
[def setValue:language forKey:UserLanguage];
[def synchronize];
//重置app
[self resetRootViewController];
}
重置app就看个人需求了·做了一个小 Demo,假装模仿一下支付宝设置多语言。可以简单参考参考,很简单的啦。