How to migrate from Lokalise to i18n-keyless
If you're on Lokalise but you've realized you're not actually using TMS features — no translators, no glossaries, no in-context review — and Lokalise has just become an expensive JSON-file storage with AI auto-translate enabled, this guide walks through migrating to i18n-keyless.
If you do use Lokalise's TMS features (translator team, glossaries, branding workflows), don't migrate. Read the comparison — Lokalise is the right tool for that workflow.
TL;DR
- Export translations from Lokalise as flat JSON, one file per locale.
- Install i18n-keyless alongside whatever client library you currently use (likely i18next or react-intl driven by Lokalise's CLI).
- Import translations into the i18n-keyless backend so users see no regression.
- Sweep code file-by-file, replacing
t("key")calls with<I18nKeyless>. - Remove Lokalise CLI, the GitHub integration, the locale files in your repo, and the TMS subscription.
The migration usually takes 1–3 sprints, depending on app size and which client library Lokalise is feeding.
Who this guide is for
This guide assumes you're using Lokalise mostly as a translation pipeline:
- Translations get pushed/pulled via
lokalise-clior the GitHub integration. - Your code references translations via
i18next(orreact-intl, or another client library) — Lokalise just feeds the locale files. - You don't have a translator team actively logging into Lokalise's UI.
If your team does actively use Lokalise's translator UI, glossaries, and review workflows, stay on Lokalise. We don't replace those.
Step 1: Export translations from Lokalise
Use the Lokalise CLI or web UI to export translations as flat JSON, one file per locale:
# CLI export
lokalise2 file download \
--token YOUR_LOKALISE_TOKEN \
--project-id YOUR_PROJECT_ID \
--format json \
--bundle-structure "%LANG_ISO%.json"
You'll end up with en.json, fr.json, de.json, etc. Same shape as the i18next migration.
Step 2: Install i18n-keyless
npm install i18n-keyless-react
Initialize alongside your existing client (don't remove anything yet):
import * as I18nKeyless from "i18n-keyless-react";
I18nKeyless.init({
API_KEY: "YOUR_API_KEY",
storage: window.localStorage,
languages: {
primary: "en",
supported: ["en", "fr", "de", "es"],
},
});
See the quick-setup guide for storage options.
Step 3: Import existing translations to i18n-keyless
Same approach as the i18next migration — for each English string, you have the corresponding French / German / etc. translation. Import all of them so users see no regression on switch.
import en from "./locales-from-lokalise/en.json";
import fr from "./locales-from-lokalise/fr.json";
import de from "./locales-from-lokalise/de.json";
function flatten(obj: any, prefix = ""): Record<string, string> {
const out: Record<string, string> = {};
for (const k of Object.keys(obj)) {
const v = obj[k];
const key = prefix ? `${prefix}.${k}` : k;
if (typeof v === "string") out[key] = v;
else Object.assign(out, flatten(v, key));
}
return out;
}
const enFlat = flatten(en);
const frFlat = flatten(fr);
const deFlat = flatten(de);
const records = Object.entries(enFlat).map(([key, sourceText]) => ({
source: sourceText,
translations: {
fr: frFlat[key] ?? null,
de: deFlat[key] ?? null,
},
}));
// POST to the i18n-keyless API to pre-populate translations.
Step 4: Migrate the code
The code-level migration depends on which client library Lokalise is feeding:
- Lokalise + i18next (most common) → follow the i18next migration guide. Replace
t("key")calls with<I18nKeyless>. - Lokalise + react-intl → follow the react-intl migration guide.
- Custom client → the pattern is the same: dual-run, sweep file-by-file, replace key references with
<I18nKeyless>source strings.
Step 5: Remove the Lokalise pipeline
Once your code no longer references the locale files Lokalise was feeding:
- Disable the Lokalise GitHub integration (Settings → Integrations in Lokalise UI). This stops auto-PRs.
- Delete
.lokalise.config/lokalise.ymlfrom your repo. - Delete the locale JSON files in
public/locales/(or wherever they live). - Uninstall
@lokalise/node-api/lokalise2CLI if installed locally:npm uninstall @lokalise/node-api - Cancel your Lokalise subscription (or downgrade if you keep it for unrelated projects).
Keep your Lokalise project archived (don't delete it) for a quarter, just in case you want to roll back.
What you lose
Be honest about what you're giving up:
- Lokalise's translator UI. If you ever want to bring on translators, you lose this. You'd have to add them to i18n-keyless's dashboard (which is override-only, not a full translator workflow) or pick a TMS again.
- Translation memory across projects. If you have multiple Lokalise projects sharing TM, that disappears. Each i18n-keyless project is independent.
- Glossaries and brand consistency tooling. Same — gone.
- In-context preview / screenshot annotations. Not a feature in keyless.
- Lokalise's machine translation marketplace (DeepL, Google, etc.). i18n-keyless uses Mistral; you don't choose the provider.
What you gain:
- No Lokalise CLI, no GitHub auto-PRs, no locale files in the repo.
- AI translations for new strings without manual project setup.
- Faster setup for adding new locales.
- Lower cost (typically) for engineering-led teams with no translation workflow.
Common gotchas
Lokalise auto-PRs after migration
If you don't fully disable the GitHub integration, Lokalise will keep generating PRs to your repo even after you've stopped reading from those locale files. They become silent noise. Disable the integration explicitly in Lokalise's settings.
Locale files in .gitignore
Some teams .gitignore their locale files (treating them as build artifacts pulled from Lokalise at deploy time). After migration, there are no locale files at all — but check your build pipeline doesn't break expecting them to exist.
Branch-based Lokalise projects
Some teams have one Lokalise project per branch (feature branches, release branches). The migration swaps "branch-aware locale files" for "single source of truth in keyless". This usually simplifies the workflow but adjust your CI accordingly.
Custom keyboard / locale keyboards in Lokalise
If you used Lokalise to manage locale-specific assets that aren't strings (e.g., legal documents per country, marketing assets), keyless doesn't manage those — they need a different solution.
When NOT to migrate from Lokalise
We say this in the comparison too, but worth restating: if you genuinely use TMS features, stay on Lokalise. Specifically:
❌ You have translators logging into Lokalise's UI weekly. ❌ Brand glossaries enforce specific terminology. ❌ You have a structured review workflow with assigned reviewers. ❌ You localize content beyond UI strings (marketing pages, legal text, support articles) where human translators add real value. ❌ You have 30+ locales with strict consistency requirements.
If 3+ of these apply, the right move isn't to migrate — it's to lean further into Lokalise's TMS features.
FAQ
Can I migrate without exporting all translations first?
You could — and let i18n-keyless's AI re-translate everything from scratch. But you'd lose any human-edited translations Lokalise had on file. Always export first.
How long is the dual-run window?
As long as you need. Most teams complete the sweep in 2–3 sprints. The dual-run is reversible until you delete the Lokalise integration and locale files.
Will my Lokalise data be lost if I cancel?
Lokalise typically retains project data for a period after cancellation (check their current policy). To be safe, export everything to JSON before cancelling and keep a backup.
What if my client library is Lokalise's SDK directly?
If you use @lokalise/i18n or similar Lokalise-specific SDKs (less common), the code-level swap is more involved — you'd be replacing both the TMS and the runtime library at once. The dual-run approach still works; expect more code touch points.
Do I lose the cost savings if I keep Lokalise for one project?
You can keep Lokalise on a smaller plan for the projects that genuinely need it, while moving the rest to keyless. They're not mutually exclusive at the company level — only at the per-project level.
Next steps
- Compare options: i18n-keyless vs Lokalise.
- If your client is i18next: Migrate from i18next.
- If your client is react-intl: Migrate from react-intl.
- Read the philosophy: The complete guide to keyless i18n.
- Set up the SDK: Quick setup.