Translator.create() exige une activation transitoire dès que le pack de langue doit encore être téléchargé, donc sur tout profil neuf. Appelez-le depuis un callback de parole et il rejette avec NotAllowedError, précisément sur les machines où cela compte le plus : celles qui ne l’ont jamais exécuté. Le préchauffage doit se faire de façon synchrone dans un clic.
Pourquoi cela marche sur votre machine
Une fois le pack sur le disque, create se résout sans activation et tout paraît correct. Le bug est donc invisible pour celui qui l’a écrit, dès la deuxième exécution, et n’apparaît que pour ceux qui ouvrent la fonctionnalité pour la première fois. C’est la pire distribution possible : cassé exactement pour les nouveaux utilisateurs, fonctionnel pour tous ceux qui testent.
Ce que permet réellement l’activation transitoire
C’est une courte fenêtre ouverte par un vrai geste utilisateur, et le premier await la dépense. C’est la partie qui piège. Un gestionnaire de clic qui attend getUserMedia puis appelle create a déjà perdu l’activation en arrivant là, même si le code est toujours dans le gestionnaire et se lit comme s’il ne l’était pas.
// Inside the click handler. No await before Translator.create, because the
// first await spends the activation and the call then rejects.
function onStart() {
// Wrong: await getUserMedia() here and the activation is gone.
const warm = Translator.create({ sourceLanguage: 'es', targetLanguage: 'en' });
warm.then((t) => (translator = t)).catch(() => (translator = null));
// Everything that can wait, waits after the create call is already in flight.
void startCaptureAndJoin();
}La règle d’ordre est donc étroite : lancez create avant le premier await, et laissez-le se résoudre en arrière-plan. Un callback de reconnaissance vocale arrive bien trop tard ; le geste est passé depuis des minutes.
Concevoir la fonctionnalité autour du geste
Ce n’est pas un contournement à ajouter, cela contraint l’interface. Il faut un moment où la personne active délibérément la traduction, et ce moment doit être celui qui préchauffe le pack. Si la traduction doit démarrer silencieusement à la détection de la parole, il n’y a aucun geste à dépenser et la fonctionnalité ne peut pas marcher à la première visite.
Je préfère de toute façon cette voie quand elle est disponible, parce qu’elle ne coûte rien et que rien ne quitte la machine. Chrome sur ordinateur sait reconnaître la parole localement et traduire localement. Tout le reste retombe sur un service hébergé, qui fonctionne et qui est le repli plutôt que le défaut.
Comment le tester
- Testez sur un profil neuf à chaque fois. Un profil déjà chaud ne peut pas reproduire la panne.
- Émulez la règle plutôt que de lui faire confiance : un double qui rejette avec NotAllowedError sauf si un geste a eu lieu dans les dernières secondes attrape la régression en CI, sans rien télécharger.
- Vérifiez aussi le chemin d’échec. Si create rejette, les sous-titres doivent rester affichés sans traduction plutôt que disparaître, car un sous-titre absent se lit comme un micro cassé.