多语言切换
更新时间: 2026/05/19 16:21:51
自 V10.5.0 起,UIKit 支持多语言切换。
语言切换原理
获取语言配置
应用语言在未设置之前默认使用系统语言。设置后,通过 UserDefaults,应用程序可以方便地读取和写入数据,实现数据的本地持久化存储。
如果需要获取用户的地区信息(Locale),会优先从本地持久化数据中获取。若本地没有持久化数据,则会获取系统的默认地区信息。
Swift
swift/// app 内语言环境工具类
public class NEAppLanguageUtil: NSObject {
/// 获取当前语言环境
/// - Returns: 返回语言环境
public static func getCurrentLanguage() -> NEAppLanguage {
if let language = UserDefaults.standard.value(forKey: "IMKitLanguage") as? String,
let languageType = NEAppLanguage(rawValue: language) {
return languageType
}
if let preferredLang = Locale.preferredLanguages.first as? NSString {
switch String(describing: preferredLang) {
case "en-US", "en-CN", "en":
return .english // 英文
case "zh-Hans-US", "zh-Hans-CN", "zh-Hant-CN", "zh-TW", "zh-HK", "zh-Hans":
return .chinese // 中文
default:
return .english
}
}
return .english
}
/// 设置当前语言环境
/// - Parameter language: 当前语言环境
public static func setCurrentLanguage(_ language: NEAppLanguage) {
UserDefaults.standard.set(language.rawValue, forKey: "IMKitLanguage")
UserDefaults.standard.synchronize()
}
}
Objective-C
objective-c/// app 内语言环境工具类
@interface NEAppLanguageUtil : NSObject
/// 获取当前语言环境
+ (NEAppLanguage)getCurrentLanguage;
/// 设置当前语言环境
+ (void)setCurrentLanguage:(NEAppLanguage)language;
@end
@implementation NEAppLanguageUtil
+ (NEAppLanguage)getCurrentLanguage {
NSString *saved = [[NSUserDefaults standardUserDefaults] stringForKey:kIMKitLanguageKey];
if (saved.length > 0) {
return NEAppLanguageFromRawValue(saved);
}
NSString *preferred = [[NSLocale preferredLanguages] firstObject];
if (preferred) {
if ([preferred hasPrefix:@"zh"]) {
return NEAppLanguageChinese;
}
}
return NEAppLanguageEnglish;
}
+ (void)setCurrentLanguage:(NEAppLanguage)language {
[[NSUserDefaults standardUserDefaults] setObject:NEAppLanguageRawValue(language) forKey:kIMKitLanguageKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
语言自主切换
iOS 端通过设置 viewController 的 title 和 控件(如 Button) 的 text 来实现语言的自主切换。
当应用启动时,通过 localizable 方法获取初始语言环境下的文案,localizable 方法会通过 Bundle 获取初始语言 lproj 文件对应的字符,该方法在每次调用时都会根据最新的语言环境返回对应的文案。
Swift
swiftpublic func localizable(_ key: String) -> String {
var stringBundle = bundle
let language = NEAppLanguageUtil.getCurrentLanguage().rawValue
if let path = bundle.path(forResource: language, ofType: "lproj") {
stringBundle = Bundle(path: path) ?? bundle
}
let value = stringBundle.localizedString(forKey: key, value: nil, table: "Localizable")
return value
}
Objective-C
objective-c- (NSString *)localizable:(NSString *)key {
NSString *language = NEAppLanguageRawValue([NEAppLanguageUtil getCurrentLanguage]);
NSBundle *stringBundle = self.bundle;
NSString *path = [self.bundle pathForResource:language ofType:@"lproj"];
if (path) {
NSBundle *lprojBundle = [NSBundle bundleWithPath:path];
if (lprojBundle) {
stringBundle = lprojBundle;
}
}
return [stringBundle localizedStringForKey:key value:nil table:@"Localizable"];
}
语言切换广播
当应用内切换语言后,除了需要持久化到本地外,还需要通过 NotificationCenter 将此事件进行广播。
Swift
swiftNotificationCenter.default.post(
name: NENotificationName.changeLanguage,
object: nil
)
Objective-C
objective-c[[NSNotificationCenter defaultCenter] postNotificationName:NENotificationChangeLanguage object:nil];
各页面监听到语言切换事件后,重新通过 localizable 方法获取当前语言 lproj 文件对应的字符,主动更新 title 或者 text,实现语言切换,以我的-设置页为例:
Swift
swiftNotificationCenter.default.addObserver(self,
selector: #selector(changeLanguage),
name: NENotificationName.changeLanguage,
object: nil
)
Objective-C
objective-c[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(changeLanguage)
name:NENotificationChangeLanguage
object:nil];
实现语言切换流程
-
切换语言时进行持久化设置,并发出通知。
SwiftswiftNEAppLanguageUtil.setCurrentLanguage(lanType) NotificationCenter.default.post( name: NENotificationName.changeLanguage, object: nil )Objective-Cobjective-c[NEAppLanguageUtil setCurrentLanguage:lanType]; [[NSNotificationCenter defaultCenter] postNotificationName:NENotificationChangeLanguage object:nil]; -
在其他页面收通知,通过 localizable 方法重新设置文案,localizable 方法内部会重新获取当前语言环境下的文案,以我的-设置页为例:
SwiftswiftNotificationCenter.default.addObserver(self, selector: #selector(changeLanguage), name: NENotificationName.changeLanguage, object: nil ) @objc func changeLanguage() { viewModel.getData() title = localizable("setting") tableView.tableFooterView = getFooterView() tableView.reloadData() }Objective-Cobjective-c[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:NENotificationChangeLanguage object:nil]; - (void)changeLanguage { [self.viewModel getData]; self.title = NELocalizable(@"setting"); self.tableView.tableFooterView = [self getFooterView]; [self.tableView reloadData]; }
多语言扩展
IM UIKit 还支持添加其他语言资源,如:Japanese 等。
此文档是否对你有帮助?




