i1n

Localização como código — 7 ferramentas MCP para enviar, puxar, traduzir, extrair strings e pesquisar traduções. Com tecnologia de IA, type-safe, 182 idiomas.

Documentação

i1n

Seu app em todos os idiomas. Um único comando.

npm license MCP Listed on MCP Servers Security: DeepSec SaaSHub

demo

Localização como código. Envie suas chaves de tradução, a IA traduz para 182 idiomas, puxe definições TypeScript com segurança de tipos. Feito para desenvolvedores, agentes de IA e equipes de produto.

Grátis para sempre · Sem cartão de crédito · i1n.ai


Por que i1n?

i18n tradicional significa dezenas de arquivos JSON, zero segurança de tipos, horas de copiar e colar e deploys que quebram às 2 da manhã. Ferramentas existentes cobram $144+/mês e exigem fluxos de trabalho baseados em navegador.

i1n é diferente:

  • Um único comandoi1n push --translate es,fr,ja e pronto
  • Segurança de tiposi1n.d.ts gerado automaticamente com autocompletar completo da IDE
  • Nativo para IA — servidor MCP para Cursor, Claude Code, Windsurf. Seu agente cuida do i18n para você
  • Zero migração — Bridge Mode envolve seu i18next/next-intl/vue-i18n existente
  • 5x mais barato — Plano gratuito incluído. Pro por $29/mês vs Lokalise por $144/mês

📦 Instalação

# 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

Suporta npm, pnpm, yarn e bun.


🏁 Início 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

✨ Principais Recursos e Comandos

🛠️ i1n init

Configuração interativa que prepara seu workspace.

  • Autentica via chave de API.
  • Novo? Se você ainda não tem uma chave, a CLI fornece orientação clara sobre como começar.
  • Detecta automaticamente frameworks (Next.js, Vite, Expo, Flutter, Rails, etc.).
  • Salva a configuração em i1n.config.json (ignorado automaticamente via .gitignore).
  • Orquestração de IA: Opcionalmente, configura regras para suas ferramentas de codificação com IA.

⬆️ i1n push

Sincroniza suas traduções locais com o i1n.

  • Detecta novas chaves e alterações de origem.
  • Tradução Inteligente: Oferece traduzir chaves ausentes com uma estimativa de custo antes de prosseguir.
  • Camada de cache eficiente — traduções repetidas custam uma fração das novas.
  • Diff de três vias — o push envia apenas os pares (chave, idioma) que você realmente alterou, nunca sobrescrevendo edições feitas via dashboard ou por outros colegas. Veja Fluxo de trabalho em equipe para o modelo completo de conflitos.

Flags:

  • --translate [langs] — dispara tradução por IA após o push (ex.: --translate es,fr,ja)
  • --strategy <mode> — como lidar com conflitos reais: interactive (padrão em TTY), ours, theirs, abort
  • --force — atalho para --strategy ours (sobrescreve o servidor com seus valores locais; destrutivo)

⬇️ i1n pull

Baixa traduções e gera IDs com segurança de tipos.

  • Atualiza arquivos de idioma locais no formato configurado.
  • Gera i1n.d.ts para autocompletar completo da IDE.

📊 i1n limits

Acompanhamento de uso em tempo real.

  • Veja seu plano atual e uso de créditos.
  • Monitore slots de idiomas ativos e capacidade disponível.

i1n check

Detecte traduções quebradas antes de publicar. Feito para CI.

  • Detecta chaves ausentes por idioma, placeholders de interpolação quebrados ({{count}} perdidos na tradução), valores vazios e arquivos malformados.
  • --min-coverage 95 falha o build quando a cobertura de tradução cai abaixo do seu limite.
  • --json para ferramentas. Códigos de saída: 0 limpo, 1 erros encontrados, 2 problema de configuração.
  • 100% offline — sem chamadas de API, sem necessidade de segredos no CI.
# .github/workflows/ci.yml
- name: Validate translations
  run: npx i1n check --min-coverage 95

🧠 i1n setup-ai

Transforma sua IDE em uma especialista em localização.

  • Gera regras específicas do projeto para Cursor (.mdc), Claude Code (CLAUDE.md), Windsurf e outros.
  • Garante que agentes de IA sigam suas convenções de nomenclatura, estrutura de arquivos e voz da marca.

🔌 i1n mcp

