apple/Docs, iOS, Swift
iOS Translation Framework
lgvv
2024. 8. 28. 00:31
iOS Translation Framework
iOS 18.0 +
Xcode 16 이상에서 작업
Overview
앱 내 번역 기능을 제공하기 위해 Translation 프레임워크를 사용할 수 있음.
시스템이 사용자를 대신하여 번역을 제안하는 기본 UI를 사용할 수 있으며, 사용자가 별도의 설정 없이도 쉽게 번역 기능을 이용.
또한, 이 프레임워크를 사용하여 번역 경험을 사용자 맞춤형으로 유연하게 조정할 수도 있음.
Translation 프레임워크를 활용하는 방법에는 두 가지가 존재.
- 시스템이 제공하는 기본 번역 UI를 사용: 하여 사용자가 손쉽게 번역을 적용할 수 있도록 합니다. 이 경우 시스템이 자동으로 번역 옵션을 제공하며, 개발자는 별도의 UI를 설계할 필요가 없습니다.
- 사용자 맞춤형 번역 경험 제공: Translation 프레임워크를 사용하여 번역 경험을 커스터마이즈할 수 있음. 이를 통해 특정 상황에 맞는 번역 설정을 제공하거나, 번역 UI를 직접 디자인하여 사용자의 요구에 맞게 조정할 수 있음.
SwiftUI에서 매우 간편하게 사용하는 예제
Text(originalText)
.translationPresentation(
isPresented: $showTranslation,
text: originalText
) { translatedText in
// 변역이 완료된 텍스트를 클로저를 통해 대치도 가능.
originalText = translatedText
}
유연하게 Configuration을 통해 직접 문자열을 다룰 수 있음.
struct SingleStringView: View {
@State private var sourceText = "Hallo, Welt!"
@State private var targetText = ""
// Define a configuration.
@State private var configuration: TranslationSession.Configuration?
var body: some View {
VStack {
TextField("Enter text to translate", text: $sourceText)
.textFieldStyle(.roundedBorder)
Button("Translate") {
triggerTranslation()
}
Text(verbatim: targetText)
}
// Pass the configuration to the task.
.translationTask(configuration) { session in
do {
// Use the session the task provides to translate the text.
let response = try await session.translate(sourceText)
// Update the view with the translated result.
targetText = response.targetText
} catch {
// Handle any errors.
}
}
.padding()
.navigationTitle("Single string")
}
private func triggerTranslation() {
guard configuration == nil else {
configuration?.invalidate()
return
}
// Let the framework automatically determine the language pairing.
configuration = .init()
}
}
유연하게 Configuration을 통해 직접 문자열을 다룰 수 있음.
여러 문자들을 한번에 처리할 경우 사용할 경우 Batch를 통해 처리할 수 있음.
Task { @MainActor in
let requests: [TranslationSession.Request] = foodItems.map {
// Map each item into a request.
TranslationSession.Request(sourceText: $0)
}
do {
let responses = try await session.translations(from: requests)
foodItems = responses.map {
// Update each item with the translated result.
$0.targetText
}
} catch {
// Handle any errors.
}
}
(참고)
https://developer.apple.com/documentation/Translation
https://www.youtube.com/watch?v=MuIFhbHNmqA&list=PLjODKV8YBFHbZ3DCbLHAYOEXiktlfXVZT&index=7