前言
在App设置-首选语言中,看到了以下设置,于是想了解下建议语言和其他语言的区别,并且我在App内部做了App多语言切换,但是首选语言里面没有切换。但是我看到其他App是有可以切换的,于是就准备调研下他们之间的关系
建议语言和其他语言
建议语言
建议语音其实很简单他不是我们App设置的,而是系统设置-通用-语言与地区里面添加的系统的首选语言
其他语言
其他语言则是除了系统语言与地区之外,App支持的
Projcet - info - Localizations 里面设置的
在之前的文章
[《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 当前实际使用的语言,由以下逻辑决定:
系统会从用户的首选语言列表(设置中的“语言与地区”顺序)中,选择第一个与 App 支持的语言匹配的语言。
如果用户的首选语言都不被 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] |
应用支持的语言,按用户首选语言的优先级重新排序后的列表。 | 强相关,仅包含支持的语言并按序排列。 |
关键说明:
-
用户系统首选语言列表
通过
Locale.preferredLanguages
获取,始终返回用户设置的原始顺序(如["ja-JP", "zh-Hans-CN", "en-US"]
)。格式:包含语言、地区、脚本的完整标识符(如
zh-Hans-CN
)。
-
应用支持的语言列表
- 通过
Bundle.main.localizations
获取,列出所有本地化资源文件支持的语言(如["en", "zh-Hans"]
)。
- 通过
-
应用当前使用的语言
由系统自动选择,规则为:从
Locale.preferredLanguages
中匹配第一个在Bundle.main.localizations
中存在的语言。如果无匹配,则回退到
Info.plist
中的CFBundleDevelopmentRegion
或主语言。
-
应用本地化排序列表
通过
Bundle.main.preferredLocalizations
获取,返回应用支持的语言按用户偏好重新排序的结果。例如:用户首选
["ja", "zh", "en"]
,应用支持["en", "zh"]
,则返回["zh", "en"]
。