Le CMS · 5b

Ce que le moteur
refuse, et pourquoi

49 erreurs cataloguées en 13 familles. Chacune porte son code, sa conséquence réelle et sa correction — avec le fichier et la ligne. Le texte des messages vit dans un JSON, pas dans le code : cette page en est la mise en forme.

Erreurs cataloguées
49
en 13 familles
Bloquantes
40
la compilation s'arrête
Éprouvées
21
par un défaut fabriqué
Non détectées
0
au banc d'essai
§1

Le texte des erreurs vit dans un JSON

Aucun message d'erreur n'est écrit dans le code du moteur. Ils vivent tous dans noyau/erreurs.json — un fichier de données, au même titre que les jetons de design ou la médiathèque.

Le code se contente de nommer un code — TRA-001 — et d'y joindre le contexte du cas rencontré : quel fichier, quelle ligne, quelle valeur.

ConséquenceCe que cela permet
La documentation est le catalogueun message ne peut pas diverger de ce que la documentation en dit — cette page est engendrée depuis le même fichier
Un agent IA peut lire le catalogueil sait ce que le moteur refuse sans lancer de compilation
Ajouter une erreur est une opération de donnéespas une modification du code

49 erreurs cataloguées, réparties en 13 familles. Un code se lit AAA-nnn : les trois lettres nomment la famille, le nombre identifie la faute. Un agent peut s'y référer sans ambiguïté.

§2

Ce qu'un rapport contient

Un message qui dit seulement « erreur de traduction » oblige à chercher. Chaque entrée porte donc quatre choses.

Contenu
OÙle fichier, et la ligne quand elle existe
QUOIla valeur fautive, citée
POURQUOIla conséquence réelle — pas la règle, la conséquence
COMMENTla correction, avec les valeurs attendues
$ ./verifier.sh

  ── cohérence des langues ──────────────────────────────────────────

  ✗ TRA-001 — Clé absente d'une traduction   (5 cas)
     Une clé existe dans la langue maîtresse mais pas dans cette langue.

       de · site/textes/txt_de.json:11    « accueil.concept.chapo »
         → insérer avant la ligne 11 — valeur française :
           « Kaina redonne confiance aux femmes traversant un mom »
       de · site/textes/txt_de.json:119   « accueil.pour-qui.titre »
         → insérer avant la ligne 119 — valeur française :
           « Pour celles qui ne se reconnaissent plus »
       de · site/textes/txt_de.json:584   « kaina.description-seo »
       de · site/textes/txt_de.json:1260  « pass-experience.titre-seo »
       de · site/textes/txt_de.json:1428  « temoignage-camille.presentation.titre »

     Pourquoi : Le convertisseur ne comble pas le trou avec la langue
                maîtresse : une page mi-traduite est un signal de
                mauvaise qualité, et un mélange de deux langues sur une
                même page est pire qu'une page absente.
     Corriger : Ajouter la clé au fichier de la langue, avec sa
                traduction.
     Source   : https://developers.google.com/search/docs/specialty/…

  ✓ en     13 pages   325 Ko
  ✓ fr     13 pages   330 Ko
  ⚠ langue « de » : 5 textes manquants (99,7 % traduit) — non compilée.

Une compilation ne s'arrête pas à la première faute. Elle les collecte toutes, puis rend un rapport complet. Corriger sept fautes une par une, en relançant à chaque fois, est le comportement qui fait abandonner les outils stricts.

Les cas répétitifs sont regroupés : cinquante clés manquantes forment un bloc, pas cinquante messages identiques.

§3

Trois niveaux, trois conséquences

Toutes les fautes n'ont pas le même poids. La distinction la plus importante est la deuxième : une traduction en chantier ne doit pas bloquer la publication du site existant.

NiveauEffetNombre
BloquantLa compilation s'arrête. Aucun fichier n'est écrit.40
Bloque la langueSeule la langue concernée n'est pas compilée. Les autres sont publiées normalement.2
AlerteLa compilation continue. Signalé dans le rapport, à traiter.7
ANX

Annexes

robots.txt, sitemap, page 404 — 2 codes

ANX-001 — robots.txt fautifBloquant

Ce que cela signifie. Une directive obsolète, inefficace ou dangereuse.

Pourquoi c'est traité ainsi. Six fautes documentées, dont le blocage des ressources de rendu et le préfixe sans barre finale — « Disallow: /de » bloque aussi /design et /demo.

