iOS应用内多语言切换

效果如下图:

本文主要是使用StoryBoard以及代码的形式实现App内多语言的切换

具体步骤此处不多贴

Demo下载请点击下面链接

Demo下载

效果如图

笔者在做此Demo的过程中遇到如下问题:

1、在更换语言后,TabBar及一些其它View并未及时变更成新选择的语言显示
由于并没有找到其它较好的方法,此处暂时使用延时加载来解决【哪位仁兄知道更好的解决办法,麻烦告知一下,谢谢】

2、解决了即使更新语言的问题,由于我是使用rootView来重新加载,使用延时会有黑屏一闪而过
由于并没有找到其它较好的方法,此处使用中间Controller来解决【哪位仁兄知道更好的解决办法,麻烦告知一下,谢谢】

注意:

在多语言的App内,使用的显示字符串需要用 NSLocalizedString
NSLocalizedString(@”显示字符串”, nil);

使用StoryBoard的时候,笔者是先去将所有布局弄好,在去设置多个语言,因为此处会自动生成相应的语言文件以及内部的key

具体代码实现【此处要是看Demo,就可以省略了】

切换语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void)changeLanguageTo:(NSString *)language {
//中文【简】
//language = @"zh-Hans";
//英文
//language = @"en";
// 设置语言
[NSBundle performSelector:@selector(setLanguage:) withObject:language afterDelay:0];
// 然后将设置好的语言存储好,下次进来直接加载
[[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];
[[NSUserDefaults standardUserDefaults] synchronize];
// 重新加载,使用用户选择的语言,如果不添加延迟,像tabbar等个别view会加载不到用户选择的语言
AppDelegate *appDele = (AppDelegate*)[UIApplication sharedApplication].delegate;
[appDele refreshRootViewCtrl];
}

这个Category是从网上找的,由于时间较长,未能找到具体出处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import "NSBundle+IRLanguage.h"
#import <objc/runtime.h>
static const char _bundle = 0;
@interface BundleEx : NSBundle
@end
@implementation BundleEx
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);
return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end
@implementation NSBundle (Language)
+ (void)setLanguage:(NSString *)language {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
object_setClass([NSBundle mainBundle], [BundleEx class]);
});
objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end