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.

A surface your translators will actually like

Keyboard-first, quiet, and honest about state. Here’s a slice of the real editor.

strings
l10n/greeting-refresh
FRESJP
Sync5
KeyTranslation · FRState
app.ctaAdd translation…New
app.greetingBienvenueChanged
app.taglineLivrez dans toutes les languesSynced

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