跳到主要内容

国际化

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

新增语言

如果内置的简体中文、英文不满足应用程序业务需求,您也可以新增语言资源。

  1. 在工程的 PROJECT -> info 创建 Localizations,选择语言,下面以阿拉伯语示例

    (width=250)

  2. 创建一个 Strings 文件,命名必须和 Global IM UIKit 的国际化文件一致,GlobalIMUIKit,点击 Create

    (width=250)

  3. 选中新建的 Strings 文件,点击 Localize,在 Xcode 右侧菜单栏选择阿拉伯语

    (width=250)

  4. 将 Global IM UIKit 的国际化文件中内容复制到新建的Strings 文件中,修改对应的 value 值为阿拉伯语

  5. 切换语言为阿拉伯语(切换方式可参考下方 切换 SDK 内新增的语言),查看显示

切换新增的语言

  1. 在工程的 PROJECT -> info 创建 Localizations,选择语言,下面以阿拉伯语示例

    (width=250)

  2. 创建一个 Strings 文件,命名必须和 Global IM UIKit 的国际化文件一致,GlobalIMUIKit,点击 Create

    (width=250)

  3. 选中新建的 Strings 文件,点击 Localize,在 Xcode 右侧菜单栏选择阿拉伯语

    (width=250)

  4. 将 Global IM UIKit 的国际化文件中内容复制到新建的Strings 文件中,修改对应的 value 值为阿拉伯语

  5. 切换语言为阿拉伯语,查看显示

下面提供一种应用内切换语言的方式供参考:

国际化都会走到 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];