v0.26.0Un servidor MCP para agentes de codificación

Envía tu app en todos los idiomas.

Cada cadena codificada en su aplicación web, móvil o de escritorio, encontrada y traducida con el contexto de su aplicación. Una solicitud de extracción para revisar y fusionar, desde un comando CLI o en cada push.

$npx localize-dev run
import { useTranslation } from 'react-i18next';

export function Inbox({ user, unread }) {
  const { t } = useTranslation();
  return (
    <section>
      <h1>{t('inbox.welcome_heading', { name: user.name })}</h1>
      <p>{t('inbox.unread_summary', { unread })}</p>
      <input placeholder={t('inbox.search_placeholder')} />
      <button>{unread ? t('inbox.mark_all_read') : t('inbox.refresh')}</button>
    </section>
  );
}

19 frameworks, desde React y Flutter hasta Rails, Android e iOS, y las herramientas que los rodean

¿Por qué localize.dev?

Cinco pasos manuales, hechos en una ejecución

El trabajo que repites en cada lanzamiento, hecho en una sola pasada y revisado como cualquier otro cambio de código.

  1. Buscar

    Normalmente:Buscar en el código base por cadenas, archivo por archivo

    Ahora:Cada cadena encontrada en el AST, incluyendo atributos, ternarios y literales de plantilla

  2. Nombre

    Normalmente:Inventar una clave para cada uno y esperar que permanezca consistente

    Ahora:Claves semánticas del contexto del componente; copias idénticas reutilizan su clave

  3. Traducir

    Normalmente:Exporta una hoja de cálculo, espera a los traductores, pégalo todo de nuevo

    Ahora:Cada idioma de destino traducido en una pasada

  4. Verificar

    Normalmente:Descubre el {placeholder} roto en producción

    Ahora:Se verifican los marcadores de posición antes de escribir

  5. Publicar

    Normalmente:Hazlo todo de nuevo en la próxima versión

    Ahora:Una solicitud de extracción en cada push, para que la nueva copia nunca se envíe sin traducir

5 traspasos la forma habitual

1 pull request con localize.dev

Pruébalo en tu código

Cómo funciona

De texto codificado a una solicitud de extracción localizada

Cuatro pasos deterministas, con el modelo solo donde el juicio ayuda: nombrar claves y traducir. Desplázate para seguir un componente a través de los cuatro.

01 / 04

Analizar el AST

Se analiza cada componente y página: plantillas JSX, Vue y Svelte, o HTML. Se extraen el texto, los atributos visibles para el usuario y las cadenas que su código renderiza. Se omiten las URL, los nombres de clase y los ejemplos de código.

src/checkout/Summary.tsx
4<aside className="resumen">class · ignorado
5 <h2>Resumen del pedido</h2>
6

Hola {user.name}, tienes {count} artículos</p>
7 Código de descuento" />
8 <button>Realizar pedido</button>
9 <Link href="/cart/edit">Editar carrito</Link>URL · ignorado
10</aside>

5

cadenas encontradas

2

ignorado por regla

1

componente

Traducción consciente del contexto

Traducido para donde se encuentra cada cadena

La traducción palabra por palabra se rompe en el momento en que una palabra significa dos cosas. localize.dev traduce cada cadena con lo que tu proyecto dice sobre ella y lo que el idioma de destino espera de ella.

Lee tu proyecto

Una cadena se traduce junto con dónde vive: el archivo, el componente y el elemento en el que se encuentra, por lo que la etiqueta de un botón, un título y un marcador de posición obtienen el significado correcto. Su glosario y notas de estilo mantienen los términos del producto y el tono iguales en cada archivo.

  • Ruta del archivo
  • Componente
  • Elemento y atributo
  • Términos del glosario
  • Nombres para no traducir
  • Tono y forma de dirigirse

"Post" → es

src/feed/Composer.tsx · dentro de <Button>Veröffentlichen
src/feed/PostCard.tsx · dentro de <CardTitle>Beitrag

Escribe para cada idioma

Los plurales obtienen cada forma que la localización necesita, incluso con dos recuentos en una oración, el 1.º y el 2.º siguen los ordinales propios de cada idioma, los enlaces y el texto en negrita se mueven donde la gramática los coloca, y la forma de dirigirse coincide con la voz que elegiste para cada mercado.

  • Reglas de plural de CLDR
  • Ordinales
  • Orden de las palabras
  • Tú formal o informal
  • Frases cortas de interfaz

"{count} archivos" → es

1 archivoone
3 archivosfew
5 de archivosmany

Establezca términos del glosario, nombres a conservar y notas de estilo por proyecto en el panel. Cada ejecución en ese repositorio los utiliza.

Localización continua

Cada push se mantiene localizado

