Blog ·
Un nom qui ne se traduit pas
Neuf langues disaient neuf choses différentes d’une même clause de clé étrangère. Huit étaient des traductions correctes, et c’était tout le problème.
Par Provibr
Nous publions chaque article en neuf langues. Un lecteur qui parcourait l’une d’elles a remarqué quelque chose qui paraît anodin une fois écrit et qui a demandé deux rondes pour être réparé correctement : une phrase au sujet d’une clé étrangère disait une chose différente dans chaque langue, et les neuf avaient raison.
La phrase explique pourquoi une ligne enfant que l’on nettoie ne doit pas emporter avec elle l’attente de son parent. Dans le schéma, cela tient en une clause, et la clause porte un nom.
Huit traductions correctes et aucun nom
Voici à quoi ressemblait la même clause à travers le catalogue avant que nous n’y touchions.
| Langue | Ce que disait la phrase |
|---|---|
| Anglais | set null rather than cascade |
| Néerlandais | op leegmaken en niet op meeverwijderen |
| Allemand | auf null setzen statt auf kaskadieren |
| Espagnol | pone a nulo en lugar de propagar el borrado |
| Français | mise à nul, pas cascade |
| Italien | impostata a nullo invece che a cascata |
| Portugais | anula em vez de propagar a eliminação |
| Roumain | pusă pe null și nu în cascadă |
| Ukrainien | ставить null, а не каскадує |
Chacune de ces phrases est une bonne phrase. Le néerlandais est sans doute la meilleure écriture de la liste ; il explique le comportement à quelqu’un qui n’a jamais vu un schéma. C’est aussi celle qui est la plus loin d’être utilisable, parce qu’un lecteur qui veut vérifier ce que nous avons réellement fait n’a rien à taper.
Les deux choses que l’on écrit dans un schéma Postgres sont SET NULL et CASCADE. Ce ne sont pas des descriptions d’un comportement, ce sont les identifiants de ce comportement, et la description d’un identifiant n’est pas un identifiant.
Le défaut était dans la source
Il est tentant de traiter cela comme huit erreurs de traduction. C’est une seule erreur de source, et le lire ainsi est ce qui a rendu la réparation petite.
L’anglais disait set null rather than cascade, en minuscules, au fil de la phrase, sans marquage d’aucune sorte. Un traducteur à qui l’on tend cela produit de la prose, parce que c’est ce que c’est. Chacun des huit a fait son travail correctement sur le matériau qu’on lui avait donné.
Le changement n’est donc pas huit corrections. C’est une seule décision de forme, appliquée neuf fois, et elle change l’anglais aussi.
La question de forme a été tranchée par la mesure, pas par le goût
Faut-il écrire SET NULL en majuscules, ou set null en minuscules ? Les deux se défendent dans l’abstrait, et l’abstrait est exactement l’endroit où ce débat ne finit jamais.
Nous avons donc regardé ce que le reste du corpus fait déjà du SQL entre accents graves. Il y a neuf occurrences : WHERE deux fois, UPDATE deux fois, DROP deux fois, un DELETE seul, un SELECT 1 dans une vérification de supervision, et un FOR UPDATE SKIP LOCKED. Toutes en majuscules.
Il y a aussi des jetons en minuscules entre accents graves qui ressemblent à des contre-exemples et n’en sont pas. Un unique qui se révèle être un drapeau sur l’API de quelqu’un. Un where qui est le nom d’une constante en JavaScript. Un null qui est une valeur plutôt qu’une clause.
Ce qui donne la vraie règle, et elle ne porte pas sur les majuscules. La distinction est entre un mot-clé et un nom. Un mot-clé du langage s’écrit en majuscules parce que c’est ainsi que le langage s’écrit ; un nom qui lui ressemble par hasard garde la casse que son propriétaire lui a donnée. Trancher sur la seule casse aurait produit la bonne réponse ici pour la mauvaise raison, et la mauvaise réponse ailleurs.
Le corpus rappelle aussi qu’un même jeton peut être deux noms. La plupart des occurrences de DELETE dans nos articles ne sont pas du SQL du tout, c’est la méthode HTTP, dans des choses comme DELETE /servers/{id}. Mêmes lettres, langage différent, et aucune règle sur les majuscules ne les distingue.
Une décision de forme a une portée, et cette portée a un bord
La première ronde a réparé l’article que le lecteur avait lu. Une vérification ensuite a montré qu’un second article faisait la même affirmation au sujet d’un schéma, sur une ligne, sans le jeton, et une seconde ronde s’en est chargée.
Cela mérite d’être dit franchement, parce qu’une décision de forme n’est pas terminée quand le fichier qui l’a provoquée est terminé. Avant cette seconde ronde, une vérification de jetons signalait les deux noms comme simplement absents de l’anglais ; après, elle a produit vingt-quatre décomptes à travers les langues, sans aucun écart.
Le bord est la partie qui a demandé de la réflexion. La règle est cette phrase nomme-t-elle une clause, et non le mot cascade apparaît-il. Dans le même article, plus bas dans le même paragraphe, il y a une phrase au sujet d’une cascade d’une table de courte durée vers une table de longue durée. C’est la description d’une conséquence, pas une référence à une clause, et elle reste de la prose dans ce que la langue dirait naturellement.
Nous avons mesuré cette frontière sur tout le catalogue anglais plutôt que de lui faire confiance : trois formulations qui pourraient plausiblement nommer une clause, cherchées hors des accents graves dans chaque article anglais. Neuf occurrences à ce moment-là, dont cinq dans l’article dont traitait la seconde ronde. Les quatre autres étaient une référence mise à une valeur nulle, un titre de section au sujet du nettoyage à la suppression comme stratégie, une remarque disant qu’une ligne donnée ne participe à aucune cascade, et un 404 sur une demande de suppression. Pas une seule ne nomme une clause. Après les deux rondes, il en reste sept, et l’article que la première ronde a réparé n’apparaît plus du tout dans la liste, ce qui est la confirmation la moins chère qui soit que le changement est allé là où il devait aller.
Ce qui reste à la langue
Les noms sont identiques dans les neuf fichiers. La phrase autour d’eux ne l’est pas, et ne doit pas l’être.
L’allemand dit toujours que la clé étrangère steht auf, le néerlandais staat op, le portugais está em. Le verbe, la préposition et l’ordre des mots appartiennent à la langue. Seuls les deux noms sont fixes, et ils sont fixes parce que ce sont des citations de Postgres plutôt que des affirmations de notre part.
Les parties mécaniques ont tenu. Le rendu produit un véritable élément de code même quand le jeton se trouve à l’intérieur d’un texte en gras, ce qui est le cas dans la liste numérotée à la fin de chaque article. L’espace insécable française devant le deux-points a survécu à une réparation qui a réécrit la clause juste devant elle, ce qui est le genre de chose qui disparaît en silence quand quelqu’un retape une ligne.
Et les différentiels sont la preuve que la règle était assez étroite. Trois lignes ajoutées et trois lignes retirées par fichier dans la première ronde, une ajoutée et une retirée dans la seconde. Une réparation de ce genre qui touche dix lignes a redécoré quelque chose.
Ce que nous noterions
- Huit traductions correctes peuvent tout de même être un défaut. La justesse de la phrase n’est pas la présence du nom.
- Le défaut est en général dans la source. De la prose en entrée, de la prose en sortie, et les traducteurs ne sont pas le problème.
- Un nom est une question de forme, pas une question de langue. On le marque une fois et on le recopie partout.
- Mesurez l’usage maison sur le corpus au lieu d’en débattre dans l’abstrait.
- La distinction est mot-clé contre nom, pas majuscules contre minuscules.
- Un même jeton peut être deux noms. La plupart de nos
DELETEsont du HTTP, pas du SQL. - Tracez la frontière à l’endroit où une phrase nomme une clause, et non là où le mot apparaît.
- Vérifiez l’article jumeau. Une décision de forme a une portée, et elle tient rarement en un seul fichier.
- Laissez le verbe à la langue. Réparer le nom ne veut pas dire réparer la phrase.
- Un petit différentiel est la preuve. Trois lignes ajoutées et trois retirées veut dire que la règle était étroite.
Pour être clair : deux rondes, la première mettant les deux noms dans neuf fichiers à trois lignes ajoutées et trois lignes retirées chacun, la seconde faisant une ligne ajoutée et une retirée sur un second article ; la construction de contenu a produit 886 articles sans aucun avertissement et la vérification de contenu a trouvé 887 fichiers générés sur 887 identiques octet pour octet, la suite web à 4604 verts, la comparaison de jetons à 40 décomptes puis à 24 décomptes sans aucun écart, la comparaison de faits à 296 et 256 sans aucun, le balayage octet sans reproche, et trois garde-fous prouvés rouges avant d’être crus verts. La lecture du corpus a porté sur trois formulations à travers 124 articles anglais. Non prouvé : chaque traduction n’a toujours qu’un seul relecteur, aucun d’eux n’est locuteur natif, et il n’existe aucune vérification navigateur de la façon dont le jeton s’affiche dans les neuf langues.
Issu du travail de plateforme sur Provibr. L’article dont tout cela parlait est L’enfant réveille le parent, ce que neuf catalogues font à un ensemble de contrôles de taille fixe est dans Seize mille clés, neuf langues, et un autre cas où la traduction était correcte et la forme fausse est dans La sélection entoure toute la phrase.