Revisamos todas las traducciones automáticas. Los controles fueron la parte que falló.
Idiomas
Antes de publicar nuestro kit de traducción, lo probamos con una pequeña aplicación de ejemplo: 70 cadenas en seis formatos (JSON, Flutter ARB, Android, Apple .strings, gettext y Markdown) traducidas al alemán, ruso, japonés, árabe y español, con un modelo abierto Qwen (Qwen3.8-Flash-Next, cuantizado a 4 bits) servido por vLLM en nuestra propia máquina. Cada cadena traducida pasa por comprobaciones antes de escribirse. Cuatro de las 350 fueron rechazadas. Los cuatro rechazos fueron erróneos.
Qué buscan los controles
Una traducción que rompe una aplicación es peor que ninguna, por lo que cada cadena debe conservar sus marcadores de posición (%1$s, {name}, {{count}}), sus etiquetas, saltos de línea y URLs; debe estar en el alfabeto del idioma de destino; no debe estar vacía, desbordada ni quedar en inglés; y las formas plurales deben cubrir exactamente las categorías que tiene el idioma. Si una cadena falla, se vuelve a solicitar nombrando el problema, y si falla de nuevo, se omite, por lo que la aplicación muestra inglés para esa cadena.
Los cuatro rechazos
- «Backups» en alemán era «Backups». El control lo marcó como no traducido. El alemán usa la palabra inglesa. Una sola palabra idéntica suele ser correcta; dos o más palabras idénticas no lo son, así que esa es la regla ahora.
- Una línea en ruso y otra en japonés con una dirección de correo electrónico fallaron el control de alfabeto: menos del 60% de las letras eran cirílicas o japonesas, porque
[email protected]está escrito en letras latinas. Las direcciones se tratan ahora como marcadores de posición: deben volver sin cambios y no cuentan como letras. - Un mensaje plural en japonés volvió como
{count, plural, =0{連続記録なし} other{{count}日連続}}. La rama{連続記録なし}no tiene espacios, por lo que el patrón de marcador de posición la tomó por una variable llamada 連続記録なし. Las llaves de rama en mensajes plurales son ahora estructura, y los nombres de los marcadores de posición deben ser ASCII.
Una vez corregidos los controles, una segunda ejecución solicitó al modelo solo esas cuatro cadenas, ya que el resto estaba en la memoria de traducción, y escribió las 350 en 45 segundos.
La parte que esperábamos que fallara y no lo hizo
Las formas plurales son donde la traducción ingenua falla: el inglés tiene una y otra, el ruso tiene una, pocas, muchas y otra, el árabe seis categorías y el japonés una sola forma. Pedimos exactamente las categorías del idioma de destino y verificamos los marcadores de posición de cada forma. El modelo escribió "1 день, 2 дня, 5 дней" para el ruso y las seis formas del árabe. Todos los plurales de Android pasaron a la primera en los cinco idiomas, al igual que todos los mensajes plurales excepto el japonés, que nuestra comprobación leyó mal.
Lo que ninguna comprobación puede detectar
Luego traducimos las 22 cadenas web del ejemplo a los 42 idiomas que Polyglot conoce: 924 de 924 cadenas pasaron. Al leerlas, una destacó. En jemer, "You are offline" había vuelto como una oración que dice "estás en línea". Es un jemer bien formado en el alfabeto correcto sin nada que falte, por lo que todas las comprobaciones lo pasaron. Las comprobaciones detectan lo que rompe una aplicación; un significado incorrecto necesita una persona que lea el idioma.
La conclusión
Las comprobaciones automáticas sobre la salida de la máquina necesitan una salida real contra la que probarse. Las pruebas unitarias con traducciones inventadas pasaban; un modelo real escribiendo japonés real encontró las lagunas en minutos. Polyglot incluye estas comprobaciones, corregidas, y con las pruebas para cada uno de los cuatro casos. Las comprobaciones por sí solas son gratuitas y de código abierto: translation-checks en GitHub.