Comment corriger. Le message nomme la ligne et le motif.

ANX-002 — Page noindex dans le sitemapBloquant

Ce que cela signifie. Une page exclue de l'index figure au sitemap.

Pourquoi c'est traité ainsi. Contradiction : le sitemap propose une page que la page elle-même refuse.

Comment corriger. Retirer la page du sitemap, ou lever son noindex.

BUD

Budgets

poids et nœuds DOM — 2 codes

BUD-001 — Page au-delà de 2 MoBloquant

Ce que cela signifie. Le HTML décompressé dépasse la limite de Googlebot.

Pourquoi c'est traité ainsi. Googlebot récupère les 2 premiers Mo puis interrompt : la suite n'est pas indexée. La limite s'applique aux données DÉCOMPRESSÉES — Brotli n'agrandit pas ce budget.

Comment corriger. Découper la page.

https://developers.google.com/search/docs/crawling-indexing/googlebot

BUD-002 — Nombre de nœuds DOM élevéAlerte

Ce que cela signifie. La page dépasse 800 nœuds.

Pourquoi c'est traité ainsi. Indicateur de coût de rendu, PAS un facteur de classement. Un annuaire dense peut légitimement dépasser le seuil.

Comment corriger. Alerte informative : à arbitrer, pas à corriger mécaniquement.

CMP

Composants

vocabulaire du langage — 5 codes

CMP-001 — Composant inconnuBloquant

Ce que cela signifie. Le type nommé ne fait pas partie du vocabulaire.

Pourquoi c'est traité ainsi. Le langage a un vocabulaire fini : un type inconnu ne peut pas être rendu.

Comment corriger. Le message propose le composant le plus proche, ou liste ceux disponibles.

CMP-002 — Propriété non reconnueBloquant

Ce que cela signifie. Une propriété absente des listes obligatoire et facultative.

Pourquoi c'est traité ainsi. Une faute de frappe tolérée ferait disparaître du contenu EN SILENCE — le cas le plus coûteux, invisible à la compilation comme à la relecture.

Comment corriger. Le message propose la propriété la plus proche et liste les admises.

CMP-003 — Propriété obligatoire absenteBloquant

Ce que cela signifie. Un composant est déclaré sans une propriété qu'il exige.

Pourquoi c'est traité ainsi. Un bouton sans destination, une image sans source : le rendu serait incomplet.

Comment corriger. Ajouter la propriété nommée dans le message.

CMP-004 — Valeur hors vocabulaire ferméBloquant

Ce que cela signifie. Une propriété à liste finie reçoit une valeur non admise.

Pourquoi c'est traité ainsi. Chaque option d'un vocabulaire fermé est correcte par construction. Une valeur libre rouvrirait l'espace des fautes.

Comment corriger. Le message donne la valeur reçue et la liste des valeurs attendues.

CMP-005 — Contenu imbriqué refuséBloquant

Ce que cela signifie. Un composant qui n'accepte pas d'enfants en reçoit.

Pourquoi c'est traité ainsi. Le contenu serait ignoré silencieusement.

Comment corriger. Déplacer le contenu dans un composant conteneur.

CTR

Contraste

calcul WCAG sur les valeurs réelles — 1 code

CTR-001 — Contraste insuffisantBloquant

Ce que cela signifie. Une paire de couleurs descend sous 4,5:1 (texte) ou 3:1 (interface).

Pourquoi c'est traité ainsi. Calculé à chaque compilation sur les valeurs réelles, pas déclaré. Échec WCAG 1.4.3, niveau AA.

Comment corriger. Assombrir le texte ou éclaircir le fond. Le message donne le rapport obtenu et le seuil.

https://www.w3.org/TR/WCAG22/#contrast-minimum

DOC

Document

arbre et hiérarchie des titres — 3 codes

DOC-001 — Saut de niveau de titreBloquant

Ce que cela signifie. Un h3 suit un h1 sans h2 intermédiaire.

Pourquoi c'est traité ainsi. Faute d'accessibilité, pas de référencement : un lecteur d'écran annonce « titre niveau 3 » et l'utilisateur cherche la section qui n'existe pas. WCAG 1.3.1, niveau A.

Comment corriger. Le niveau étant calculé depuis l'arbre, cette faute vient d'un composant mal classé — pas d'une écriture.

https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships

