← Tous les articles

Le framework Translation d'Apple : gratuit, sur l'appareil et plus pointu qu'il n'y paraît

Le framework Translation d’Apple traduit du texte directement sur l’appareil, gratuitement, sans clé API ni appel réseau une fois la langue installée1. Il repose sur des modèles Core ML, est livré avec le système et offre à une application le moteur de traduction qu’utilise l’app Traduire. Pour des fonctionnalités multilingues qui impliquaient autrefois une facture de traduction dans le cloud et une question de confidentialité, le coût retombe une fois encore à zéro. Et comme pour le framework Foundation Models, l’intérêt ne réside pas dans le scénario idéal ; il réside dans les angles morts que les démos esquivent : le téléchargement de la langue qui bloque votre première traduction, le simulateur qui refuse silencieusement de fonctionner et la surface exclusivement SwiftUI qui détermine la façon dont vous l’adoptez.

En bref

  • Deux surfaces, deux versions d’iOS. translationPresentation affiche la fenêtre contextuelle de traduction intégrée d’Apple (iOS 17.4+). TranslationSession, accessible via le modificateur translationTask, effectue une traduction programmatique au sein de votre propre interface (iOS 18+)2.
  • La traduction programmatique est async. À l’intérieur de la closure translationTask, vous obtenez une TranslationSession ; appelez-la pour traduire une seule chaîne ou un lot3.
  • Le traitement par lot est de première classe. Traduisez une liste en une seule requête et gardez chaque résultat associé à son entrée, au lieu de boucler et d’attendre une traduction à la fois3.
  • L’interface de traduction est exclusivement SwiftUI, et elle ne fonctionne pas dans le simulateur iOS. Ces deux points se découvrent facilement à la dure ; concevez et testez en conséquence4.
  • Hors ligne implique d’abord un téléchargement. La première traduction d’une paire de langues télécharge des modules linguistiques, ce qui constitue un véritable moment d’expérience utilisateur à gérer, et non un détail5.
  • L’association à connaître : traduisez l’entrée de l’utilisateur avec Translation, puis raisonnez dessus avec Foundation Models, et une fonctionnalité d’agent monolingue sur l’appareil fonctionne dans n’importe quelle langue que l’appareil peut installer.

Deux surfaces : la fenêtre contextuelle du système et votre propre interface

Le framework vous offre deux moyens distincts de traduire, et choisir le bon constitue l’essentiel de la décision.

L’approche légère est translationPresentation, disponible depuis iOS 17.4. Vous l’attachez à une vue, vous liez un indicateur isPresented et vous transmettez le texte ; lorsque l’indicateur passe à true, le système fait apparaître sa propre fenêtre contextuelle de traduction par-dessus votre contenu2 :

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

Vous n’écrivez aucune logique de traduction et vous ne voyez pas le résultat ; Apple maîtrise l’interface et l’interaction. Pour « laisser l’utilisateur traduire ce passage », c’est là toute la fonctionnalité, et recourir à quoi que ce soit de plus lourd est un effort gaspillé.

La surface programmatique est TranslationSession, disponible depuis iOS 18, et vous y accédez via le modificateur translationTask. Le modificateur exécute une closure asynchrone et vous remet une session que vous appelez vous-même, de sorte que le texte traduit revient à votre code et que vous l’affichez à votre manière2 :

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

La distinction est nette. translationPresentation sert à montrer à l’utilisateur une traduction dans l’interface d’Apple. TranslationSession sert à faire entrer du texte traduit dans vos données et vos vues. La plupart des applications qui font davantage qu’une traduction ponctuelle se tournent vers la session.

Traduction par lot : traduisez la liste, pas la boucle

Le détail qui sépare une fonctionnalité fluide d’une fonctionnalité saccadée, c’est le traitement par lot. Si vous devez traduire une liste (messages d’une conversation, entrées d’un catalogue, un ensemble d’étiquettes), ne bouclez pas en faisant await sur chaque traduction tour à tour. TranslationSession accepte un lot de requêtes et renvoie les réponses, chacune associée à sa requête, en une seule passe3 :

