I1n

by Pakvothe

272 downloads
Not rated
GitHub

About

Localization as code — 7 MCP tools to push, pull, translate, extract strings, and search translations. AI-powered, type-safe, 182 languages.

Details

Author
Pakvothe
Downloads
272
Categories
Developer Tools, Other, Automation, AI

- 7 tools: status, push, pull, translate, add language, extract/translate, search
- Free forever with support for 182 languages
- AI agent can extract, push, translate, and generate TypeScript types automatically
- Automatic diff detection on push
- One‑step extract, push, and translate workflow

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name I1n
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Add the server to your MCP configuration using the npx i1n mcp command, then invoke its tools via an AI agent. No further setup is required beyond the JSON configuration.

i1n_status

Get project status including plan, limits, languages, and configuration

i1n_pull

Pull translations from i1n and generate TypeScript types

i1n_push

Push local translation files to i1n (with diff detection, only changed keys are pushed)

i1n_check

Validate local translation files offline: missing keys per language, broken interpolation placeholders, empty values, and coverage. Returns a JSON report. Safe for CI — no API calls.

i1n_translate

Translate to specified languages with AI. Estimates cost, translates, polls for completion, and auto-pulls results.

i1n_add_language

Add new languages to the project and optionally auto-translate existing keys

i1n_extract_and_translate

Accept extracted strings, push them to i1n, translate to all active languages, and pull updated types. Pass an array of {key, value, namespace?} objects.

i1n_search

Search existing translations by key name, namespace, or source value

i1n_setup_bridge

Detect any i18n library (i18next, vue-i18n, next-intl, react-intl, etc.) and configure i1n bridge mode in this project — end-to-end, with no terminal needed. Use when the user asks to 'set up / configure the bridge', 'wire up i1n with my existing i18n library', or 'install i1n on top of <library>'. If `i1n.config.json` doesn't exist yet, pass `apiKey` (and optionally `projectId`) and the tool runs init non-interactively (validate, pick project, write config) before wiring the bridge. If `apiKey` is missing, the tool returns status `needs_api_key` so you can ask the user for it. If multiple projects exist, it returns status `multiple_projects` with the list — re-call with the chosen `projectId`. Pass `write=true` to actually write the bridge helper file (do this whenever the user asks to *configure*/*install*; only leave it false if they explicitly asked to *analyze* or *preview*). For libraries outside the known list, the tool still emits a best-effort snippet flagged for verification.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "i1n": {
            "i1n": {
                "command": "npx",
                "args": [
                    "i1n",
                    "mcp"
                ]
            }
        }
    }
}

McpServers

{
    "i1n": {
        "command": "npx",
        "args": [
            "i1n",
            "mcp"
        ]
    }
}

Your app in every language. One command.

Localization as code. Push your translation keys, AI translates to 182 languages, pull type-safe TypeScript definitions. Built for developers, AI agents, and product teams.

Traditional i18n means dozens of JSON files, zero type safety, hours of copy-pasting, and deploys that break at 2 AM. Existing tools charge $144+/mo and require browser-based workflows.

- One commandi1n push --translate es,fr,jaand you're done
- Type-safe— auto-generatedi1n.d.tswith full IDE autocomplete
- AI-native— MCP server for Cursor, Claude Code, Windsurf. Your agent handles i18n for you
- Zero migration— Bridge Mode wraps your existing i18next/next-intl/vue-i18n
- 5x cheaper— Free tier included. Pro at $29/mo vs Lokalise at $144/mo

# 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
# 1. Initialize (auth + auto-detect setup) i1n init # 2. Push your translation keys i1n push # 3. Pull translations + auto-generated TypeScript types i1n pull

Interactive setup that prepares your workspace.

- Authenticates via API key.
- New?If you don't have a key yet, the CLI provides clear guidance on how to get started.
- Auto-detects frameworks (Next.js, Vite, Expo, Flutter, Rails, etc.).
- Saves configuration toi1n.config.json(automatically ignored via.gitignore).
- AI Orchestration: Optionally sets up rules for your AI coding tools.

- Detects new keys and source changes.
- Smart Translate: Offers to translate missing keys with a cost estimate before proceeding.
- Efficient caching layer — repeated translations cost a fraction of fresh ones.
- Three-way diff— push only sends the (key, lang) pairs you actually changed, never overwriting edits made via the dashboard or by other teammates. SeeTeam workflowfor the full conflict model.

- --translate [langs]— trigger AI translation after push (e.g.--translate es,fr,ja)
- --strategy <mode>— how to handle real conflicts:interactive(default in TTY),ours,theirs,abort
- --force— shorthand for--strategy ours(overwrite the server with your local values; destructive)

Downloads translations and generates type-safe IDs.

- Updates local locale files in your configured format.
- Generatesi1n.d.tsfor full IDE autocomplete.

- View your current plan and credit usage.
- Monitor active language slots and available capacity.

Catch broken translations before they ship. Built for CI.

- Detects missing keys per language,broken interpolation placeholders({{count}}lost in translation), empty values, and malformed files.
- --min-coverage 95fails the build when translation coverage drops below your threshold.
- --jsonfor tooling. Exit codes:0clean,1errors found,2config problem.
- 100% offline — no API calls, no secrets needed in CI.

# .github/workflows/ci.yml - name: Validate translations run: npx i1n check --min-coverage 95

Turns your IDE into a localization expert.

- Generates project-specific rules forCursor (.mdc),Claude Code (CLAUDE.md),Windsurf, and more.
- Ensures AI agents follow your naming conventions, file structure, and brand voice.

Starts aModel Context Protocolserver that lets Cursor, Claude Code, Windsurf, and other AI assistants execute i1n commands directly from your 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"] } } }

