You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用新版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项目

  1. 先把用户选择的语言存储到UserDefaults(系统默认识别AppleLanguages这个键,存语言代码数组,第一个元素是优先语言):
    func switchLanguage(to langCode: String) {
        UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()
        // 更新应用的Locale环境
        appLocale = Locale(identifier: langCode)
    }
    
  2. 在根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项目

  1. 同样先存储选择的语言到UserDefaults:
    func switchToLanguage(_ langCode: String) {
        UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()
        // 重启根视图控制器,让新Locale生效
        reloadRootViewController()
    }
    
  2. 刷新根视图控制器,让整个界面用新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:59:54