Frequently asked questions

Everything you need to know about i18n-keyless before you start.

Do I need to manage translation files?

No. There are no JSON files, no key extraction step, and no build-time plugin. You write your sentences in your source language, the SDK sends them to the API on the first request, the API translates them with AI, and every subsequent request is served from the cache. Your code is the single source of truth.

What happens when I change the source text?

The source text is the key. Change it and you get a new key with a fresh AI translation. The old key simply stops being requested, and the dashboard cleans it up after 30 days without use. A typo fix is the same: fix it in the code, deploy, and the new text is translated on the first request.

How much does it cost?

Self-hosted: fully free, unlimited projects, no subscription and no usage cap — install the Docker image, use your own AI key. You like it? Tip me! Hosted: one flat price per project per month, by monthly active users — €4 up to 1,000, €9 up to 5,000, €29 up to 50,000, €99 up to 500,000 — billed monthly, cancel any time. There is no per-seat, per-word, or per-string pricing on either.

Can I export my translations?

Yes. The dashboard has an "Export JSON" button that downloads every translation in your project as a single JSON file. The export includes all rows, not just the ones used in the last 30 days, so it is a full backup. There is no lock-in: your data is always one click away.

What frameworks does it support?

React, React Native, Vue, Svelte, Vanilla JS, Node.js, Ruby on Rails, Python, Go, Swift and Kotlin. Every SDK works the same way: wrap your text in a translation call, and the API returns the translation for the current language. The server SDKs are thread-safe and cache translations in memory.

How many languages are supported?

48 languages, including regional variants like zh-Hans / zh-Hant, en / en-GB, fr / fr-CA, pt / pt-BR, and es / es-MX. Arabic, Hebrew and Urdu are in the list, so right-to-left languages work too. Adding a new language to your project is one click in the dashboard.

Does it work with server-side rendering?

Yes. The Node.js SDK uses AsyncLocalStorage so your loaders, head functions and server components can translate without a React provider. On the client side, the React provider hydrates from the server-rendered HTML. There are step-by-step guides for Next.js, Nuxt, and TanStack Start in the documentation.

Does it slow down my app?

The first time a new string is requested, the API calls the AI model — about half a second for a short UI string, more for a paragraph. Every request after that is served from the database, which is a regular cache hit. The SDK also caches translations locally, so returning users see zero network delay. If ten users request the same string at the same time, only one AI call is made.

What happens if the service goes down?

Every SDK caches translations locally — in localStorage on the web, AsyncStorage on mobile, and in memory on the server. If the API is unreachable, the SDK serves the cached translations. Your users see the last known translation, never a blank string. When the API comes back, the SDK refreshes silently.

Which AI provider does it use?

Five providers are supported: Mistral, OpenAI, Anthropic, Google, and any OpenAI-compatible endpoint such as Ollama, Groq, or Together. The operator picks the provider and the model from the dashboard or from the environment. The default on i18n-keyless.com is Mistral. Self-hosted users can run Ollama locally and send nothing to a third party.

Can I override an AI translation?

Yes. Click any cell in the dashboard, type the correct text, and save. The fix is permanent: the API never overwrites a value that was set by hand. You can also override translations through the API or through the MCP server, so an AI coding agent can fix a translation for you.

Can I migrate from i18next or another library?

Yes. There is a step-by-step migration guide for i18next, react-intl, and Lokalise in the documentation. The API has a migrate endpoint that imports your existing translations one by one, with no AI call and nothing billed. The MCP server has the same tool, so an AI agent can do the migration for you.

Is there a free plan?

The self-hosted edition is fully free with unlimited projects — install the Docker image, use your own AI key, and keep your data on your own server. No time limit, no feature gate. The hosted plan starts at €4 per month per project if you prefer not to run a server.

Is the source code available?

The server, the dashboard and the Docker image are published on GitHub under the Elastic License 2.0. You can read every line, run the code, and change it. The SDKs — React, Vue, Node, Rails and the others — are MIT-licensed. The only restriction: you may not offer the software as a hosted service to third parties.

One maintainer: what happens if the project stops?

The SDKs are MIT and stay on npm, PyPI, RubyGems and the other registries. The server is public under the Elastic License 2.0 and the protocol between them is documented, so anyone can run it, fork it, or write a server against it. Your translations leave in one JSON export at any time. If the hosted service stopped: installed apps keep serving their cached translations, a fresh client falls back to the source language, and pointing the SDK at your own instance with API_URL restores everything. What you would lose is the AI translation of new strings on i18n-keyless.com — not your data and not your app.

