← Alle Beitrage

Apples Translation Framework: kostenlos, On-Device und schärfer, als es aussieht

Apples Translation Framework übersetzt Text direkt auf dem Gerät, kostenlos, ohne API-Schlüssel und ohne Netzwerkaufruf, sobald die Sprache installiert ist1. Es baut auf Core-ML-Modellen auf, wird mit dem System ausgeliefert und stellt einer App dieselbe Übersetzungs-Engine zur Verfügung, die auch die Translate-App nutzt. Was früher eine Cloud-Übersetzungsrechnung und eine Datenschutzfrage bedeutete, rundet sich bei mehrsprachigen Funktionen damit erneut auf null ab. Und wie schon beim Foundation Models Framework liegt das Interessante nicht im Idealfall, sondern in den Rändern, die Demos auslassen: der Sprach-Download, der die erste Übersetzung blockiert, der Simulator, der stillschweigend den Dienst verweigert, und die ausschließlich auf SwiftUI ausgelegte Oberfläche, die prägt, wie Sie das Framework einsetzen.

Kurzfassung

  • Zwei Oberflächen, zwei iOS-Versionen. translationPresentation zeigt Apples integriertes Übersetzungs-Popover (iOS 17.4+). TranslationSession, erreichbar über den translationTask-Modifier, übernimmt die programmatische Übersetzung in Ihrer eigenen Benutzeroberfläche (iOS 18+)2.
  • Programmatische Übersetzung ist async. Innerhalb der translationTask-Closure erhalten Sie eine TranslationSession; rufen Sie diese auf, um einen einzelnen String oder einen ganzen Stapel zu übersetzen3.
  • Stapelverarbeitung ist erstklassig vorgesehen. Übersetzen Sie eine Liste in einer einzigen Anfrage und halten Sie jedes Ergebnis seiner Eingabe zugeordnet, statt in einer Schleife einzeln darauf zu warten3.
  • Die Übersetzungsoberfläche gibt es nur in SwiftUI, und sie läuft nicht im iOS-Simulator. Beides lässt sich leicht auf die harte Tour entdecken; planen und testen Sie entsprechend4.
  • Offline bedeutet zuerst einen Download. Die erste Übersetzung für ein Sprachpaar lädt die Sprachpakete herunter – ein echter UX-Moment, den Sie behandeln müssen und der kein Detail ist5.
  • Die Kombination, die man kennen sollte: Übersetzen Sie die Benutzereingabe mit Translation, lassen Sie sie dann von Foundation Models verarbeiten, und schon funktioniert eine einsprachige On-Device-Agentenfunktion in jeder Sprache, die das Gerät installieren kann.

Zwei Oberflächen: das System-Popover und Ihre eigene Benutzeroberfläche

Das Framework bietet Ihnen zwei klar getrennte Wege zum Übersetzen, und die richtige Wahl macht den größten Teil der Entscheidung aus.

Der leichtgewichtige Ansatz ist translationPresentation, verfügbar seit iOS 17.4. Sie hängen ihn an eine View, binden ein isPresented-Flag und übergeben den Text; sobald das Flag auf true springt, schiebt das System sein eigenes Übersetzungs-Popover über Ihren Inhalt2:

.translationPresentation(isPresented: $showTranslation, text: selectedText)

Sie schreiben keinerlei Übersetzungslogik und sehen das Ergebnis nicht; Apple kontrolliert die Oberfläche und die Interaktion. Für „Lassen Sie den Benutzer diesen Absatz übersetzen” ist das die gesamte Funktion, und zu etwas Schwererem zu greifen wäre verschwendete Mühe.

Die programmatische Oberfläche ist TranslationSession, verfügbar seit iOS 18, und Sie erreichen sie über den translationTask-Modifier. Der Modifier führt eine asynchrone Closure aus und übergibt Ihnen eine Sitzung, die Sie selbst aufrufen, sodass der übersetzte Text in Ihren Code zurückkommt und Sie ihn nach Ihren Vorstellungen darstellen2:

.translationTask(configuration) { session in
    let response = try await session.translate("Good morning")
    await MainActor.run { translated = response.targetText }
}

Die Trennung ist sauber. translationPresentation dient dazu, dem Benutzer eine Übersetzung in Apples Oberfläche zu zeigen. TranslationSession dient dazu, übersetzten Text in Ihre Daten und Ihre Views zu bringen. Die meisten Apps, die mehr tun als ein einmaliges „Übersetze das”, greifen zur Sitzung.

Stapelübersetzung: übersetzen Sie die Liste, nicht die Schleife

Das Detail, das eine flüssige Funktion von einer ruckeligen trennt, ist die Stapelverarbeitung. Wenn Sie eine Liste übersetzen müssen (Chatnachrichten, Katalogeinträge, eine Reihe von Beschriftungen), durchlaufen Sie keine Schleife und warten nicht nacheinander mit await auf jede einzelne Übersetzung. TranslationSession nimmt einen Stapel von Anfragen entgegen und gibt die Antworten zurück, jede ihrer Anfrage zugeordnet, in einem Durchgang3:

.translationTask(configuration) { session in
    let requests = items.map { TranslationSession.Request(sourceText: $0.text, clientIdentifier: $0.id) }
    for try await response in session.translate(batch: requests) {
        store[response.clientIdentifier] = response.targetText
    }
}

Der clientIdentifier ist der entscheidende Teil: Er kommt auf der Antwort zurück, sodass Sie jede Übersetzung der Zeile zuordnen können, zu der sie gehört, ohne sich auf die Reihenfolge verlassen zu müssen. Die Stapelverarbeitung erlaubt dem Framework außerdem, die Arbeit effizient einzuplanen, statt über eine Schleife hinweg pro Aufruf Mehraufwand zu zahlen. Für alles, was über einen einzelnen String hinausgeht, gilt: bündeln.

Die Offline-Realität, von der niemand einen Screenshot macht

Hier ist der Rand, der aus einer sauberen Demo ein Support-Ticket macht. Die Übersetzung läuft auf dem Gerät, aber die Sprache muss zuerst auf dem Gerät sein. Wenn Ihre App ein bestimmtes Quell-zu-Ziel-Paar zum ersten Mal übersetzt, lädt das System die Sprachpakete herunter, und dieser Download braucht Zeit und eine Netzwerkverbindung5. Wenn Sie eine Übersetzung anstoßen und das Ergebnis darstellen, ohne den Download zu behandeln, scheint Ihre Funktion bei der ersten Nutzung jeder neuen Sprache zu hängen.

Behandeln Sie das bewusst. Das Framework lässt Sie die Sprachverfügbarkeit prüfen und ein Paar vorbereiten (herunterladen), bevor Sie es brauchen, sodass Sie einen Zustand „Übersetzung wird vorbereitet” anzeigen oder in einem ruhigeren Moment vorab herunterladen können, statt mitten in der Interaktion zu blockieren5. Das passende mentale Modell: Behandeln Sie die erste Übersetzung eines Sprachpaars wie einen einmaligen Asset-Download, denn genau das ist sie. Planen Sie die UX um die Existenz des Downloads herum, dann zahlt sich der Vorteil „offline und kostenlos” aus; ignorieren Sie ihn, verschwindet der Vorteil hinter einem Hänger.

Zwei weitere Tatsachen, die einen halben Tag kosten, wenn man sie zu spät lernt. Die Oberflächen der Übersetzungs-UI sind SwiftUI-Modifier, sodass ein UIKit-Screen eine SwiftUI-View einbettet (über UIHostingController), um sie zu erreichen – wobei eine TranslationSession für Arbeit ohne UI auch direkt erzeugt werden kann4. Und das Framework läuft weder im iOS- noch im iPadOS-Simulator; Übersetzungen testen Sie auf einem echten Gerät4. Keines von beidem wird laut dokumentiert, und in beides läuft man leicht frontal hinein.

Translation mit Foundation Models kombinieren

Die Synthese, die man mitnehmen sollte, verknüpft dieses Framework mit dem übrigen On-Device-Stack. Die meisten Sprachaufgaben auf dem Gerät setzen voraus, dass die Eingabe in einer Sprache vorliegt, mit der Ihre Logik und das Systemmodell gut umgehen. Echte Benutzer spielen nicht mit. Das Translation Framework schließt diese Lücke: Übersetzen Sie die Eingabe des Benutzers in die Sprache, in der Ihre Funktion denkt, führen Sie die Foundation Models-Arbeit auf dem übersetzten Text aus und übersetzen Sie das Ergebnis dann zurück.

Die Form ist eine Klammer: hinein übersetzen, verarbeiten, hinaus übersetzen.

// 1. translate the user's text into English (session configured for their language -> en)
let english = try await inboundSession.translate(userText).targetText
// 2. reason on-device, monolingually, in English
let summary = try await LanguageModelSession()
    .respond(to: "Summarize in one line: \(english)").content
// 3. translate the result back (a session configured for en -> their language)
let localized = try await outboundSession.translate(summary).targetText

Eine Funktion zur Support-Triage, ein Notiz-Zusammenfasser, ein Intent-Extraktor: Jede davon lässt sich einmal und einsprachig schreiben und dann in jeder Sprache betreiben, die das Gerät installieren kann, indem man den Foundation-Models-Aufruf mit Translation einklammert. Die beiden Richtungen nutzen zwei Sitzungskonfigurationen (ihre Sprache nach Englisch, dann Englisch zurück), denn eine Sitzung ist für ein einziges Sprachpaar konfiguriert. Beide Schichten laufen auf dem Gerät, beide sind kostenlos, und nichts verlässt das Telefon – die mehrsprachige Variante kostet also weder Datenschutz noch Cloud-Rechnung mehr als die einsprachige. Genau diese Komposition (hinein übersetzen, verarbeiten, hinaus übersetzen) ist das Muster, das aus einer kleinen On-Device-Funktion eine wirklich globale macht, und sie ist nur möglich, weil beide Hälften lokal und kostenlos laufen.