Servidor MCP para assistentes de codificação com IA.

Inicia um servidor Model Context Protocol que permite que Cursor, Claude Code, Windsurf e outros assistentes de IA executem comandos i1n diretamente da sua 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 ferramentas disponíveis:

FerramentaDescrição
i1n_statusObter status do projeto, plano, limites e idiomas ativos
i1n_checkValidar arquivos de idioma offline: chaves ausentes, placeholders quebrados, cobertura
i1n_pushEnviar arquivos de tradução locais com diff de três vias (preserva edições no servidor, aborta em conflito para o agente resolver)
i1n_pullPuxar traduções e gerar definições TypeScript com segurança de tipos
i1n_translateTraduzir chaves para idiomas especificados usando IA
i1n_add_languageAdicionar novos idiomas com tradução automática opcional
i1n_extract_and_translateExtrair strings do código, enviar como chaves, traduzir para todos os idiomas
i1n_searchPesquisar chaves de tradução existentes por nome ou valor
i1n_setup_bridgeDetectar sua biblioteca i18n (i18next, vue-i18n, next-intl, etc.) e configurar o bridge mode do i1n de ponta a ponta

O fluxo de trabalho matador — diga ao seu agente de IA "internacionalize este componente":

  1. O agente lê seu arquivo e identifica strings hardcoded
  2. Ele chama i1n_extract_and_translate com as strings extraídas
  3. O i1n envia as chaves, traduz para todos os idiomas ativos, gera tipos
  4. O agente reescreve seu componente com chamadas t('key')

Uma tarefa de 60 minutos em 30 segundos.


👥 Fluxo de trabalho em equipe

O i1n é projetado para equipes onde várias pessoas editam traduções em paralelo — devs em branches diferentes, redatores no dashboard, agentes de IA via MCP. i1n push é seguro de executar sem se preocupar que sua árvore de trabalho local possa pulverizar as edições de outra pessoa.

Como o push decide o que enviar

Antes de cada push, a CLI:

  1. Lê seus arquivos de idioma locais (L).
  2. Pergunta ao servidor quais chaves existem e quando cada uma foi modificada pela última vez (chamada barata apenas de metadados, ~50× menor que um pull completo).
  3. Se algo mudou no servidor desde sua última sincronização, busca o estado completo do servidor (S).
  4. Calcula um diff de três vias por (namespace, key, lang) contra o último baseline que você sincronizou (P, armazenado em locales/.i1n-push-state.json).

Para cada (key, lang), o diff o coloca em um destes grupos:

LocalServidorBaselineAção
== servidorinalterado, pular
== baselinealteradoapenas no servidor — puxar automaticamente para seus arquivos de idioma
alterado== baselineedição local — enviar
alteradoalteradoambos moveramconflito — resolver interativamente
ausentepresentepresente no baselineavisar, não propagar (sem verbo de exclusão)

Apenas os idiomas que realmente mudaram localmente são enviados. Idiomas que você não tocou não estão no payload, então a mesclagem por idioma do servidor os preserva. Chega de "meu push sobrescreveu silenciosamente yield_rate que eu nunca nem abri".

Quando há um conflito real

Um conflito real significa que você e outra pessoa editaram o mesmo (key, lang) para valores diferentes desde a última sincronização. A CLI mostra cada um e pede que você escolha:

Conflict 1/3: common.greeting [en_us]

  › Keep local: "Hello there"
    Accept server: "Hi"
    Abort push
  • Local → enviar seu valor, sobrescrever o servidor.
  • Servidor → descartar seu local, puxar automaticamente o valor do servidor para seu arquivo.
  • Abortar → sair; nada é enviado.

Para ambientes em lote / CI / não interativos, passe uma estratégia:

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

Em contextos não-TTY (ex.: CI sem flag de estratégia), o push aborta com um diff dos conflitos para você resolver no código.

Puxando automaticamente alterações apenas no servidor

Se um colega ou alguém no dashboard atualizou uma chave que você nunca tocou, o valor do servidor é automaticamente gravado no seu arquivo local no momento do push e seu i1n.d.ts é regenerado se necessário. Sua árvore de trabalho acaba refletindo a realidade — seu git diff mostrará a incorporação para você commitar junto com suas próprias alterações.

Push via MCP (agentes de IA)

