main → l10n/*

Translations
that live in your repository.

One source string, every language, and a clean path home. Strings pulls your keys out of the repo, translates them in place, and sends them back as a pull request.

Connect your repoSee how it works
One source · every language · home again
opens a pull request → merges to main
mainsource
en.json
app.greeting · 1 source string
Your repository
stringsapp.greeting
ENSource
Hello
FRBonjour
ESHola
JAこんにちは
+6 more languages, in sync
Translate in Strings
#482Open
Translate greeting
+9 ~1 · 9 locales
Back to GitHub
mainsource
en.json · app.greeting
stringsapp.greeting
ENSource
Hello
FRBonjour
ESHola
JAこんにちは
+6 more languages, in sync
#482Open
+9 ~1 · 9 locales → merges home to main
locales/en.jsonsource edited+1 −1
"app": {
"title": "Strings",
"greeting": "Hello",
+"greeting": "Welcome",
"cta": "Get started"
}
The source of truth

Your locale files are the truth. Strings just edits them.

No parallel database, no export-then-reimport ritual. Strings reads and writes the JSON, YAML and ARB files already in your repository. What you see in the editor is exactly what ships — versioned, reviewed and diffed like any other code change.

Reads your existing keys — no migration
Every change lands as a reviewable commit
Branch-aware — translate without blocking a release
What Strings does

Built for the people who actually translate

Three things, done quietly well — so localization stops being the step everyone dreads.

Translate in place

A clean grid of every key, side by side with its English source. Autosave on blur, inline edit history, and a flag the instant a source string changes under you.

Every language, one view

Open any key to see all locales at once, with completeness at a glance. Nothing slips through — you always know what’s missing before it ships.

Ship as a pull request

Review the diff, then sync. Strings commits to your branch and opens a PR — your team approves and merges it in GitHub, like any other change.

From repo to merged PR in three steps

How it works
1
Connect your repo

Point Strings at your locale files through GitHub. It reads your existing keys instantly — no schema, no import.

2
Translate on a branch

Work safely on a localization branch. Autosave, history and source-change flags keep everyone oriented as they go.

3
Sync to a pull request

One click commits your work and opens a PR. Review the diff, merge in GitHub, and the translations are live in your repo.

The editor

A surface your translators will actually like

Not a spreadsheet, not a ticket queue. Three small ideas that make localization feel calm — keyboard-first, quiet, and always honest about where every string stands.

Keyboard-first

Land, type, and fly to the next key without ever reaching for the mouse.

Honest about state

Every key wears its status. You see what’s new, what drifted, and what’s shipped.

Quiet by default

No save button, no modal pile-ups. It autosaves on blur and gets out of your way.

Make your repo multilingual.

Connect a repository and translate your first key in under five minutes. It commits back as a PR — nothing leaves your codebase.

Connect your repoRead the docs