SwiftUI — translationTask

在 iOS 开发中,translationTask 是 iOS 18 及更高版本引入的 SwiftUI 修饰符,允许开发者在应用内直接集成翻译功能,无需依赖系统弹窗。以下是其使用方法的详细介绍:

1. 环境要求与基础配置 #

  • 系统版本:需运行 iOS 18 及以上系统。
  • 模块导入:在 SwiftUI 文件中导入 Translation 模块:
    import SwiftUI
    import Translation
    
  • 语言配置:通过 TranslationSession.Configuration 定义翻译的源语言和目标语言。例如,将中文翻译为英文:
    let config = TranslationSession.Configuration(
        source: .init(identifier: "zh-Hans-CN"), // 源语言(简体中文)
        target: .init(identifier: "en-US")       // 目标语言(英语)
    )
    
    支持的语言标识符需参考苹果官方文档。

2. 在视图中集成 translationTask #

  • 修饰符绑定:将 .translationTask 附加到需要翻译的视图组件(如 Text),并绑定配置变量:
    struct ContentView: View {
        @State private var article = "需要翻译的文本"
        @State private var configuration: TranslationSession.Configuration?
    
        var body: some View {
            Text(article)
                .translationTask(configuration) { session in
                    // 执行翻译操作
                }
        }
    }
    
  • 触发翻译:通过用户操作(如按钮点击)更新 configuration,从而触发翻译任务:
    Button("翻译") {
        configuration = TranslationSession.Configuration(source: ..., target: ...)
    }
    

3. 执行翻译与处理结果 #

  • 调用翻译接口:在闭包中使用 session.translate() 方法传入待翻译文本,并通过 await 处理异步返回结果:
    .translationTask(configuration) { session in
        if let response = try? await session.translate(article) {
            // 更新界面显示翻译结果
            article.append("\n\n" + response.targetText)
        }
    }
    
  • 结果处理response.targetText 包含翻译后的文本,开发者可自定义后续操作(如更新 UI 或存储翻译结果)。

4. 高级功能与注意事项 #

  • 离线翻译支持:若需启用离线翻译,需在系统设置中开启“设备端模式”(需提前下载语言包),确保隐私性与无网络环境使用。
  • 错误处理:示例中使用 try? 简化了错误处理,实际开发建议通过 do-catch 块捕获异常,例如网络问题或语言包缺失。
  • 真机测试:该 API 依赖设备端神经引擎,需在真机运行测试,模拟器可能无法支持。

5. 应用场景示例 #

  • 多语言内容展示:在新闻类 App 中,用户可一键将外文文章翻译为本地语言。
  • 实时聊天翻译:社交应用中自动翻译接收到的外语消息。
  • 文档处理工具:支持用户导入外文 PDF,通过 translationTask 实现段落翻译。

通过以上步骤,开发者可高效集成苹果原生翻译能力,提升应用的多语言支持体验。实际开发中需注意语言标识符的兼容性及用户隐私设置。

translationPresentation #

在 SwiftUI 中,translationPresentation 是 iOS 17.4 及更高版本引入的翻译修饰符,它允许开发者通过调用系统原生的翻译服务,在应用内快速实现文本翻译功能,并自动展示翻译叠加层(类似系统 Translate App 的弹窗效果)。以下是其核心功能的详细解析:


一、功能与参数解析 #

translationPresentation 修饰符的核心参数如下:

.translationPresentation(
    isPresented: Binding<Bool>,  // 控制翻译弹窗的显示状态
    text: String,                // 需要翻译的原始文本
    completion: (String) -> Void // 翻译完成后的回调(返回翻译结果)
)
  • isPresented:通过绑定一个布尔值状态变量(如 @State),控制翻译弹窗的显示与隐藏。
  • text:需要翻译的原始文本,支持多语言自动识别(如中文、英文等)。
  • completion:翻译完成后,系统会将翻译结果通过闭包返回,开发者可在此更新界面或存储结果。

二、使用场景与示例 #

1. 基础用法 #

以下是一个典型的使用场景:点击按钮触发翻译,并在翻译完成后更新原始文本。

import SwiftUI
import Translation

struct ContentView: View {
    @State private var showTranslation = false
    @State private var originalText = "Hello, World!"
    
    var body: some View {
        VStack {
            Text(originalText)
            Button("Translate") {
                showTranslation.toggle() // 触发弹窗显示
            }
        }
        .padding()
        .translationPresentation(isPresented: $showTranslation, text: originalText) { translatedText in
            originalText = translatedText // 更新原文本为翻译结果
        }
    }
}
  • 效果:点击按钮后,系统会弹出翻译叠加层,自动识别原文语言并提供翻译结果。用户确认后,通过闭包将结果返回到应用界面。

2. 翻译流程 #

  1. 触发弹窗:通过状态变量 showTranslation 控制弹窗显示。
  2. 系统翻译:文本由系统服务自动翻译(无需开发者处理语言识别)。
  3. 结果回调:翻译后的文本通过闭包返回,开发者可自定义后续逻辑(如更新数据、存储历史记录等)。

三、与其他翻译 API 的对比 #

在 iOS 18 中,Apple 进一步推出了 translationTask 修饰符,二者区别如下:

特性translationPresentation (iOS 17.4+)translationTask (iOS 18+)
界面依赖依赖系统弹窗无弹窗,后台直接翻译
翻译流程用户交互触发开发者主动配置翻译参数
适用场景快速集成翻译功能定制化翻译流程(如批量翻译)
  • 优势translationPresentation 适合需要直接调用系统翻译界面、减少开发成本的场景。

四、注意事项 #

  1. 真机测试:该功能依赖系统翻译服务,需在真实 iOS 设备上运行,模拟器可能无法生效。
  2. 语言支持:翻译语言范围由系统决定,开发者需确保目标语言在设备支持列表中。
  3. 错误处理:若翻译失败(如网络问题),回调可能不执行,建议在闭包中添加错误捕获逻辑。

通过 translationPresentation,开发者能以极低的代码量实现高质量的系统级翻译功能,显著提升应用国际化体验。若需要更灵活的翻译控制,可参考 iOS 18 的 translationTask 修饰符。

本文共 1785 字,创建于 Mar 4, 2025
相关标签: Xcode, SwiftUI