Wann man es nicht einsetzen sollte

On-Device-Übersetzung ist kostenlos und privat, was sie zur richtigen Standardwahl für Übersetzungen innerhalb einer App macht. In einigen ehrlichen Fällen ist sie das falsche Werkzeug.

  • Sie brauchen die bestmögliche Übersetzungsqualität oder die größte Sprachabdeckung. Die On-Device-Modelle sind gut, aber nicht das Beste, was verfügbar ist, und der installierbare Sprachumfang ist endlich. Für Übersetzungen mit hohem Einsatz (juristisch, medizinisch, veröffentlichte Inhalte) gewinnt ein dedizierter Cloud-Übersetzungsdienst nach wie vor bei Qualität und Breite.
  • Sie können den Download bei der ersten Nutzung nicht tolerieren. Für eine Funktion, die beim ersten Start sofort und ohne Netzwerk funktionieren muss, kann allein die Download-Anforderung die On-Device-Übersetzung disqualifizieren – es sei denn, Sie laden während des Onboardings vorab herunter.
  • Ihre App ist UIKit ohne Platz für einen SwiftUI-Host, oder Ihr Ablauf muss im Simulator laufen (etwa ein automatisierter UI-Test). Die Beschränkungen „nur SwiftUI” und „kein Simulator” sind hart, nicht bloß ein Hinweis.

Das Framework ist einer der leiseren Erfolge im On-Device-Werkzeugkasten: eine wirklich kostenlose, private Übersetzungs-Engine, die die meisten Apps an einem Nachmittag übernehmen könnten. Die Fertigkeit ist dieselbe, die der übrige Teil dieses Stacks belohnt. Wissen Sie, welche Oberfläche passt (das System-Popover oder Ihre eigene Sitzung), bündeln Sie, wenn Sie eine Liste haben, und planen Sie für den Download, statt so zu tun, als gäbe es ihn nicht. Tun Sie das, dann hört Übersetzung auf, eine Cloud-Abhängigkeit zu sein, und wird zu einer lokalen Fähigkeit, die Sie mit allem anderen komponieren, was das Gerät kostenlos leistet.



  1. Apple Developer, “Translation” framework. A first-party framework for on-device, system-provided translation built on Core ML models, performing translation locally without a network call once language assets are installed. 

  2. Apple Developer, “translationPresentation(isPresented:text:attachmentAnchor:arrowEdge:replacementAction:)” (iOS 17.4+) presents the system’s built-in translation UI over a view; “translationTask(_:action:)” (iOS 18+) runs an async closure that provides a TranslationSession for programmatic translation in your own interface. 

  3. Apple Developer, TranslationSession and TranslationSession.Request. translate(_:) handles a single string; the batch API takes an array of requests, each carrying a clientIdentifier that returns on the matching response so results can be reassociated with their inputs independent of order. 

  4. The Translation framework’s translation APIs are surfaced through SwiftUI view modifiers (translationTask, translationPresentation) and have no UIKit entry point; a UIKit screen hosts a SwiftUI view (for example via UIHostingController) to use them. The framework also requires a physical device and does not function in the iOS Simulator. See the Translation framework documentation and “Translating text within your app”

  5. Apple Developer, “Translating text within your app” and LanguageAvailability. The first translation of a source-to-target language pair downloads the required language assets; the framework exposes language-availability checks and a way to prepare (download) a pair in advance so apps can manage the download moment rather than stall on first use. 

  6. Author’s related analysis on composing on-device capabilities: Apple Foundation Models: The On-Device LLM Framework, On-Device LLMs with Apple’s Foundation Models, and Writing Tools API adoption. The translate-in, reason, translate-out pattern brackets a monolingual Foundation Models call with Translation to make an on-device feature multilingual without leaving the device. 

Verwandte Beiträge

Image Playground API: SwiftUI Sheet, programmatischer Image Creator und Stilsteuerung

Image Playground bietet Apps zwei Wege: den SwiftUI-Modifier imagePlaygroundSheet und die programmatische ImageCreator-A…

9 Min. Lesezeit

Genmoji und NSAdaptiveImageGlyph: Inline-Emoji unter iOS 18+

Genmoji wird als NSAdaptiveImageGlyph in attributiertem Text ausgeliefert. Apps mit UITextView und TextKit 2 aktivieren …

8 Min. Lesezeit

The Robots Are Taking Exams in My Search Console

First-party GSC data: 91% of 3.8M impressions fail a human-query filter. Exam questions, pasted errors, and agent sweeps…

10 Min. Lesezeit