如何使用新版String Catalogs系统动态获取并切换应用语言?
如何使用新版String Catalogs系统动态获取并切换应用语言?
嘿,我之前也折腾过这个问题,正好可以分享下用String Catalogs动态处理应用语言的实用方法!
一、获取当前应用语言/区域设置
分两种情况来看:
- 未自定义应用内语言时:直接通过系统Locale就能拿到当前生效的语言信息
- 获取语言代码(如
zh、en):Locale.current.language.languageCode?.identifier - 获取完整区域标识(如
zh-Hans-CN、en-US):Locale.current.identifier
- 获取语言代码(如
- 已自定义应用内语言切换时:从你存储用户选择的地方(比如UserDefaults)读取,再转成Locale对象,示例代码:
if let savedLangCode = UserDefaults.standard.string(forKey: "AppLanguage") { let currentAppLocale = Locale(identifier: savedLangCode) // 这里就拿到了应用当前使用的自定义locale }
二、动态切换应用语言
String Catalogs是基于当前Locale环境来匹配字符串的,所以核心是修改Locale并让视图刷新,下面分SwiftUI和UIKit两种场景说:
SwiftUI项目
- 先把用户选择的语言存储到UserDefaults(系统默认识别
AppleLanguages这个键,存语言代码数组,第一个元素是优先语言):func switchLanguage(to langCode: String) { UserDefaults.standard.set([langCode], forKey: "AppleLanguages") UserDefaults.standard.synchronize() // 更新应用的Locale环境 appLocale = Locale(identifier: langCode) } - 在根App结构中维护自定义Locale,并注入到环境中,这样所有子视图都会自动使用这个Locale匹配String Catalogs的字符串:
@main struct MyApp: App { @State private var appLocale: Locale = .current var body: some Scene { WindowGroup { ContentView() .environment(\.locale, appLocale) .onAppear { // 启动时读取保存的语言 if let savedLang = UserDefaults.standard.stringArray(forKey: "AppleLanguages")?.first { appLocale = Locale(identifier: savedLang) } } } } }
当调用switchLanguage方法后,appLocale更新,所有依赖Environment(\.locale)的视图会自动刷新,String Catalogs的对应语言字符串就会生效。
UIKit项目
- 同样先存储选择的语言到UserDefaults:
func switchToLanguage(_ langCode: String) { UserDefaults.standard.set([langCode], forKey: "AppleLanguages") UserDefaults.standard.synchronize() // 重启根视图控制器,让新Locale生效 reloadRootViewController() } - 刷新根视图控制器,让整个界面用新的Locale重新渲染:
private func reloadRootViewController() { guard let window = UIApplication.shared.windows.first else { return } // 这里根据你的项目实际情况初始化根VC,比如从Storyboard或者代码创建 let rootVC = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()! window.rootViewController = rootVC window.makeKeyAndVisible() }
几个需要注意的点
- 确保你的String Catalogs已经添加了对应语言的翻译条目,不然切换后会 fallback 到默认语言的字符串
- 切换语言后必须刷新视图,因为之前的视图已经用旧Locale渲染完成,不刷新的话不会显示新语言内容
- 如果你在代码里直接用
"key".localized,它会自动使用当前生效的Locale,不需要额外处理
备注:内容来源于stack exchange,提问作者Yali Hart
相关产品推荐
相关产品推荐

