Si tu repo ya tiene next-intl, react-i18next, i18next o Lingui integrados — carpetas de locale en disco, dependencias en package.json, middleware o archivos de configuración —, no necesitas otra herramienta que finja que empiezas de cero. globalize.now es infraestructura de localización impulsada por IA. En modo L1 (ya internacionalizado), el producto se salta el andamiaje de configuración destructivo y permanece en modo de sincronización: lee tu idioma de origen, compara los demás locales en cada push y abre pull requests con los huecos rellenados. Este artículo explica qué toca ese modo, qué se niega a tocar y qué hacer cuando la detección falla.

¿Por qué la mayoría de los consejos sobre i18n dan por hecho que partes de cero?

La copy de marketing de las herramientas de i18n sigue centrada en el caso «desde cero»: sin biblioteca instalada, sin archivos de locale, sin extracción hecha. La mayoría de los codebases en producción no están ahí.

En las últimas semanas, tres sesiones de primer contacto sin relación entre sí presentaron el mismo patrón: el equipo probó i18n una vez, consiguió algo a medio funcionar y lo dejó — porque arrancarlo todo y rehacerlo parecía peor que vivir con el desorden.

Si esto te suena, este artículo está escrito para ti.

¿Cómo es en realidad un codebase a medio internacionalizar?

Estos patrones se repiten una y otra vez (detalles anonimizados):

  • Una app Next.js + next-intl donde la mayoría de los componentes usan t(), pero las rutas antiguas siguen mostrando inglés codificado porque la primera ola de migración nunca se terminó.
  • Un proyecto React + i18next cuyos archivos de locale existen pero solo contienen valores en inglés — la traducción siempre quedaba para el próximo trimestre.
  • Un árbol de messages/ donde en.json está lleno y es.json está prácticamente vacío.
  • Un selector de idioma integrado en el layout que a veces devuelve un 404 porque el enrutamiento solo se migró a medias.

Ninguno de estos proyectos necesita que globalize.now empiece de nuevo. Necesitan que termine el trabajo.

L0 versus L1 setup pathA decision tree showing that when globalize.now detects existing i18n on first run, it skips four destructive setup steps and goes straight to translating missing keys.your repoDETECTIONfirst-run scan of package.json + repoNO i18n FOUNDL0 pathi18n DETECTEDL1 pathinstall libraryextract stringsgenerate locale filesinject switchertranslateinstall libraryextract stringsgenerate locale filesinject switchertranslateSKIPPEDPR on every push
La detección bifurca el flujo de configuración. L0 ejecuta los cinco pasos completos; L1 se salta cuatro y va directo a la sincronización.

¿Qué señales escanea globalize.now en la primera ejecución?

La detección ocurre en dos pasos, no en uno.

Primero, apunta globalize.now al repo. Conectarlo en la app ejecuta la detección y la conversión única por ti. Si prefieres que tu agente haga ese pase en local, instala los Skills — esto añade unos pocos archivos de playbook en .claude/skills/ y no cambia nada más en tu repo:

npx skills add globalize-now/globalize-skills

Después, indícaselo a tu agente — Claude Code, Cursor o Codex. El agente lee los Skills instalados y los usa para escanear tu repo:

Set up localization for my project

Ese segundo paso es donde ocurre realmente la detección. El agente busca:

  • Dependencias de package.json: next-intl, react-i18next, i18next, @lingui/core, @lingui/react, @lingui/macro, o cualquier plugin de i18next-*.
  • Carpetas de locale: messages/ en la raíz del repo, una carpeta locales/, o src/i18n/ con subcarpetas de locale.
  • Archivos de locale existentes: en.json, en.po, en.yml, en.yaml, o el archivo de locale por defecto que tu biblioteca ya espera.
  • Configuración específica del framework: i18n.config.ts, middleware de next-intl, lingui.config.js, o equivalentes.

Si al menos dos de esas señales están presentes, el proyecto se trata como L1 — ya internacionalizado — y el flujo de configuración se bifurca en lugar de ejecutar el andamiaje completo de proyecto nuevo. Hay más detalle en el artículo del centro de ayuda sobre i18n existente.

¿Qué se niega a cambiar el modo L1?

Esta es la parte que le importa a la gente. En modo L1, globalize.now no:

  • Ejecuta el paso amplio de extracción de cadenas que escanea componentes en busca de literales codificados.
  • Genera claves de traducción nuevas ni reorganiza la estructura de claves que ya adoptaste.
  • Crea el andamiaje de archivos de locale para idiomas que aún no has configurado.
  • Inyecta un selector de idioma. Si ya tienes uno, se mantiene. Si no tienes ninguno, no añadimos uno.
  • Reescribe el enrutamiento, el middleware ni la configuración del framework por ti.

