国际化
Global IM UIKit 内置了简体中文与英文语言包,并支持国际化。
切换 SDK 支持的语言
Global IM UIKit 默认支持中文、英文两种语言,且跟随系统语言切换,需要应用内切换语言,可以使用下面接口切换 Global IM UIKit 的语言:
[RCIMKitConfig shared].languageCode = @"zh_CN";
注意 语言缩写内容格式为 (ISO-639 Language Code)_(ISO-3166 Country Codes),如:zh_CN。目前支持的内置语言为 zh_CN、en
新增语言
如果内置的简体中文、英文不满足应用程序业务需求,您也可以新增语言资源。
-
在工程的 PROJECT -> info 创建 Localizations,选择语言,下面以阿拉伯语示例
-
创建一个 Strings 文件,命名必须和 Global IM UIKit 的国际化文件一致,GlobalIMUIKit,点击 Create
-
选中新建的 Strings 文件,点击 Localize,在 Xcode 右侧菜单栏选择阿拉伯语
-
将 Global IM UIKit 的国际化文件中内容复制到新建的Strings 文件中,修改对应的 value 值为阿拉伯语
-
切换语言为阿拉伯语(切换方式可参考下方
切换 SDK 内新增的语言
),查看显示
切换新增的语言
-
在工程的 PROJECT -> info 创建 Localizations,选择语言,下面以阿拉伯语示例
-
创建一个 Strings 文件,命名必须和 Global IM UIKit 的国际化文件一致,GlobalIMUIKit,点击 Create
-
选中新建的 Strings 文件,点击 Localize,在 Xcode 右侧菜单栏选择阿拉伯语
-
将 Global IM UIKit 的国际化文件中内容复制到新建的Strings 文件中,修改对应的 value 值为阿拉伯语
-
切换语言为阿拉伯语,查看显示
下面提供一种应用内切换语言的方式供参考:
国际化都会走到 NSBundle 的- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName 方法,使用自定义 Bundle 替换 NSBundle,来实现 APP 内部切换语言。
增加应用内语言管理类
@interface LocalizedManager : NSObject
+ (instancetype)sharedInstance;
//当前语言
- (NSString *)currentLanguage;
//设置要转换的语言
- (void)setLanguage:(NSString *)language;
//设置为系统语言
- (void)systemLanguage;
@end
@implementation LocalizedManager
+ (instancetype)sharedInstance {
static LocalizedManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[LocalizedManager alloc] init];
});
return instance;
}
- (NSString *)currentLanguage {
NSString *language=[[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
return language;
}
- (void)setLanguage:(NSString *)language {
[[NSUserDefaults standardUserDefaults] setObject:language forKey:AppLanguage];
}
- (void)systemLanguage {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:AppLanguage];
}
@end
自定义 CustomBundle 继承 NSBundle
重写mainBundle方法,通过语言管理类获取当前应该加载哪一种语言。
#import "CustomBundle.h"
#import "LocalizedManager.h"
#import <Foundation/Foundation.h>
@interface CustomBundle : NSBundle
@end
@implementation CustomBundle
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
if ([CustomBundle custom_mainBundle]) {
return [[CustomBundle custom_mainBundle] localizedStringForKey:key value:value table:tableName];
} else {
return [super localizedStringForKey:key value:value table:tableName];
}
}
+ (NSBundle *)custom_mainBundle {
if ([LocalizedManager sharedInstance].currentLanguage.length) {
NSString *path = [[NSBundle mainBundle] pathForResource:[LocalizedManager sharedInstance].currentLanguage ofType:@"lproj"];
if (path.length) {
return [NSBundle bundleWithPath:path];
}
}
return nil;
}
@end
拦截国际化方法
通过分类和runtime来实现拦截,将 NSBundle 替换为自定义 CustomBundle。
#import "NSBundle+RC.h"
#import "RCDLanguageManager.h"
#import <objc/runtime.h>
#import "CustomBundle.h"
#import "LocalizedManager.h"
@interface NSBundle (Custom)
@end
@implementation NSBundle (Custom)
+ (NSString *)currentLanguage {
return [LocalizedManager sharedInstance].currentLanguage ?: [NSLocale preferredLanguages].firstObject;
}
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
object_setClass([NSBundle mainBundle], [CustomBundle class]);
});
}
@end
调用示例
切换为英文
[[LocalizedManager sharedInstance] setLanguage:@"en"];
跟随系统语言
[[LocalizedManager sharedInstance] systemLanguage];