A ferramenta MCP i1n_push executa o mesmo diff, mas o padrão é abortar em conflito porque um agente de IA não deve escolher um vencedor silenciosamente. Conflitos são relatados na resposta para que o agente decida puxar, perguntar a você ou resolver manualmente antes de tentar novamente.

Checkouts novos

locales/.i1n-push-state.json é ignorado pelo git por design — é estado da árvore de trabalho, como .git/index. Em um clone novo ou branch novo onde o arquivo não existe, o baseline é sintetizado a partir do servidor. Qualquer divergência local do servidor é então tratada como conflito (a CLI não consegue distinguir se você editou localmente ou tem dados desatualizados). Execute i1n pull primeiro se você acabou de clonar e quer trazer tudo de forma limpa.


📁 Formatos Suportados

FormatoFrameworksExemplo de Arquivo
JSON aninhadoi18next, next-intl, vue-i18nen/common.json
JSON planoReact Native, Genéricolocales/en.json
ARBFlutter / Dartapp_en.arb
YAMLRuby on Railsen.yml
XML AndroidAndroid nativostrings.xml
Strings AppleiOS / macOSLocalizable.strings
TypeScriptJSON com segurança de tiposlocales/en.ts

🧩 Uso do SDK

O pacote i1n inclui um SDK de runtime para projetos JS/TS web e mobile. Você pode usá-lo de duas maneiras:

Modo Standalone — Substitua sua biblioteca i18n

Use o motor nativo do i1n diretamente. Sem dependências externas necessárias.

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"

Resolução de chaves funciona automaticamente com estruturas aninhadas e planas — use o formato que seu projeto preferir.

Bridge Mode — Mantenha sua biblioteca, adicione segurança de tipos

Já usa i18next, vue-i18n ou react-intl? Conecte-o ao i1n com uma linha e obtenha autocompletar 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 com qualquer biblioteca:

  • 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))

Pluralização

Defina variantes plurais com sufixos _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"

Interpolação

Três sintaxes suportadas universalmente: {var}, {{var}}, %{var}

JavaScript (sem TypeScript)

O SDK funciona em JS puro — você só não tem autocompletar:

import { init, t } from "i1n";
init({ locale: "en_us", resources: { en_us: { greeting: "Hello {name}" } } });
t("greeting", { name: "World" }); // "Hello World"

⚛️ Integração React / Preact

Para uma experiência "plug and play", use este padrão minimalista de provider.

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 sem JS

Projetos Flutter, Android e iOS não usam o SDK. Eles usam os arquivos de tradução (.arb, .xml, .strings) gerados por i1n pull com seus sistemas de localização nativos.


🛡️ Experiência do Desenvolvedor

🔒 Privacidade e Segurança

  • Auto-Ignorar: i1n init adiciona automaticamente arquivos de configuração sensíveis ao seu .gitignore.
  • Gerenciamento de Segredos: Chaves de API são armazenadas apenas localmente e nunca commitadas no controle de versão.
  • Transmissão Criptografada: Todas as operações de sincronização acontecem por canais HTTPS seguros.

🔒 Segurança de Tipos Zero-Config (TypeScript)

A CLI gera um arquivo de declaração leve (i1n.d.ts) que aumenta automaticamente o pacote i1n com as chaves específicas do seu projeto.

  1. Pull: Execute i1n pull. A CLI gera locales/i1n.d.ts e atualiza automaticamente seu tsconfig.json para que sua IDE os encontre imediatamente.
  2. Uso: Importe t de i1n e obtenha autocompletar completo + verificação em tempo de compilação. Sem mapeamento manual de caminhos necessário.
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);

Verificação estrita de literais chegou em 1.3.0: passar uma string hardcoded que não está em I1nKeys agora é um erro de TypeScript (sem mais avisos silenciosos de [i1n] Missing translation em runtime). Variáveis tipadas como string continuam funcionando sem casts.


💳 Preços

PlanoPreçoChaves (pool compartilhado)IdiomasTraduções de IA/mês
Starter$020022.000
Pro$29/mês2.000310.000
Business$99/mês8.000630.000
EnterpriseA partir de $399/mêsPersonalizado (25k+)IlimitadoPersonalizado

CLI, SDK e servidor MCP são gratuitos em todos os planos. Não é necessário cartão de crédito para o Starter.

Pro vitalício a partir de $199 — somente para os primeiros 200 usuários.


📄 Licença

MIT — © 2026 i1n.ai