.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
    }
}

Le clientIdentifier est l’élément qui compte : il revient sur la réponse, ce qui vous permet d’associer chaque traduction à la ligne à laquelle elle appartient sans dépendre de l’ordre. Le traitement par lot permet en outre au framework d’ordonnancer le travail efficacement plutôt que de payer le coût propre à chaque appel tout au long d’une boucle. Pour tout ce qui dépasse une seule chaîne, procédez par lot.

La réalité du hors ligne que personne ne montre en capture d’écran

Voici l’angle mort qui transforme une démo soignée en ticket de support. La traduction s’exécute sur l’appareil, mais la langue doit d’abord se trouver sur l’appareil. La première fois que votre application traduit une paire source-vers-cible donnée, le système télécharge les modules linguistiques, et ce téléchargement prend du temps et nécessite une connexion réseau5. Si vous déclenchez une traduction et affichez le résultat sans aucune gestion du téléchargement, votre fonctionnalité semble se figer à la première utilisation pour chaque nouvelle langue.

Gérez ce cas délibérément. Le framework vous permet de vérifier la disponibilité d’une langue et de préparer (télécharger) une paire en amont du moment où vous en avez besoin, afin de pouvoir faire apparaître un état « préparation de la traduction » ou de procéder au téléchargement préalable lors d’un moment plus calme, au lieu de bloquer en pleine interaction5. Le modèle mental : traitez la première traduction d’une paire de langues comme un téléchargement de ressource ponctuel, parce que c’est exactement cela. Concevez l’expérience utilisateur en tenant compte de l’existence de ce téléchargement, et l’avantage du hors-ligne-et-gratuit porte ses fruits ; ignorez-le, et l’avantage se cache derrière un blocage.

Deux autres faits qui coûtent une après-midi si vous les apprenez trop tard. Les surfaces de l’interface de traduction sont des modificateurs SwiftUI, de sorte qu’un écran UIKit héberge une vue SwiftUI (via UIHostingController) pour y accéder, même si une TranslationSession peut aussi être construite directement pour un travail sans interface4. Et le framework ne fonctionne pas dans le simulateur iOS ou iPadOS ; vous testez la traduction sur un appareil réel4. Ni l’un ni l’autre n’est documenté à grand bruit, et tous deux sont faciles à percuter de plein fouet.

Associer la traduction à Foundation Models

La synthèse à retenir relie ce framework au reste de la pile sur l’appareil. La plupart des travaux linguistiques sur l’appareil supposent que l’entrée est dans une langue que votre logique et le modèle système gèrent bien. Les vrais utilisateurs ne coopèrent pas. Le framework Translation comble cet écart : traduisez l’entrée de l’utilisateur dans la langue dans laquelle votre fonctionnalité raisonne, exécutez le travail de Foundation Models sur le texte traduit, puis retraduisez le résultat.

La forme est celle d’un encadrement : traduire à l’entrée, raisonner, traduire à la sortie.

// 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

Une fonctionnalité de triage du support, un outil de résumé de notes, un extracteur d’intention : chacun peut être écrit une seule fois, de manière monolingue, et amené à fonctionner dans n’importe quelle langue que l’appareil peut installer, en encadrant l’appel à Foundation Models par Translation. Les deux directions utilisent deux configurations de session (leur langue vers l’anglais, puis l’anglais en retour), puisqu’une session est configurée pour une seule paire de langues. Les deux couches sont sur l’appareil, toutes deux sont gratuites, et rien ne quitte le téléphone ; ainsi, la version multilingue ne coûte ni la confidentialité ni la facture cloud que la version monolingue n’engageait pas non plus. Cette composition (traduire à l’entrée, raisonner, traduire à la sortie) est le motif qui rend une petite fonctionnalité sur l’appareil véritablement mondiale, et elle n’est possible que parce que les deux moitiés s’exécutent localement et gratuitement.

