如何在iOS15中使用Swift检测翻译功能的On-Device模式是否开启
检测iOS15+系统翻译On-Device模式启用状态的实现方案
核心结论
苹果未在公开的Translate框架中提供直接读取系统全局设备端翻译总开关状态的API,该设置属于系统层级的隐私配置,第三方应用默认无权限直接查询。
间接实现方案
可以通过构造无网络依赖的翻译测试请求,根据请求的返回结果间接判断模式是否开启,实现代码参考如下:
import Translate import UIKit func checkOnDeviceTranslationEnabled(completion: @escaping (Bool) -> Void) { // 适配iOS15及以上版本 guard #available(iOS 15.0, *) else { completion(false) return } // 构造测试用的源、目标语言,可根据需要调整 guard let sourceLanguage = Locale.LanguageCode("en").language, let targetLanguage = Locale.LanguageCode("zh-Hans").language else { completion(false) return } let request = TranslationRequest(sourceLanguage: sourceLanguage, targetLanguage: targetLanguage, text: "test") // 配置仅允许设备端翻译,不允许走网络 let config = TranslationSession.Configuration() config.allowsOnDeviceTranslation = true config.allowsNetworkAccess = false Task { do { let session = TranslationSession(configuration: config) let _ = try await session.translations(for: request).first // 请求成功代表On-Device模式已开启且对应语言离线包已下载 completion(true) } catch { // 请求失败包含两种情况:1. On-Device总开关关闭 2. 对应语言离线包未下载 completion(false) } } }
注意事项
- 调用该方法前需要先获取用户的翻译功能授权,可通过
TranslationSession.requestAuthorization()触发授权申请 - 如果需要区分「总开关关闭」和「离线语言包未下载」两种情况,可先调用
availableLanguages方法查询当前已下载的离线语言列表,排除语言包未下载的场景 - 测试请求的文本尽可能短,避免产生不必要的性能开销

内容的提问来源于stack exchange,提问作者fatenumber25
相关产品推荐
相关产品推荐

