Translations that ship with your code
Translation management that speaks git
wortwerk reads your source strings from GitHub or Bitbucket, lets your translators work in a focused editor and sends the result back as a pull request.
locales/de.json "checkout": { - "title": "Checkout" + "title": "Zur Kasse" + "items_one": "{{count}} Artikel", + "items_other": "{{count}} Artikel" }
Works with the stack and files you already have
From commit to merged translations
wortwerk sits between your repository and your translators. Nobody uploads or downloads files.
- 1acme/webshopmainacme/appdeveloplocales/%locale%.json
Connect
Connect a repository and point wortwerk at your locale files.
- 2checkout.titlenewcart.itemsnewnav.home
Sync
Every push updates the source strings. New keys show up right away, removed ones are set aside.
- 3Checkout→Zur Kassede96%fr81%it64%
Translate
Translators fill the gaps with translation memory, context and optional AI pre-translation.
- 4Update translationswortwerk/translations → main+42−3Merged
Merge
wortwerk opens a pull request with clean, minimal diffs. You review and merge.
Built for GitHub and Bitbucket
Connect once per workspace, then link any repository to a project. wortwerk only ever writes to its own branch.
GitHub
Install the wortwerk GitHub App on the repositories you choose. Access is scoped per repository and can be revoked any time.
- Fine-grained access through a GitHub App
- Push webhooks trigger a sync automatically
- One pull request, refreshed on every export
Bitbucket Cloud
Connect your Bitbucket Cloud account and pick a repository. wortwerk registers a signed webhook for it.
- OAuth connection, no app passwords
- Signed webhook per repository
- Pull requests from a dedicated branch
Something else? Trigger a sync from any CI pipeline with a project token.
Built for developers and translators
Git-native
Source strings come from your repo, translations go back as a pull request on a dedicated branch.
JSON, YAML and PO
i18next, Rails and gettext files keep their key order, nesting and comments.
Plurals done right
ICU MessageFormat under the hood, with the right plural forms for every language.
Full history
Every change is a revision. Review statuses keep quality visible.
Context for translators
Comments, screenshots and translation memory right next to each key.
Machine translation
Pre-translate with AI on the agency plan, placeholders stay intact.
Simple pricing
Agency
CHF 500 / year
- Up to 500,000 keys
- Up to 10 team members
- GitHub and Bitbucket
- Machine translation included
Questions and answers
The short answers to what teams usually ask first.
Do I have to change my translation files?
No. wortwerk reads JSON (nested, flat or i18next style), Rails YAML and gettext PO files as they are, and writes them back with the same key order, nesting and comments.
Will wortwerk push to my main branch?
Never. Translations go to a dedicated branch (wortwerk/translations by default) and reach your main branch only through a pull request you review and merge.
What happens when I delete a key in my code?
The key is marked obsolete and its translations are kept. If the key comes back, everything is restored. Obsolete keys are only purged when you decide to.
Which git hosts are supported?
GitHub (through a GitHub App) and Bitbucket Cloud. For anything else you can upload files manually or trigger syncs from CI with a project token.
Can I trigger a sync from CI?
Yes. Create a project token and call the sync endpoint from your pipeline, for example after a release. You can poll the run until it is done.
How does machine translation work?
On the Agency plan you can pre-translate a whole project or a single key with AI. Placeholders and plural forms are checked, and every machine translation is marked for review.
What counts as a key?
One source string, no matter how many languages it is translated into. A message with plural forms counts as a single key.
Where is my data and who can see it?
Your data is only visible to members of your workspace. We use no tracking or analytics. The privacy statement lists every service provider involved.