Toutes les notes

, depuis tariqkhalif.me

Trois choses qui ont cassé en ajoutant l'arabe

Un piège à spam, l'espacement des lettres et deux expressions anglaises à la suite ont toutes cassé une fois la page passée de droite à gauche.

Ajouter une version arabe de ce site signifiait poser dir="rtl" sur la page et refléter la mise en page. La majeure partie a simplement fonctionné. Les parties qui ont cassé n'étaient pas les grosses, évidentes, mais de petits morceaux de CSS et de contenu qui avaient tranquillement supposé la gauche vers la droite depuis le début.

1. Le piège à miel

Le formulaire de contact a un champ caché servant de piège à spam : les robots le remplissent, les vraies personnes ne le voient jamais. Il était caché avec position: absolute; left: -9999px;. Sur une page de gauche à droite, ça le range simplement hors de vue, au-delà du bord gauche. En dir="rtl", le début de la ligne se trouve à droite, et un contenu très éloigné vers la gauche devient au contraire un débordement défilable. La page d'accueil arabe s'est retrouvée avec une énorme barre de défilement horizontale, et une capture d'écran sans interface est ressortie comme un champ vide de couleur de fond. La correction est le modèle standard « visuellement caché », qui ne dépend pas du tout de la direction :

.form-honeypot {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  opacity: 0;
}

2. L'espacement des lettres

Les titres de la police d'affichage utilisent du tracking, un espacement supplémentaire entre les caractères. L'arabe est une écriture liée : les lettres se rattachent à leurs voisines, et l'espacement des lettres écarte les jonctions jusqu'à ce que le mot cesse de se lire comme un mot. La correction a été de le ramener à zéro pour tout ce qui est en arabe, et de donner au texte du corps plus d'espace vertical à la place :

:lang(ar) * { letter-spacing: 0 !important; }
:lang(ar) body { line-height: 1.8; }

3. Deux expressions anglaises à la suite

Le héros en arabe se terminait par ...علوم حاسوب في SFU. Vancouver, BC. L'algorithme bidirectionnel du navigateur traite un point et une espace comme neutres, donc SFU et Vancouver, BC ont fusionné en une seule séquence de gauche à droite. La phrase s'affichait avec ses morceaux dans le mauvais ordre : elle se lisait comme SFU. Vancouver, BC flottant au mauvais endroit, avec le point final du mauvais côté. Insérer un mot arabe entre les deux expressions a séparé les séquences : علوم حاسوب في SFU. مقيم في Vancouver, BC. Envelopper chaque expression dans <bdi>, ou ajouter une marque de droite à gauche (U+200F) juste après SFU., aurait aussi corrigé le problème.

Ce qui n'a demandé aucun effort

La majeure partie de la mise en page utilisait déjà des propriétés CSS logiques : margin-inline-start, inset-inline-end, text-align: start. Basculer dir vers rtl a tout reflété gratuitement. Les restes qui utilisaient encore des propriétés physiques, points de chronologie, puces de liste, une flèche de retour, étaient les seules parties à nécessiter une passe. La carte du ciel et les diagrammes restent volontairement de gauche à droite : ce ne sont pas du texte, et les refléter les aurait rendus faux.

La leçon

Les propriétés logiques font de la direction le problème de quelqu'un d'autre. Tout ce qui suppose encore gauche et droite, et non début et fin, est là où se trouvent les bugs.