i1n
Localización como código: 7 herramientas MCP para enviar, extraer, traducir, extraer cadenas y buscar traducciones. Impulsado por IA, con seguridad de tipos, 182 idiomas.
Documentación
i1n
Tu aplicación en todos los idiomas. Un solo comando.

Localización como código. Sube tus claves de traducción, la IA traduce a 182 idiomas, descarga definiciones de TypeScript con seguridad de tipos. Diseñado para desarrolladores, agentes de IA y equipos de producto.
Gratis para siempre · Sin tarjeta de crédito · i1n.ai
¿Por qué i1n?
La i18n tradicional significa docenas de archivos JSON, cero seguridad de tipos, horas de copiar y pegar, y despliegues que se rompen a las 2 AM. Las herramientas existentes cobran $144+/mes y requieren flujos de trabajo basados en navegador.
i1n es diferente:
- Un solo comando —
i1n push --translate es,fr,jay listo - Seguridad de tipos —
i1n.d.tsautogenerado con autocompletado completo del IDE - Nativo para IA — Servidor MCP para Cursor, Claude Code, Windsurf. Tu agente maneja la i18n por ti
- Cero migración — Bridge Mode envuelve tu i18next/next-intl/vue-i18n existente
- 5 veces más barato — Plan gratuito incluido. Pro a $29/mes vs Lokalise a $144/mes
📦 Instalación
# To use the CLI (global)
npm install -g i1n
# To use the SDK + types (in your app)
npm install i1n
# Local CLI usage (optional)
npm install -D i1n
Soporta npm, pnpm, yarn y bun.
🏁 Inicio rápido
# 1. Initialize (auth + auto-detect setup)
i1n init
# 2. Push your translation keys
i1n push
# 3. Pull translations + auto-generated TypeScript types
i1n pull
✨ Características y comandos clave
🛠️ i1n init
Configuración interactiva que prepara tu espacio de trabajo.
- Autentica mediante clave API.
- ¿Nuevo? Si aún no tienes una clave, la CLI te ofrece orientación clara sobre cómo empezar.
- Detecta automáticamente frameworks (Next.js, Vite, Expo, Flutter, Rails, etc.).
- Guarda la configuración en
i1n.config.json(ignorado automáticamente mediante.gitignore). - Orquestación de IA: Opcionalmente configura reglas para tus herramientas de codificación con IA.
⬆️ i1n push
Sincroniza tus traducciones locales con i1n.
- Detecta nuevas claves y cambios en el origen.
- Traducción inteligente: Ofrece traducir las claves faltantes con una estimación de coste antes de continuar.
- Capa de caché eficiente: las traducciones repetidas cuestan una fracción de las nuevas.
- Diff de tres vías: el push solo envía los pares (clave, idioma) que realmente cambiaste, sin sobrescribir nunca las ediciones hechas desde el panel o por otros compañeros. Consulta Flujo de trabajo en equipo para el modelo completo de conflictos.
Banderas:
--translate [langs]— activa la traducción con IA después del push (p. ej.--translate es,fr,ja)--strategy <mode>— cómo manejar conflictos reales:interactive(predeterminado en TTY),ours,theirs,abort--force— abreviatura de--strategy ours(sobrescribe el servidor con tus valores locales; destructivo)
⬇️ i1n pull
Descarga traducciones y genera IDs con seguridad de tipos.
- Actualiza los archivos de idioma locales en tu formato configurado.
- Genera
i1n.d.tspara autocompletado completo del IDE.
📊 i1n limits
Seguimiento de uso en tiempo real.
- Consulta tu plan actual y uso de crédito.
- Supervisa los espacios de idioma activos y la capacidad disponible.
✅ i1n check
Detecta traducciones rotas antes de que lleguen a producción. Diseñado para CI.
- Detecta claves faltantes por idioma, marcadores de interpolación rotos (
{{count}}perdidos en la traducción), valores vacíos y archivos malformados. --min-coverage 95falla la compilación cuando la cobertura de traducción cae por debajo de tu umbral.--jsonpara herramientas. Códigos de salida:0limpio,1errores encontrados,2problema de configuración.- 100% sin conexión: sin llamadas API, sin secretos necesarios en CI.
# .github/workflows/ci.yml
- name: Validate translations
run: npx i1n check --min-coverage 95
🧠 i1n setup-ai
Convierte tu IDE en un experto en localización.
- Genera reglas específicas del proyecto para Cursor (
.mdc), Claude Code (CLAUDE.md), Windsurf y más. - Asegura que los agentes de IA sigan tus convenciones de nombres, estructura de archivos y voz de marca.
🔌 i1n mcp
Servidor MCP para asistentes de codificación con IA.
Inicia un servidor Model Context Protocol que permite a Cursor, Claude Code, Windsurf y otros asistentes de IA ejecutar comandos de i1n directamente desde tu IDE.
# Add to Claude Code
claude mcp add i1n -- npx i1n mcp
# Or add to .mcp.json / cursor config
{
"mcpServers": {
"i1n": {
"command": "npx",
"args": ["i1n", "mcp"]
}
}
}
9 herramientas disponibles:
| Herramienta | Descripción |
|---|---|
i1n_status | Obtener estado del proyecto, plan, límites e idiomas activos |
i1n_check | Validar archivos de idioma sin conexión: claves faltantes, marcadores rotos, cobertura |
i1n_push | Subir archivos de traducción locales con diff de tres vías (preserva ediciones del servidor, aborta en conflicto para que el agente pueda resolver) |
i1n_pull | Descargar traducciones y generar definiciones de TypeScript con seguridad de tipos |
i1n_translate | Traducir claves a idiomas específicos usando IA |
i1n_add_language | Añadir nuevos idiomas con auto-traducción opcional |
i1n_extract_and_translate | Extraer cadenas del código, subirlas como claves, traducir a todos los idiomas |
i1n_search | Buscar claves de traducción existentes por nombre o valor |
i1n_setup_bridge | Detectar tu librería i18n (i18next, vue-i18n, next-intl, etc.) y configurar el bridge mode de i1n de extremo a extremo |
El flujo de trabajo definitivo — dile a tu agente de IA "internacionaliza este componente":
- El agente lee tu archivo e identifica las cadenas hardcodeadas
- Llama a
i1n_extract_and_translatecon las cadenas extraídas - i1n sube las claves, traduce a todos los idiomas activos, genera tipos
- El agente reescribe tu componente con llamadas a
t('key')
Una tarea de 60 minutos en 30 segundos.
👥 Flujo de trabajo en equipo
i1n está diseñado para equipos donde varias personas editan traducciones en paralelo: desarrolladores en diferentes ramas, redactores en el panel, agentes de IA mediante MCP. i1n push es seguro de ejecutar sin preocuparte de que tu árbol de trabajo local pueda pulverizar las ediciones de otros.
Cómo decide el push qué enviar
Antes de cada push, la CLI:
- Lee tus archivos de idioma locales (
L). - Pregunta al servidor qué claves existen y cuándo se modificó cada una (llamada barata solo de metadatos, ~50× más pequeña que una descarga completa).
- Si algo se movió en el servidor desde tu última sincronización, obtiene el estado completo del servidor (
S). - Calcula un diff de tres vías por
(namespace, key, lang)contra la última línea base que sincronizaste (P, almacenada enlocales/.i1n-push-state.json).
Para cada (key, lang), el diff lo coloca en uno de estos grupos:
| Local | Servidor | Línea base | Acción |
|---|---|---|---|
== servidor | — | — | sin cambios, omitir |
== línea base | cambiado | — | solo servidor — auto-descarga a tus archivos de idioma |
| cambiado | == línea base | — | edición local — enviar |
| cambiado | cambiado | ambos movidos | conflicto — resolver interactivamente |
| faltante | presente | presente en línea base | avisar, no propagar (sin verbo de borrado) |
Solo se envían los idiomas que realmente cambiaron localmente. Los idiomas que no tocaste no están en la carga útil, por lo que la fusión por idioma del servidor los preserva. Nada de "mi push sobrescribió silenciosamente yield_rate que ni siquiera abrí".
Cuando hay un conflicto real
Un conflicto real significa que tú y otra persona editaron el mismo (key, lang) a valores diferentes desde la última sincronización. La CLI muestra cada uno y te pide elegir:
Conflict 1/3: common.greeting [en_us]
› Keep local: "Hello there"
Accept server: "Hi"
Abort push
- Local → enviar tu valor, sobrescribir el servidor.
- Servidor → descartar tu local, auto-descargar el valor del servidor a tu archivo.
- Abortar → salir; no se envía nada.
Para entornos por lotes / CI / no interactivos, pasa una estrategia:
i1n push --strategy theirs # accept all server values, push nothing for conflicts
i1n push --strategy ours # local wins (alias: --force)
i1n push --strategy abort # exit on any conflict
En contextos sin TTY (p. ej. CI sin bandera de estrategia), el push aborta con un diff de los conflictos para que puedas resolverlos en código.
Auto-descarga de cambios solo del servidor
Si un compañero o alguien en el panel actualizó una clave que nunca tocaste, el valor del servidor se escribe automáticamente en tu archivo local al hacer push y tu i1n.d.ts se regenera si es necesario. Tu árbol de trabajo termina reflejando la realidad: tu git diff mostrará la incorporación para que puedas confirmarla junto con tus propios cambios.
Push MCP (agentes de IA)
La herramienta MCP i1n_push ejecuta el mismo diff pero por defecto aborta en conflicto porque un agente de IA no debería elegir un ganador silenciosamente. Los conflictos se reportan en la respuesta para que el agente pueda decidir descargar, preguntarte o resolver manualmente antes de reintentar.
Checkouts nuevos
locales/.i1n-push-state.json está en gitignore por diseño: es estado del árbol de trabajo, como .git/index. En un clon nuevo o una rama nueva donde el archivo no existe, la línea base se sintetiza desde el servidor. Cualquier divergencia local del servidor se trata entonces como conflicto (la CLI no puede saber si editaste localmente o tienes datos obsoletos). Ejecuta i1n pull primero si acabas de clonar y quieres traer todo limpiamente.
📁 Formatos soportados
| Formato | Frameworks | Ejemplo de archivo |
|---|---|---|
| JSON anidado | i18next, next-intl, vue-i18n | en/common.json |
| JSON plano | React Native, Genérico | locales/en.json |
| ARB | Flutter / Dart | app_en.arb |
| YAML | Ruby on Rails | en.yml |
| XML de Android | Android nativo | strings.xml |
| Apple Strings | iOS / macOS | Localizable.strings |
| TypeScript | JSON con seguridad de tipos | locales/en.ts |
🧩 Uso del SDK
El paquete i1n incluye un SDK en tiempo de ejecución para proyectos JS/TS web y móviles. Puedes usarlo de dos maneras:
Modo independiente — Reemplaza tu librería i18n
Usa el motor nativo de i1n directamente. Sin dependencias externas necesarias.
import { init, t, setLocale } from "i1n";
// Load your translation resources
init({
locale: "en_us",
resources: {
en_us: {
auth: { login: "Login", title: "Welcome back, {user}" },
items_one: "One item",
items_other: "{count} items",
},
es_es: {
auth: { login: "Entrar", title: "Bienvenido de nuevo, {user}" },
items_one: "Un elemento",
items_other: "{count} elementos",
},
},
});
// Autocomplete and type-safety work out of the box after 'i1n pull'
t("auth.login"); // "Login"
// Support for default values (useful during development)
t("new.key", { defaultValue: "Coming soon..." }); // "Coming soon..."
// Variables & Plurals
t("auth.title", { user: "Fran" }); // "Welcome back, Fran"
t("items", { count: 5 }); // "5 items"
// Switch language at runtime
setLocale("es_es");
t("auth.login"); // "Entrar"
La resolución de claves funciona automáticamente con estructuras anidadas y planas: usa el formato que prefiera tu proyecto.
Bridge Mode — Mantén tu librería, añade seguridad de tipos
¿Ya usas i18next, vue-i18n o react-intl? Conéctalo a i1n con una línea y obtén autocompletado completo.
import i18next from "i18next";
import { registerI1n, t } from "i1n";
// Set up i18next as usual
await i18next.init({
lng: "en",
resources: {
/* ... */
},
});
// Connect to i1n — one line
registerI1n((key, params) => i18next.t(key, params));
// Now t() uses i18next under the hood, but with strict type checking
t("common.greeting", { name: "World" }); // Powered by i18next, typed by i1n
Funciona con cualquier librería:
- vue-i18n:
registerI1n((key, params) => i18n.global.t(key, params)) - react-intl:
registerI1n((key, params) => intl.formatMessage({ id: key }, params)) - Personalizado:
registerI1n((key) => myLookup(key))
Pluralización
Define variantes plurales con sufijos _zero, _one, _other:
// In your translation files:
// "items_zero": "No items"
// "items_one": "One item"
// "items_other": "{count} items"
t("items", { count: 0 }); // "No items"
t("items", { count: 1 }); // "One item"
t("items", { count: 5 }); // "5 items"
Interpolación
Tres sintaxis soportadas universalmente: {var}, {{var}}, %{var}
JavaScript (sin TypeScript)
El SDK funciona en JS plano: simplemente no obtienes autocompletado:
import { init, t } from "i1n";
init({ locale: "en_us", resources: { en_us: { greeting: "Hello {name}" } } });
t("greeting", { name: "World" }); // "Hello World"
⚛️ Integración con React / Preact
Para una experiencia "plug and play", usa este patrón de proveedor minimalista.
import { createContext, useContext, useState, useEffect } from "react";
import { init, t, getLocale, setLocale as sdkSetLocale } from "i1n";
// 1. Initialize with wordings
// (In a real app, you'd probably import these from your locales folder)
init({
locale: "en_us",
resources: {
/* ... */
},
});
const STORAGE_KEY = "i1n-locale";
const I1nContext = createContext({
locale: "en_us",
setLocale: (l: string) => {},
});
// 2. Persistent Provider
export function I1nProvider({ children, defaultLocale = "en_us" }) {
const [locale, setLocaleState] = useState(() => {
return localStorage.getItem(STORAGE_KEY) || defaultLocale;
});
// Keep SDK in sync
useEffect(() => {
sdkSetLocale(locale);
}, [locale]);
const setLocale = (newLocale: string) => {
localStorage.setItem(STORAGE_KEY, newLocale);
setLocaleState(newLocale);
};
return (
<I1nContext.Provider value={{ locale, setLocale }}>
{children}
</I1nContext.Provider>
);
}
// 3. Simple Hook
export const useI1n = () => ({ t, ...useContext(I1nContext) });
Uso:
const { t, setLocale } = useI1n();
return (
<div>
<h1>{t("auth.title", { user: "Fran" })}</h1>
<button onClick={() => setLocale("es_es")}>Español</button>
</div>
);
Plataformas sin JS
Los proyectos Flutter, Android e iOS no usan el SDK. Usan los archivos de traducción (.arb, .xml, .strings) generados por i1n pull con sus sistemas de localización nativos.
🛡️ Experiencia de desarrollador
🔒 Privacidad y seguridad
- Auto-ignorar:
i1n initañade automáticamente archivos de configuración sensibles a tu.gitignore. - Gestión de secretos: Las claves API solo se almacenan localmente y nunca se confirman en el control de versiones.
- Transmisión cifrada: Todas las operaciones de sincronización ocurren a través de canales HTTPS seguros.
🔒 Seguridad de tipos con cero configuración (TypeScript)
La CLI genera un archivo de declaración ligero (i1n.d.ts) que aumenta automáticamente el paquete i1n con las claves específicas de tu proyecto.
- Descarga: Ejecuta
i1n pull. La CLI generalocales/i1n.d.tsy actualiza automáticamente tutsconfig.jsonpara que tu IDE los encuentre de inmediato. - Uso: Importa
tdesdei1ny obtén autocompletado completo + verificación en tiempo de compilación. Sin mapeo de rutas manual requerido.
import { t } from "i1n";
// Full autocomplete & compile-time checking
t("auth.login.title");
// ERROR: Argument of type '"auth.login.titlse"' is not assignable...
t("auth.login.titlse");
// Dynamic strings still pass through — useful for `t(item.name)`,
// runtime-built keys, etc.
declare const dynamicKey: string;
t(dynamicKey);
La verificación estricta de literales llegó en
1.3.0: pasar una cadena hardcodeada que no está enI1nKeysahora es un error de TypeScript (sin más advertencias silenciosas de[i1n] Missing translationen tiempo de ejecución). Las variables tipadas comostringsiguen funcionando sin casts.
💳 Precios
| Plan | Precio | Claves (grupo compartido) | Idiomas | Traducciones IA/mes |
|---|---|---|---|---|
| Starter | $0 | 200 | 2 | 2,000 |
| Pro | $29/mes | 2,000 | 3 | 10,000 |
| Business | $99/mes | 8,000 | 6 | 30,000 |
| Enterprise | Desde $399/mes | Personalizado (25k+) | Ilimitado | Personalizado |
CLI, SDK y servidor MCP son gratuitos en todos los planes. No se requiere tarjeta de crédito para Starter.
Pro de por vida desde $199 — solo para los primeros 200 usuarios.
📄 Licencia
MIT — © 2026 i1n.ai