Registro de cambios

Lo que se lanzó y lo que sigue.

Próximamente Hoja de ruta

  • Capturas de pantalla en revisión

    Vea dónde aparece una cadena en la aplicación mientras revisa su traducción.

  1. v0.33.4

    11 de noviembre de 2026

    Astro: texto en constantes de frontmatter e iconos omitidos del texto del botón

    • Astro: el texto se mantiene en constantes de frontmatter, como los metadatos de una página o una lista de tarjetas (const items = [{ title, description }]), se convierte en t() donde está escrito. Se incluyen listas dentro de listas y literales de plantilla con valores. Una constante que el frontmatter lee para su texto se deja como está escrita
    • Un icono antes o después del texto de un botón, como un chevrón <svg>, se mantiene fuera del mensaje, por lo que el texto se traduce por sí solo en lugar de en un <Trans> con el icono dentro
  2. v0.33.3

    11 de noviembre de 2026

    Un servidor MCP alojado, con inicio de sesión OAuth

    • Un servidor MCP alojado en https://uselocalize.dev/api/mcp, para agentes que no pueden ejecutar npx. Tiene las mismas herramientas. Cada llamada transporta los archivos que la herramienta necesita y devuelve los archivos a escribir; se guardan en una carpeta temporal para esa llamada y se eliminan cuando responde
    • Los clientes que admiten el inicio de sesión de MCP se conectan con OAuth: apruebas la conexión en localize.dev y eliges el espacio de trabajo. La conexión aparece en las claves de API y eliminar la clave la desconecta. Otros envían una clave de API como token de portador o en una cabecera x-api-key
    • La página de MCP tiene configuración para Lovable, Bolt y v0, y el servidor también está en el Registro de MCP como un servidor remoto
    • El paquete exporta handleRemoteMessage y REMOTE_TOOLS, las herramientas del servidor alojado, para ejecutar el mismo servidor en otro lugar
  3. v0.33.2

    10 de noviembre de 2026

    Plugins para Claude Code y Cursor, y su inclusión en el Registro MCP

    • Un plugin de Claude Code agrega el servidor MCP y una habilidad que le dice a Claude cuándo localizar. Instálalo con claude plugin marketplace add ufortstephen/localize-dev, luego claude plugin install localize-dev@uselocalize
    • El mismo plugin funciona en Cursor, con una regla para aplicaciones que tienen un localize.config.json
    • El servidor MCP figura en el Registro MCP como io.github.ufortstephen/localize-dev, por lo que los clientes que leen el registro pueden encontrarlo e instalarlo
  4. v0.33.1

    10 de noviembre de 2026

    Proyectos de Create React App, Compose Multiplatform y XcodeGen

    • Los proyectos de React, React Native y Solid que mantienen JSX en archivos .js, como lo hace Create React App, también escanean esos archivos. Antes, solo se escaneaban los archivos .tsx y .jsx, a menos que include listara .js
    • check informa de las traducciones que faltan en String Catalogs, strings.xml y archivos ARB cuando el proyecto no tiene un archivo fuente JSON. Antes solo lo hacía con los catálogos .po de Django y decía que todo lo demás estaba traducido
    • Los proyectos que generan su proyecto Xcode con XcodeGen (project.yml) o Tuist (Project.swift) se detectan como aplicaciones iOS
    • Las cadenas de Compose Multiplatform en composeResources/values/ se encuentran y traducen de la misma manera que las de Android res/values/
    • Los archivos en las carpetas __tests__ y __mocks__ se omiten por defecto, al igual que los archivos .test y .spec
  5. v0.33.0

    10 de noviembre de 2026

    localize-dev seo, Remix e idiomas cargados en el servidor

    • localize-dev seo <url> comprueba lo que los motores de búsqueda ven de cada idioma en un sitio en vivo o una compilación local: el sitemap, los enlaces hreflang que apuntan hacia atrás e incluyen x-default, <html lang>, la dirección canónica y og:locale
    • Las aplicaciones Remix 2 con v3_routeConfig obtienen una dirección por idioma, de la misma manera que las aplicaciones React Router.
    • Las aplicaciones React Router y Remix con más de tres idiomas cargan cada idioma en el cargador de la ruta (route's loader), por lo que el servidor renderiza /fr/about en francés incluso cuando el francés no está en el paquete. Las direcciones hreflang completas provienen de la solicitud, por lo que no se necesita siteUrl.
    • Sin siteUrl, la dirección del sitio proviene de un archivo CNAME o de la página de inicio en package.json, y en Netlify, Render y Railway de la dirección que el host le da a la compilación (build), como ya ocurría en Vercel.
    • Las páginas de Qwik City obtienen <html lang> y dir para el idioma de su dirección, establecido en entry.ssr.tsx.
    • Cuando los idiomas se cargan bajo demanda, el menú de idiomas los lista todos, no solo los que se han cargado hasta ahora.
    • check ya no informa nombres de clase ni claves dentro de ejemplos de código escritos como cadenas, elementos centrados (left-1/2 con -translate-x-1/2) como problemas de derecha a izquierda, ni fuentes cuyos subconjuntos cubran el script.
  6. v0.32.1

    10 de noviembre de 2026

    Django, ERB y Blade: etiquetas de plantilla entre atributos

    • Una etiqueta de plantilla entre los atributos de una etiqueta, como un bloque if que agrega aria-current, ya no hace que la verificación informe el resto de la etiqueta como texto. Se encuentra y traduce un título o aria-label dentro del bloque
    • Un enlace se une al mensaje de una oración solo cuando las palabras están justo a su lado. Antes, un separador como · o texto en otro lugar del bloque convertía un enlace solitario en un mensaje
    • Las opciones sin un atributo de valor se dejan solas, ya que su texto es lo que envía el formulario
    • comprueba los informes de entradas vacías y difusas en los catálogos .po de un proyecto Django cuando no tiene un catálogo en inglés, que es como se configuran la mayoría de los proyectos Django. Antes, decía que todo estaba traducido
    • doNotTranslate en localize.config.json enumera nombres y abreviaturas que se conservarán tal como están escritos, como Metron o TPB. El texto compuesto únicamente por ellos, números y símbolos no se extrae ni se informa en la verificación
  7. v0.32.0

    10 de noviembre de 2026

    Una dirección por idioma en React Router

    • Las aplicaciones de React Router (modo framework) obtienen una dirección por idioma (/es/about). routes.ts pasa sus rutas a través de withLanguageRoutes, que agrega una copia de cada una en cada idioma, por lo que no cambian los archivos de ruta
    • El servidor renderiza cada página en el idioma de su dirección, con enlaces hreflang, una dirección canónica y og:locale. El menú de idioma abre la misma página en el nuevo idioma, y los enlaces sin idioma conservan el idioma de la página
    • Una ruta sitemap.xml creada a partir de las rutas de la aplicación, por lo que las nuevas páginas se enumeran sin ejecución, y una ruta robots.txt, cuando la aplicación no tiene ninguna
    • El módulo i18n va en app/ y se importa desde app/root.tsx. Antes, la configuración no podía encontrar el archivo de entrada de una aplicación React Router
    • la comprobación ya no se detiene con un error en una lista de clases que tiene una variante sin una clase después, como cn(active && 'hover:', 'ml-2')
  8. v0.31.0

    10 de noviembre de 2026

    SvelteKit 3, Qwik City y cada idioma en sitios estáticos de SvelteKit

    • SvelteKit 3 funciona: no tiene $lib, por lo que los archivos generados importan desde #lib cuando la aplicación lo declara. También se configura un layout raíz con props tipados, como lo escribe npx sv create.
    • En SvelteKit, los enlaces a las páginas propias de la app conservan el idioma de la página en la que se encuentran, por lo que /es/about enlaza a /es/ en lugar de /.
    • Las compilaciones estáticas de SvelteKit (adapter-static) escriben las páginas de cada idioma: la compilación se ejecuta en la dirección de siteUrl, por lo que las encuentra a través de los enlaces hreflang.
    • Las aplicaciones Qwik City obtienen un componente LanguageHead en root.tsx con enlaces hreflang y og:locale, una ruta sitemap.xml y una ruta robots.txt cuando la app no tiene ninguna.
    • El sitemap de Astro utiliza las mismas direcciones que las páginas (/about/ en una compilación estática), por lo que coincide con sus enlaces canónicos.
  9. v0.30.0

    10 de noviembre de 2026

    Un mapa del sitio para sitios estáticos

    • Los sitios HTML estáticos con htmlPages y siteUrl obtienen un sitemap.xml que enumera cada página, las traducidas en cada idioma con enlaces hreflang entre ellas. Se reescribe en cada ejecución, pero se mantiene un sitemap que el sitio ya tiene tal como está
    • Un robots.txt que apunta al sitemap, cuando el sitio no tiene ninguno
    • Dos redacciones en el sitio alemán, a partir de una revisión de sus traducciones
  10. v0.29.0

    10 de noviembre de 2026

    Cada idioma en los resultados de búsqueda, para Astro y SvelteKit

    • Las aplicaciones SvelteKit obtienen una dirección por idioma (/es/about) a través de un hook de reenvío, por lo que las rutas no necesitan una carpeta [lang]. Cada página obtiene enlaces hreflang, una dirección canónica y og:locale, y el menú de idioma va a la misma página en el nuevo idioma. Esto requiere SvelteKit 2.3 o posterior
    • Los diseños de Astro obtienen un componente I18nHead en su <head>, con enlaces hreflang, una dirección canónica y og:locale para la página
    • Ambos obtienen un sitemap.xml que enumera cada página en cada idioma. Se crea a partir de la carpeta de páginas o rutas, por lo que las nuevas páginas aparecen sin ejecutar localize nuevamente. Se agrega un robots.txt cuando la aplicación no tiene ninguno
  11. v0.28.0

    10 de noviembre de 2026

    Cada idioma en los resultados de búsqueda

    • Las aplicaciones de Next.js App Router obtienen una dirección canónica y og:locale para la URL de cada idioma, agregadas a través de generateMetadata en el diseño raíz. Los propios metadatos de un diseño se conservan y sus valores prevalecen
    • Un sitemap.ts que enumera cada página con una dirección fija en cada idioma, con alternativas hreflang, y un robots.ts que apunta a él. Se escriben solo cuando la aplicación no tiene ninguno de los dos, y son suyos para editar
    • Los motores de búsqueda necesitan direcciones completas: provienen de siteUrl en localize.config.json, o de VERCEL_PROJECT_PRODUCTION_URL en Vercel
    • Las aplicaciones configuradas anteriormente obtienen todo esto en su próxima ejecución
  12. v0.27.0

    9 de noviembre de 2026

    Localiza mientras escribes

    • init --agent configura agentes de codificación: el servidor MCP para Claude Code y Cursor, un hook posterior a la edición que le dice a Claude Code qué texto dejó sin traducir en el archivo que acaba de editar, e instrucciones en AGENTS.md y una regla de Cursor.
    • check y run toman --files, --changed y --staged, por lo que verificar los archivos que tocó lleva aproximadamente un segundo; init --agent --pre-commit agrega esa verificación al hook de git.
    • El servidor MCP pide a los agentes que localicen los archivos que cambian, y su herramienta de verificación toma rutas.
    • La página de uso muestra dónde se tradujeron las cadenas: mientras se escribe, en CI o desde la CLI.
  13. v0.26.6

    9 de noviembre de 2026

    Las correcciones hechas en la pull request se mantienen

    • Cuando la rama base avanza y la pull request se reconstruye, se conservan los cambios que la gente hizo en ella. Los archivos de idioma se combinan clave por clave, y una traducción que cambiaron ambos lados conserva la versión de la persona
    • Un archivo que la nueva propuesta también cambió toma la versión de la propuesta, y la ejecución indica esos archivos para que el cambio pueda hacerse de nuevo
    • El sitio escribe los números y los precios como lo hace cada idioma: 10.000 en alemán, 10 000 en francés
  14. v0.26.5

    4 de noviembre de 2026

    De derecha a izquierda desde la primera representación en aplicaciones Next.js

    • Las apps de Next.js reciben <html dir> según el idioma, así que el árabe, el hebreo y el persa se muestran de derecha a izquierda desde la primera carga; las apps configuradas antes lo reciben en su próxima ejecución
    • Un idioma cuyo código también es una palabra justo después de una lista (it, no) se sigue añadiendo, y la palabra queda tal cual
  15. v0.26.4

    4 de noviembre de 2026

    Idiomas cuyo código también es una palabra

    • Un idioma nuevo se suma a cada lista generada que no lo tiene, aunque su código sea una palabra en otra parte del archivo (it para el italiano, no para el noruego)
    • El sitio: el árabe se lee de derecha a izquierda desde la primera carga, y el encabezado y sus menús siguen la dirección de lectura
  16. v0.26.3

    4 de noviembre de 2026

    Los idiomas nuevos llegan al menú de idiomas de la app

    • Un idioma añadido después de la configuración se suma a las listas que generó localize.dev: el menú de idiomas, las rutas, las importaciones y las tablas del selector, con su propio nombre, bandera y dirección
    • Astro y Qwik reciben la copia de cada página para el idioma nuevo, y Django su archivo .po
  17. v0.26.2

    4 de noviembre de 2026

    Elija los idiomas al ejecutar

    • Ejecutar ahora pregunta a qué idiomas traducir: uno que añada se incorpora al proyecto, se traduce en esa ejecución y se añade a localize.config.json en su pull request
    • Cada ejecución de la Action traduce a los idiomas del proyecto en el panel, así que un idioma añadido allí ya no requiere cambiar el flujo de trabajo
  18. v0.26.1

    3 de noviembre de 2026

    Idiomas de destino contados en toda la cuenta

    • Los idiomas de destino de un plan se cuentan en todos sus espacios de trabajo: cualquier idioma al que se haya traducido en los últimos 30 días o configurado en un proyecto. Una ejecución que superaría el límite se detiene antes de escribir nada e indica los idiomas en uso
    • localize-dev whoami muestra cuántos de los idiomas de destino del plan están en uso, y cuáles
  19. v0.26.0

    3 de noviembre de 2026

    Un servidor MCP para agentes de codificación y traducciones revisadas en la solicitud de extracción

    • localize-dev mcp: un servidor MCP para agentes de codificación como Claude Code, Cursor, Codex y GitHub Copilot, con las herramientas check, localize, translate, add_language y config
    • La herramienta de configuración incluye el glosario del proyecto cuando se establece una clave API, de modo que el agente mantiene los nombres y términos como decidió el equipo
    • Las solicitudes de extracción reciben un comentario con una tabla de las nuevas traducciones, publicado por la GitHub App, o por la Action cuando el repositorio no usa la App
    • Las traducciones editadas en la solicitud de extracción antes de fusionarse se aprenden para las próximas ejecuciones, en cada formato de idioma y para plurales, y se marcan como Editadas en GitHub en la revisión
  20. v0.25.0

    3 de noviembre de 2026

    Selectores de idioma para todos los frameworks

    • La configuración añade un menú de idiomas y useLanguage() a las aplicaciones Vue, Nuxt, Svelte, Solid, Qwik, Angular, Astro, Lit y Ember, junto al módulo de i18n que genera
    • Rails, Django y Laravel reciben un menú de idiomas para sus plantillas que recuerda la elección; Flutter, iOS, Android y React Native, uno nativo
    • localize-dev/switcher: el menú como elemento personalizado, con las mismas variables CSS que el de React
    • La configuración automática ya no descarga el repositorio, así que también termina en monorepos grandes
  21. v0.24.6

    3 de noviembre de 2026

    Configuración automática y la Action, para apps en un monorepo

    • Configurar automáticamente encuentra la app en un monorepo (la carpeta con un localize.config.json) y ejecuta allí el workflow con working_directory
    • En la raíz de un monorepo, la Action indica el working_directory que hay que poner para cada app, en lugar de comandos cd
  22. v0.24.5

    3 de noviembre de 2026

    Pull requests abiertas por la GitHub App de localize.dev, y archivos ignorados intactos

    • La GitHub App de localize.dev abre las pull requests de la Action en los repositorios conectados: sin ajuste de permisos de workflow que marcar, y los checks de las pull requests se ejecutan
    • El texto de un módulo que la configuración ignora se queda tal cual, aunque un componente lo lea
  23. v0.24.4

    3 de noviembre de 2026

    Una app en un monorepo: working_directory en la Action

    • Monorepos: working_directory en la Action localiza una sola app (apps/web), y su pull request cambia los archivos en su sitio
    • mode: check en un directorio de trabajo anota cada problema con su ruta desde la raíz del repositorio, para que aparezca en el diff
  24. v0.24.3

    31 de octubre de 2026

    Un paquete más fácil de auditar: sin código evaluado, archivos legibles e instalaciones que no ejecutan scripts

    • Los Plural-Forms de gettext se leen con un pequeño analizador de su propia gramática en lugar de evaluarse como código
    • El paquete de npm no está minificado: lo publicado se lee como el código fuente
    • Los compiladores de plantillas son dependencias peer opcionales; se instalan al usarse por primera vez sin ejecutar scripts de paquetes, o nunca con LOCALIZE_DEV_NO_INSTALL=1
  25. v0.24.2

    31 de octubre de 2026

    Actualizaciones que siguen en verde: entradas lock antiguas de Vue, repositorios solo con archivos de idioma, locks de monorepos y pull requests de traducción más claros

    • Actualización: los plurales con barra de Vue y Nuxt en un archivo lock escrito por 0.23.0 cuentan como al día, así que check sigue en verde y ningún pull request reescribe el lock
    • check (CLI y Action) en un repositorio con solo archivos de idioma comprueba sus traducciones en lugar de fallar por no tener carpeta src/
    • Monorepos: la primera ejecución de run --workspaces registra los mensajes de las bibliotecas compartidas en el lock de cada app, así que la segunda no cambia nada
    • Un pull request que solo completa traducciones lleva un título acorde (fill in 3 translation(s)) y lista los mensajes por idioma
    • translate vuelve a pedir un plural que llega sin sus formas, en lugar de dejar el idioma para la siguiente ejecución
  26. v0.24.1

    31 de octubre de 2026

    Correcciones de la Action desde CI: Astro, los proyectos en la raíz del repositorio y los sitios estáticos abren su pull request, una ejecución no puede quedarse colgada y se completan los plurales con barra de Vue

    • React: i18next se configura aunque la propia ejecución lo importe para fechas y números, así que la app muestra sus textos en lugar de las claves
    • Monorepos: check y prune cuentan las claves que usan las bibliotecas del workspace de una app, y prune --workspaces abarca cada app y biblioteca
    • Action: los proyectos con su código en la raíz del repositorio abren su pull request (rutas sin ./), las páginas de Astro se reescriben (el compilador WASM se incluye con la Action) y un sitio estático sin configuración se analiza en la raíz, como en la CLI
    • Action: una ejecución se detiene y falla tras timeout_minutes (30 por defecto) en lugar de quedarse colgada, y un archivo cuyo analizador no carga hace fallar la ejecución en lugar de omitirse
    • Vue: run completa los plurales con barra (only {count} copy left | …) con todas las formas que necesita el idioma, y run, translate y check coinciden en qué falta o está desactualizado
  27. v0.24.0

    29 de octubre de 2026

    Segundas ejecuciones que no cambian nada, ninguna petición sin textos nuevos y un check para workflows offline

    • Una segunda ejecución solo recoge textos nuevos: las ordenaciones y fechas de los scripts de Vue siguen el idioma de la app desde la primera ejecución, los mensajes con %@ de un String Catalog ya no bloquean una ejecución de iOS y las páginas estáticas pseudolocalizadas no se vuelven a analizar
    • Ninguna petición de traducción sin nada que traducir: se omiten los textos que ya tienen su clave y todas sus traducciones, y las ejecuciones offline indican que solo crean claves
    • El título y el resumen del pull request dicen lo que cambia, como fechas y números que ahora siguen el idioma de la app, sin tablas vacías
    • check y prune cuentan como usados el título y la descripción de la página que fija el módulo i18n generado, en todos los frameworks
    • Action: check_only: strings comprueba solo los textos fijos en el código, para workflows que localizan offline
    • Flutter: n == 0 ? 'Nada que regar' : '$n plantas necesitan agua' se convierte en un único mensaje plural con =0, y el texto unido con + se lista y hace fallar check en lugar de omitirse
    • Las traducciones se comprueban como las lee la biblioteca i18n de la app antes de escribirse: mismos marcadores, sin llaves sueltas, todas las formas de plural, ICU válido. Una que falla se vuelve a pedir y, si no, se omite y se informa
    • check ignora las llamadas a t() en comentarios en todos los lenguajes, y los archivos generados ya no muestran ejemplos con forma de clave; los nuevos catálogos gettext llevan la cabecera estándar
  28. v0.23.0

    29 de octubre de 2026

    Rails, Django y Laravel: las frases con enlaces se mantienen enteras, y las librerías de un monorepo compilan con pnpm

    • Rails: una expresión que pasa a un argumento de t() recibe los paréntesis que Ruby necesita (link_to(book.title, book_path(book.id))), así las vistas compilan
    • Rails: un mensaje que interpola un enlace u otro HTML recibe una clave _html, así el enlace se muestra en lugar de escaparse
    • Un enlace dentro de una frase se queda en su mensaje: link_to en Rails, un solo blocktranslate en Django (con el {% url %} capturado antes) y {!! __() !!} con los valores escapados en Laravel
    • Monorepos: una librería de componentes declara lo que importa su código reescrito (react-i18next) como dependencia peer y de desarrollo, y sus archivos pasan a ser componentes de cliente cuando los usa una app de Next.js
    • Ember: se añaden @glimmer/tracking y @ember/test-helpers, que ember-intl necesita sin declararlos, cuando la app no los tiene
  29. v0.22.0

    29 de octubre de 2026

    Apps que compilan tras la localización: enlaces de Svelte intactos, módulos de Angular con el pipe correcto y código de SvelteKit que pasa la comprobación de tipos

    • Las plantillas Svelte y Vue ahora se analizan, por lo que un marcador de posición ${ … } dentro de un atributo nunca se confunde con un precio, y a los atributos de URL (href, src, action) nunca se les asigna uno
    • Angular: los NgModules y los componentes standalone importan el pipe de traducción que tiene la versión instalada de ngx-translate (TranslatePipe desde la 16), y se repara un TranslateModule que una ejecución anterior dejó con ngx-translate 18
    • SvelteKit: el código generado pasa la comprobación de tipos; las fechas usan $locale ?? undefined, I18nT.svelte tiene props tipadas y el layout raíz sigue el idioma tras navegar, sin advertencias
    • package.json conserva su formato: las dependencias nuevas siguen el estilo de las líneas vecinas en lugar de reescribirse todo el archivo
  30. v0.21.0

    29 de octubre de 2026

    Cada petición de SvelteKit en su propio idioma, frases de Astro enteras y números de versión como valores

    • SvelteKit muestra y traduce cada petición en su propio idioma: el hook lo guarda en event.locals, los mensajes del servidor lo reciben, y nada en el servidor lee el idioma compartido de svelte-i18n
    • Las frases de Astro con enlaces y negritas siguen siendo un solo mensaje, mostrado con los propios elementos de la página
    • Los números de versión y de compilación en los textos son valores, Version {version} (build {build}), así una nueva versión no deja todas las traducciones desactualizadas
    • check lista una sola vez lo que run no puede traducir, bajo un único aviso
  31. v0.20.0

    29 de octubre de 2026

    Mensajes desde el código, descripciones de página y mensajes del servidor traducidos en todas partes, y nada se omite sin avisar

    • El texto que run no puede traducir siempre se lista y hace fallar check: el texto de una función auxiliar en un módulo, las listas de frases y los elementos fuera de componentes en Solid y Qwik
    • alert, confirm, document.title y los avisos se traducen en Lit, Angular, Ember, React Native (Alert.alert y sus botones), el Java de Android y los scripts propios de un sitio estático
    • Las descripciones de página y los títulos para redes en <meta> se traducen junto al título de la página en todos los frameworks, igual que useHead y useSeoMeta de Nuxt
    • Se traducen los mensajes de fail() y error() de SvelteKit y de useActionState de Next
    • Se traducen las tablas de Angular leídas con computed(), los valores iniciales de @state en Lit y el texto leído por índice (quotes[i].text)
    • check encuentra texto y estilos de izquierda/derecha en css`` de Lit y en styled-components
  32. v0.19.0

    29 de octubre de 2026

    Head de rutas de Qwik, constantes que se pasan a otros componentes, y un check que detecta lo que run omite

    • Los head de las rutas de Qwik City se traducen: export const head pasa a ser una función de la URL de la página, con su título y descripción en el idioma de esa página
    • Las constantes con textos que se pasan enteras (useState(TASKS), data={TASKS}) se construyen con t() en el único componente que las lee, sin perder su tipo
    • Las constantes que no pueden moverse, porque se comparan en el código, son dependencia de un efecto o las leen dos componentes, se informan con el motivo
    • check falla con los textos que run tuvo que omitir, con el motivo de run; la sintaxis de plantillas y otras omisiones intencionadas siguen pasando
    • Las listas de clases con utilidades de una palabra (border border-outline), las rutas de archivo y las listas con código de idioma ya no cuentan como texto
  33. v0.18.0

    29 de octubre de 2026

    Textos en cualquier campo que muestre un componente, títulos de página mediante funciones auxiliares, y una URL por idioma junto a tu propio proxy

    • Cuenta como texto cualquier campo que muestre un componente, no solo label y title (ROWS.map(({ task, manual }) => …)); los ids, enlaces y slugs nunca
    • Una lista que también se consulta con length, findIndex, some o includes se sigue igualmente, siempre que esas consultas no lean sus textos
    • Los títulos de página establecidos a través de un ayudante, export const metadata = pageMetadata({ title: … }), también se traducen
    • Los elementos que se mantienen fuera de los componentes en archivos de cliente se traducen con <Trans>, que no necesita un hook
    • Las aplicaciones con su propio proxy.ts obtienen i18n-proxy.ts: una llamada allí le da a cada página una URL por idioma
    • Las listas de clases de Tailwind ya no se informan como texto no traducido
  34. v0.17.0

    29 de octubre de 2026

    Páginas de Astro encontradas en su totalidad, bloques de plantilla dejados solos y comprobación en un monorepo

    • Astro: se encuentra texto después de una letra acentuada o una comilla rizada, y también cada página cuyo <head> tenga un <title>
    • Los diseños de Astro importan el módulo i18n una vez, con t y el idioma de la página desde una línea
    • Los comentarios de Django, los bloques verbatim y blocktranslate, y los bloques @verbatim y @php de Blade, permanecen como están escritos, por lo que una segunda ejecución no cambia nada
    • Los elementos de Vue con v-pre permanecen como están escritos
    • check ya no informa sobre copias traducidas en su lugar: un título de index.html, texto de SwiftUI en el Catálogo de Cadenas y blocktranslate de Django
    • check --workspaces (y el modo de la Acción: check con workspaces: true) comprueba cada aplicación en un monorepo
    • Los paquetes de monorepo sin UI, como un servidor API o un paquete de utilidades, se omiten
  35. v0.16.0

    29 de octubre de 2026

    Componentes de servidor encontrados por sus importaciones, y textos ya en otro idioma sin tocar

    • Next.js: los componentes fuera de app/ se renderizan como sus importadores; los que son solo para el servidor esperan al traductor, y los que ambas partes importan se convierten en componentes cliente
    • Las aplicaciones Next.js que también instalan Svelte o Vue se detectan como React, y con Cache Components el layout principal se renderiza por solicitud
    • El <code> en línea permanece dentro de su oración, por lo que la oración es un mensaje que los traductores pueden reordenar
    • El texto marcado lang="…" en otro idioma, y las listas con una entrada por idioma, permanecen como están escritas
    • <Trans> da a sus propios componentes un hijo sustituto tipado, para que los componentes con hijos requeridos pasen la verificación de tipos
    • La copia importada a través de alias de tsconfig como @/lib/nav se sigue
    • translate mantiene `inline code` como está escrito, rellena formas plurales que una ejecución anterior dejó fuera y avisa cuando un idioma regresa vacío
    • Las claves nunca terminan como una forma plural, y la verificación informa las formas plurales que faltan en un idioma
  36. v0.15.0

    28 de octubre de 2026

    El texto que solía pasarse por alto, los títulos de página y lo que sucede después de la fusión

    • Los idiomas regionales se eligen del navegador y Accept-Language: pt-PT llega al pt-BR de la app, zh-cn a su zh-CN
    • Los metadatos de Next.js se convierten en generateMetadata con el traductor de la solicitud; el título y la descripción de index.html de una SPA siguen el idioma
    • Monorepos: las bibliotecas de componentes se traducen con las aplicaciones que las utilizan, sus mensajes se fusionan en los archivos de localización de esas aplicaciones
    • pluralize(word, count) del paquete pluralize es un plural; las listas unidas por comas y "a, b y c" se convierten en Intl.ListFormat
    • la comprobación falla en las claves que faltan en el archivo de localización, e informa texto en CSS y valores almacenados que se muestran tal cual
    • Valor ARIA, texto de rol y descripción, títulos SVG en HTML estático y diseño de derecha a izquierda de React Native
    • Texto que antes se pasaba por alto: props de componentes como encabezado y descripción, tablas de búsqueda, funciones auxiliares y texto importado de módulos como nav.ts
    • Las fechas de date-fns, dayjs y moment siguen el idioma de la aplicación, al igual que localeCompare y las mayúsculas/minúsculas
    • Después de la fusión: las pruebas cargan i18n en su archivo de configuración, las aplicaciones React multilingües cargan archivos de idioma bajo demanda y los archivos de idioma se fusionan clave por clave
    • Remix y React Router se hidratan sin discrepancias; compruebe que las fuentes de las banderas no tengan letras del idioma de destino
  37. v0.14.0

    28 de octubre de 2026

    Plurales en cada framework, de Angular a iOS

    • Plurales en Angular (una tubería pluralForm generada), Django (pluralize to blocktranslate count), Laravel (trans_choice), Android (<plurals>) y iOS (variaciones de String Catalog)
    • Dos recuentos en una frase y ordinales en Vue, Svelte, Astro, Lit, Ember y Angular; dos recuentos en Flutter, Rails, Laravel y Android
    • Vue y Svelte: lo que los valores y funciones calculados devuelven se traduce, y las listas pasadas a componentes hijos se traducen
    • Componentes de clase: el texto antes del return en render(), constructores y métodos estáticos se traducen
    • Pug: las etiquetas en línea dentro de etiquetas en línea se convierten en mensajes anidados
    • La Acción de GitHub escanea la propia carpeta de cada framework (app/views, resources/views…) en lugar de siempre src/
  38. v0.13.0

    28 de octubre de 2026

    iOS, documentación Markdown, texto editado retraducido y el texto que solía pasarse por alto

    • iOS y macOS: la copia de SwiftUI y UIKit va a Localizable.xcstrings con cada idioma; las asignaciones de UIKit se convierten en String(localized:)
    • El código de vista de Android en Kotlin y Java (setText, label.text =) utiliza recursos de cadena, como layouts y Compose
    • localize-dev traduce el contenido de Markdown y MDX a un texto por idioma, manteniendo el código, enlaces y MDX sin cambios
    • El texto editado se vuelve a traducir: localize.lock.json recuerda cada mensaje original, y la comprobación falla si las traducciones están desactualizadas
    • Las claves no utilizadas se reportan y localize-dev prune las elimina
    • El texto en constantes leídas por componentes, cadenas concatenadas, mensajes de setter, toast y alertas, y mensajes de validación de zod/yup se extraen
    • Las oraciones de género se convierten en un mensaje con una variante por género
    • Idiomas de derecha a izquierda: la comprobación reporta estilos izquierda/derecha, y localize-dev rtl --fix intercambia los seguros por los lógicos
    • Las fechas, números y precios siguen el idioma de la app también en componentes de Vue y Svelte; más símbolos de moneda y una configuración para un dólar sin signo
    • Los componentes de clase de React se traducen mediante withTranslation(), y el título propio de un enlace permanece dentro de su oración
    • Las solicitudes de pull de vista previa cubren cada aplicación en un monorepositorio y dejan los archivos Git LFS sin tocar
    • Las plantillas de Vue escritas en Pug se traducen: texto de etiquetas, piped y bloques, y atributos
    • Angular antes de la versión 14 mantiene las oraciones alrededor de los enlaces intactas y las componentes NgModule reciben el pipe translate a través de su módulo
    • Una oración con dos cantidades recibe un plural por cada frase contada, y los ordinales (1º, 2º, 3º lugar) se convierten en formas plurales ordinales propias de cada idioma
    • Vue y Svelte: las constantes que muestra el plantado (como un título o una lista de pestañas en v-for o #each) se convierten en claves y se leen mediante o $_()
    • Toda componente de React en clase se traduce: <Translation> alrededor de render() cuando no es la exportación por defecto
    • Un enlace cuyo título se establece desde el código permanece dentro de su oración; las etiquetas de Pug #[inline] y #{values} se traducen
  39. v0.12.0

    28 de octubre de 2026

    Vista previa en tu repositorio, una verificación CI, pseudo-localización, y fechas y dinero

    • Vista previa de solicitud de extracción: conecta un repositorio y localize.dev localiza su rama por defecto en el servidor (hasta 200 cadenas) y abre una solicitud de extracción sin flujo de trabajo, clave ni checkout
    • localize-dev check (y el modo de la acción: check) falla en CI cuando el texto está codificado en duro o faltan traducciones, con anotaciones en la solicitud de extracción
    • --pseudo escribe un idioma pseudo en-XA (o ar-XB, de derecha a izquierda) para encontrar texto recortado o codificado en duro antes de traducir; gratis, también en el playground
    • Las fechas, números y precios codificados en duro a un idioma específico (toLocaleDateString('en-US'), formatadores Intl, `$${price}`) siguen el idioma de la aplicación en React, React Native y Solid
    • El modelo flaggea las traducciones de las que no está seguro, con su razón; la pestaña Revisar se abre para ellas y Aprobar el resto las deja para una persona
    • Una URL por idioma para motores de búsqueda: Next.js obtiene un proxy que sirve /es/… con enlaces hreflang, Nuxt prefix_except_default con useLocaleHead
    • Una calculadora de precios frente a agencias de traducción
  40. v0.11.0

    28 de octubre de 2026

    Svelte y Angular más antiguos, formato anidado y contexto de código en la revisión

    • Svelte 3 y 4 y Angular 14+ también mantienen las frases alrededor de los enlaces completas, a través de componentes generados que no necesitan características más nuevas
    • El formato dentro de un enlace (texto en negrita en un enlace, hasta tres niveles de profundidad) se convierte en un mensaje anidado en Vue, Svelte, Angular y Ember
    • Pestaña de revisión: En el código muestra las líneas alrededor de dónde se usa cada cadena, leídas de la pull request de la ejecución
    • La zona de pruebas muestra el componente generado a través del cual un archivo localizado renderiza sus frases
    • Los mensajes de Ember de la zona de pruebas y las guías usan marcadores de posición ICU, como la CLI
    • Phrase y Lokalise aparecen con sus propios logotipos
  41. v0.10.0

    28 de octubre de 2026

    Las oraciones con enlaces permanecen completas en todas partes, y las rutas dinámicas de Astro

    • Svelte 5, Angular 17+, Ember, Solid y Qwik mantienen una frase alrededor de un enlace o texto en negrita como un solo mensaje, renderizado por un componente generado (o rich() en Solid y Qwik), para que los traductores puedan mover el enlace
    • Rails: un link_to dentro de una frase se convierte en un mensaje _html con el enlace interpolado; el texto de link_to, button_to, submit y label se traduce
    • Astro: las rutas dinámicas también obtienen una copia por idioma, manteniendo sus getStaticPaths y props
    • Laravel: un middleware SetLocale selecciona el idioma (?locale=, una cookie lang, luego Accept-Language), registrado en bootstrap/app.php o el núcleo HTTP
    • Django: se encuentran los paquetes de configuración (settings/base.py) y se agrega LocaleMiddleware incluso sin SessionMiddleware
    • El playground acepta archivos de Rails, Django, Laravel y Android, y muestra los archivos de idioma propios de cada uno
    • Las cadenas de texto que faltan un idioma (o formas plurales) se solicitan de nuevo antes de caer en el respaldo
    • Requiere Node.js 22 o posterior; los proyectos sin package.json (Rails, Django, Laravel, Android, Flutter) se ejecutan mediante npx
  42. v0.9.0

    28 de octubre de 2026

    Rails, Django, Laravel, Android, Astro, Qwik, Lit, Ember y revisión de traducciones

    • Astro: los plantillas .astro se convierten en llamadas a t() que leen el idioma de la URL, con una copia de cada página estática por idioma y <html lang dir> configurado en los diseños
    • Las islas de Astro (React, Vue, Svelte) se localizan con sus páginas, siguiendo cada una el idioma de la página
    • Qwik: useTranslation() lee el idioma de la URL, con una ruta por idioma; Lit: plantillas html`` a t() con un controlador que vuelve a renderizar al cambiar el idioma
    • Ember: Plantillas Glimmer (.hbs, .gjs/.gts) a ember-intl’s {{t}}, con pluralidad de {{if (eq n 1) …}} y una ruta de aplicación que selecciona el idioma
    • Pestaña de revisión en cada proyecto: aprueba o edita traducciones automáticas, se incluyen formas plurales; las ediciones alimentan la memoria de traducción y se pueden confirmar en la solicitud de extracción abierta
    • Notas de revisión para el próximo revisor, quién aprobó qué y cuándo, y sugerencias del glosario a partir de las correcciones que sigues haciendo
    • Texto enriquecido anidado: las oraciones alrededor de enlaces que contienen texto en negrita y similares permanecen como un solo mensaje
    • Más patrones plurales: n > 1, Intl.PluralRules select(), y helpers plural(n, one, other)
    • Sincronización de Lokalise y Transifex; GitHub Action: tms_pull trae traducciones revisadas a la pull request, tms_push sube archivos fuente desde la rama predeterminada
    • El playground acepta archivos Astro
    • Rails: las vistas ERB se convierten en llamadas t() con config/locales YAML y count: plurales; se configuran los idiomas disponibles y un selector de idioma
    • Django: las plantillas obtienen las etiquetas translate y blocktranslate, se rellenan los catálogos .po y se activa LocaleMiddleware
    • Laravel: las vistas Blade se convierten en llamadas __() con lang/<locale>.json indexadas por el texto
    • Android: los layouts y Jetpack Compose se mueven a strings.xml (stringResource, marcadores de posición %1$s), con la lista de idiomas por aplicación
    • Vue: las oraciones alrededor de enlaces y texto en negrita permanecen en un solo mensaje, a través de <i18n-t>
    • Qwik: las rutas dinámicas también obtienen una copia por idioma
    • Las ejecuciones de la CLI (pr y pr --translate) llegan a la pestaña Revisar, como las de la Acción
    • Revisores por idioma, se les envía un correo electrónico una vez por ejecución cuando llegan las traducciones; cada fila en la pestaña Revisar enlaza a su archivo de origen
    • Una instalación más pequeña: los compiladores de Vue, Svelte, Angular, Astro y Ember se obtienen la primera vez que un proyecto los necesita
    • Guías por framework, con resultados reales de antes y después
  43. v0.8.0

    27 de octubre de 2026

    Angular, Flutter, Solid, y sincronización de Crowdin y Phrase

    • Angular: las plantillas y las plantillas en línea se convierten en la tubería ngx-translate, con el flujo de control, los enlaces y los atributos aria manejados; provideI18n() y TranslatePipe están integrados
    • Flutter: los argumentos de estilo Text() y hintText se convierten en búsquedas de AppLocalizations con archivos ARB, plurales ICU y metadatos de marcadores de posición; const se elimina donde es necesario y se configura gen-l10n
    • Solid: JSX con useTranslation() de un módulo i18next generado cuyo idioma es una señal
    • localize-dev sync push y pull: archivos de origen a Crowdin o Phrase, traducciones de vuelta a sus archivos de localización
    • El playground toma plantillas de Angular (.component.html) y archivos Dart
  44. v0.7.0

    27 de octubre de 2026

    Vue, Svelte, HTML estático, React Native y archivos de idioma existentes

    • localize-dev translate (y el modo de la Acción: translate) rellena las traducciones que faltan en los archivos de localización existentes: JSON, Rails YAML, gettext .po, Flutter .arb, Android strings.xml, Apple .xcstrings y .strings, extension messages.json
    • translate conserva las coincidencias ICU =0 y las ramas select, y crea nuevos idiomas gettext con sus propias reglas de plural
    • Componentes Vue de archivo único: el texto y los atributos de la plantilla se convierten en llamadas , con vue-i18n configurado e instalado
    • Svelte y SvelteKit: el marcado se convierte en llamadas $_() con svelte-i18n, inicializado desde +layout o main
    • Sitios HTML estáticos: marcadores data-i18n y un i18n.js generado que carga los archivos de localización, con un menú de idioma opcional
    • React Native y Expo: etiquetas de accesibilidad traducidas y una configuración de i18n que se ejecuta sin APIs del navegador
    • El framework se detecta automáticamente; anúlelo con "framework" en localize.config.json
    • Plurales en Vue (formato de barra vertical con las reglas de cada idioma) y Svelte (ICU); mensajes que se muestran desde scripts, como toasts y alertas
    • Las páginas de SvelteKit se renderizan en el idioma del visitante en el servidor; Nuxt obtiene @nuxtjs/i18n; se conservan las configuraciones existentes de vue-i18n y svelte-i18n
    • HTML: las oraciones con enlaces y texto en negrita permanecen completas, las páginas funcionan desde el disco y htmlPages escribe una copia traducida por idioma para los motores de búsqueda
    • Los idiomas de derecha a izquierda establecen dir en <html> en todas partes; el texto del motor de plantillas y PHP se dejan solos
    • Monorepos: --workspaces localiza cada aplicación (la Acción actualiza el archivo lockfile raíz)
  45. v0.6.0

    27 de octubre de 2026

    Un menú de idioma adecuado y useLanguage()

    • localize-dev/react: un menú de idiomas fácil de usar con teclado y lector de pantalla, con banderas y nombres nativos
    • Personaliza la lista, los nombres, las banderas, el diseño y los estilos, o reemplaza partes con render props
    • useLanguage() devuelve el idioma actual, su bandera, nombre y dirección, la lista y setLanguage()
    • Los idiomas de derecha a izquierda establecen dir en <html>; los selectores <select> generados se actualizan automáticamente
  46. v0.5.0

    27 de octubre de 2026

    Selector de idioma

    • Un <LanguageSwitcher /> generado lista cada idioma incluido en su propio nombre
    • Recuerda la elección (localStorage, o la cookie de idioma en Next.js para que los componentes del servidor sigan)
    • Los proyectos configurados por una versión anterior lo obtienen en su próxima ejecución, en una solicitud de extracción propia
  47. v0.4.0

    27 de octubre de 2026

    Plurales, texto enriquecido, componentes de servidor de Next.js, equipos

    • Mensajes plurales: una clave con exactamente las formas CLDR que cada idioma necesita
    • El texto alrededor de los enlaces y el formato se convierte en un mensaje <Trans> que los traductores pueden reordenar
    • Next.js App Router: los componentes del servidor usan un traductor esperado; los componentes del cliente comparten el idioma de la solicitud
    • Glosario del proyecto: términos para no traducir nunca, traducciones preferidas y una nota de estilo
    • Espacios de trabajo de equipo con invitaciones y un selector de espacios de trabajo
    • Facturación con Stripe y correos electrónicos de uso al 80 % y 100 %
  48. v0.3.0

    26 de octubre de 2026

    Estadísticas del proyecto e historial de ejecuciones

    • Las páginas del proyecto muestran cadenas traducidas y reemplazadas, ejecuciones y traducciones por idioma
    • La Acción de GitHub informa cada ejecución: pull request, cadenas reemplazadas, traducciones o el error
    • El uso se atribuye al repositorio de donde provino
    • Configuración paso a paso de claves de API y permisos de pull request, vinculada a la configuración de su repositorio
  49. v0.2.0

    26 de octubre de 2026

    Funciona en aplicaciones sin i18n

    • Agrega i18next y react-i18next cuando faltan, con el archivo de bloqueo actualizado en la Acción
    • Crea src/i18n.ts que carga cada archivo de idioma y lo importa desde su archivo de entrada
    • Habilita resolveJsonModule en tsconfig.json y coincide con su estilo de comillas
    • Deja las configuraciones existentes de i18next intactas
  50. v0.1.0

    26 de octubre de 2026

    Primera versión pública

    • Escáner AST para texto JSX, atributos en lista blanca y literales de plantilla renderizados en JSX
    • Transformador de diferencia mínima que agrega useTranslation una vez por componente
    • Modelo de traducción alojado en cada plan, con claves API, asignaciones mensuales y un nivel gratuito
    • Nomenclatura de claves semántica y traducción en una sola pasada, con comprobaciones de marcadores de posición antes de escribir nada
    • CLI: comandos init, login, whoami, scan, run y pr, además del modo offline
    • Acción de GitHub que mantiene actualizado un branch y una pull request por branch base
    • Playground web que ejecuta el mismo motor que la CLI