DOC-002 — Zéro ou plusieurs h1Bloquant

Ce que cela signifie. La page produite ne contient pas exactement un h1.

Pourquoi c'est traité ainsi. Vérifié sur les OCTETS PRODUITS, pas sur l'arbre. C'est ce contrôle qui a rattrapé une page à deux h1 que le contrôle d'arbre avait laissé passer.

Comment corriger. Le message cite le texte de chaque h1 trouvé.

DOC-003 — Profondeur supérieure à sixBloquant

Ce que cela signifie. L'imbrication dépasse h6.

Pourquoi c'est traité ainsi. h7 n'existe pas dans la spécification HTML. Une arborescence si profonde est un défaut de conception du contenu.

Comment corriger. Aplatir la structure de la page.

IMG

Images

médiathèque et balise responsive — 7 codes

IMG-001 — Image absente de la médiathèqueBloquant

Ce que cela signifie. Le jeton d'image nommé n'existe pas.

Pourquoi c'est traité ainsi. Les pages nomment un emplacement, jamais un fichier : un jeton inconnu ne peut pas être résolu.

Comment corriger. Le message liste les emplacements connus.

IMG-002 — Texte alternatif absentBloquant

Ce que cela signifie. Une image n'a ni alt ni déclaration décorative.

Pourquoi c'est traité ainsi. Google documente le alt comme « the most important attribute » d'une image. Un alt manquant fait lire le NOM DU FICHIER par le lecteur d'écran — la distinction entre « rien à dire » et « oubli » ne peut pas être devinée.

Comment corriger. Renseigner le alt, ou déclarer l'image décorative explicitement.

https://developers.google.com/search/docs/appearance/google-images

IMG-003 — Dimensions absentesBloquant

Ce que cela signifie. Une image sans width ni height.

Pourquoi c'est traité ainsi. Le navigateur ne connaît pas le rapport d'aspect avant le téléchargement : il réserve zéro pixel puis pousse le contenu. Première cause de décalage de mise en page (CLS).

Comment corriger. Les dimensions viennent de la médiathèque — reconstruire l'entrée.

IMG-004 — Deux images prioritairesBloquant

Ce que cela signifie. Plus d'une image porte fetchpriority="high" sur la même page.

Pourquoi c'est traité ainsi. La priorité est RELATIVE : deux images prioritaires équivalent à aucune.

Comment corriger. Ne garder la priorité que sur l'image du hero.

IMG-005 — Aucune variante de repliBloquant

Ce que cela signifie. L'image n'a ni WebP ni JPEG sous son AVIF.

Pourquoi c'est traité ainsi. Un src AVIF nu est une image cassée sur Safari 16.3 et antérieur.

Comment corriger. Régénérer les variantes de l'image.

IMG-006 — Texte alternatif dupliquéAlerte

Ce que cela signifie. Deux images différentes portent le même texte alternatif.

Pourquoi c'est traité ainsi. Soit une description est trop générique, soit la même photo est entrée deux fois.

Comment corriger. Différencier les descriptions, ou fusionner les entrées.

IMG-007 — Image de partage absenteBloquant

Ce que cela signifie. La propriété « image_partage » d'une page désigne un fichier qui n'existe pas.

Pourquoi c'est traité ainsi. « og:image » est ce que les réseaux sociaux et les messageries affichent quand on partage un lien. Un fichier absent produit un aperçu vide — le lien paraît cassé, et rien ne le signale au moment de la compilation. Constaté ici : 2 pages sur 11 pointaient vers une taille qui n'avait jamais été engendrée.

Comment corriger. Employer une variante qui existe, ou mieux : désigner l'emplacement de médiathèque plutôt qu'un chemin de fichier, pour que le moteur choisisse lui-même la variante disponible.

https://ogp.me/#structured

JET

Jetons de design

vocabulaire fermé des valeurs — 5 codes

JET-001 — Taille de texte sans composante remBloquant

Ce que cela signifie. Une taille en unités de fenêtre ne contient aucun rem ni em.

Pourquoi c'est traité ainsi. Au zoom 200 %, le texte ne grossit pas — il peut même rétrécir. Mesuré sur l'ancien site : un h1 passait de 152 px à 79 px.

Comment corriger. Mélanger rem et vw dans la composante fluide, par exemple clamp(2.9rem, 4rem + 5.9vw, 16rem).

https://www.w3.org/WAI/WCAG22/Techniques/failures/F94

