Comprueba siete cosas antes de lanzar una app que Codex, Claude Code o Cursor tradujeron con un solo prompt: si las cadenas largas caben, si las formas de plural coinciden con cada idioma, si las variables sobrevivieron, si los términos son consistentes, si el tono suena bien a un hablante nativo, si cada clave existe en cada locale y si la próxima feature llegará a traducirse siquiera. globalize.now es infraestructura de localización impulsada por IA, y casi todo lo que vemos fallar después de una traducción de una sola pasada es mecánico, lo cual es una buena noticia: los problemas mecánicos se pueden comprobar.

La primera pasada rara vez es el problema. Los agentes actuales producen traducciones legibles en poco tiempo. Lo que un solo prompt no incluye es ningún paso que verifique el resultado, y estas comprobaciones son ese paso.

¿El texto cabe después de traducir?

A menudo no, y los botones fallan primero. La guía del W3C sobre el tamaño del texto en la traducción señala que cuanto más corto es el mensaje de origen, mayor es la expansión probable, así que la etiqueta de un botón de dos palabras crece proporcionalmente más que un párrafo. También apunta que los sustantivos compuestos de idiomas como el alemán pueden no partirse en varias líneas, y que algunos sistemas de escritura necesitan más espacio horizontal o vertical que el texto latino.

Un agente que traduce cadenas en un archivo JSON nunca ve la pantalla, así que no puede saber que «Save changes» ahora llena el botón de lado a lado. Ejecuta la app en el locale más largo que lances, recorre los flujos principales y busca texto cortado, botones con saltos de línea y cabeceras de tabla truncadas. Si das soporte a idiomas de derecha a izquierda, repite la pasada en uno de ellos; la guía de árabe y RTL para apps de Lovable cubre la dirección, que las comprobaciones de desbordamiento por sí solas no detectan.

La solución duradera está en el layout, no en acortar las traducciones: deja que los contenedores crezcan, evita anchos fijos en el texto y no abrevies para que quepa. Pídele a tu agente esa parte, porque es código.

¿Las formas de plural coinciden con el idioma de destino?

Compruébalo pronto, porque falla en silencio. Unicode CLDR define seis categorías de plural: zero, one, two, few, many y other. El inglés usa solo one y other. El ruso usa one, few, many y other. El galés usa las seis, y la documentación de i18next muestra el árabe también con sus seis claves de plural.

Un agente que copia el par del inglés en un archivo de ruso o árabe produce un catálogo que se parsea y se renderiza, pero muestra la forma equivocada para cada número que necesita una categoría que el archivo no tiene. No lanzará ningún error. Con i18next, recuerda que la variable debe llamarse exactamente count, y la documentación indica que no hay fallback a la clave simple si falta. El mismo agente escribiendo count === 1 ? 'item' : 'items' en un componente tiene el mismo bug antes incluso de empezar a traducir; qué es ICU MessageFormat y por qué hace tropezar a las apps generadas con IA cubre el lado de la sintaxis.

La comprobación es mecánica: para cada locale, compara las claves de plural con las categorías que ese idioma requiere.

¿Sobrevivieron las variables de interpolación?

No siempre, y un script lo resuelve. Las variables de interpolación como {{name}} o {count} deben aparecer en cada traducción exactamente como están escritas. Los agentes que traducen un archivo largo a veces reformulan una variable, eliminan una porque la frase suena mejor sin ella o traducen el contenido de una etiqueta. El resultado se renderiza como un hueco en blanco, una llave literal o un crash.

Compara el conjunto de variables de cada cadena traducida con el de su cadena de origen. Este script corto de Node lo hace y además informa de las claves que existen en inglés pero no en otro locale:

import fs from "node:fs";

const [src, ...targets] = process.argv.slice(2);
const read = (f) => JSON.parse(fs.readFileSync(f, "utf8"));
const vars = (s) =>
  [...String(s).matchAll(/\{\{?\s*[\w.]+\s*\}?\}/g)].map((m) => m[0]).sort().join(",");

const base = read(src);
let problems = 0;
for (const file of targets) {
  const loc = read(file);
  for (const [key, text] of Object.entries(base)) {
    if (!(key in loc)) { console.log(file, "missing", key); problems++; continue; }
    if (typeof text === "string" && vars(text) !== vars(loc[key])) {
      console.log(file, "variable mismatch", key); problems++;
    }
  }
}
process.exit(problems ? 1 : 0);