Quand ne pas l’utiliser

La traduction sur l’appareil est gratuite et privée, ce qui en fait le bon choix par défaut pour la traduction au sein d’une application. C’est le mauvais outil dans quelques cas qu’il faut reconnaître honnêtement.

  • Vous avez besoin de la meilleure qualité de traduction possible ou de la plus large couverture linguistique. Les modèles sur l’appareil sont bons, sans être les meilleurs disponibles, et l’ensemble des langues installables est fini. Pour une traduction à fort enjeu (juridique, médical, contenu publié), un service de traduction cloud dédié l’emporte toujours sur la qualité et l’étendue.
  • Vous ne pouvez pas tolérer le téléchargement à la première utilisation. Pour une fonctionnalité qui doit fonctionner instantanément au premier lancement sans réseau, l’exigence de téléchargement peut à elle seule disqualifier la traduction sur l’appareil, à moins que vous ne procédiez au téléchargement préalable pendant l’intégration.
  • Votre application est en UIKit sans place pour un hôte SwiftUI, ou votre parcours doit s’exécuter dans le simulateur (un test d’interface automatisé, par exemple). Les contraintes du tout-SwiftUI et du sans-simulateur sont strictes, et non indicatives.

Ce framework est l’une des réussites les plus discrètes de la boîte à outils sur l’appareil : un moteur de traduction véritablement gratuit et privé que la plupart des applications pourraient adopter en une après-midi. Le savoir-faire requis est le même que celui que récompense le reste de cette pile. Sachez quelle surface convient (la fenêtre contextuelle du système ou votre propre session), procédez par lot lorsque vous avez une liste, et concevez en tenant compte du téléchargement au lieu de faire comme s’il n’existait pas. Faites cela, et la traduction cesse d’être une dépendance au cloud pour devenir une capacité locale que vous composez avec tout le reste de ce que l’appareil fait gratuitement.

FAQ

Le framework Translation d’Apple est-il gratuit et exécuté sur l’appareil ?

Oui. La traduction s’exécute sur l’appareil et est gratuite, sans que rien ne quitte le téléphone, ce qui en fait le bon choix par défaut pour la traduction au sein d’une application. La contrepartie, c’est que la qualité de traduction et la couverture linguistique sont bonnes plutôt que de premier ordre ; les travaux à fort enjeu peuvent donc encore préférer un service cloud.

Pourquoi la première traduction se fige-t-elle ou nécessite-t-elle un téléchargement ?

La traduction s’exécute sur l’appareil, mais la paire de langues doit d’abord s’y trouver. La première fois que vous traduisez une paire source-vers-cible donnée, le système télécharge les modules linguistiques, ce qui requiert du temps et une connexion réseau5. Vérifiez la disponibilité et préparez (téléchargez à l’avance) la paire en amont du moment où vous en avez besoin, afin de pouvoir afficher un état « préparation en cours » plutôt que de bloquer en pleine interaction.

Quelles sont les deux façons d’ajouter la traduction à une application ?

La fenêtre contextuelle du système via un modificateur de présentation SwiftUI, ou votre propre interface pilotée par une TranslationSession construite directement pour un travail sans interface4. Comme les surfaces sont des modificateurs SwiftUI, un écran UIKit y accède en hébergeant une vue SwiftUI via UIHostingController.

Le framework Translation d’Apple fonctionne-t-il dans le simulateur ?

Non. Le framework ne fonctionne pas dans le simulateur iOS ou iPadOS ; vous testez donc la traduction sur un appareil réel4. Cette contrainte est stricte, et non indicative, et elle exclut également la traduction au sein des tests d’interface automatisés exécutés dans le simulateur.

