@surea11y/core 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +382 -81
- package/docs/ENGINE_OPTIONS.md +66 -1
- package/docs/I18N.md +3 -3
- package/docs/OUTPUT_SCHEMA.md +5 -5
- package/docs/RULE_TAXONOMY.md +9 -8
- package/docs/TROUBLESHOOTING.md +2 -2
- package/docs/WCAG_CONFORMANCE.md +1 -1
- package/package.json +2 -2
- package/src/checks/automatic/aria-allowed-attr.js +47 -24
- package/src/core.js +978 -39
- package/src/i18n/fr.js +314 -1
package/src/i18n/fr.js
CHANGED
|
@@ -523,5 +523,318 @@ module.exports = {
|
|
|
523
523
|
"labelInName_title": "Intitulé dans le nom : le nom accessible contient le texte visible",
|
|
524
524
|
"labelInName_description": "Vérifie que lorsqu’un composant possède un libellé textuel visible, le nom accessible contient ce libellé visible (WCAG 2.5.3).",
|
|
525
525
|
"labelInName_summary_fail": "{{element}} : le libellé visible « {{visibleLabel}} » (source : {{labelSource}}) n’est pas inclus dans le nom accessible (source : {{nameMechanism}}).",
|
|
526
|
-
"labelInName_hint_fail": "Modifiez aria-label ou aria-labelledby (ou le texte du libellé visible) afin que le nom accessible inclue le libellé visible."
|
|
526
|
+
"labelInName_hint_fail": "Modifiez aria-label ou aria-labelledby (ou le texte du libellé visible) afin que le nom accessible inclue le libellé visible.",
|
|
527
|
+
"ariaRolesValid_title": "L’attribut role doit être un rôle ARIA valide et non abstrait",
|
|
528
|
+
"ariaRolesValid_description": "Vérifie qu’un attribut role=\"\" explicite correspond à un rôle WAI-ARIA réel et non abstrait.",
|
|
529
|
+
"ariaRolesValid_summary_invalid": "role=\"{{role}}\" n’est pas un rôle ARIA reconnu.",
|
|
530
|
+
"ariaRolesValid_hint_invalid": "Utilisez un rôle ARIA valide, ou retirez l’attribut role si aucun ne s’applique.",
|
|
531
|
+
"ariaRolesValid_summary_abstract": "role=\"{{role}}\" est un rôle ARIA abstrait, qui ne doit pas être utilisé directement.",
|
|
532
|
+
"ariaRolesValid_hint_abstract": "Remplacez ce rôle abstrait par un rôle concret adapté au composant/à la structure.",
|
|
533
|
+
"ariaDeprecatedRole_title": "L’attribut role ne doit pas utiliser un rôle ARIA obsolète ou interdit aux auteurs",
|
|
534
|
+
"ariaDeprecatedRole_description": "Vérifie qu’un attribut role=\"\" explicite n’utilise pas un rôle rendu obsolète par la spécification WAI-ARIA, ni un rôle réservé à un usage interne à l’agent utilisateur (ex. role=\"generic\").",
|
|
535
|
+
"ariaDeprecatedRole_summary_fail": "Cet élément utilise role=\"{{role}}\", que les auteurs ne doivent pas déclarer explicitement.",
|
|
536
|
+
"ariaDeprecatedRole_hint_fail": "{{guidance}}",
|
|
537
|
+
"ariaValidAttr_title": "Les attributs aria-* doivent être des attributs ARIA réels et définis",
|
|
538
|
+
"ariaValidAttr_description": "Vérifie que chaque nom d’attribut aria-* présent dans le DOM est un attribut réel défini par la spécification WAI-ARIA.",
|
|
539
|
+
"ariaValidAttr_summary_fail": "{{attr}} n’est pas un attribut ARIA reconnu.",
|
|
540
|
+
"ariaValidAttr_hint_fail": "Corrigez le nom de l’attribut (vérifiez les fautes de frappe), ou retirez-le s’il n’est pas nécessaire.",
|
|
541
|
+
"ariaValidAttrValue_title": "Les valeurs des attributs aria-* doivent correspondre à leur type déclaré",
|
|
542
|
+
"ariaValidAttrValue_description": "Vérifie que chaque attribut aria-* reconnu a une valeur conforme à son type déclaré par WAI-ARIA (booléen, tri-état, jeton, entier, nombre ou référence d’ID).",
|
|
543
|
+
"ariaValidAttrValue_summary_fail": "{{attr}}=\"{{value}}\" n’est pas une valeur valide pour cet attribut.",
|
|
544
|
+
"ariaValidAttrValue_hint_fail": "Utilisez une valeur correspondant au type attendu de l’attribut (consultez la spécification WAI-ARIA pour cet attribut).",
|
|
545
|
+
"ariaAllowedAttr_title": "Les attributs aria-* doivent être autorisés pour le rôle de l’élément",
|
|
546
|
+
"ariaAllowedAttr_description": "Vérifie que chaque attribut aria-* reconnu présent sur un élément ayant un rôle explicite est soit globalement pris en charge, soit pris en charge par ce rôle.",
|
|
547
|
+
"ariaAllowedAttr_summary_fail": "{{attr}} n’est pas autorisé sur role=\"{{role}}\".",
|
|
548
|
+
"ariaAllowedAttr_hint_fail": "Retirez cet attribut, ou utilisez un rôle qui le prend en charge.",
|
|
549
|
+
"ariaProhibitedAttr_title": "Les attributs de nommage ARIA ne doivent pas être utilisés sur des rôles qui les interdisent",
|
|
550
|
+
"ariaProhibitedAttr_description": "Vérifie que aria-label/aria-labelledby ne sont pas présents sur des rôles WAI-ARIA dont la spécification interdit explicitement le nommage ARIA (ex. generic, emphasis, strong, paragraph).",
|
|
551
|
+
"ariaProhibitedAttr_summary_fail": "{{attr}} est interdit sur role=\"{{role}}\".",
|
|
552
|
+
"ariaProhibitedAttr_hint_fail": "Retirez cet attribut ; ce rôle ne doit pas porter de nom accessible.",
|
|
553
|
+
"ariaRequiredAttr_title": "Les rôles avec un état/une propriété ARIA requis doivent le porter",
|
|
554
|
+
"ariaRequiredAttr_description": "Vérifie que les éléments ayant un rôle explicite portent chaque état/propriété aria-* requis, non ambigu et indépendant du contexte, pour ce rôle (ex. role=\"checkbox\" doit avoir aria-checked).",
|
|
555
|
+
"ariaRequiredAttr_summary_fail": "{{attr}} est requis pour role=\"{{role}}\", mais est absent.",
|
|
556
|
+
"ariaRequiredAttr_hint_fail": "Ajoutez cet attribut avec une valeur valide pour ce rôle.",
|
|
557
|
+
"ariaAllowedRole_title": "Le rôle explicite doit être autorisé pour son élément hôte",
|
|
558
|
+
"ariaAllowedRole_description": "Vérifie qu’un attribut role=\"\" explicite fait partie des rôles que la spécification ARIA-in-HTML autorise pour l’élément hôte (ex. role=\"tab\" n’est pas autorisé sur <nav>).",
|
|
559
|
+
"ariaAllowedRole_summary_fail": "role=\"{{role}}\" n’est pas autorisé sur <{{element}}>.",
|
|
560
|
+
"ariaAllowedRole_hint_fail": "Utilisez un rôle autorisé pour cet élément, ou changez l’élément hôte.",
|
|
561
|
+
"ariaRequiredChildren_title": "Les rôles conteneurs doivent posséder au moins un rôle enfant requis",
|
|
562
|
+
"ariaRequiredChildren_description": "Vérifie que les rôles conteneurs disposant d’une entrée documentée « éléments possédés requis » (list, listbox, menu, radiogroup, table, grid, tablist, tree, row, ...) contiennent au moins un descendant, ou un élément référencé par aria-owns, ayant un rôle possédé acceptable.",
|
|
563
|
+
"ariaRequiredChildren_summary_fail": "role=\"{{role}}\" ne possède aucun enfant ayant l’un des rôles requis : {{requiredRoles}}.",
|
|
564
|
+
"ariaRequiredChildren_hint_fail": "Ajoutez un descendant (ou un élément référencé par aria-owns) ayant l’un des rôles possédés requis.",
|
|
565
|
+
"ariaProhibitedChildren_title": "Les rôles conteneurs ne doivent pas posséder d’enfant ayant un rôle interdit",
|
|
566
|
+
"ariaProhibitedChildren_description": "Vérifie que chaque enfant possédé (dans l’arbre d’accessibilité) d’un rôle conteneur (list, listbox, menu, menubar, radiogroup, rowgroup, table, grid, treegrid, tablist, tree, row) a l’un des rôles possédés autorisés par ce rôle.",
|
|
567
|
+
"ariaProhibitedChildren_summary_fail": "Cet élément a le rôle role=\"{{childRole}}\", qui n’est pas un rôle enfant possédé autorisé par le conteneur englobant role=\"{{containerRole}}\".",
|
|
568
|
+
"ariaProhibitedChildren_hint_fail": "Retirez ou modifiez ce rôle afin qu’il corresponde à l’un des rôles possédés autorisés du conteneur ({{allowedRoles}}), ou déplacez cet élément hors du conteneur {{containerRole}}.",
|
|
569
|
+
"ariaProhibitedChildren_summary_fail_roleless": "Cet élément n’a pas de rôle explicite mais porte {{attr}}, ce qui en fait un véritable nœud de l’arbre d’accessibilité qui n’est pas un enfant possédé autorisé du conteneur englobant role=\"{{containerRole}}\".",
|
|
570
|
+
"ariaProhibitedChildren_hint_fail_roleless": "Retirez {{attr}} (ou la relation de possession avec le conteneur role=\"{{containerRole}}\"), ou attribuez à cet élément role=\"presentation\"/\"none\" s’il n’est pas censé constituer son propre nœud dans l’arbre d’accessibilité.",
|
|
571
|
+
"ariaRequiredParent_title": "Les rôles exigeant un rôle de contexte spécifique doivent se trouver dans ce contexte",
|
|
572
|
+
"ariaRequiredParent_description": "Vérifie que les rôles disposant d’une entrée documentée « rôle de contexte requis » (listitem, option, tab, treeitem, row, cell, ...) ont un ancêtre, ou un propriétaire aria-owns, ayant un rôle de contexte acceptable.",
|
|
573
|
+
"ariaRequiredParent_summary_fail": "role=\"{{role}}\" exige un rôle de contexte parmi : {{requiredRoles}}, qui n’a pas été trouvé.",
|
|
574
|
+
"ariaRequiredParent_hint_fail": "Placez cet élément à l’intérieur d’un élément ayant un rôle de contexte acceptable (ou référencez-le depuis celui-ci via aria-owns).",
|
|
575
|
+
"deprecatedElements_title": "Les éléments obsolètes non interruptibles (<blink>, <marquee>) ne doivent pas être utilisés",
|
|
576
|
+
"deprecatedElements_description": "Vérifie que les éléments HTML obsolètes et non standards dont le contenu clignotant/défilant ne peut pas être mis en pause, arrêté ou masqué par l’utilisateur (<blink>, <marquee>) ne sont pas présents.",
|
|
577
|
+
"deprecatedElements_summary_fail": "Le contenu de <{{element}}> ne peut pas être mis en pause, arrêté ou masqué par l’utilisateur.",
|
|
578
|
+
"deprecatedElements_hint_fail": "Retirez cet élément ; utilisez à la place un contenu statique, ou une animation dotée d’un contrôle de pause/arrêt accessible à l’utilisateur.",
|
|
579
|
+
"iframeNamePresent_title": "Les cadres ont un nom accessible",
|
|
580
|
+
"iframeNamePresent_description": "Vérifie que les éléments <iframe>/<frame> exposent un nom accessible non vide via aria-label, aria-labelledby, ou l’attribut title.",
|
|
581
|
+
"iframeNamePresent_summary_fail": "Ce <{{element}}> n’a pas de nom accessible.",
|
|
582
|
+
"iframeNamePresent_hint_fail": "Ajoutez un attribut title (ou aria-label/aria-labelledby) décrivant le contenu ou l’objet du cadre.",
|
|
583
|
+
"iframeTitleUnique_title": "Les titres de cadres doivent être uniques",
|
|
584
|
+
"iframeTitleUnique_description": "Vérifie qu’aucun <iframe>/<frame> dans le périmètre analysé ne partage la même valeur d’attribut title qu’un autre.",
|
|
585
|
+
"iframeTitleUnique_summary_fail": "Le titre « {{title}} » de ce <{{element}}> n’est pas unique parmi les cadres de cette page.",
|
|
586
|
+
"iframeTitleUnique_hint_fail": "Donnez à chaque cadre un titre distinct décrivant son contenu ou son objet spécifique.",
|
|
587
|
+
"iframeFocusableContent_title": "Les cadres avec tabindex=\"-1\" ne doivent pas contenir de contenu focalisable",
|
|
588
|
+
"iframeFocusableContent_description": "Vérifie que les éléments <iframe>/<frame> de même origine avec tabindex=\"-1\" ne contiennent pas de contenu focalisable, car les navigateurs ne propagent pas cette restriction au document intégré du cadre.",
|
|
589
|
+
"iframeFocusableContent_summary_fail": "Ce <{{element}}> a tabindex=\"-1\" mais son contenu contient des éléments focalisables, qui restent accessibles au clavier.",
|
|
590
|
+
"iframeFocusableContent_hint_fail": "Retirez le contenu focalisable du cadre, ou retirez tabindex=\"-1\" si le cadre est censé être accessible.",
|
|
591
|
+
"tableHeadersAttrValid_title": "L’attribut headers d’une cellule de tableau doit référencer des cellules d’en-tête valides",
|
|
592
|
+
"tableHeadersAttrValid_description": "Vérifie que chaque id de l’attribut headers d’un <td>/<th> correspond à un élément <th> du même tableau (ni absent, ni un élément autre que th, ni lui-même).",
|
|
593
|
+
"tableHeadersAttrValid_summary_fail": "L’attribut headers de ce <{{element}}> référence des cellules d’en-tête invalides : {{invalidIds}}.",
|
|
594
|
+
"tableHeadersAttrValid_hint_fail": "Mettez à jour l’attribut headers afin que chaque id désigne un élément <th> du même tableau.",
|
|
595
|
+
"tableThHasDataCells_title": "Les éléments <th> doivent décrire au moins une cellule de données",
|
|
596
|
+
"tableThHasDataCells_description": "Vérifie qu’un tableau contenant des éléments <th> contient aussi au moins une cellule de données <td> que ces en-têtes décrivent.",
|
|
597
|
+
"tableThHasDataCells_summary_fail": "Ce tableau a des cellules d’en-tête mais aucune cellule de données à décrire.",
|
|
598
|
+
"tableThHasDataCells_hint_fail": "Ajoutez des cellules de données (<td>) au tableau, ou retirez les cellules d’en-tête si le tableau n’a pas de données.",
|
|
599
|
+
"ariaHiddenBody_title": "Le <body> du document ne doit pas être aria-hidden",
|
|
600
|
+
"ariaHiddenBody_description": "Vérifie que <body> n’a pas aria-hidden=\"true\", ce qui retirerait toute la page de l’arbre d’accessibilité.",
|
|
601
|
+
"ariaHiddenBody_summary_fail": "Le corps du document a aria-hidden=\"true\", ce qui masque toute la page aux technologies d’assistance.",
|
|
602
|
+
"ariaHiddenBody_hint_fail": "Retirez aria-hidden de <body>. Masquez des éléments spécifiques à la place, si c’était l’intention.",
|
|
603
|
+
"listChildrenValid_title": "Les listes ne doivent contenir directement que des éléments de liste",
|
|
604
|
+
"listChildrenValid_description": "Vérifie que les éléments <ul>/<ol> n’ont comme enfants directs que <li>, <script> ou <template>.",
|
|
605
|
+
"listChildrenValid_summary_fail": "Ce <{{element}}> contient un enfant direct qui n’est pas un élément de liste : {{invalidChildren}}.",
|
|
606
|
+
"listChildrenValid_hint_fail": "N’utilisez que <li> (ou <script>/<template>) comme enfants directs de <ul>/<ol> ; déplacez tout autre balisage à l’intérieur d’un <li>.",
|
|
607
|
+
"listitemParentValid_title": "Les éléments de liste doivent se trouver à l’intérieur d’un conteneur de liste",
|
|
608
|
+
"listitemParentValid_description": "Vérifie que les éléments <li> sont contenus par <ul>, <ol>, ou un élément ayant role=\"list\".",
|
|
609
|
+
"listitemParentValid_summary_fail": "Le parent de cet élément de liste (<{{parentElement}}>) n’est pas un conteneur de liste.",
|
|
610
|
+
"listitemParentValid_hint_fail": "Placez ce <li> à l’intérieur d’un <ul>/<ol>, ou donnez à son parent role=\"list\".",
|
|
611
|
+
"definitionListChildrenValid_title": "Les listes de définitions doivent être structurées correctement",
|
|
612
|
+
"definitionListChildrenValid_description": "Vérifie que les éléments <dl> ne contiennent directement que des groupes <dt>/<dd> (éventuellement enveloppés dans un seul <div>), <script>, <template>, ou <style>.",
|
|
613
|
+
"definitionListChildrenValid_summary_fail_invalidChild": "Cette liste de définitions contient un enfant direct ou enveloppé qui ne fait pas partie d’un groupe dt/dd : {{invalidChildren}}.",
|
|
614
|
+
"definitionListChildrenValid_hint_fail_invalidChild": "N’utilisez que <dt>/<dd> (éventuellement enveloppés dans un seul <div>), <script>, <template>, ou <style> à l’intérieur de <dl>.",
|
|
615
|
+
"definitionListChildrenValid_summary_fail_noDtDd": "Cette liste de définitions n’a aucun groupe terme/définition <dt>/<dd>.",
|
|
616
|
+
"definitionListChildrenValid_hint_fail_noDtDd": "Ajoutez au moins une paire <dt>/<dd> à l’intérieur de ce <dl>.",
|
|
617
|
+
"dlitemParentValid_title": "Les éléments d’une liste de définitions doivent se trouver à l’intérieur d’une liste de définitions",
|
|
618
|
+
"dlitemParentValid_description": "Vérifie que les éléments <dt>/<dd> sont contenus par un <dl>, directement ou via un <div> englobant.",
|
|
619
|
+
"dlitemParentValid_summary_fail": "Le parent (<{{parentElement}}>) de ce <{{element}}> n’est pas une liste de définitions.",
|
|
620
|
+
"dlitemParentValid_hint_fail": "Placez ce <dt>/<dd> à l’intérieur d’un <dl>, directement ou enveloppé dans un seul <div>.",
|
|
621
|
+
"duplicateIdAria_title": "Les ID référencés par ARIA doivent être uniques",
|
|
622
|
+
"duplicateIdAria_description": "Vérifie que toute valeur id référencée par un attribut de référence d’ID ARIA (aria-labelledby, aria-describedby, aria-owns, aria-controls, aria-activedescendant, aria-flowto, aria-errormessage, aria-details) est unique dans le document.",
|
|
623
|
+
"duplicateIdAria_summary_fail": "L’id « {{id}} » est référencé par un attribut ARIA mais est utilisé par {{duplicateCount}} éléments.",
|
|
624
|
+
"duplicateIdAria_hint_fail": "Rendez uniques dans le document les id référencés par des attributs ARIA.",
|
|
625
|
+
"summaryNamePresent_title": "Les éléments summary ont un nom accessible",
|
|
626
|
+
"summaryNamePresent_description": "Vérifie que les éléments <summary> exposent un nom accessible non vide.",
|
|
627
|
+
"summaryNamePresent_summary_fail": "Ce summary n’a pas de nom accessible.",
|
|
628
|
+
"summaryNamePresent_hint_fail": "Fournissez un texte de summary qui ne soit pas masqué aux technologies d’assistance, ou fournissez aria-label ou aria-labelledby.",
|
|
629
|
+
"metaViewportZoomEnabled_title": "La balise meta viewport ne doit pas désactiver le zoom",
|
|
630
|
+
"metaViewportZoomEnabled_description": "Vérifie que <meta name=\"viewport\"> ne définit pas user-scalable=no ni maximum-scale en dessous de 2 (200 %).",
|
|
631
|
+
"metaViewportZoomEnabled_summary_fail": "Cette balise meta viewport restreint la capacité de l’utilisateur à zoomer ({{reasons}}).",
|
|
632
|
+
"metaViewportZoomEnabled_hint_fail": "Retirez user-scalable=no et tout maximum-scale inférieur à 2 du contenu de la balise meta viewport.",
|
|
633
|
+
"metaRefreshTimingAbsent_title": "La page ne doit pas utiliser un rafraîchissement meta minuté",
|
|
634
|
+
"metaRefreshTimingAbsent_description": "Vérifie que <meta http-equiv=\"refresh\"> n’impose pas un délai positif de 20 heures ou moins.",
|
|
635
|
+
"metaRefreshTimingAbsent_summary_fail": "Cette page se rafraîchit automatiquement après {{delay}} secondes.",
|
|
636
|
+
"metaRefreshTimingAbsent_hint_fail": "Retirez le rafraîchissement meta minuté, ou proposez un moyen pour les utilisateurs de le désactiver, de le prolonger ou de le mettre en pause avant qu’il ne se déclenche.",
|
|
637
|
+
"meterNamePresent_title": "Les éléments meter ont un nom accessible",
|
|
638
|
+
"meterNamePresent_description": "Vérifie que les éléments avec role=\"meter\" exposent un nom accessible non vide.",
|
|
639
|
+
"meterNamePresent_summary_fail": "Ce meter n’a pas de nom accessible.",
|
|
640
|
+
"meterNamePresent_hint_fail": "Fournissez un texte pour le meter qui ne soit pas masqué aux technologies d’assistance, ou fournissez aria-label ou aria-labelledby.",
|
|
641
|
+
"progressbarNamePresent_title": "Les barres de progression ont un nom accessible",
|
|
642
|
+
"progressbarNamePresent_description": "Vérifie que les éléments avec role=\"progressbar\" exposent un nom accessible non vide.",
|
|
643
|
+
"progressbarNamePresent_summary_fail": "Cette barre de progression n’a pas de nom accessible.",
|
|
644
|
+
"progressbarNamePresent_hint_fail": "Fournissez un texte pour la barre de progression qui ne soit pas masqué aux technologies d’assistance, ou fournissez aria-label ou aria-labelledby.",
|
|
645
|
+
"tooltipNamePresent_title": "Les infobulles ont un nom accessible",
|
|
646
|
+
"tooltipNamePresent_description": "Vérifie que les éléments avec role=\"tooltip\" exposent un nom accessible non vide.",
|
|
647
|
+
"tooltipNamePresent_summary_fail": "Cette infobulle n’a pas de nom accessible.",
|
|
648
|
+
"tooltipNamePresent_hint_fail": "Fournissez un texte pour l’infobulle qui ne soit pas masqué aux technologies d’assistance, ou fournissez aria-label ou aria-labelledby.",
|
|
649
|
+
"serverSideImageMapAbsent_title": "Les images ne doivent pas utiliser une carte d’image côté serveur",
|
|
650
|
+
"serverSideImageMapAbsent_description": "Vérifie que les éléments <img> ne portent pas l’attribut ismap (les cartes d’image côté serveur n’ont pas d’équivalent utilisable au clavier).",
|
|
651
|
+
"serverSideImageMapAbsent_summary_fail": "Cette image utilise une carte d’image côté serveur, qui n’a pas d’équivalent utilisable au clavier.",
|
|
652
|
+
"serverSideImageMapAbsent_hint_fail": "Remplacez la carte d’image côté serveur (ismap) par une carte d’image côté client (<map>/<area>) ou par des liens/boutons accessibles distincts.",
|
|
653
|
+
"formControlSingleLabel_title": "Les contrôles de formulaire ne doivent pas avoir plusieurs étiquettes",
|
|
654
|
+
"formControlSingleLabel_description": "Vérifie qu’un contrôle de formulaire est associé à au plus un <label> (par imbrication ou par label[for]).",
|
|
655
|
+
"formControlSingleLabel_summary_fail": "Ce <{{element}}> est associé à {{labelCount}} étiquettes.",
|
|
656
|
+
"formControlSingleLabel_hint_fail": "Conservez une seule <label> par contrôle de formulaire (soit en l’enveloppant, soit en la référençant via for/id).",
|
|
657
|
+
"nestedInteractiveControlsAbsent_title": "Les contrôles interactifs ne doivent pas être imbriqués",
|
|
658
|
+
"nestedInteractiveControlsAbsent_description": "Vérifie qu’un contrôle interactif (lien, bouton, contrôle de formulaire, ou rôle de widget ARIA) ne contient pas un autre contrôle interactif.",
|
|
659
|
+
"nestedInteractiveControlsAbsent_summary_fail": "Ce <{{element}}> contient un ou plusieurs contrôles interactifs imbriqués : {{nestedElements}}.",
|
|
660
|
+
"nestedInteractiveControlsAbsent_hint_fail": "Déplacez le(s) contrôle(s) interactif(s) imbriqué(s) hors de cet élément ; les contrôles interactifs imbriqués ne sont pas utilisables de façon fiable via les technologies d’assistance.",
|
|
661
|
+
"bypassBlocksPresent_title": "La page doit proposer un moyen de contourner les blocs répétés",
|
|
662
|
+
"bypassBlocksPresent_description": "Vérifie que la page dispose d’au moins un mécanisme reconnu de contournement des blocs répétés (WCAG 2.4.1) : un point de repère main, un lien d’ancrage fonctionnel vers la même page, ou un titre.",
|
|
663
|
+
"bypassBlocksPresent_summary_fail": "Cette page n’a aucun moyen reconnu de contourner les blocs de contenu répétés.",
|
|
664
|
+
"bypassBlocksPresent_hint_fail": "Ajoutez un point de repère main (<main> ou role=\"main\"), un lien « aller au contenu » fonctionnel, ou des éléments de titre que les technologies d’assistance peuvent utiliser pour passer le contenu répété.",
|
|
665
|
+
"landmarkBannerIsTopLevel_title": "Le point de repère banner doit être de premier niveau",
|
|
666
|
+
"landmarkBannerIsTopLevel_description": "Vérifie que le point de repère banner (role=\"banner\" ou un <header> non imbriqué) n’est pas imbriqué dans un autre point de repère.",
|
|
667
|
+
"landmarkBannerIsTopLevel_summary_cantTell": "Ce point de repère banner est imbriqué dans un autre point de repère.",
|
|
668
|
+
"landmarkBannerIsTopLevel_hint_cantTell": "Déplacez le point de repère banner (header/role=\"banner\") afin qu’il ne soit contenu par aucun autre point de repère ; un banner doit être une région de premier niveau de la page.",
|
|
669
|
+
"landmarkContentinfoIsTopLevel_title": "Le point de repère contentinfo doit être de premier niveau",
|
|
670
|
+
"landmarkContentinfoIsTopLevel_description": "Vérifie que le point de repère contentinfo (role=\"contentinfo\" ou un <footer> non imbriqué) n’est pas imbriqué dans un autre point de repère.",
|
|
671
|
+
"landmarkContentinfoIsTopLevel_summary_cantTell": "Ce point de repère contentinfo est imbriqué dans un autre point de repère.",
|
|
672
|
+
"landmarkContentinfoIsTopLevel_hint_cantTell": "Déplacez le point de repère contentinfo (footer/role=\"contentinfo\") afin qu’il ne soit contenu par aucun autre point de repère ; contentinfo doit être une région de premier niveau de la page.",
|
|
673
|
+
"landmarkMainIsTopLevel_title": "Le point de repère main doit être de premier niveau",
|
|
674
|
+
"landmarkMainIsTopLevel_description": "Vérifie que le point de repère main (role=\"main\" ou <main>) n’est pas imbriqué dans un autre point de repère.",
|
|
675
|
+
"landmarkMainIsTopLevel_summary_cantTell": "Ce point de repère main est imbriqué dans un autre point de repère.",
|
|
676
|
+
"landmarkMainIsTopLevel_hint_cantTell": "Déplacez le point de repère main (<main>/role=\"main\") afin qu’il ne soit contenu par aucun autre point de repère ; main doit être une région de premier niveau de la page.",
|
|
677
|
+
"landmarkNoDuplicateBanner_title": "La page ne doit pas avoir plus d’un point de repère banner",
|
|
678
|
+
"landmarkNoDuplicateBanner_description": "Vérifie qu’au plus un point de repère banner (role=\"banner\" ou un <header> non imbriqué) existe sur la page.",
|
|
679
|
+
"landmarkNoDuplicateBanner_summary_cantTell": "Cette page a plus d’un point de repère banner.",
|
|
680
|
+
"landmarkNoDuplicateBanner_hint_cantTell": "Ne conservez qu’un seul point de repère banner (header/role=\"banner\") par page.",
|
|
681
|
+
"landmarkNoDuplicateContentinfo_title": "La page ne doit pas avoir plus d’un point de repère contentinfo",
|
|
682
|
+
"landmarkNoDuplicateContentinfo_description": "Vérifie qu’au plus un point de repère contentinfo (role=\"contentinfo\" ou un <footer> non imbriqué) existe sur la page.",
|
|
683
|
+
"landmarkNoDuplicateContentinfo_summary_cantTell": "Cette page a plus d’un point de repère contentinfo.",
|
|
684
|
+
"landmarkNoDuplicateContentinfo_hint_cantTell": "Ne conservez qu’un seul point de repère contentinfo (footer/role=\"contentinfo\") par page.",
|
|
685
|
+
"landmarkNoDuplicateMain_title": "La page ne doit pas avoir plus d’un point de repère main",
|
|
686
|
+
"landmarkNoDuplicateMain_description": "Vérifie qu’au plus un point de repère main (role=\"main\" ou <main>) existe sur la page.",
|
|
687
|
+
"landmarkNoDuplicateMain_summary_cantTell": "Cette page a plus d’un point de repère main.",
|
|
688
|
+
"landmarkNoDuplicateMain_hint_cantTell": "Ne conservez qu’un seul point de repère main (<main>/role=\"main\") par page.",
|
|
689
|
+
"landmarkOneMain_title": "La page devrait avoir un point de repère main",
|
|
690
|
+
"landmarkOneMain_description": "Vérifie que la page a au moins un point de repère main (role=\"main\" ou <main>).",
|
|
691
|
+
"landmarkOneMain_summary_cantTell_missing": "Cette page n’a aucun point de repère main.",
|
|
692
|
+
"landmarkOneMain_hint_cantTell_missing": "Ajoutez un point de repère main (<main> ou role=\"main\") autour du contenu principal de la page.",
|
|
693
|
+
"landmarkUnique_title": "Les points de repère partageant le même rôle doivent avoir des noms uniques",
|
|
694
|
+
"landmarkUnique_description": "Vérifie que lorsque deux points de repère ou plus partagent le même rôle, chacun a un nom accessible distinct.",
|
|
695
|
+
"landmarkUnique_summary_cantTell_duplicateName": "Ce point de repère {{role}} partage son nom accessible avec un autre point de repère {{role}}.",
|
|
696
|
+
"landmarkUnique_summary_cantTell_bothUnnamed": "Ce point de repère {{role}} n’a pas de nom accessible, et plus d’un point de repère {{role}} sans nom existe sur cette page.",
|
|
697
|
+
"landmarkUnique_hint_cantTell": "Donnez à chaque point de repère {{role}} un nom distinct via aria-label ou aria-labelledby.",
|
|
698
|
+
"emptyHeading_title": "Les titres ne doivent pas être vides",
|
|
699
|
+
"emptyHeading_description": "Vérifie que les éléments de titre (<h1>-<h6> ou role=\"heading\") ont un nom accessible non vide.",
|
|
700
|
+
"emptyHeading_summary_cantTell": "Ce titre n’a pas de nom accessible.",
|
|
701
|
+
"emptyHeading_hint_cantTell": "Ajoutez du contenu textuel (ou aria-label/aria-labelledby) à ce titre, ou retirez-le s’il n’est pas nécessaire.",
|
|
702
|
+
"headingOrder_title": "Les niveaux de titre ne doivent pas sauter un niveau",
|
|
703
|
+
"headingOrder_description": "Vérifie que les niveaux de titre n’augmentent que d’un niveau à la fois, dans l’ordre du document.",
|
|
704
|
+
"headingOrder_summary_cantTell": "Ce titre passe du niveau {{fromLevel}} au niveau {{toLevel}}, en sautant un niveau.",
|
|
705
|
+
"headingOrder_hint_cantTell": "Utilisez des niveaux de titre consécutifs (ne sautez pas de niveau en descendant dans la hiérarchie) afin que le plan du document reste prévisible.",
|
|
706
|
+
"pageHasHeadingOne_title": "La page devrait avoir un titre de niveau un",
|
|
707
|
+
"pageHasHeadingOne_description": "Vérifie que la page a au moins un titre de niveau un (<h1> ou role=\"heading\" avec aria-level=\"1\").",
|
|
708
|
+
"pageHasHeadingOne_summary_cantTell": "Cette page n’a aucun titre de niveau un.",
|
|
709
|
+
"pageHasHeadingOne_hint_cantTell": "Ajoutez un titre de niveau un (<h1> ou role=\"heading\" aria-level=\"1\") identifiant le contenu principal de la page.",
|
|
710
|
+
"accesskeys_title": "Les valeurs accesskey doivent être uniques",
|
|
711
|
+
"accesskeys_description": "Vérifie qu’aucun élément de la page ne partage la même valeur d’attribut accesskey qu’un autre.",
|
|
712
|
+
"accesskeys_summary_cantTell": "L’accesskey de cet élément est partagée avec un autre élément de la page.",
|
|
713
|
+
"accesskeys_hint_cantTell": "Rendez chaque valeur accesskey unique sur l’ensemble de la page.",
|
|
714
|
+
"scopeAttrValid_title": "L’attribut scope doit avoir une valeur valide",
|
|
715
|
+
"scopeAttrValid_description": "Vérifie que scope=\"...\" vaut row, col, rowgroup, ou colgroup.",
|
|
716
|
+
"scopeAttrValid_summary_cantTell": "Cette valeur d’attribut scope n’est pas reconnue.",
|
|
717
|
+
"scopeAttrValid_hint_cantTell": "Utilisez row, col, rowgroup, ou colgroup pour l’attribut scope.",
|
|
718
|
+
"tabindex_title": "tabindex ne devrait pas être supérieur à 0",
|
|
719
|
+
"tabindex_description": "Vérifie que les valeurs de tabindex sont égales à 0 ou négatives, jamais un nombre positif.",
|
|
720
|
+
"tabindex_summary_cantTell": "Cet élément a un tabindex positif, ce qui modifie l’ordre naturel de tabulation.",
|
|
721
|
+
"tabindex_hint_cantTell": "Utilisez tabindex=\"0\" (ou une valeur négative pour le retirer de l’ordre de tabulation) plutôt qu’un nombre positif ; corrigez l’ordre dans le DOM si un ordre de tabulation différent est nécessaire.",
|
|
722
|
+
"emptyTableHeader_title": "Les cellules d’en-tête de tableau ne doivent pas être vides",
|
|
723
|
+
"emptyTableHeader_description": "Vérifie que les éléments <th> ont un contenu textuel visible — un en-tête nommé uniquement via aria-label/aria-labelledby est aussi signalé, car la prise en charge réelle par les lecteurs d’écran/navigateurs est incohérente.",
|
|
724
|
+
"emptyTableHeader_summary_cantTell": "Cette cellule d’en-tête de tableau n’a pas de nom accessible.",
|
|
725
|
+
"emptyTableHeader_hint_cantTell": "Ajoutez du contenu textuel (ou aria-label/aria-labelledby) à cette cellule d’en-tête, ou retirez-la si elle n’est pas nécessaire.",
|
|
726
|
+
"emptyTableHeader_summary_cantTell_ariaOnly": "Cette cellule d’en-tête de tableau n’a pas de texte visible — son seul nom accessible provient de aria-label/aria-labelledby, que des combinaisons réelles de lecteur d’écran/navigateur (ex. NVDA+Firefox, iOS VoiceOver+Safari) sont connues pour ignorer sur les éléments <th>.",
|
|
727
|
+
"emptyTableHeader_hint_cantTell_ariaOnly": "Ajoutez du contenu textuel visible à cette cellule d’en-tête (en plus de, ou à la place de, aria-label/aria-labelledby) — le texte visible est le seul mécanisme de nommage confirmé comme fonctionnel sur les lecteurs d’écran testés.",
|
|
728
|
+
"labelTitleOnly_title": "Les contrôles de formulaire ne devraient pas utiliser title comme seule étiquette",
|
|
729
|
+
"labelTitleOnly_description": "Vérifie qu’un contrôle de formulaire ayant un attribut title possède aussi une véritable étiquette (élément label, aria-label, ou aria-labelledby).",
|
|
730
|
+
"labelTitleOnly_summary_cantTell": "Ce contrôle de formulaire repose sur l’attribut title comme seule étiquette.",
|
|
731
|
+
"labelTitleOnly_hint_cantTell": "Ajoutez une <label> visible (ou aria-label/aria-labelledby) en plus de, ou à la place de, l’attribut title.",
|
|
732
|
+
"imageRedundantAlt_title": "Le texte alt d’une image ne doit pas dupliquer le texte visible adjacent",
|
|
733
|
+
"imageRedundantAlt_description": "Vérifie que le texte alt d’un <img> n’est pas identique à un autre texte visible déjà présent dans son élément parent immédiat.",
|
|
734
|
+
"imageRedundantAlt_summary_cantTell": "Le texte alt de cette image duplique un autre texte visible juste à côté.",
|
|
735
|
+
"imageRedundantAlt_hint_cantTell": "Videz le texte alt (alt=\"\") si l’image est purement décorative à côté du texte, ou supprimez la duplication redondante.",
|
|
736
|
+
"tableDuplicateName_title": "La légende d’un tableau ne doit pas dupliquer son attribut summary",
|
|
737
|
+
"tableDuplicateName_description": "Vérifie que le texte de la <caption> d’un <table> n’est pas identique à son attribut summary (obsolète).",
|
|
738
|
+
"tableDuplicateName_summary_cantTell": "La légende de ce tableau duplique son attribut summary.",
|
|
739
|
+
"tableDuplicateName_hint_cantTell": "Retirez l’attribut summary redondant, ou faites en sorte qu’il apporte une information différente de la légende.",
|
|
740
|
+
"metaViewportLarge_title": "La balise meta viewport devrait permettre un zoom jusqu’à 500 %",
|
|
741
|
+
"metaViewportLarge_description": "Vérifie que <meta name=\"viewport\"> ne définit pas user-scalable=no ni maximum-scale en dessous de 5 (500 %).",
|
|
742
|
+
"metaViewportLarge_summary_cantTell": "Cette balise meta viewport restreint le zoom en dessous de l’objectif de bonne pratique de 500 %.",
|
|
743
|
+
"metaViewportLarge_hint_cantTell": "Retirez user-scalable=no et augmentez maximum-scale à au moins 5 (500 %) si possible.",
|
|
744
|
+
"presentationRoleConflict_title": "Un rôle de présentation ne doit pas entrer en conflit avec un attribut ARIA global ou la focalisabilité",
|
|
745
|
+
"presentationRoleConflict_description": "Vérifie que role=\"presentation\"/\"none\" (y compris le rôle presentation implicite d’un <img alt=\"\">) n’est pas combiné avec un attribut ARIA global (aria-label, aria-hidden, aria-describedby, ...) ou avec la focalisabilité (tabindex/native).",
|
|
746
|
+
"presentationRoleConflict_summary_cantTell": "Cet élément role=\"{{role}}\" a aussi une condition conflictuelle ({{attrs}}), qui restaure son rôle implicite et annule l’intention présentationnelle.",
|
|
747
|
+
"presentationRoleConflict_hint_cantTell": "Retirez le(s) attribut(s) de nommage conflictuel(s) et/ou la focalisabilité (tabindex/native) si l’élément doit rester présentationnel, ou retirez role=\"presentation\"/\"none\" s’il doit être exposé aux technologies d’assistance.",
|
|
748
|
+
"region_title": "Le contenu de la page devrait se trouver à l’intérieur d’un point de repère",
|
|
749
|
+
"region_description": "Vérifie que les enfants directs de <body> ayant un contenu textuel visible sont contenus dans un point de repère.",
|
|
750
|
+
"region_summary_cantTell": "Ce contenu n’est contenu dans aucun point de repère.",
|
|
751
|
+
"region_hint_cantTell": "Déplacez ce contenu à l’intérieur d’un point de repère (main, nav, aside, une section nommée, etc.).",
|
|
752
|
+
"skipLink_title": "Un lien d’évitement doit avoir une cible qui se résout",
|
|
753
|
+
"skipLink_description": "Vérifie que le fragment href d’un lien « aller au... » se résout vers un élément réel du document.",
|
|
754
|
+
"skipLink_summary_cantTell": "La cible de ce lien d’évitement n’existe pas.",
|
|
755
|
+
"skipLink_hint_cantTell": "Faites pointer le href du lien d’évitement vers un id qui existe dans le document, ou ajoutez l’élément cible manquant.",
|
|
756
|
+
"autocompleteValid_title": "L’attribut autocomplete doit être une valeur d’auto-remplissage valide",
|
|
757
|
+
"autocompleteValid_description": "Vérifie qu’un attribut autocomplete non vide vaut « on »/« off » ou une liste de jetons d’auto-remplissage bien formée.",
|
|
758
|
+
"autocompleteValid_summary_fail": "Cette valeur d’attribut autocomplete n’est pas une valeur d’auto-remplissage valide.",
|
|
759
|
+
"autocompleteValid_hint_fail": "Utilisez « on »/« off », ou une liste de jetons d’auto-remplissage valide (ex. « shipping street-address », « cc-number »).",
|
|
760
|
+
"htmlXmlLangMismatch_title": "lang et xml:lang ne doivent pas se contredire",
|
|
761
|
+
"htmlXmlLangMismatch_description": "Vérifie que les attributs lang et xml:lang de l’élément <html> déclarent la même langue principale, lorsque les deux sont présents.",
|
|
762
|
+
"htmlXmlLangMismatch_summary_fail": "Les attributs lang (« {{lang}} ») et xml:lang (« {{xmlLang}} ») déclarent des langues différentes.",
|
|
763
|
+
"htmlXmlLangMismatch_hint_fail": "Faites en sorte que lang et xml:lang déclarent la même langue principale, ou retirez l’attribut obsolète xml:lang.",
|
|
764
|
+
"avoidInlineSpacing_title": "Un style en ligne ne doit pas forcer l’espacement du texte avec !important",
|
|
765
|
+
"avoidInlineSpacing_description": "Vérifie qu’un style en ligne ne définit pas line-height, letter-spacing, ou word-spacing avec !important, ce qui bloque les surcharges d’espacement de texte par l’utilisateur.",
|
|
766
|
+
"avoidInlineSpacing_summary_fail": "Le style en ligne de cet élément force {{properties}} avec !important, bloquant les surcharges d’espacement de texte par l’utilisateur.",
|
|
767
|
+
"avoidInlineSpacing_hint_fail": "Retirez !important de line-height/letter-spacing/word-spacing dans les styles en ligne afin que les utilisateurs puissent surcharger l’espacement du texte.",
|
|
768
|
+
"metaRefreshNoExceptions_title": "La page ne doit utiliser aucun rafraîchissement meta (AAA)",
|
|
769
|
+
"metaRefreshNoExceptions_description": "Vérifie que <meta http-equiv=\"refresh\"> n’est présent en aucun cas, quel que soit le délai — la variante plus stricte, de niveau AAA, de la vérification de niveau A qui ne porte que sur les délais positifs.",
|
|
770
|
+
"metaRefreshNoExceptions_summary_fail": "Cette page utilise un rafraîchissement meta, un changement de contexte automatique non initié par l’utilisateur.",
|
|
771
|
+
"metaRefreshNoExceptions_hint_fail": "Retirez le rafraîchissement meta ; déclenchez la redirection/le rafraîchissement uniquement en réponse à une action de l’utilisateur.",
|
|
772
|
+
"validLang_title": "L’attribut lang d’un élément doit être syntaxiquement valide",
|
|
773
|
+
"validLang_description": "Vérifie que tout élément (autre que la racine <html>) ayant un attribut lang non vide utilise une étiquette de langue syntaxiquement valide.",
|
|
774
|
+
"validLang_summary_fail": "Cette valeur d’attribut lang (« {{value}} ») n’est pas une étiquette de langue syntaxiquement valide.",
|
|
775
|
+
"validLang_hint_fail": "Utilisez une étiquette de langue BCP47 valide (ex. « fr », « es-MX »).",
|
|
776
|
+
"linkInTextBlock_title": "Les liens dans des blocs de texte doivent être distinguables du texte environnant sans se fier uniquement à la couleur",
|
|
777
|
+
"linkInTextBlock_description": "Vérifie qu’un lien à l’intérieur d’un bloc de texte est visuellement distinguable du texte environnant par un soulignement, une différence de graisse/style de police, ou un contraste de couleur suffisant (>= 3:1) — pas seulement par la couleur.",
|
|
778
|
+
"linkInTextBlock_summary_fail": "Ce lien dans un bloc de texte se distingue du texte environnant uniquement par la couleur.",
|
|
779
|
+
"linkInTextBlock_hint_fail": "Ajoutez un soulignement, une différence de graisse/style de police, ou augmentez le contraste de couleur entre le lien et le texte environnant à au moins 3:1.",
|
|
780
|
+
"noAutoplayAudio_title": "Un audio en lecture automatique devrait proposer un mécanisme de pause/arrêt ou de contrôle du volume",
|
|
781
|
+
"noAutoplayAudio_description": "Signale les éléments <audio>/<video> qui se lancent automatiquement sans être coupés et sans attribut controls natif, pour une revue manuelle par rapport à l’exemption de 3 secondes de la WCAG 1.4.2.",
|
|
782
|
+
"noAutoplayAudio_summary_cantTell": "Cet élément lit un audio automatiquement sans mécanisme natif de pause/arrêt ou de contrôle du volume.",
|
|
783
|
+
"noAutoplayAudio_hint_cantTell": "Si ce clip dure plus de 3 secondes, ajoutez un attribut controls (ou un mécanisme personnalisé équivalent) afin que les utilisateurs puissent le mettre en pause/l’arrêter ou contrôler son volume indépendamment du volume du système.",
|
|
784
|
+
"videoCaption_title": "Une vidéo préenregistrée devrait proposer une piste de sous-titres",
|
|
785
|
+
"videoCaption_description": "Signale les éléments <video> sans enfant <track kind=\"captions\"|\"subtitles\">, pour une revue manuelle visant à déterminer si la vidéo a une piste audio nécessitant des sous-titres.",
|
|
786
|
+
"videoCaption_summary_cantTell": "Cette vidéo n’a aucune piste de sous-titres (captions ou subtitles).",
|
|
787
|
+
"videoCaption_hint_cantTell": "Si cette vidéo a une piste audio porteuse d’information, ajoutez un <track kind=\"captions\" src=\"...\"> avec le contenu sous-titré.",
|
|
788
|
+
"scrollableRegionFocusable_title": "Les régions défilantes sans contenu focalisable devraient être focalisables au clavier",
|
|
789
|
+
"scrollableRegionFocusable_description": "Signale les éléments dont le CSS déclare overflow:auto/scroll, qui ne contiennent aucun descendant focalisable, et qui ne sont pas eux-mêmes focalisables au clavier, pour une revue manuelle visant à déterminer si leur contenu déborde réellement et nécessite un accès au défilement au clavier.",
|
|
790
|
+
"scrollableRegionFocusable_summary_cantTell": "Cet élément déclare overflow:auto/scroll, n’a aucun descendant focalisable, et n’est pas lui-même focalisable au clavier.",
|
|
791
|
+
"scrollableRegionFocusable_hint_cantTell": "Si le contenu de cette région déborde réellement, ajoutez tabindex=\"0\" (et une étiquette adaptée) afin que les utilisateurs du clavier puissent la focaliser et faire défiler avec les flèches.",
|
|
792
|
+
"identicalLinksSamePurpose_title": "Les liens partageant le même nom accessible devraient mener à la même destination",
|
|
793
|
+
"identicalLinksSamePurpose_description": "Signale les groupes de liens qui partagent le même nom accessible mais mènent à plus d’une destination distincte, pour une revue manuelle visant à déterminer s’ils servent le même objectif.",
|
|
794
|
+
"identicalLinksSamePurpose_summary_cantTell": "Ce lien partage un nom accessible avec d’autres liens de la page qui mènent à une destination différente.",
|
|
795
|
+
"identicalLinksSamePurpose_hint_cantTell": "Assurez-vous que les liens ayant le même texte servent le même objectif, ou rendez le texte du lien suffisamment distinct pour décrire chaque destination.",
|
|
796
|
+
"ariaBrailleEquivalent_title": "aria-braillelabel/aria-brailleroledescription doivent avoir un équivalent non braille",
|
|
797
|
+
"ariaBrailleEquivalent_description": "Vérifie que les éléments utilisant aria-braillelabel ont aussi un nom accessible ordinaire, et que ceux utilisant aria-brailleroledescription ont aussi aria-roledescription.",
|
|
798
|
+
"ariaBrailleEquivalent_summary_fail": "Cet élément a {{attr}} mais pas {{requires}}, son équivalent non braille.",
|
|
799
|
+
"ariaBrailleEquivalent_hint_fail": "{{attr}} est un complément spécifique au braille, pas un remplacement — fournissez aussi {{requires}}.",
|
|
800
|
+
"ariaConditionalAttr_title": "aria-errormessage exige que aria-invalid soit défini à une valeur autre que false",
|
|
801
|
+
"ariaConditionalAttr_description": "Vérifie que les éléments ayant aria-errormessage ont aussi aria-invalid défini à « true », « grammar », ou « spelling » — sinon le message d’erreur est retiré de l’arbre d’accessibilité.",
|
|
802
|
+
"ariaConditionalAttr_summary_fail": "Cet élément a aria-errormessage mais aria-invalid est absent ou « false », donc le message d’erreur n’est pas exposé.",
|
|
803
|
+
"ariaConditionalAttr_hint_fail": "Définissez aria-invalid à « true » (ou « grammar »/« spelling ») chaque fois que aria-errormessage doit être exposé aux technologies d’assistance.",
|
|
804
|
+
"ariaCheckedStateMismatch_title": "L’aria-checked d’une case à cocher/d’un bouton radio natif devrait correspondre à son état réel",
|
|
805
|
+
"ariaCheckedStateMismatch_description": "Signale un <input type=\"checkbox\">/<input type=\"radio\"> natif dont la valeur explicite d’aria-checked ne correspond pas à son état réel (coché/indéterminé), pour une revue manuelle.",
|
|
806
|
+
"ariaCheckedStateMismatch_summary_cantTell": "La valeur d’aria-checked de cet élément ne correspond pas à son état réel (coché/indéterminé).",
|
|
807
|
+
"ariaCheckedStateMismatch_hint_cantTell": "Définissez aria-checked pour qu’il corresponde à l’état réel de l’élément, ou retirez-le — une case à cocher/un bouton radio natif expose déjà cet état sans lui.",
|
|
808
|
+
"cssOrientationLock_title": "Le CSS ne doit pas verrouiller la page à une seule orientation",
|
|
809
|
+
"cssOrientationLock_description": "Vérifie qu’aucune règle @media (orientation: portrait|landscape) ne définit un transform: rotate(...) sur la page, une technique connue pour contourner l’orientation de l’appareil.",
|
|
810
|
+
"cssOrientationLock_summary_fail": "Une media query « {{mediaText}} » fait pivoter « {{selectorText}} », verrouillant la page à une seule orientation.",
|
|
811
|
+
"cssOrientationLock_hint_fail": "Retirez la transformation rotate() de la media query d’orientation ; laissez la page répondre naturellement à l’orientation de l’appareil au lieu de forcer une rotation visuelle.",
|
|
812
|
+
"ariaText_title": "Les éléments role=\"text\" ne devraient avoir aucun descendant focalisable",
|
|
813
|
+
"ariaText_description": "Vérifie que les éléments ayant role=\"text\" ne contiennent aucun descendant focalisable (lien, bouton, contrôle de formulaire, tabindex, iframe, ou contenteditable).",
|
|
814
|
+
"ariaText_summary_cantTell": "Cet élément role=\"text\" contient un descendant focalisable.",
|
|
815
|
+
"ariaText_hint_cantTell": "Retirez role=\"text\" (ou retirez le descendant focalisable) — une région de « texte brut » ne devrait pas contenir de contenu focalisable.",
|
|
816
|
+
"focusOrderSemantics_title": "Les éléments ajoutés à l’ordre de tabulation devraient avoir une sémantique interactive",
|
|
817
|
+
"focusOrderSemantics_description": "Signale les éléments ayant tabindex >= 0 dont le rôle explicite est un rôle structurel/documentaire non interactif (ex. heading, list, region, presentation), pour une revue manuelle.",
|
|
818
|
+
"focusOrderSemantics_summary_cantTell": "Cet élément est dans l’ordre de tabulation (tabindex=\"{{tabindex}}\") mais a un rôle non interactif (« {{role}} »).",
|
|
819
|
+
"focusOrderSemantics_hint_cantTell": "Retirez tabindex si cet élément n’est pas censé être interactif, ou utilisez un rôle interactif correspondant à son comportement réel.",
|
|
820
|
+
"pAsHeading_title": "Un <p> stylé pour ressembler à un titre devrait probablement être un véritable titre",
|
|
821
|
+
"pAsHeading_description": "Signale les éléments <p> courts dont tout le texte est en gras et affiché à >= 18px, pour une revue manuelle visant à déterminer si un véritable élément de titre devrait être utilisé à la place.",
|
|
822
|
+
"pAsHeading_summary_cantTell": "Ce paragraphe est entièrement en gras et affiché à une taille évoquant un titre.",
|
|
823
|
+
"pAsHeading_hint_cantTell": "Si ce texte introduit une nouvelle section, utilisez un véritable élément de titre (<h1>-<h6> ou role=\"heading\") plutôt que de styler un paragraphe pour qu’il y ressemble.",
|
|
824
|
+
"tableFakeCaption_title": "La première ligne d’un tableau ne devrait pas tenir lieu de véritable <caption>",
|
|
825
|
+
"tableFakeCaption_description": "Signale les tableaux sans <caption> dont la première ligne a une seule cellule non vide alors que les autres lignes ont plusieurs cellules, pour une revue manuelle visant à déterminer si cette cellule fait office de légende factice.",
|
|
826
|
+
"tableFakeCaption_summary_cantTell": "Ce tableau n’a pas de <caption>, mais sa première ligne est une cellule unique placée au-dessus de lignes à plusieurs cellules — elle fait peut-être office de légende factice.",
|
|
827
|
+
"tableFakeCaption_hint_cantTell": "Si cette cellule est censée décrire le tableau, utilisez un véritable élément <caption> plutôt qu’une cellule isolée en première ligne.",
|
|
828
|
+
"tdHasHeader_title": "Les cellules de données des grands tableaux doivent avoir un en-tête associé",
|
|
829
|
+
"tdHasHeader_description": "Vérifie que chaque <td> d’un tableau grand et simple (sans colspan/rowspan) a un en-tête associé — via un attribut headers, un <th> de colonne implicite au-dessus, ou un <th> de ligne implicite à sa gauche.",
|
|
830
|
+
"tdHasHeader_summary_fail": "Cette cellule de données n’a pas d’en-tête associé (pas d’attribut headers, pas de <th> de colonne au-dessus, pas de <th> de ligne à gauche).",
|
|
831
|
+
"tdHasHeader_hint_fail": "Ajoutez un attribut headers référençant le(s) id du/des <th> pertinent(s), ou restructurez le tableau afin que cette cellule ait un en-tête de ligne/colonne implicite.",
|
|
832
|
+
"mouseOnlyEventHandlers_title": "Les gestionnaires d’événements en ligne réservés au pointeur devraient avoir un équivalent accessible au clavier",
|
|
833
|
+
"mouseOnlyEventHandlers_description": "Signale les éléments ayant un gestionnaire d’événement en ligne réservé au pointeur (onmouseover, onmouseout, onmousedown, onmouseup, ondblclick, onmousemove, onmouseenter, onmouseleave) sans équivalent accessible au clavier (onkeydown/onkeyup/onkeypress/onfocus/onblur), pour une revue manuelle.",
|
|
834
|
+
"mouseOnlyEventHandlers_summary_cantTell": "Cet élément a {{attrs}} mais aucun gestionnaire équivalent accessible au clavier.",
|
|
835
|
+
"mouseOnlyEventHandlers_hint_cantTell": "Ajoutez onkeydown/onkeyup/onkeypress (ou onfocus/onblur pour un comportement déclenché au survol) afin que cette fonctionnalité soit aussi accessible au clavier.",
|
|
836
|
+
"linkNameQuality_title": "Le texte des liens devrait être descriptif, pas générique",
|
|
837
|
+
"linkNameQuality_description": "Signale les liens dont le nom accessible complet est une formule connue comme non descriptive (ex. « cliquez ici », « en savoir plus », « plus »), pour une revue manuelle visant à déterminer si l’objet du lien est clair sans contexte supplémentaire.",
|
|
838
|
+
"linkNameQuality_summary_cantTell": "Le nom accessible de ce lien (« {{name}} ») est une formule générique et non descriptive.",
|
|
839
|
+
"linkNameQuality_hint_cantTell": "Faites en sorte que le texte du lien lui-même décrive sa destination/son objet (ex. « Télécharger le guide tarifaire 2026 » plutôt que « Télécharger »), ou confirmez que le contexte environnant rend déjà l’objet clair.",
|
|
527
840
|
}
|