Read the full answer, with code
Is context not just a key in disguise?

No. A key is mandatory on every string, must be unique, and lives in a global namespace you maintain by hand. A context is optional, attached to the few strings whose meaning is ambiguous — "Close" the window or "close" by distance — and it describes the meaning, it does not name the string. Most strings carry none. The source text stays the lookup, with or without a context; two identical texts with two contexts are simply two rows.

Read the full answer, with code
Can I review the copy in a pull request?

Yes. The source string is in the code, so every wording change is a diff the reviewer reads in the pull request, in plain language rather than a key name. What is not in git is the translation into the other languages: it lives in the database, as it does with any translation platform, and you review it in the dashboard, where a per-cell "reviewed" mark separates what a person checked from what the AI wrote, or in the JSON export.

Read the full answer, with code
Why not Tolgee, which is open source too?

Tolgee is a key-based translation platform under the Apache 2.0 licence, with in-context editing, screenshot context and translation memory; if you want those, or translators in the loop, it is a good choice. i18n-keyless has no keys, no locale files, AI translation by default with a manual override the AI never rewrites, a server under the Elastic License 2.0 with MIT SDKs, and a self-hosted image that runs on SQLite in one container. For an in-context fix, take a screenshot and give it to an AI agent connected to the MCP server: it finds the string and overrides the translation. The comparison page in the docs puts the prices side by side.

Read the full answer, with code
Self-hosted or subscription: which one?

Self-hosted: the very same Docker image on your own server, fully free with unlimited projects, with your own AI key and your data at home. You like it? Tip me! Subscription: we run it, updates are automatic, one flat price per project from €4 a month. Take the subscription if you prefer not to run a server.

Read the full answer, with code
How do I handle dynamic values like names or counts?

Use the replace option. Write the sentence with a placeholder — "Hello {name}, you have {count} items" — and pass the values at render time with replace: { "{name}": userName, "{count}": String(n) }. The AI sees the placeholder and keeps it in every translation. The SDK substitutes the value at runtime.

How do I handle plurals?

Write one form with {count} where the number goes and pass the number as count. The API stores one ICU plural message per language with exactly the forms that language needs — two in French, four in Russian, six in Arabic — checked against Intl.PluralRules, and the SDK picks the right one. Add ordinal for ranks (1st, 2nd). You never write the branches yourself.

Read the full answer, with code
How do I handle genders?

Pass the value in select — select={{ gender: "female" }} — and the model writes one variant per value, in every language, with the agreement that language needs. Values are identifiers from a closed set, at most 10 per variable and 2 variables per sentence; a select and a count can be combined. Open values like a name stay a replace.

Read the full answer, with code
How do I format dates, numbers and currencies?

The SDK does not format them, your runtime does. Use Intl.DateTimeFormat and Intl.NumberFormat with the current language from the SDK, then put the result into the sentence with replace. One sentence, one translation, the right format in every language.

Read the full answer, with code
Can I customise the translation prompt?

No, and you do not need to. The prompt reads your context for each key: that is where tone, audience and meaning go, and it is what makes the same word translate differently in two places. And any translation can be overridden by hand in the dashboard; the API never overwrites what you wrote.

Read the full answer, with code
Does it have an MCP server for AI coding agents?

Yes. The API is also an MCP server with OAuth 2.1 authentication. An AI agent can list translations, translate strings, override values, import existing translations, and manage project members — the same operations a human does in the dashboard. Connect it from Claude Code, Cursor, Windsurf, or any MCP-compatible client.

Can I use it for backend strings and emails?

Yes. The Node.js, Ruby on Rails, Python and Go SDKs run on the server. Translate an email subject, an error message, or a push notification the same way you translate a UI string. The server SDKs cache translations in memory and refresh in the background, so they do not add latency to your request.

Can my whole team work on translations?

Yes. Add team members to a project from the dashboard or through the API. Every member can see all translations, override any value, and add languages. Admins create projects and manage members. There is no per-seat pricing: add as many people as you need.

How do I fix a typo?

The source text is the key. Fix a typo in the source and you get a new key with a fresh translation; the old string simply stops being asked for, and the dashboard cleans it up on its own after 30 days without use. A typo in a translation: edit the cell in the dashboard, and the fix is permanent.

Read the full answer, with code