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.
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.
- 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
- 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
- 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
- Verificar
Normalmente:Descubre el {placeholder} roto en producción
Ahora:Se verifican los marcadores de posición antes de escribir
- 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
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.
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
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
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
Localiza: 12 nuevas cadenas en 4 idiomas
localize-dev/mainmain
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 appRevisió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.
12 traducciones españolas nuevas para revisar
Enviado al revisor de español del proyecto cuando la ejecución terminó
Realizar pedido
checkout.place_order
Realizar pedido
Aprobado{{count}} artículos en tu carrito
checkout.items
{{count}} artículos en tu carrito
AprobarPagar
checkout.heading
Pago
Editado
Los revisores siguen cambiando checkout a pago.
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
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
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.
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.
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
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.mdFunciona 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
Free shipping on orders over $50





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.
Frameworks
Plataformas de traducción y CI
¿Ya localizado? localize-dev translate rellena los archivos de idioma de cualquier stack. Archivos de idioma existentes
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$ 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.
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
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.