JET-002 — Borne minimale en unités de fenêtreBloquant

Ce que cela signifie. Le premier terme d'un clamp() est en vw, vh, vmin ou vmax.

Pourquoi c'est traité ainsi. Sur un écran étroit le texte devient illisible, et le zoom ne le rattrape pas : la borne basse suit la fenêtre, pas le réglage de l'utilisateur.

Comment corriger. Exprimer la borne minimale en rem.

JET-003 — Composante fluide sans remBloquant

Ce que cela signifie. Le terme central d'un clamp() est en unités de fenêtre pures.

Pourquoi c'est traité ainsi. C'est ce terme qui pilote la taille sur la plage utile. En vw seul, il ignore le zoom du navigateur entre les deux bornes.

Comment corriger. Écrire par exemple 4rem + 5.9vw plutôt que 8vw.

JET-004 — Couleur non analysableBloquant

Ce que cela signifie. La valeur n'est pas une couleur CSS reconnue.

Pourquoi c'est traité ainsi. Le contraste ne peut pas être calculé, donc la conformité WCAG ne peut pas être garantie.

Comment corriger. Utiliser #rrggbb, rgb(), hsl(), oklch() ou transparent.

JET-005 — Jeton inconnuBloquant

Ce que cela signifie. Une valeur nommée qui n'existe dans aucune famille.

Pourquoi c'est traité ainsi. CSS ignore silencieusement une variable inconnue : la règle serait morte, sans erreur et sans effet visible.

Comment corriger. Vérifier l'orthographe. Le message liste les noms valides de la famille.

NAV

Navigateurs

compatibilité des moteurs de rendu — 3 codes

NAV-001 — Règle CSS qui casse un moteurBloquant

Ce que cela signifie. Une propriété interdite figure dans la feuille produite.

Pourquoi c'est traité ainsi. Chaque entrée correspond à un défaut documenté — par exemple overflow-x:hidden sur body, qui crée un conteneur de défilement et casse TOUS les position:sticky de la page.

Comment corriger. Le message nomme la propriété, le motif, et la solution de remplacement.

NAV-002 — Fonctionnalité non interopérableBloquant

Ce que cela signifie. Une propriété Baseline « limited » ou « newly » hors @supports.

Pourquoi c'est traité ainsi. Une propriété « newly » fonctionne chez qui l'a et échoue en silence chez les autres — acceptable pour un embellissement, jamais pour ce dont dépend la lisibilité.

Comment corriger. Placer sous @supports, ou renoncer.

https://web.dev/baseline

NAV-003 — target=_blank sans rel=noopenerBloquant

Ce que cela signifie. Un lien ouvrant un onglet sans protection.

Pourquoi c'est traité ainsi. La page ouverte peut manipuler window.opener.

Comment corriger. Ajouter rel="noopener".

RSP

Mise en page adaptative

débordement, chevauchement, cible tactile, écran bas. Ces défauts ne se voient ni dans le CSS ni à l'œil : ils se mesurent dans un navigateur, boîte par boîte. — 8 codes

RSP-001 — Débordement horizontalBloquant

Ce que cela signifie. Un élément dépasse la largeur du viewport à l'une des classes d'écran.

Pourquoi c'est traité ainsi. Le visiteur doit défiler latéralement pour lire. Sur la classe la plus fréquente de Suisse — 414x896, un quart du trafic mobile — un débordement de quelques pixels suffit à décaler toute la page.

Comment corriger. Neutraliser min-width:auto sur l'élément, ou permettre la césure du mot long.

https://web.dev/articles/responsive-web-design-basics

RSP-002 — Enfant de grille sans min-width neutraliséBloquant

Ce que cela signifie. Un conteneur grid ou flex laisse ses enfants à min-width:auto.

Pourquoi c'est traité ainsi. Par défaut, un élément de grille ne peut pas devenir plus étroit que son mot le plus long. Ce mot impose alors une piste plus large que le conteneur, et la page déborde. Mesuré sur ce site : 91 conteneurs sur 97 étaient exposés. Le défaut ne se déclare qu'au mot long — donc typiquement en allemand.

Comment corriger. Ajouter min-width:0 sur les enfants du conteneur.

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Grid_layout_and_overflow

RSP-003 — Cible tactile sous 24 pxAlerte

Ce que cela signifie. Un lien ou un bouton mesure moins de 24 px dans l'une de ses dimensions.