Agrega la Acción de GitHub y las nuevas copias nunca se envían sin traducir. Cada ejecución actualiza la misma rama y solicitud de extracción, por lo que nunca terminas con una pila de PRs o conflictos entre ejecuciones.

  • Realiza un commit con los componentes y cada archivo de idioma.
  • Configura la biblioteca de i18n de tu framework si aún no existe.
  • El cuerpo de R enumera cada reemplazo y cada cadena omitida.
  • traducciones revisadas de Crowdin, Phrase, Lokalise o Transifex
  • muy a menudo termina en la pestaña Revisión del proyecto
  • verificación que rechaza pull requests con contenido sin traducir
Configurar la Acción

Localiza: 12 nuevas cadenas en 4 idiomas

localize-dev/mainmain

esfrdeja Placeholders verificados
.github/workflows/localize.yml
name: Localize

on:
  push:
    branches: [main]
  pull_request:
    types: [opened, synchronize]
  workflow_dispatch: # "Run workflow" button in the Actions tab

permissions:
  contents: write # push the localize-dev/<branch> branch
  pull-requests: write # open or update the localization PR

# One run per branch at a time; a newer push supersedes the running one.
concurrency:
  group: localize-${{ github.head_ref || github.ref_name }}
  cancel-in-progress: true

jobs:
  localize:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    # Skip localize.dev's own branches, and fork PRs (their token is read-only).
    if: >-
      !startsWith(github.head_ref || github.ref_name, 'localize-dev/') &&
      (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          # On PRs, scan the branch itself rather than the merge commit.
          ref: ${{ github.head_ref || github.ref_name }}

      - name: Localize
        uses: ufortstephen/autolocalize-action@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          api_key: ${{ secrets.LOCALIZEDEV_API_KEY }}
          target_locales: 'es,fr,de,ja'
          # src_dir: 'src' # default: your framework's (src, app/views, resources/views, lib…)
          # locales_path: 'public/locales/{locale}/common.json' # default: your framework's
          # working_directory: 'apps/web' # monorepo: localize just this app

Revisión humana

Los hablantes nativos dan el visto bueno y sus correcciones se mantienen

Las traducciones automáticas son un primer borrador. Cada idioma tiene su propio revisor, y cada corrección que hacen se recuerda en la siguiente ejecución.

  • El modelo marca las traducciones de las que no está seguro, con su razón, para que los revisores empiecen ahí.
  • Un revisor por idioma, notificado una vez por ejecución.
  • Aprobar o editar, incluyendo formas plurales, con un enlace al archivo original.
  • Los cambios se guardan en la solicitud de extracción abierta.
  • Notas para el siguiente revisor y términos del glosario sugeridos por correcciones repetidas.
Cómo funciona la revisión

12 traducciones españolas nuevas para revisar

Enviado al revisor de español del proyecto cuando la ejecución terminó

Revisión · es1 de 3 aprobados
  • Realizar pedido

    checkout.place_order

    Realizar pedido

    Aprobado
  • {{count}} artículos en tu carrito

    checkout.items

    {{count}} artículos en tu carrito

    Aprobar
  • Pagar

    checkout.heading

    Pago

    Editado

Los revisores siguen cambiando checkout a pago.

Agregar al glosario

Antes de lanzar

Detecta los problemas antes que tus usuarios.

Pruébalo en tu propio código, encuentra diseños que se rompen con texto más largo o de derecha a izquierda, detén la copia sin traducir y desactualizada en la solicitud de extracción, señala a los revisores las traducciones que necesitan y trae tus documentos.

Véalo en su código primero

Conecte un repositorio y obtenga una solicitud de extracción previa: hasta 200 cadenas de su rama predeterminada, localizadas en nuestro lado. Sin flujo de trabajo, clave ni comprobación.

Vista previa de localize.dev: 184 cadenas en es

localize-dev/previewmain

¿Cómo funciona la vista previa?

Una comprobación que lo mantiene así

La comprobación de localize-dev falla en una solicitud de extracción que agrega texto codificado en duras, deja un idioma atrás o cambia el inglés cuando sus traducciones no se han actualizado, y señala la línea. Ejecuta en CI sin clave API.

Verificación de i18n fallida

src/Cart.tsx:7 "Free shipping today" no está traducido
locales/de.json 3 mensajes no tienen traducción en alemán
locales/en.json cart.pay ha cambiado desde que fue traducido

Agregar la comprobación

Encuentre diseños rotos antes de traducir

localize-dev run --pseudo genera un idioma falso alargado y con acentos. Los botones recortados aparecen y también el texto que aún está codificado a mano. Gratis, sin modelo.

Realizar pedido[Þļáçé öŕðéŕ one two]en-XA: ~35% más largo, como el alemán
Prueba la localización pseudo

Revisa primero los dudosos

El modelo marca las traducciones de las que no está seguro, con su razón. La pestaña Revisar se abre en esos casos; aprueba el resto con un solo clic.

Reservar → Reservares

Necesita revisión: ¿una reserva o una novela? Se asumió reserva por el botón.

¿Cómo funciona la revisión?

Diseños de derecha a izquierda, comprobados antes de publicar

Con árabe o hebreo en tus idiomas, las listas de verificación ajustan los márgenes y alineaciones a un lado, y localize-dev rtl --fix cambia los seguros por los lógicos que se invierten automáticamente.

- margin-left-4 texto-izquierda redondeado-izquierda

+ ms-4 texto-inicio redondeado-derecha

¿Cómo funciona el texto de derecha a izquierda?

Sus documentos, en cada idioma también

localize-dev traduce el contenido de Markdown y MDX, documentos, publicaciones de blog y páginas legales a una copia por idioma. El código, enlaces y componentes permanecen exactamente como están escritos; solo los documentos editados se rehacen.

docs/intro.mdintro.es.mdintro.fr.mdintro.de.md
Traduzca sus documentos

Funciona donde construyes

Un motor para web, móvil y escritorio

Sitios web y aplicaciones renderizadas en servidor, aplicaciones iOS y Android, aplicaciones de escritorio y las bibliotecas de componentes que comparten. Cada una obtiene la biblioteca i18n que su framework espera.

01 / 04

Aplicaciones web

React · Next.js · Angular · Vue · SvelteKit · Astro

acmegoods.com/en

Free shipping on orders over $50

Acme Goods2
The weekend editPieces for slow mornings and long trips.Shop now
Canvas Weekender
New arrivalsView all
Studio Headphones
Studio Headphones$189
Essential Tee
Essential Tee$32
Parlour Palm
Parlour Palm$38
Minimal Watch
Minimal Watch$149

Integraciones

Tu framework, tus herramientas

Cada framework tiene su propia biblioteca i18n, configurada para ti. Las traducciones llegan a la solicitud de extracción, tu plataforma de traducción o los archivos de idioma que ya tienes.

Desde tu terminal

Ver cada cambio antes de que suceda

Ejécútalo localmente primero. --dry-run imprime cada reemplazo y cada cadena omitida con la razón, para que nada te sorprenda en revisión.

localize-dev scanlocalize-dev run --dry-runlocalize-dev run --pseudolocalize-dev checklocalize-dev prlocalize-dev translate
Referencia CLI
~/acme/storestore

$ npx localize-dev run -l es,fr,de

🔍 Escaneando src/ (idiomas objetivo: es, fr, de)

src/checkout/Summary.tsx

L6 Resumen del pedido → {t('checkout.order_summary_heading')}

L12 "Código de descuento" → {t('checkout.discount_code_placeholder')}

L15 Realizar pedido → {t('checkout.place_order_button')}

src/legacy/PromoBanner.tsx:9 omitido "Envío gratis en compras superiores a $50": componente de clase

✅ Se han localizado 3 cadenas en 1 archivo(s) (3 claves nuevas, 0 reutilizadas). 5 archivos escritos.

$

Cómo funciona el motor

Las reglas hacen la reescritura. El modelo solo nombra las claves y traduce.

Diferencias mínimas

Las ediciones se insertan en las posiciones exactas del AST. El formato y el orden de importación permanecen igual, para que los revisores solo vean las líneas que cambiaron.

- <button>Realizar pedido</button>
<button>{Realizar pedido}</button>
<a href="/terms">…

Frases completas

Texto, expresiones, enlaces y texto en negrita se combinan en un solo mensaje, para que los traductores vean la oración completa en lugar de fragmentos.

Hola {name}, tienes {count} elementos

Omite lo que no puede cambiar de forma segura

Las cadenas que el motor no puede reescribir de forma segura, como las de los componentes de clase o fuera de un Composable, se dejan como están y se informan con el motivo.

Idempotente

Ejécútalo en cada push. Las cadenas envueltas se dejan igual y la copia idéntica reutiliza su clave existente.

Nada para alojar

La traducción se ejecuta en el modelo alojado de localize.dev en cada plan. No necesitas GPUs, indicaciones o claves de proveedor. Solo una clave API.

Sin bloqueo

La salida es la biblioteca i18n que ya usa tu framework, con archivos de locales simples en tu repositorio. Deja de usar localize.dev mañana y tu app seguirá funcionando, con traducciones y todo.

  • react-i18next
  • vue-i18n
  • ngx-translate
  • svelte-i18n
  • ember-intl
  • Rails I18n
  • gettext
  • strings.xml
  • Flutter ARB

Fechas, números y dinero también

toLocaleDateString('en-US'), los formateadores Intl y `$${{price}}` se reescriben para seguir el idioma de la app, así que $1,234.50 se lee como 1.234,50 € para un visitante alemán.

Seguridad y privacidad

Lo que sale de tu máquina

Solo las cadenas que se traducen se envían a la API. Tus archivos fuente permanecen en tu máquina o en el entorno CI.

  • Cadenas, no fuente

    Solo se envían cadenas extraídas, con la ruta del archivo para contexto. Los archivos completos nunca salen de tu máquina.

  • Local cuando quieras

    Escaneos y ejecuciones offline ocurren en tu máquina sin clave API y sin llamadas de red, y no usan tu cuota.

  • Claves API hashadas

    Solo se almacena un hash de cada clave. Los secretos se muestran una vez, y revocar uno tiene efecto inmediato.

  • Todo o nada

    Si una ejecución excede tu plan, se detiene antes de escribir, dejando tu código completo.

Precios

Comienza gratis. Actualiza cuando tu contenido crezca.

Free

$0siempre

Todo lo que necesitas para localizar un proyecto secundario o probarlo en una base de código real.

  • 1000 cadenas / mes
  • 3 idiomas de destino
  • CLI and GitHub Action
  • El modo sin conexión y los escaneos nunca usan su cuota

Pro

Más popular

$100/año

Facturado anualmente

Para productos que se envían en varios mercados.

  • Cadenas ilimitadas
  • 5 idiomas de destino
  • Solicitudes de extracción en cada push
  • Panel de uso y claves API múltiples

Team

$200/año

Facturado anualmente

Incluye 3 miembros · +50 US$/año por miembro adicional

Para equipos de producto que se envían en muchos mercados.

  • Cadenas ilimitadas
  • Idiomas de destino ilimitados
  • 3 miembros incluidos, luego 50 US$/año cada uno
  • Espacios de trabajo ilimitados, compartiendo el plan
  • Proyectos, claves y uso compartidos
  • Soporte prioritario

Compara planes en detalle

Preguntas frecuentes

Preguntas que hacen los equipos primero

¿Es solo para aplicaciones web de React?+

No. Funciona en React y Next.js, React Native y Expo, Flutter, Angular, Vue y Nuxt, Svelte y SvelteKit, Astro, Solid, Qwik, Lit, Ember, Electron y Tauri, sitios HTML sencillos, plantillas Rails, Django y Laravel, diseños de Android, Jetpack Compose y código View, y aplicaciones iOS y macOS en SwiftUI y UIKit. Configura la biblioteca i18n correspondiente para cada una: react-i18next, ngx-translate, vue-i18n o @nuxtjs/i18n, svelte-i18n, ember-intl, gen-l10n de Flutter, Rails I18n, gettext de Django, recursos de cadenas de Android o un pequeño script para páginas estáticas.

Ya tenemos i18n configurado. ¿Sigue siendo útil?+

Sí. localize-dev translate rellena las traducciones faltantes en los archivos de localización que ya tienes, en cualquier stack: JSON (i18next, react-intl, vue-i18n, ngx-translate), Rails YAML, gettext .po, Flutter .arb, Android strings.xml, Apple String Catalogs y .strings, y mensajes de extensiones de navegador. El código no se toca, las traducciones existentes no se cambian y en CI se abre una pull request cada vez que llegan nuevas claves.

¿Sale mi código de mi máquina?+

Solo las cadenas que se están traduciendo se envían a la API de localize.dev, con su ruta de archivo y su ubicación (el componente y el elemento como un botón o un encabezado) como contexto. Nunca se envían archivos completos. La reescritura ocurre localmente (o en su propio ejecutor de CI), y los escaneos y las ejecuciones sin conexión nunca tocan la red.

¿Son las traducciones automáticas lo bastante buenas para publicarlas?+

Son un primer borrador sólido con marcadores de posición correctos y claves consistentes. Para textos regulados o críticos para la marca, asigne un revisor por idioma: reciben un correo electrónico cuando se completa una ejecución, aprueban o corrigen cada traducción en la pestaña Revisar, y las correcciones se incluyen en la solicitud de extracción abierta y en cada ejecución posterior. Las correcciones que surgen repetidamente se convierten en términos del glosario con un solo clic. El modelo también marca las traducciones sobre las que no está seguro, con su motivo, para que los revisores comiencen con ellas.

¿Qué pasa si dejamos de usar localize.dev?+

Tu aplicación sigue funcionando. La salida es la biblioteca i18n que tu framework ya utiliza (react-i18next, vue-i18n, ngx-translate, Rails I18n, gettext, recursos de cadenas de Android, Catálogos de cadenas de Apple…) con archivos de idioma sencillos en tu repositorio. No hay un runtime, SDK o proxy de localize.dev que eliminar.

Pega un componente o una página. Velo en dos idiomas.

No se necesita cuenta. El entorno de pruebas usa el mismo motor que la CLI.