iOS 建议语言,首选语言的概念,以及获取当前App支持的语言

前言

在App设置-首选语言中,看到了以下设置,于是想了解下建议语言和其他语言的区别,并且我在App内部做了App多语言切换,但是首选语言里面没有切换。但是我看到其他App是有可以切换的,于是就准备调研下他们之间的关系

17581728524210_.pic.jpg

建议语言和其他语言

建议语言

建议语音其实很简单他不是我们App设置的,而是系统设置-通用-语言与地区里面添加的系统的首选语言


17591728524521_.pic.jpg

其他语言

其他语言则是除了系统语言与地区之外,App支持的

Projcet - info - Localizations 里面设置的

WeChat46b0c648ac1408aaebea8a97fa484be6.jpg

在之前的文章

[《iOS Swift 本地化 Localizable 方案》]
//www.greatytc.com/p/f2af66a3b1a0

写了App内部切换语言的方法,但是这个方法不会切换系统的首选语言。
可能会出现APP内部语言是英文,但是设置-首选语言里面是中文的情况
如果想App内部切换导致设置里面也切换的话 需要这样加入代码

    func setLanguage(_ language: String) {
        UserDefaults.standard.set([language], forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()
        // 重启应用或刷新界面
    }

// 设置为中文
setLanguage("zh-Hans") // 简体中文
// 设置为英文
setLanguage("en")

这样系统的首选语言也会切换

其他参考:
https://juejin.cn/post/6844903716928094215

新总结,无法准确的获得系统的首选语言,只能相对近似的获取到

如果App首选语言使用的默认的,则Locale.preferredLanguages首选语言表是系统语言顺序。
如果App首选语言使用的自己切换的 则Locale.preferredLanguages则不是默认顺序会有改变导致获取不到。

1. Locale.current.languageCode 的作用

  • 它返回的是 App 当前实际使用的语言,由以下逻辑决定:

    1. 系统会从用户的首选语言列表(设置中的“语言与地区”顺序)中,选择第一个与 App 支持的语言匹配的语言。

    2. 如果用户的首选语言都不被 App 支持,则回退到 App 的默认语言(如 Info.plist 中的设置)。

  • 结论Locale.current.languageCode 是经过 App 支持语言过滤后的结果,而非用户系统设置的“原始语言”。


2. 如何获取用户系统设置的原始语言?

要获取用户在 iOS 系统中设置的原始首选语言列表(包括未被 App 支持的语言),需使用以下方法:

Swift 代码示例

// 获取用户的首选语言列表(原始顺序,未经 App 过滤)
let preferredLanguages = Locale.preferredLanguages
print("用户系统首选语言列表:", preferredLanguages)
// 示例输出:["ja-JP", "zh-Hans-CN", "en-US"]

// 提取第一个语言代码(如 "ja")
if let primaryLanguage = preferredLanguages.first {
    let locale = Locale(identifier: primaryLanguage)
    let languageCode = locale.languageCode // "ja"
    print("系统首选语言代码:", languageCode ?? "未知")
}

关键 API

  • Locale.preferredLanguages 返回用户在系统设置中配置的完整语言列表,按优先级排序(例如 ["ja-JP", "zh-Hans-CN", "en-US"])。

    • 格式为语言标识符(包含语言、脚本、地区,如 zh-Hans-CN)。

    • 未经过 App 支持语言过滤,直接反映用户设置。

  • 提取纯语言代码 使用 Locale 解析标识符,获取标准化语言代码(如 zh-Hans-CN"zh"):

let components = Locale.components(fromIdentifier: "zh-Hans-CN")
let languageCode = components[NSLocale.Key.languageCode.rawValue] // "zh"

3. 对比总结

方法 返回结果 是否受 App 支持语言影响
Locale.current.languageCode App 当前使用的语言(如 zh
Locale.preferredLanguages 用户系统设置的原始语言列表(如 ja-JP

4. 实际场景验证

  • 用户设置:日语 (ja-JP) → 中文 (zh-Hans-CN) → 英文 (en-US)

  • App 支持:中文 (zh)、英文 (en)

方法 返回结果
Locale.current.languageCode zh(App 使用中文)
Locale.preferredLanguages ["ja-JP", "zh-Hans-CN", "en-US"]

语言/地区相关变量对比表

变量/方法 代码示例 输出结果示例 类型 含义 与应用程序支持的语言的关系
用户系统首选语言列表 Locale.preferredLanguages ["ja-JP", "zh-Hans-CN", "en-US"] [String] 用户在系统设置中配置的完整语言列表,按优先级排序(包含语言、地区信息)。 无关,直接反映用户设置。
应用支持的语言列表 Bundle.main.localizations ["en", "zh-Hans"] [String] 应用程序实际支持的语言列表(取自本地化资源文件)。 严格依赖,仅包含支持的语言。
应用当前使用的语言 Locale.current.languageCode "zh" String? 应用运行时实际采用的语言,从用户首选列表中匹配第一个支持的语言。 强相关,受应用支持语言过滤影响。
设备地区代码 Locale.current.regionCode "JP" String? 设备设置的地区(影响日期、货币格式等),独立于语言设置。 无关,仅依赖用户手动设置的地区。
用户首选语言(原始) Locale.preferredLanguages.first "ja-JP" String? 用户系统中优先级最高的语言标识符(未过滤)。 无关,直接返回原始设置。
应用本地化排序列表 Bundle.main.preferredLocalizations ["zh-Hans", "en"] [String] 应用支持的语言,按用户首选语言的优先级重新排序后的列表。 强相关,仅包含支持的语言并按序排列。

关键说明:

  1. 用户系统首选语言列表

    • 通过 Locale.preferredLanguages 获取,始终返回用户设置的原始顺序(如 ["ja-JP", "zh-Hans-CN", "en-US"])。

    • 格式:包含语言、地区、脚本的完整标识符(如 zh-Hans-CN)。

  2. 应用支持的语言列表

    • 通过 Bundle.main.localizations 获取,列出所有本地化资源文件支持的语言(如 ["en", "zh-Hans"])。
  3. 应用当前使用的语言

    • 由系统自动选择,规则为:从 Locale.preferredLanguages 中匹配第一个在 Bundle.main.localizations 中存在的语言。

    • 如果无匹配,则回退到 Info.plist 中的 CFBundleDevelopmentRegion 或主语言。

  4. 应用本地化排序列表

    • 通过 Bundle.main.preferredLocalizations 获取,返回应用支持的语言按用户偏好重新排序的结果。

    • 例如:用户首选 ["ja", "zh", "en"],应用支持 ["en", "zh"],则返回 ["zh", "en"]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容