Localis
Runs on your machine

Only the missing translations.

Point Localis at a project on your disk. It finds the keys your other locales are missing, translates only those with AI, and writes them back into your own files β€” after you approve them.

./messages Β· source en 2 missing
checkout.pay

Pay now

Payer maintenant

checkout.total

Total: {amount}

Total : {amount}

Approve all placeholders checked

The tedious part

English gains four keys. Five locales fall four keys behind. Finding which ones means diffing JSON by hand, and pasting whole files into a chat window re-translates work that was already reviewed.

French 14 missing

124 / 138

Spanish Complete

138 / 138

Localis computes this from your files every time you open it. There is no database to drift out of sync.

How it works

Four screens, no setup

  1. 1

    Select a project

    Pick a folder. Any stack β€” Next.js, Go, Rails, Laravel, Flutter, or something it has never seen.

  2. 2

    It works out your setup

    The i18n library, the translation directories, the source language, every locale. Read from manifests, config and source β€” never folder names alone.

  3. 3

    Translate what's missing

    Only keys that exist in English and are absent from the target are ever sent to your AI provider. Never a whole file.

  4. 4

    Review, then approve

    Every suggestion is shown next to its source with placeholder checks. Nothing touches disk until you say so.

Works with what you have

Your layout, not a prescribed one

JSON YAML CSV ARB

Read and written: JSON, YAML, CSV. A locale can live in the file name, as the file's root key (Rails), or inside one shared file β€” as root keys, as a key on every entry, or as CSV columns. Localis reads the file to find out which.

Detection covers next-intl, next-i18next, next-international, react-i18next, i18next, Lingui, Paraglide, Tolgee and plain JSON setups β€” and reads paths straight out of your config when it declares them.

Or describe it yourself

Every set is a folder plus a pattern. Preview what it matches, then save the formula β€” locally, or committed as localis.json for your team.

  • {locale}.json one file per locale
  • {locale}/{namespace}.json one folder per locale
  • {namespace}/{locale}.json one folder per namespace
  • active.{locale}.json go-i18n
  • translations.json every locale in one file
  • strings.csv one column per locale

Monorepos

Every app and package in one table

Ten apps with ten locales folders is the normal case, not the exception. Localis finds every set, then shows sets down the side and languages across the top, so β€œwhere is Spanish missing?” is one glance instead of ten clicks.

Add language everywhere creates a locale's files across every set that lacks it, and skips the ones that already have it.

pnpm Β· npm Β· yarn Turborepo Β· Nx Β· Lerna Go Β· Cargo workspaces
Set en de es fr
apps/marketplace source ignored βœ“ 14
apps/dashboard source ignored βœ“ 8
packages/ui source ignored – –
packages/checkout source ignored βœ“ βœ“

What it won't do

The safety is the feature

Existing translations are never touched

Only absent or blank keys are sent to the model or written. The key list is recomputed from your files at request time and again at write time, so a stale tab can't overwrite finished work.

Placeholders have to survive

{name}, {{count}}, {count, plural, …}, %s and %1$s are compared between source and translation. A mismatch blocks approval β€” in the browser and again on the server.

Your files keep their shape

Nesting, key order, indentation and trailing newline are preserved. YAML keeps its comments. CSV keeps its delimiter and extra columns. Writes are atomic.

Nothing leaves your machine

No account, no database, no repository upload. Your API key lives in a file in your home directory that the browser never sees. The only outbound request is to the provider you configured.

Get started

Clone it, run it, point it at a project

Localis runs on your own machine β€” that's the whole idea. Add an OpenAI key (or any OpenAI-compatible endpoint) in Settings once, and you're done.

A small CLI comes with it, for the one thing a terminal does better: localis status --check exits non-zero when translations lag, so CI can hold the line.

$ git clone https://github.com/ishworgiri1999/localis
$ cd localis
$ pnpm install
$ pnpm dev

  β–Έ http://127.0.0.1:3010

Connect nothing. Configure almost nothing.

Select your project and translate only what's missing.