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
相关产品推荐
相关产品推荐

