在macOS/AppKit中如何为VoiceOver指定界面元素的内容语言
macOS AppKit 下指定无障碍朗读语言的可行方案
方案1:单语言内容控件直接设置视图级属性
macOS 10.10 及以上版本中,所有NSView子类都遵守NSAccessibility协议,原生支持和iOS端逻辑一致的accessibilityLanguage属性,不需要通过富文本属性绕路实现。
直接对目标NSTextField设置对应语言的ISO 639-1编码(建议附带区域编码匹配系统语音包)即可:
// Swift 示例 // 指定控件内容为法语,VoiceOver会自动调用法语语音引擎朗读 wordTextField.accessibilityLanguage = "fr-FR"
// Objective-C 示例 self.wordTextField.accessibilityLanguage = @"ja-JP"; // 指定为日语
注意:设置前请确认系统已下载对应语言的语音包,路径为「系统设置 > 辅助功能 > 语音 > 系统语音 > 自定义」
方案2:多语言混合富文本内容的处理
如果单个控件内同时存在多种语言的文本,再使用富文本的accessibilityLanguage属性,该属性需要绑定到对应文本的范围才能生效,直接设置到整个富文本对象不会触发效果:
let mixedText = NSMutableAttributedString(string: "你好 Bonjour") // 给中文片段指定中文语音 mixedText.addAttribute( .accessibilityLanguage, value: "zh-CN", range: NSRange(location: 0, length: 2) ) // 给法语片段指定法语音 mixedText.addAttribute( .accessibilityLanguage, value: "fr-FR", range: NSRange(location: 2, length: 7) ) textField.attributedStringValue = mixedText
调试排查流程
如果设置后未生效,按以下步骤排查:
- 确认系统版本高于等于10.10,低版本系统无对应原生属性
- 打开Accessibility Inspector,选中目标控件后在「Advanced」标签页查看
Accessibility Language字段,确认属性值已正确写入 - 重启VoiceOver(按Option+Command+F5关闭后重新打开),清除语音缓存后再测试
内容的提问来源于stack exchange,提问作者codingFriend1
相关产品推荐
相关产品推荐

