Translate your app's localization files with your own provider key, without breaking them.
Babel Fishers is a command-line tool. It sends only the translatable text to the provider you choose, keeps placeholders and plural forms intact, checks every string that comes back, and writes the file in its original format. In CI, it opens the pull request for you.
Quickstart
pip install babelfishers # Python 3.11+
babelfishers init # writes babelfishers.toml
[locale]
source = "en"
targets = ["fr", "de"]
[engine]
provider = "deepl"
[resources.json]
paths = ["locales/[source]/*.json"]
See what would be translated. This needs no API key and writes nothing:
$ babelfishers translate --dry-run
File Locale Status Units Cached To translate Chars Engine
locales/en/app.json de new 2 0 2 79 deepl
locales/en/app.json fr new 2 0 2 79 deepl
Then set your provider's key as an environment variable and run it for real:
babelfishers translate
How it works
A provider that sees {name} may hand back {nom}, and your app shows a raw token. Babel Fishers never gives it the chance:
source Hello, {name}! You have %d new messages.
written Bonjour, {name} ! Vous avez %d nouveaux messages.
- Nothing is written broken. Every placeholder is checked after translation. A string that doesn't match is retried, then tried with a fallback provider if you set one. If it still doesn't match, it keeps the source text and you get a warning.
- You never pay twice. A translation memory kept in your repo means a string translated once is reused everywhere, CI included.
- Pull requests from CI.
babelfishers citranslates what changed and opens or updates a pull request on GitHub Actions or GitLab CI/CD. - Your key, your provider. DeepL, Azure, Google Cloud, LibreTranslate, or one of five AI models. With a self-hosted LibreTranslate server, your strings never leave your network.
- Twelve formats, 133 locales. From JSON and gettext to Android and String Catalogs, with regional variants such as
pt-BR,es-419andzh-Hant.
See How it works for the full picture.
When to use something else
Babel Fishers currently has no web editor, translator accounts or approval workflow. Review happens in your pull requests. If translators or other non-developers need to work on the strings, a platform such as Crowdin or Tolgee is a better fit.
Documentation
- Getting started
- Configuration
- Translation providers
- Continuous integration
- Supported formats
- CLI reference
Feedback
Questions and ideas go to Discussions, bugs to issues.
Contributing
This project is still young and worked on when time allows. If you find a bug or have an idea, open an issue and I will take a look.
License
Metadata
Release files for babelfishers 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| babelfishers-0.1.3.tar.gz | 80.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| babelfishers-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 204.7 kB
Release files / babelfishers-0.1.3.tar.gz
| Download URL | babelfishers-0.1.3.tar.gz |
|---|---|
| Size | 80.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3bec61258fe917ca4e3b49c77d19f53e08e3872b216741a2ab39835d2eff3368
|
|
BLAKE2b-256 checksum How to use checksums |
151311dd6f7a5ec245e86263a3d2686de83bbb61f5f89569791c711a904d571e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / babelfishers-0.1.3-py3-none-any.whl
| Download URL | babelfishers-0.1.3-py3-none-any.whl |
|---|---|
| Size | 123.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
08549f3bdef9631dbf4531502664b2f158ebb8d96a1754622ebf2f97126e9d1f
|
|
BLAKE2b-256 checksum How to use checksums |
dc442a59028155cff99dc5ef2663d498be220d1b90efafca08c82376fc677baf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log