Comment faire fonctionner une fonctionnalité Foundation Models dans n’importe quelle langue ?

Encadrez-la : traduisez l’entrée de l’utilisateur dans la langue dans laquelle votre logique raisonne, exécutez le travail de Foundation Models sur le texte traduit, puis retraduisez le résultat. Les deux directions utilisent deux configurations de TranslationSession (leur langue vers l’anglais, puis l’anglais en retour), puisqu’une session est configurée pour une seule paire de langues. Les deux couches sont sur l’appareil et gratuites ; ainsi, la version multilingue ne coûte ni la confidentialité ni une facture cloud.

Quand ne devrais-je pas utiliser la traduction sur l’appareil ?

Lorsque vous avez besoin de la meilleure qualité possible ou de la plus large couverture linguistique (juridique, médical, contenu publié), lorsqu’une fonctionnalité doit fonctionner instantanément au premier lancement sans réseau et que vous ne pouvez pas procéder à un téléchargement préalable, ou lorsque votre parcours doit s’exécuter dans le simulateur ou repose sur UIKit sans place pour un hôte SwiftUI. Ces dernières contraintes sont des limites strictes.



  1. Apple Developer, framework « Translation ». Un framework de première partie pour une traduction sur l’appareil, fournie par le système et bâtie sur des modèles Core ML, qui effectue la traduction localement sans appel réseau une fois les ressources de langue installées. 

  2. Apple Developer, « translationPresentation(isPresented:text:attachmentAnchor:arrowEdge:replacementAction:) » (iOS 17.4+) présente l’interface de traduction intégrée du système par-dessus une vue ; « translationTask(_:action:) » (iOS 18+) exécute une closure asynchrone qui fournit une TranslationSession pour une traduction programmatique au sein de votre propre interface. 

  3. Apple Developer, TranslationSession et TranslationSession.Request. translate(_:) traite une seule chaîne ; l’API de traitement par lot prend un tableau de requêtes, chacune portant un clientIdentifier qui revient sur la réponse correspondante, de sorte que les résultats peuvent être réassociés à leurs entrées indépendamment de l’ordre. 

  4. Les API de traduction du framework Translation sont exposées via des modificateurs de vue SwiftUI (translationTask, translationPresentation) et n’ont aucun point d’entrée UIKit ; un écran UIKit héberge une vue SwiftUI (par exemple via UIHostingController) pour les utiliser. Le framework requiert également un appareil physique et ne fonctionne pas dans le simulateur iOS. Voir la documentation du framework Translation et « Translating text within your app »

  5. Apple Developer, « Translating text within your app » et LanguageAvailability. La première traduction d’une paire de langues source-vers-cible télécharge les ressources de langue nécessaires ; le framework expose des vérifications de disponibilité de langue et un moyen de préparer (télécharger) une paire à l’avance afin que les applications puissent gérer le moment du téléchargement plutôt que de bloquer à la première utilisation. 

  6. Analyse connexe de l’auteur sur la composition des capacités sur l’appareil : Apple Foundation Models : le framework LLM sur l’appareil, Des LLM sur l’appareil avec Foundation Models d’Apple et Adoption de l’API Writing Tools. Le motif « traduire à l’entrée, raisonner, traduire à la sortie » encadre un appel monolingue à Foundation Models par Translation pour rendre une fonctionnalité sur l’appareil multilingue sans quitter l’appareil. 

Articles connexes

API Image Playground : feuille SwiftUI, créateur d'images programmatique et contrôle du style

Image Playground offre deux voies aux applications : le modificateur SwiftUI imagePlaygroundSheet et l'API programmatiqu…

11 min de lecture

Genmoji et NSAdaptiveImageGlyph : emoji intégrés sur iOS 18+

Genmoji s'intègre comme NSAdaptiveImageGlyph dans le texte attribué. Les apps utilisant UITextView avec TextKit 2 active…

10 min de lecture

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 de lecture