Aller au contenu

Langues de l'écran

L'écran du Tab5 parle français (la langue source), anglais, allemand, néerlandais, espagnol, italien ou turc. Tout ce que l'écran affiche ou que la tablette dit suit la langue choisie : popups, cartes, dates, le réveil et ses rappels parlés, et les huit jeux. Deux exceptions : les questions du quiz de Trial Poursuite restent en français (plus de 720), et les noms des consoles (Fil d'Or, Roi Noir…) sont des noms propres, gardés tels quels.

Toutes les langues ont été écrites par une IA, comme le reste du projet. L'auteur a relu le français ; l'anglais, et les traductions allemande, néerlandaise, espagnole, italienne et turque (faites avec Claude à partir des textes français et anglais), ne sont pas encore relus. Les corrections sont bienvenues : une issue, ou une pull request sur Tab5/lang/en.yaml, de.yaml, nl.yaml, es.yaml, it.yaml ou tr.yaml. L'intégration Home Assistant (HACS) parle les mêmes sept langues, d'après la langue du serveur : custom_components/tab5/translations/*.json, messages.py et les tables TEXTES / LIBELLES d'assistant.py, traduits de la même façon et pas relus non plus.

Choisir la langue

  • Depuis Home Assistant : la tablette expose un select « Langue » (Configuration). Choisissez Français, English, Deutsch, Nederlands, Español, Italiano ou Türkçe : la tablette redémarre et revient dans la nouvelle langue. Elle garde ce choix.
  • Les phrases parlées (rappels du réveil, « Volet arrêté ») suivent la langue de l'écran, mais la voix qui les lit est celle du pipeline vocal de la tablette dans Home Assistant : donnez-lui une voix de la même langue.
  • Le tableau de bord Home Assistant écrit par custom_templates/tab5_dashboard.jinja (libellés et explications des vues Tab5, Réglages et Santé) suit aussi la langue de l'écran, quand vous le réécrivez après avoir changé de langue (installation). Ses textes allemands, néerlandais, espagnols, italiens et turcs ont eux aussi été écrits par une IA et ne sont pas relus.
  • Les entités de la tablette dans Home Assistant (sa page d'appareil) gardent leur nom français dans toutes les langues : Home Assistant reconnaît une entité ESPHome à son nom, les traduire créerait donc de nouvelles entités sur chaque tablette déjà installée. Le tableau de bord ci-dessus montre les réglages et les capteurs avec des libellés dans la langue de l'écran (réglages).
  • Au premier démarrage : tab5_langue: English dans Tab5/user_entities.yaml (le nom de la langue dans la langue elle-même). Sans cette ligne, le français.

Ce qui ne change pas : les noms d'entités, les options de select et les états que lit Home Assistant (par exemple « Heure fixe », « Écran courant »). Les renommer casserait votre historique et vos automatisations : ils restent tels quels dans toutes les langues. Depuis le lot 4c, Home Assistant n'envoie plus de phrases mais des codes (niveau et heure de début de la pluie, nombre de mises à jour et d'erreurs…), et la tablette écrit la phrase dans sa langue — « Averses dans 12 mn » ou “Showers in 12 min”, décomptée avec sa propre horloge. Les libellés des jours des prévisions sont traduits à l'affichage. Ce qui reste tel que HA l'envoie : vos propres données (titres des événements du calendrier, noms des mises à jour et des capteurs).

Comment ça marche

Comme gettext : le texte français écrit dans le code est la clé.

  • En C++ et dans les lambdas YAML, un texte affiché passe par tr("Calendrier"), qui rend Calendar en anglais, et le texte français lui-même en français. Dans une langue pas encore complète, un texte manquant s'affiche en anglais (en français si l'anglais ne l'a pas non plus) : tools/gen_i18n.py écrit ce repli dans les tables générées.
  • Les textes posés par le YAML (text: "Calendrier") gardent leur texte français ; i18n_apply_boot() les traduit une fois en fin de setup, avant la première image.
  • Un mot à deux sens reçoit un contexte : tr_ctx("mardi", "M") → T, tr_ctx("mercredi", "M") → W, tr_ctx("echecs", "Dame") → Queen mais tr_ctx("dames", "Dame") → King.
  • Un ordre des mots qui change avec la langue passe par un modèle : tr_fill("{jour} {quantieme} {mois}", …) → {jour}, {mois} {quantieme} en anglais.
  • Un texte rangé dans une table (static const char* const kModes[] = {…}) est marqué tr_noop("Joueur contre Tab") et traduit là où il s'affiche, tr(kModes[i]). tr_noop() ne traduit rien : il signale seulement à tools/i18n_keys.py que le texte est une clé.

Chaque langue est un fichier, Tab5/lang/<code>.yaml : un mapping plat "texte français": "traduction". tools/gen_i18n.py en fait Tab5/socle/tab5_i18n_data.h (généré, versionné).

Ajouter une langue

  1. Copiez Tab5/lang/en.yaml en Tab5/lang/<code>.yaml (par exemple pt.yaml).
  2. Changez _langue (le nom dans la langue elle-même, tel qu'affiché dans le select : Português), _code (pt) et _index (le numéro suivant : la tablette mémorise l'index, les langues existantes ne bougent donc jamais). Retirez _statut: complet tant que la traduction n'est pas finie : les textes manquants s'affichent alors en anglais, donc une langue partielle est utilisable (c'est pourquoi l'anglais doit rester complet).
  3. Traduisez la partie droite de chaque ligne. Gardez les %d/%s dans le même ordre et les {noms} tels quels.
  4. Ajoutez le nom natif à la fin des options: du select « Langue » (Tab5/paquets/tab5-ha-controls.yaml).
  5. Lancez :
python tools/gen_i18n.py        # régénère Tab5/socle/tab5_i18n_data.h
python tools/i18n_keys.py       # liste les textes qui manquent encore, par langue
python -m pytest tests/test_i18n.py
  1. Le tableau de bord Home Assistant (HomeAssistant_Config/custom_templates/tab5_dashboard.jinja) a sa propre table : ajoutez la langue à code (haut de la macro) et sa traduction à chaque entrée de TRADUCTIONS (fin du fichier) ; tests/test_tableau_de_bord.py liste ce qui manque.

Caractères : les polices de l'écran portent le Latin-1, la ponctuation Windows-1252 et les lettres turques Ğ ğ İ ı Ş ş (&latin1 dans Tab5/paquets/tab5-styles.yaml). Ça couvre l'anglais, l'allemand, l'espagnol, l'italien, le portugais, le néerlandais, le turc et les langues nordiques. Le polonais, le tchèque, le cyrillique ou le grec demandent d'abord d'étendre ce jeu de glyphes : ça coûte de la flash sur chaque police de texte (les cinq lettres turques ont ajouté 2 464 octets au firmware) ; les noms que Home Assistant envoie pour les tuiles sont filtrés au même jeu (kHorsLatin1 dans Tab5/ecran/tab5_tuiles.cpp, tenu égal par tests/test_tuiles_firmware.py) ; tests/test_i18n.py refuse une traduction dont les polices n'ont pas les caractères — ils s'afficheraient en carrés vides.

Règles pour contribuer

  • Un nouveau texte à l'écran s'écrit en français dans le code, passe par tr() (C++, lambdas) ou est posé par le YAML, et reçoit sa ligne dans chaque fichier de langue complet. tests/test_i18n.py échoue si une langue complète (anglais, allemand, néerlandais, espagnol, italien, turc) ne l'a pas. Gardez le littéral sur la même ligne que tr( : l'outil qui relève les clés lit ligne par ligne.
  • Le texte français lui-même ne doit utiliser que des caractères des polices : les tests vérifient aussi le français.
  • Ne jamais traduire ce que lit Home Assistant : name: d'entité, options de select, états de text_sensor, codes des payloads (En_mouvement, Rouge…). Une valeur HA affichée à l'écran se traduit au moment de l'affichage : tr(etat.c_str()).
  • Une clé qui ne correspond plus à aucun texte du code fait échouer les tests : changez la clé quand vous changez le texte français.