iOS本地化App:如何获取设备语言(而非应用语言)
获取iOS设备原生语言(不受App语言设置影响)
你的场景里,Locale.preferredLanguages和Locale.current返回的是App自身的语言配置(当前是德文),要获取设备系统层面的语言(英文),可以用以下两种方法:
iOS 16.0+ 推荐方案
苹果在iOS 16新增了Locale.system属性,直接返回系统级的区域设置,完全不受App语言配置影响:
let systemLocale = Locale.system // 获取语言码(如"en") let deviceLangCode = systemLocale.language.languageCode?.identifier ?? "unknown" // 获取完整语言标识(如"en-US") let deviceFullLang = systemLocale.language.identifier
兼容iOS 15及更早版本
对于低版本系统,需要读取系统级的UserDefaults域来获取设备语言偏好:
if let systemLangList = UserDefaults(suiteName: "com.apple.LanguageSettings")?.array(forKey: "AppleLanguages") as? [String] { let primaryDeviceLang = systemLangList.first ?? "unknown" // 提取纯语言码(去掉地区后缀) let langCode = primaryDeviceLang.components(separatedBy: "-").first ?? primaryDeviceLang }
修改后的示例代码
把你的ContentView改成这样,就能直观对比App语言和设备语言:
struct ContentView: View { private var devicePrimaryLanguage: String { if #available(iOS 16.0, *) { return Locale.system.language.identifier } else { guard let systemLangList = UserDefaults(suiteName: "com.apple.LanguageSettings")?.array(forKey: "AppleLanguages") as? [String] else { return "unknown" } return systemLangList.first ?? "unknown" } } var body: some View { Form { Text("Hello, world") Text("App语言(Locale.preferredLanguages):\n\(Locale.preferredLanguages.joined(separator: ", "))") Text("App当前Locale:\n\(Locale.current.language.languageCode?.identifier ?? "")") Text("设备原生语言:\n\(devicePrimaryLanguage)") } } }
关键说明
Locale.preferredLanguages/Locale.current:绑定App的本地化配置,随App语言设置变化;- 上述方法获取的是系统设备层面的语言偏好,完全独立于App的语言设置,满足你推进本地化流程的需求。
内容的提问来源于stack exchange,提问作者finebel
相关产品推荐
相关产品推荐

