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.

npm license MCP Listed on MCP Servers Security: DeepSec SaaSHub

demo

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,ja y listo
  • Seguridad de tipos — i1n.d.ts autogenerado 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 de 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.ts para 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 idiomas activos y la capacidad disponible.

✅ i1n check

Detecta traducciones rotas antes de que se publiquen. 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 95 falla la compilación cuando la cobertura de traducción cae por debajo de tu umbral.
  • --json para herramientas. Códigos de salida: 0 limpio, 1 errores encontrados, 2 problema de configuración.
  • 100% sin conexión: sin llamadas a 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.
  • Garantiza que los agentes de IA sigan tus convenciones de nomenclatura, 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:

HerramientaDescripción
i1n_statusObtén el estado del proyecto, plan, límites e idiomas activos
i1n_checkValida archivos de idioma sin conexión: claves faltantes, marcadores rotos, cobertura
i1n_pushSube archivos de traducción locales con diff de tres vías (preserva las ediciones del servidor, aborta en conflicto para que el agente pueda resolver)
i1n_pullDescarga traducciones y genera definiciones de TypeScript con seguridad de tipos
i1n_translateTraduce claves a idiomas específicos usando IA
i1n_add_languageAñade nuevos idiomas con traducción automática opcional
i1n_extract_and_translateExtrae cadenas del código, súbelas como claves, traduce a todos los idiomas
i1n_searchBusca claves de traducción existentes por nombre o valor
i1n_setup_bridgeDetecta tu librería i18n (i18next, vue-i18n, next-intl, etc.) y configura el modo bridge de i1n de principio a fin

El flujo de trabajo definitivo — dile a tu agente de IA "internacionaliza este componente":

  1. El agente lee tu archivo e identifica las cadenas hardcodeadas
  2. Llama a i1n_extract_and_translate con las cadenas extraídas
  3. i1n sube las claves, traduce a todos los idiomas activos, genera tipos
  4. 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:

  1. Lee tus archivos de idioma locales (L).
  2. Pregunta al servidor qué claves existen y cuándo se modificó cada una por última vez (llamada barata solo de metadatos, ~50 veces más pequeña que una descarga completa).
  3. Si algo cambió en el servidor desde tu última sincronización, obtiene el estado completo del servidor (S).
  4. Calcula un diff de tres vías por (namespace, key, lang) contra la última línea base que sincronizaste (P, almacenada en locales/.i1n-push-state.json).

Para cada (key, lang), el diff lo coloca en uno de estos grupos:

LocalServidorLínea baseAcción
== servidor——sin cambios, omitir
== línea basecambiado—solo servidor — descarga automática a tus archivos de idioma
cambiado== línea base—edición local — enviar
cambiadocambiadoambos movidosconflicto — resolver interactivamente
faltantepresentepresente en línea baseavisar, no propagar (sin verbo de eliminación)

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. Se acabó el "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 → envía tu valor, sobrescribe el servidor.
  • Servidor → descarta tu local, descarga automáticamente 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.

Descarga automática 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.

Clonados 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 compatibles

FormatoFrameworksEjemplo de archivo
JSON anidadoi18next, next-intl, vue-i18nen/common.json
JSON planoReact Native, Genéricolocales/en.json
ARBFlutter / Dartapp_en.arb
YAMLRuby on Railsen.yml
XML de AndroidAndroid nativostrings.xml
Strings de AppleiOS / macOSLocalizable.strings
TypeScriptJSON con seguridad de tiposlocales/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"

Resolución de claves funciona con estructuras anidadas y planas automáticamente: usa el formato que prefiera tu proyecto.

Modo bridge — Conserva 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 compatibles 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 minimalista de proveedor.

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 init añade automáticamente archivos de configuración sensibles a tu .gitignore.
  • Gestión de secretos: Las claves de 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 configuración cero (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.

  1. Descarga: Ejecuta i1n pull. La CLI genera locales/i1n.d.ts y actualiza automáticamente tu tsconfig.json para que tu IDE los encuentre de inmediato.
  2. Uso: Importa t desde i1n y 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á en I1nKeys ahora es un error de TypeScript (sin más advertencias silenciosas de [i1n] Missing translation en tiempo de ejecución). Las variables tipadas como string siguen funcionando sin conversiones.


💳 Precios

PlanPrecioClaves (grupo compartido)IdiomasTraducciones IA/mes
Starter$020022,000
Pro$29/mes2,000310,000
Business$99/mes8,000630,000
EnterpriseDesde $399/mesPersonalizado (25k+)IlimitadoPersonalizado

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