Tu configuración de i18n existente sigue siendo tuya. No la refactorizamos en ese modo.

¿Qué hace el modo de sincronización L1 después de la detección?

L1 prioriza la sincronización. Una vez asentada la detección:

  1. Leemos tus archivos de locale existentes para conocer la forma actual de las claves y qué idioma es la fuente de verdad.
  2. Conectas el repositorio de GitHub a través de la CLI de globalize.now o de la web app.
  3. En cada push a tu rama main, comparamos el archivo del idioma de origen con los demás locales. Las traducciones que faltan se rellenan con salida de IA que respeta el glosario y la guía de estilo que configures.
  4. Llega una pull request con los archivos de locale actualizados. Tú revisas y haces merge. Nosotros nunca hacemos merge por ti.

Ese es el ciclo. Sin dashboard de traducción que vigilar. Sin exportaciones manuales. Sin hacer malabares con formatos de archivo.

Compáralo con el recorrido L0 en ¿Cómo añado i18n a una app Next.js construida con Cursor en 15 minutos? — el mismo producto, una ruta de entrada distinta.

¿Y si solo una parte de la interfaz usa llamadas de traducción?

Esa es la forma habitual de una migración a medias: las pantallas nuevas usan t(), las antiguas siguen filtrando literales. Fuera del modo de sincronización, el pipeline de Skills trata las cadenas ya con clave como bloqueadas: se centra en los literales que aún no están conectados y conserva las claves existentes. Los equipos que despliegan cada semana mientras van a medio camino de esa migración son el usuario canónico de «L1 mixto» en nuestros registros.

Para un caso de conversión completa con agente en un árbol complicado, lee ¿Qué pasa cuando un agente de IA internacionaliza un monorepo real?.

¿Qué deberías hacer si el flujo de configuración generó todo el andamiaje de todas formas?

Estamos afinando la lógica de detección para que no se dispare la rama equivocada, pero si npx skills add globalize-now/globalize-skills ya produjo un diff de más de 100 archivos que reescribe tu carpeta de locale, añade un selector que no pediste, o reorganiza el enrutamiento — no hagas commit. Usa el widget de comentarios (abajo a la derecha) con tu lista de dependencias de package.json y una nota breve sobre cómo están organizadas tus carpetas de locale; podemos encaminar el repo hacia L1 manualmente. Pronto llega un flag de CLI --existing-i18n de autoservicio.

La recuperación en tu máquina consiste en git restore . más git clean -fd si hace falta. No se hizo push de nada; nada de cara a producción se rompió; el agente solo tocó tu rama local. El artículo completo está en globalize_skills hizo demasiados cambios: ¿qué pasó?.

¿Por qué «probamos i18n y se quedó a medias» es ahora la historia por defecto?

Esto no es un eslogan: es un patrón. Tres sesiones independientes de primer contacto en seis semanas, tres versiones de «sí, lo intentamos; ahora mismo está hecho un desastre». Una extensión de Chrome con decenas de miles de usuarios sufrió un pico de tráfico coreano y disparó una migración a next-intl a medio terminar. Una app construida con Lovable rompió su propio build al añadir soporte multilingüe y hubo que revertirla. Un repo React + Vite hecho con vibe coding conectó i18next, rellenó más o menos un tercio de las claves y se quedó a medias.

El codebase L0 perfectamente limpio que busca una biblioteca sí existe, pero no es el cuello de botella. El cuello de botella es el codebase que ya lo intentó una vez y ahora nadie quiere hacerse cargo del desastre.

El modo L1 existe justo para ese codebase.

¿Cuánto cuesta?

20 € al mes. Un solo plan. Incluye unas 16.000 palabras (piensa en unas 80 pantallas típicas de app). 5 € de crédito de traducción al registrarte. Da igual si eres L0 y partes de cero o L1 arrastrando tres años de deuda de locale — el precio es el mismo. Medimos el volumen y la automatización, no lo desordenado que estaba el primer commit.

¿Qué artículos y documentos del Centro de ayuda deberías leer a continuación?

Lanza en los idiomas que tu tráfico ya está esperando — conecta el repo en globalize.now, o descubre cómo encaja la automatización con Git push en el flujo de trabajo de un equipo ya establecido.

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