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

Locale.Language区域区分问题:无法区分两岸中文的技术咨询

解决Locale.Language区域级区分问题

你的核心问题在于仅对比languageCode,而中文(中国大陆,zh-Hans-CN)和中文(台湾,zh-Hant-TW)共享同一个languageCode(zh),自然无法区分。要实现区域级的语言切换,需要匹配完整的语言标识信息,以下是两种可靠方案:

方案1:使用标准标识符直接匹配

直接对比Locale.Language的identifier属性——这是符合BCP 47标准的完整语言标识,包含语言、脚本、区域的核心信息,能精准区分不同区域的同语种语言:

if let index = currentLanguages.firstIndex(where: { $0.identifier == language.identifier }) {            
    currentLanguages.remove(at: index)         
} else {
    currentLanguages.append(language)
}

方案2:分属性精准校验

如果需要更细粒度的控制,可以分别对比languageCode、script和region三个属性,确保三者完全匹配才判定为同一语言项:

if let index = currentLanguages.firstIndex(where: { target in
    target.languageCode == language.languageCode &&
    target.script == language.script &&
    target.region == language.region
}) {            
    currentLanguages.remove(at: index)         
} else {
    currentLanguages.append(language)
}

补充说明

你提到使用maximalIdentifier对比失效,大概率是因为该属性会包含额外的扩展信息(如语言变体),而你的语言实例可能未携带这些扩展内容,导致匹配失败。相比之下,identifier属性仅保留核心标识信息,更适合这类场景。

同时要确保你获取的Locale.Language实例包含完整的区域和脚本信息,比如通过完整标识符创建:

let chineseCN = Locale.Language(identifier: "zh-Hans-CN")
let chineseTW = Locale.Language(identifier: "zh-Hant-TW")

内容的提问来源于stack exchange,提问作者StelzenPieper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:02