Ejecútalo como node check-locales.mjs locales/en.json locales/de.json locales/ru.json en CI. Asume archivos de claves de un solo nivel; adapta el bucle si tu catálogo está anidado.

¿La terminología es consistente?

Lo es dentro de una misma respuesta y se desvía entre varias. Si la traducción de una app grande se reparte entre archivos, sesiones o lotes, nada garantiza que «workspace», «project» y el nombre de tu producto salgan igual cada vez. Acabas con un botón que dice una cosa y una página de ayuda que dice otra.

Escribe los términos una sola vez: un glosario con nombres de producto, nombres de features y palabras que no deben traducirse, y haz que el paso de traducción lo lea. globalize.now genera un glosario compartido cuando se convierte el codebase, de modo que los términos existen como datos antes de que se traduzca nada. Sin una herramienta, lo mínimo es un archivo de glosario corto referenciado desde las instrucciones de tu agente; el post sobre las reglas de AGENTS.md muestra dónde viven esas instrucciones.

¿Suena bien a un hablante nativo?

Esta es la única comprobación que un script no puede hacer. El registro, la formalidad y las mayúsculas son donde las traducciones de una sola pasada se notan hechas por una máquina: el nivel de trato formal equivocado, botones en imperativo que suenan a órdenes, un titular en mayúsculas en un idioma donde eso se lee como un grito.

No revises todas las cadenas. Elige un idioma por familia lingüística de las que lances y pide a un hablante nativo que lea las pantallas del primer uso, el flujo de pago o de registro y los mensajes de error. Son las pantallas donde el tono te cuesta usuarios. Anota sus correcciones en el glosario para que la siguiente ejecución parta de ellas.

¿Existe cada clave y llegó cada cadena al catálogo?

Dos huecos distintos se ven igual en pantalla. Una clave puede existir en inglés y faltar en un locale, algo que el script anterior detecta. O una cadena puede haber quedado codificada en el componente sin llegar nunca al catálogo, de modo que ninguna traducción podría cubrirla. Los agentes dejan el segundo tipo en atributos, toasts y mensajes de error más a menudo que en el texto visible; por qué los agentes siguen añadiendo cadenas codificadas cubre el patrón y la regla de lint que lo detecta.

Cambia la app a un locale que no sea inglés y navega por ella. Todo el inglés que quede es una clave ausente o una cadena que nunca entró en el sistema, y la solución es distinta en cada caso.

¿Se traducirá la próxima funcionalidad?

Solo si la traducción forma parte de cómo se lanza el código, y esta es la comprobación que una ejecución de un solo prompt no puede superar. El prompt tradujo la app tal como estaba esa tarde. La próxima funcionalidad que construya tu agente llega en inglés, en los mismos archivos, y los locales se quedan atrás una funcionalidad tras otra. Por qué los archivos de traducción se desincronizan describe cómo se acumula.

Aquí es donde el enfoque de una sola pasada y un pipeline se separan. La localización subiendo al ciclo de desarrollo expone el argumento de fondo; la versión práctica es que la conversión se hace una vez y los cambios posteriores se traducen donde se hacen. Con globalize.now conectas el repositorio en la app, la base de código se convierte una vez y los trabajos de push traducen después las nuevas unidades del catálogo, con los resultados entregados como cambios que revisas y fusionas. La biblioteca de runtime y el formato del catálogo siguen siendo tuyos. Los equipos que ya tienen un traductor humano conservan ese paso de revisión; simplemente deja de ser lo único que separa el código solo en inglés de una versión publicada.

Si prefieres mantenerlo en tus propios scripts, lo mínimo es el script anterior ejecutándose en CI más una regla para que las cadenas nuevas pasen por el catálogo. Cómo localizar una app generada por IA recorre todo el camino, y la guía de Claude Code cubre ese agente en concreto.

¿Por dónde empiezas?

Ejecuta hoy el script sobre tus archivos de locale actuales; lleva un minuto y te dice si la estructura es sólida. Después abre la app en tu locale más largo y recorre el flujo del primer uso. Si lanzaste una app construida con IA y quieres que la conversión, la traducción y las actualizaciones posteriores se gestionen en lugar de mantenerlas a mano, la página de Vibe Coders es la visión general, la referencia para desarrolladores cubre las configuraciones de agentes y los precios tienen su propia página.

globalize.now convierte el texto codificado de tu app en archivos de traducción listos para localizar y los mantiene actualizados en cada despliegue.

Prueba globalize.now gratis