The killer workflow— tell your AI agent "internationalize this component":
- The agent reads your file and identifies hardcoded strings
- It callsi1n_extract_and_translatewith the extracted strings
- i1n pushes the keys, translates to all active languages, generates types
- The agent rewrites your component witht('key')calls

i1n is designed for teams where multiple people edit translations in parallel — devs in different branches, copywriters in the dashboard, AI agents via MCP.i1n pushis safe to run without worrying that your local working tree might pulverize someone else's edits.
- Reads your local locale files (L).
- Asks the server which keys exist and when each was last modified (cheap metadata-only call, ~50× smaller than a full pull).
- If anything moved on the server since your last sync, fetches the full server state (S).
- Computes a three-way diff per(namespace, key, lang)against the last baseline you synced (P, stored inlocales/.i1n-push-state.json).

For each(key, lang)the diff places it in one of these buckets:

Only the languages that genuinely changed locally are sent. Languages you didn't touch are not in the payload, so the server's per-language merge preserves them. No more "my push silently overwrote yield_rate that I never even opened".

A real conflict meansyou and someone else both edited the same(key, lang)to different valuessince the last sync. The CLI shows each one and asks you to pick:

Conflict 1/3: common.greeting [en_us] › Keep local: "Hello there" Accept server: "Hi" Abort push

- Local→ push your value, overwrite the server.
- Server→ discard your local, auto-pull the server's value into your file.
- Abort→ exit; nothing is pushed.

For batch / CI / non-interactive environments, pass a strategy:

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

In non-TTY contexts (e.g. CI without a strategy flag), push aborts with a diff of the conflicts so you can resolve in code.

If a teammate or someone in the dashboard updated a key you never touched, the server's value is automatically written into your local file at push time and youri1n.d.tsis regenerated if needed. Your working tree ends up reflecting reality — yourgit diffwill show the bring-in so you can commit it alongside your own changes.

The MCPi1n_pushtool runs the same diff but defaults toabort on conflictbecause an AI agent should not silently pick a winner. Conflicts are reported in the response so the agent can decide to pull, ask you, or resolve manually before retrying.

locales/.i1n-push-state.jsonis gitignored by design — it's working-tree state, like.git/index. On a fresh clone or new branch where the file doesn't exist, the baseline is synthesized from the server. Any local divergence from the server is then treated as a conflict (the CLI can't tell whether you edited locally or have stale data). Runi1n pullfirst if you just cloned and want to bring everything in cleanly.

Thei1npackage includes a runtime SDK for web and mobile JS/TS projects. You can use it in two ways:

Standalone Mode — Replace your i18n library

Use the i1n native engine directly. No external dependencies needed.

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"

Key resolutionworks with both nested and flat structures automatically — use whatever format your project prefers.

Bridge Mode — Keep your library, add type safety

Already using i18next, vue-i18n, or react-intl? Connect it to i1n with one line and get full autocompletion.

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

- vue-i18n:registerI1n((key, params) => i18n.global.t(key, params))
- react-intl:registerI1n((key, params) => intl.formatMessage({ id: key }, params))
- Custom:registerI1n((key) => myLookup(key))

Define plural variants with_zero,_one,_othersuffixes:

// 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"

Three syntaxes supported universally:{var},{{var}},%{var}

The SDK works in plain JS — you just don't get autocompletion:

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

For a "plug and play" experience, use this minimalist provider pattern.

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) });
const { t, setLocale } = useI1n(); return ( <div> <h1>{t("auth.title", { user: "Fran" })}</h1> <button onClick={() => setLocale("es_es")}>Español</button> </div> );

Flutter, Android, and iOS projects don't use the SDK. They use the translation files (.arb,.xml,.strings) generated byi1n pullwith their native localization systems.

- Auto-Ignore:i1n initautomatically adds sensitive config files to your.gitignore.
- Secret Management: API keys are only stored locally and never committed to version control.
- Encrypted Transmission: All sync operations happen over secure HTTPS channels.

The CLI generates a lightweight declaration file (i1n.d.ts) that automatically augments thei1npackage with your project's specific keys.
- Pull: Runi1n pull. The CLI generateslocales/i1n.d.tsandautomatically updatesyourtsconfig.jsonso your IDE finds them immediately.
- Usage: Importtfromi1nand get full autocomplete + compile-time checking. No manual path mapping required.

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

Strict literal checking landed in1.3.0: passing a hard-coded string that isn't inI1nKeysis now a TypeScript error (no more silent[i1n] Missing translationwarnings at runtime). Variables typed asstringkeep working without casts.

CLI, SDK, and MCP server are free on every plan. No credit card required for Starter.

Pro lifetime from $199 —only for the first 200 users.

This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.

Manage your app’s translations directly from your AI coding assistant. Search keys, create translations, trigger machine translation. All without leaving your editor.

Translate JSON i18n files using Google Gemini or local Ollama models, with incremental caching support.

Make your AI agent speak every language on the planet, using Lingo.dev Localization Engine.

Server for advanced AI-driven video editing, semantic search, multilingual transcription, generative media, voice cloning, and content moderation.

Integrates ComfyUI with MCP, allowing the use of custom workflows. Requires a running ComfyUI server.

Extract, govern, and ship structured content from your codebase.

Manage Rails i18n translations with CopyTuner. Search, update, and create translation keys.

Integrates the Dify AI API to generate Ant Design business component code. Supports text, image inputs, and streaming responses.

Connect Cursor, Claude Code, or any MCP-compatible tool directly to your ElmapiCMS instance. Manage collections, content, and assets through natural language.

Deploy and serve Haystack pipelines as REST APIs, MCP Tools, and OpenAI-compatible chat completion backends.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.