Pourquoi c'est traité ainsi. Sous 24 px, la cible est trop petite pour être atteinte de façon fiable au doigt. Mesuré sur ce site : des liens à 23 px — l'échec d'un seul pixel est invisible à l'œil et certain à la mesure.

Comment corriger. Augmenter la hauteur de ligne ou le remplissage de la cible.

https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html

RSP-004 — Bloc pleine hauteur sur écran basBloquant

Ce que cela signifie. Un bloc réclame toute la hauteur du viewport sans garde pour les écrans bas.

Pourquoi c'est traité ainsi. Un téléphone en paysage offre moins de 400 px de hauteur — 99,78 % d'entre eux sont sous 480dp. Un bloc plein écran y devient une bande illisible, surmontée d'un menu fixe qui consomme déjà 17 % de la hauteur.

Comment corriger. Encadrer la règle par une requête @media (min-height: 30em).

https://developer.android.com/develop/ui/compose/layouts/adaptive/window-size-classes

RSP-005 — Unité vh sans repli svhBloquant

Ce que cela signifie. Une hauteur est exprimée en vh sans déclaration svh équivalente.

Pourquoi c'est traité ainsi. vh équivaut à lvh : il vaut la hauteur BARRE MASQUÉE. Au chargement, barre visible, un bloc en 100vh est structurellement plus haut que l'espace disponible. Ce n'est pas un défaut de navigateur, c'est le comportement spécifié.

Comment corriger. Écrire min-height:100vh puis min-height:100svh — le moteur ancien garde la première.

https://www.w3.org/TR/css-values-4/#viewport-relative-lengths

RSP-006 — Chevauchement de deux élémentsBloquant

Ce que cela signifie. Deux éléments porteurs de contenu occupent la même surface à l'écran.

Pourquoi c'est traité ainsi. Un menu « fixed » ne pousse rien : sans réserve de hauteur, le contenu passe DESSOUS. Mesuré ici en paysage 852x393 : le logo recouvrait « Kaina Expérience » sur 59x18 px et le bouton du menu recouvrait « Genève & Lausanne » sur 42x18 px. Aucun contrôle de débordement ne voit ce défaut — il faut comparer les boîtes deux à deux.

Comment corriger. Réserver la hauteur du menu fixe (padding-block sur le premier bloc), ou sortir l'élément du flux recouvert.

https://developer.mozilla.org/en-US/docs/Web/CSS/position#fixed_positioning

RSP-007 — Panneau surgissant sous un ancêtre fonduBloquant

Ce que cela signifie. Un panneau surgissant — menu déroulant, infobulle, boîte de dialogue — descend d'un élément portant « mix-blend-mode », « opacity » sous 1 ou un filtre, sans neutraliser cet héritage.

Pourquoi c'est traité ainsi. « mix-blend-mode » a DEUX effets, et le second est le piège. (1) Il impose son mode de composition à toute la descendance : le fond du panneau se combine avec ce qui est derrière, et le contenu de la page le traverse. (2) Il crée un CONTEXTE D'EMPILEMENT : le « z-index » du panneau ne vaut plus que DANS l'ancêtre fondu, et tout élément de la page ayant son propre z-index se dessine par-dessus. Constaté ici : neutraliser la composition sur le panneau a bien rendu son fond opaque — et il restait dessous, parce que le vrai problème était l'empilement créé par ce même fondu.

Comment corriger. Porter le fondu sur les ENFANTS qui en ont besoin (le logo, les liens), jamais sur le conteneur qui abrite le panneau. L'ancêtre ne crée alors plus de contexte d'empilement, et le panneau retrouve celui du document. Compléter par « mix-blend-mode: normal » et « isolation: isolate » sur le panneau lui-même.

https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode

RSP-008 — Jalon de rupture inconnuBloquant

Ce que cela signifie. La feuille de style emploie un jalon {{RUPTURE:...}} absent de responsive.json.

Pourquoi c'est traité ainsi. Un jalon non substitué produirait « @media (min-width: {{RUPTURE:x}}) », requête invalide que le navigateur ignore SANS RIEN DIRE. Toute la mise en page de cette classe d'écran disparaîtrait en silence.

Comment corriger. Ajouter la classe à responsive.json, ou corriger le nom du jalon.

SRC

Sources

fichiers et structure du dépôt — 3 codes

