Blog ·
Un nombre que no se puede traducir
Nueve idiomas dijeron nueve cosas distintas sobre una misma cláusula de clave ajena. Ocho eran traducciones correctas, y ese era justo el problema.
Por Provibr
Publicamos todos los artículos en nueve idiomas. Un lector que estaba trabajándose uno de ellos se fijó en algo que escrito parece trivial y que costó dos rondas arreglar bien: una frase sobre una clave ajena decía una cosa distinta en cada idioma, y las nueve eran ciertas.
La frase explica por qué una fila hija que se está limpiando no debe llevarse con ella la espera de su padre. En el esquema eso es una cláusula, y la cláusula tiene un nombre.
Ocho traducciones correctas y ningún nombre
Así se veía la misma cláusula por todo el catálogo antes de que la tocáramos.
| Idioma | Lo que decía la frase |
|---|---|
| Inglés | set null rather than cascade |
| Neerlandés | op leegmaken en niet op meeverwijderen |
| Alemán | auf null setzen statt auf kaskadieren |
| Español | pone a nulo en lugar de propagar el borrado |
| Francés | mise à nul, pas cascade |
| Italiano | impostata a nullo invece che a cascata |
| Portugués | anula em vez de propagar a eliminação |
| Rumano | pusă pe null și nu în cascadă |
| Ucraniano | ставить null, а не каскадує |
Todas y cada una de ellas son buenas frases. La neerlandesa es, se puede defender, la mejor escritura de la lista; explica el comportamiento a alguien que no ha visto nunca un esquema. Y es también la que está más lejos de ser utilizable, porque un lector que quiera comprobar qué hicimos en realidad no tiene nada que teclear.
Las dos cosas que se escriben en un esquema de Postgres son SET NULL y CASCADE. No son descripciones de un comportamiento, son los identificadores de uno, y la descripción de un identificador no es un identificador.
El defecto estaba en la fuente
Es tentador tratar esto como ocho errores de traducción. Es un error de fuente, y leerlo así es lo que hizo pequeña la reparación.
El inglés decía set null rather than cascade, en minúsculas, corriendo dentro de la frase, sin marca de ninguna clase. Quien traduce y recibe eso produce prosa, porque eso es lo que es. Los ocho hicieron bien su trabajo sobre el material que se les dio.
Así que el cambio no son ocho correcciones. Es una decisión sobre la forma, aplicada nueve veces, y cambia también el inglés.
La cuestión de la forma se respondió midiendo, no por gusto
¿Debería ser SET NULL en mayúsculas o set null en minúsculas? Las dos son defendibles en abstracto, y en abstracto es justo donde esa discusión no termina nunca.
Así que miramos qué hace ya el resto del corpus con el SQL dentro de comillas invertidas. Hay nueve apariciones: WHERE dos veces, UPDATE dos veces, DROP dos veces, un DELETE a secas, un SELECT 1 en una comprobación de monitorización y un FOR UPDATE SKIP LOCKED. Todas en mayúsculas.
También hay palabras en minúsculas entre esas comillas que parecen contraejemplos y no lo son. Un unique que resulta ser un indicador de la API de alguien. Un where que es el nombre de una constante en JavaScript. Un null que es un valor y no una cláusula.
Lo cual da la regla de verdad, y no va de mayúsculas. La distinción está entre una palabra clave y un nombre. Una palabra clave del lenguaje va en mayúsculas porque así es como se escribe ese lenguaje; un nombre que da la casualidad de que se parece a una conserva la caja que le dio su dueño. Decidir solo por la caja habría producido aquí la respuesta correcta por el motivo equivocado, y la respuesta equivocada en otro sitio.
El corpus recuerda además que un mismo elemento puede ser dos nombres. La mayoría de las apariciones de DELETE en nuestros artículos no son SQL en absoluto, son el método HTTP en cosas como DELETE /servers/{id}. Las mismas letras, otro lenguaje, y ninguna regla sobre mayúsculas los distingue.
Una decisión de forma tiene un alcance, y el alcance tiene un borde
La primera ronda arregló el artículo que el lector había estado leyendo. Una comprobación posterior mostró que un segundo artículo hacía la misma afirmación sobre un esquema en una línea, sin el elemento, así que una segunda ronda se ocupó de ese.
Merece la pena decirlo con todas las letras, porque una decisión sobre la forma no está terminada cuando lo está el fichero que la provocó. Antes de esa segunda ronda una comprobación de elementos informaba de que los dos nombres estaban sencillamente ausentes del inglés; después hizo veinticuatro recuentos por los idiomas sin ninguna desviación.
El borde es la parte que costó pensar. La regla es si esta frase nombra una cláusula, no si aparece la palabra cascada. En el mismo artículo, más abajo en el mismo párrafo, hay una frase sobre una cascada desde una tabla de vida corta hacia una de vida larga. Eso es la descripción de una consecuencia, no la referencia a una cláusula, y se queda como prosa en lo que cada idioma diría con naturalidad.
Medimos ese límite por todo el catálogo inglés en lugar de fiarnos de él: tres formulaciones que podrían plausiblemente estar nombrando una cláusula, buscadas fuera de las comillas invertidas en cada artículo inglés. Nueve aciertos entonces, cinco de ellos en el artículo del que iba la segunda ronda. Los otros cuatro eran una referencia que se pone a un valor nulo, un encabezado de sección sobre la limpieza al borrar como estrategia, una observación de que una fila concreta no participa en ninguna cascada, y un 404 ante una petición de borrado. Ninguno de ellos nombra una cláusula. Después de las dos rondas quedan siete, y el artículo que reparó la primera ronda ya no aparece en la lista en absoluto, que es la confirmación más barata que hay de que el cambio fue adonde se pretendía.
Lo que se queda con el idioma
Los nombres son idénticos en los nueve ficheros. La frase que los rodea no lo es, y no debe serlo.
El alemán sigue diciendo que la clave ajena steht auf, el neerlandés staat op, el portugués está em. El verbo, la preposición y el orden de las palabras pertenecen al idioma. Solo los dos nombres están fijados, y lo están porque son citas de Postgres y no afirmaciones nuestras.
Las partes mecánicas aguantaron. El generador produce un elemento de código de verdad incluso cuando el nombre está dentro de texto en negrita, cosa que ocurre en la lista numerada del final de cada artículo. El espacio irrompible francés delante de los dos puntos sobrevivió a una reparación que reescribió la cláusula justo anterior, que es de esas cosas que desaparecen en silencio cuando alguien vuelve a teclear una línea.
Y las diferencias son la prueba de que la regla era lo bastante estrecha. Tres líneas dentro y tres líneas fuera por fichero en la primera ronda, una dentro y una fuera en la segunda. Una reparación de esta clase que toca diez líneas ha redecorado algo.
Lo que dejaríamos por escrito
- Ocho traducciones correctas pueden ser aun así un defecto. Que la frase sea correcta no es lo mismo que la presencia del nombre.
- El defecto suele estar en la fuente. Entra prosa, sale prosa, y quien traduce no es el problema.
- Un nombre es una cuestión de forma, no de idioma. Se marca una vez y se copia a todas partes.
- Mida la forma de la casa sobre el corpus en lugar de debatirla en abstracto.
- La distinción es palabra clave frente a nombre, no mayúsculas frente a minúsculas.
- Un mismo elemento puede ser dos nombres. La mayoría de nuestros
DELETEson HTTP, no SQL. - Trace el límite en si una frase nombra una cláusula, no en si aparece la palabra.
- Compruebe el artículo hermano. Una decisión de forma tiene un alcance, y rara vez es un solo fichero.
- Deje el verbo al idioma. Arreglar el nombre no significa arreglar la frase.
- Una diferencia pequeña es la prueba. Tres líneas dentro y tres fuera significa que la regla era estrecha.
Para que quede claro qué es esto: dos rondas, la primera metiendo los dos nombres en nueve ficheros a tres líneas dentro y tres líneas fuera cada uno, la segunda haciendo una línea dentro y una fuera sobre un segundo artículo; la generación de contenido produjo 886 artículos sin advertencias y la comprobación de contenido encontró 887 de 887 ficheros generados idénticos byte a byte, el conjunto de pruebas web en 4604 en verde, la comparación de elementos en 40 recuentos y después en 24 recuentos sin desviaciones, la comparación de hechos en 296 y 256 sin ninguna, el barrido de bytes limpio, y tres guardas demostradas en rojo antes de creerlas en verde. La lectura del corpus fueron tres formulaciones por 124 artículos ingleses. Sin demostrar: cada traducción sigue teniendo un solo lector, ninguno de ellos hablante nativo, y no hay ninguna comprobación de navegador de cómo se dibuja el nombre en los nueve idiomas.
Del trabajo de plataforma en Provibr. El artículo del que iba todo esto es el hijo despierta al padre, lo que nueve catálogos le hacen a un conjunto de controles fijos está en dieciséis mil claves, nueve idiomas, y otro caso en el que la traducción era correcta y la forma estaba equivocada está en la selección abarca la frase entera.