SRC-001 — Fichier source introuvableBloquant

Ce que cela signifie. Un fichier attendu du dépôt est absent.

Pourquoi c'est traité ainsi. Le moteur ne devine pas une source manquante.

Comment corriger. Le message donne le chemin attendu.

SRC-002 — JSON invalideBloquant

Ce que cela signifie. Un fichier source n'est pas du JSON analysable.

Pourquoi c'est traité ainsi. Virgule finale, guillemet non fermé, commentaire — le JSON ne les tolère pas.

Comment corriger. Le message donne le fichier, la ligne et la colonne.

SRC-003 — Langue absente du catalogueBloquant

Ce que cela signifie. Un fichier txt_XX.json existe sans entrée dans le catalogue.

Pourquoi c'est traité ainsi. Le convertisseur ignore l'endonyme, le drapeau et le sens de lecture de cette langue.

Comment corriger. Ajouter la langue à site/langues/catalogue.json.

TET

En-tête

ordre du <head> et métadonnées — 4 codes

TET-001 — charset au-delà de 1024 octetsBloquant

Ce que cela signifie. La balise meta charset ne tient pas dans le premier kilo-octet.

Pourquoi c'est traité ainsi. Le navigateur redémarre l'analyse du document avec le bon encodage, et jette tout le travail déjà fait.

Comment corriger. Raccourcir ce qui précède dans le <head>.

https://html.spec.whatwg.org/multipage/semantics.html#charset

TET-002 — Viewport absent ou bloquant le zoomBloquant

Ce que cela signifie. Pas de meta viewport, ou présence de user-scalable=no.

Pourquoi c'est traité ainsi. Sans viewport, la page est rendue à 980 px puis réduite. Avec user-scalable=no, l'utilisateur ne peut plus zoomer : échec WCAG 1.4.4.

Comment corriger. Émettre width=device-width,initial-scale=1 sans restriction d'échelle.

TET-003 — Texte de page manquantBloque la langue

Ce que cela signifie. Une référence @clé ne trouve pas son texte.

Pourquoi c'est traité ainsi. La page afficherait la clé au lieu du mot.

Comment corriger. Ajouter la clé au fichier de la langue concernée.

TET-004 — Bloc de texte obligatoire absentAlerte

Ce que cela signifie. Le fichier de la langue maîtresse ne contient pas l'une des clés que tout site doit porter : mentions légales, données personnelles, cookies.

Pourquoi c'est traité ainsi. En Suisse, la LPD (art. 19) impose d'informer la personne concernée de la collecte de ses données. Un site sans page de politique de confidentialité ni mentions légales expose son exploitant. Ces textes doivent être TOKENISÉS dès le départ : les ajouter après coup oblige à reprendre chaque fichier de langue.

Comment corriger. Ajouter les clés au fichier de la langue maîtresse. Le contenu reste à la charge de l'exploitant — le CMS garantit l'emplacement, pas la rédaction juridique.

https://www.fedlex.admin.ch/eli/cc/2022/491/fr

TRA

Traductions

cohérence entre les fichiers de langue — 4 codes

TRA-001 — Clé absente d'une traductionBloque la langue

Ce que cela signifie. Une clé existe dans la langue maîtresse mais pas dans cette langue.

Pourquoi c'est traité ainsi. Le convertisseur ne comble pas le trou avec la langue maîtresse : une page mi-traduite est un signal de mauvaise qualité, et un mélange de deux langues sur une même page est pire qu'une page absente.

Comment corriger. Ajouter la clé au fichier de la langue, avec sa traduction.

https://developers.google.com/search/docs/specialty/international/localized-versions

TRA-002 — Clé en trop dans une traductionAlerte

Ce que cela signifie. Une clé existe dans cette langue mais plus dans la langue maîtresse.

Pourquoi c'est traité ainsi. Elle n'est plus utilisée : c'est le reste d'un texte supprimé. Sans nettoyage, les fichiers de langue divergent lentement.

Comment corriger. Supprimer la clé, ou la rétablir dans la langue maîtresse si sa disparition est un oubli.

TRA-003 — Valeur identique à la langue maîtresseAlerte

Ce que cela signifie. Un texte long est rigoureusement identique à l'original.

Pourquoi c'est traité ainsi. Probable oubli de traduction. Certains cas sont légitimes — noms propres, URL, prix — d'où l'alerte plutôt que le blocage.

Comment corriger. Traduire, ou ignorer si la valeur ne doit pas l'être.

TRA-004 — Métadonnée SEO non traduiteAlerte

Ce que cela signifie. Un titre ou une description SEO est identique à la langue maîtresse.

Pourquoi c'est traité ainsi. C'est le seul point où une balise du <head> a un effet mesuré et documenté : un <title> non traduit déclenche activement sa réécriture par Google.

Comment corriger. Rédiger le titre et la description dans la langue cible — 30 à 60 caractères pour le titre, 120 à 155 pour la description.

https://developers.google.com/search/docs/appearance/title-link

TYP

Typographie mesurée sur la police

interligne minimal calculé sur l'encre réelle des glyphes, présence des fichiers. Un interligne au jugé fait percuter les accents. — 2 codes

TYP-001 — Interligne sous le minimum mesuré de la policeBloquant

Ce que cela signifie. Un jeton d'interligne est inférieur à la hauteur d'encre réelle des caractères employés.

Pourquoi c'est traité ainsi. Les accents de la ligne du bas percutent les lettres de la ligne du haut. CSS ne rogne jamais l'encre : quand line-height est inférieur à la hauteur du contenu, l'interligne devient négatif et les glyphes se chevauchent. Le défaut est invisible sur un texte sans accent et apparaît à la traduction.

Comment corriger. Porter le jeton au minimum indiqué. Le message donne le caractère le plus haut et le plus bas responsables, et le chevauchement en pixels.

https://www.w3.org/TR/CSS22/visudet.html#line-height

TYP-002 — Fichier de police absent ou illisibleBloquant

Ce que cela signifie. Le dossier des polices est vide, ou un fichier ne peut pas être décodé.

Pourquoi c'est traité ainsi. Sans les fichiers, l'interligne minimal ne peut pas être mesuré et la règle @font-face ne peut pas être engendrée : le site se rendrait avec la police de repli, à des métriques différentes.

Comment corriger. Déposer les fichiers .woff2 dans site/design/polices/.

§4

Éprouvé sur un cas réel

La traduction allemande a été produite avec sept défauts délibérés — cinq clés supprimées, deux valeurs laissées en français — pour vérifier que le moteur les nomme toutes, et correctement.

Résultat : 7 défauts posés, 7 détectés, chacun avec son fichier et sa ligne.

Défaut poséCode renduEffet
accueil.concept.chapoTRA-001allemand non compilé ; français et anglais publiés normalement
accueil.pour-qui.titreTRA-001
kaina.description-seoTRA-001
pass-experience.titre-seoTRA-001
temoignage-camille.presentation.titreTRA-001
partenaires.inscription.chapoTRA-003alerte — le site est publié
temoignages.presentation.chapoTRA-003alerte — le site est publié

Le test a aussi montré la reprise. Les cinq clés rétablies, l'allemand a compilé — sauf une, laissée en français exprès : elle est passée en TRA-004, distinct de TRA-003 parce qu'un <title> non traduit est le seul cas où une balise du <head> a un effet mesuré et documenté.

§5

Un catalogue qui décrit des contrôles réels

Un catalogue qui décrirait des contrôles inexistants serait pire qu'une absence de catalogue : il donnerait une fausse assurance.

tests/audit_erreurs.py fabrique un défaut par code et vérifie que le moteur le refuse vraiment.

$ python3 tests/audit_erreurs.py

  37 codes au catalogue · 21 éprouvés par un cas réel

  ✓ JET-001  Taille de texte sans composante rem
  ✓ JET-002  Borne minimale en unités de fenêtre
  ✓ JET-003  Composante fluide sans rem
  ✓ CTR-001  Contraste insuffisant
  ✓ DOC-001  Saut de niveau de titre
  ✓ DOC-002  Zéro ou plusieurs h1
  ✓ NAV-001  Règle CSS qui casse un moteur
  ✓ IMG-002  Texte alternatif absent
  ✓ ANX-001  robots.txt fautif
  …

  21 détectés · 0 non détectés · 16 hors de ce banc

Ce banc a trouvé un vrai défaut. Le contrôle des tailles ne vérifiait que la borne minimale d'un clamp(). Or c'est le terme central qui pilote la taille sur la plage utile : clamp(2rem, 8vw, 5rem) passait le contrôle tout en échouant au zoom. Le code JET-003 est né de cette découverte.