deepl-i18n
Allows translation of JSON/YAML/other localization files using the DeepL API, supporting incremental translations, placeholder protection, glossaries, formality control, and cost tracking.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@deepl-i18ntranslate app to French"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
deepl-i18n
Translate your JSON localization files with the DeepL API. DeepL-first, config-driven, and free — no telemetry, no account required beyond a DeepL API key (the free tier gives 500,000 characters/month).
Unofficial project. Not affiliated with, sponsored by, or endorsed by DeepL SE. "DeepL" is a trademark of DeepL SE; used here only to describe API compatibility.
Point it at a source-language JSON file, list your target languages, and it fills in only the missing keys — existing translations are preserved, obsolete keys are removed, and placeholders are protected from corruption.
Optionally translate via a local LLM (LM Studio) instead of DeepL — see Local model.
Features
Incremental — only missing/empty keys are translated; existing values stay untouched.
Placeholder-safe — variables like
{{ name }}are shielded from translation and verified afterwards, catching both changed tokens and corruption where a placeholder gets glued to a word (e.g.d{{value1}}ových). The placeholder format is configurable ({{ }},%s,{0}, …).Multiple formats — JSON and YAML (nested), Java
.propertiesand iOS.strings(flat); auto-detected by extension or forced with--file-format. Nested objects are recursed; non-string values (numbers, booleans, null) are copied verbatim.Formality, context & model — set DeepL
formality, acontextprompt, and themodel_type(quality- vs. latency-optimized) to steer tone, terminology and speed.Cost transparency — every run reports the characters DeepL actually billed.
Dry run — see how many keys and characters would be translated, and whether it fits the DeepL free tier, without spending any quota.
Quota display — real-time DeepL character usage.
Related MCP server: tolgee-mcp
Requirements
Python 3.13+
A DeepL API key
deepl(the only third-party dependency)
Setup
# create & activate a virtual environment
python -m venv venv
./venv/Scripts/activate # Windows
# source venv/bin/activate # macOS/Linux
# install the CLI (and its only dependency, deepl) from source
pip install -e .This installs a deepl-i18n command. config.json and .env are resolved from the
current working directory, so run the command from your project folder (or pass
--config path/to/config.json).
API key
Provide your DeepL API key in one of these ways (checked in this order):
DEEPL_API_KEYenvironment variable (recommended, especially for CI)a
.envfile in the project root containingDEEPL_API_KEY=your-key(copy.env.exampleto.env)
.env and config.json are git-ignored so your key and local paths never get committed.
Configuration
Copy the example config and adjust it:
cp config.example.json config.json{
"source_lang": "EN",
"output_languages": ["DE", "FR", "ES", "IT", "PT-PT"],
"filename_overrides": {},
"formality": "default",
"placeholder_pattern": "{{\\s*\\w+\\s*}}",
"context": "Optional: describe your app so DeepL picks the right terminology and tone.",
"targets": {
"app": {
"input_path": "./locales/en.json",
"output_dir": "./locales"
}
}
}Key | Meaning |
| DeepL source language code of your master file (e.g. |
| Target language codes (e.g. |
| Map a language code to a custom output filename, e.g. |
|
|
| Regex matching your placeholders. Default |
| Optional prompt passed to DeepL to disambiguate terminology and tone. |
| Optional path to a glossary file (see Glossary), or |
| Force a format ( |
| DeepL model: |
| Named input/output path pairs. Each needs |
Output filenames use the lowercase language code (e.g. de.json, pt-pt.json) unless
overridden.
Usage
All commands take a <target> — a key under targets in your config.json.
# translate the missing keys of a target
deepl-i18n translate app
# only one language
deepl-i18n translate app --lang FR
# dry run — no API calls, no files written; shows keys, characters and free-tier fit
deepl-i18n translate app --dry-run
deepl-i18n translate app --dry-run --lang FR
# re-translate existing keys, and keep a .bak of each file before overwriting
deepl-i18n translate app --override --backup
# use a config elsewhere
deepl-i18n translate app --config ./locales/config.jsonWatch
Re-translate automatically whenever the source file changes:
deepl-i18n watch app # polls the source file (default every 2s)
deepl-i18n watch app --interval 5 --backupCheck (CI gate)
Validate existing translations without translating anything: reports missing/empty keys and placeholder corruption, and exits non-zero if any problem is found — ready to drop into CI.
deepl-i18n check app
deepl-i18n check app --lang FRDeepL quota
deepl-i18n usageAlso printed automatically at the end of every translate run and dry run.
File formats
The format is detected from the source file's extension; output files use the same
extension. Force it with --file-format (or file_format in the config) when the
extension is ambiguous or missing.
Format | Extensions | Structure | Notes |
JSON |
| nested | i18next-style; non-string values preserved |
YAML |
| nested | needs |
Java properties |
| flat |
|
iOS strings |
| flat |
|
Flutter ARB |
| flat |
|
Android XML |
| flat |
|
CSV |
| flat |
|
deepl-i18n translate app --file-format yamlMore formats (gettext .po, ARB template regeneration, Android <string-array>/<plurals>)
are on the roadmap.
Glossary
Keep terminology consistent across languages. Point glossary in your config (or pass
--glossary path) at a JSON file with two optional sections:
{
"doNotTranslate": ["BeerpongMe", "Rerack", "Bracket"],
"terms": {
"Turnier": { "FR": "tournoi", "ES": "torneo" }
}
}doNotTranslate— terms kept verbatim in every target language.terms— per-term, per-language forced translations (language codes match youroutput_languages; a base code likeENalso matchesEN-US).
For DeepL, an ephemeral glossary is created for each target language, used for that run, and deleted afterwards (glossary create/delete cost no characters). Language pairs DeepL doesn't support for glossaries are skipped with a note. For the local model, the same glossary is injected into the prompt.
# validate a glossary file and preview entries per language (no API calls)
deepl-i18n glossary check app --glossary glossary.json
# manage glossaries stored on DeepL
deepl-i18n glossary list
deepl-i18n glossary delete <id>
deepl-i18n glossary delete --allLocal model (LM Studio)
Instead of DeepL you can translate with a local LLM through LM Studio's OpenAI-compatible
server (default http://localhost:1234, default model openai/gpt-oss-20b). Same
key-selection logic (missing keys only), same output files. Batch mode groups several keys
per request; keys the batch returns broken (e.g. corrupted placeholders) are retried
individually.
deepl-i18n local app # translate target "app" (batch mode)
deepl-i18n local app --lang CS
deepl-i18n local app --dry-run
deepl-i18n local app --model "openai/gpt-oss-20b"
deepl-i18n local app --single # key-by-key instead of batch
deepl-i18n local app --chunk-size 20 # keys per batch request (default 30)Compare a local model against existing (DeepL) translations without writing anything:
deepl-i18n compare app --lang CSLMSTUDIO_MODEL and LMSTUDIO_URL can be set via environment variables.
MCP server
Expose the tool to MCP clients (Claude Desktop, Claude Code, …) so an agent can estimate, check and run translations for you.
pip install deepl-i18n[mcp]Tools:
Tool | What it does |
| missing keys/characters per language, free-tier fit — no API calls |
| completeness + placeholder check; returns |
| current DeepL quota |
| translate missing keys and write the files (uses quota) |
Each tool takes a target (a key under targets), an optional lang, and an optional
config path. Register the server with your client (set cwd to the folder that holds
your config.json and API key):
{
"mcpServers": {
"deepl-i18n": {
"command": "deepl-i18n-mcp",
"cwd": "/path/to/your/i18n/project"
}
}
}Development
pip install -e .[dev] # installs pytest + pyyaml
pytest -q # runs the offline test suite (no DeepL calls)CI runs the suite on Python 3.10–3.13 via GitHub Actions (.github/workflows/ci.yml).
Roadmap
This project is being generalized from an internal tool into a public, DeepL-first i18n
CLI. See ROADMAP.md for planned work (unified CLI, pip install, glossary
support, more providers, an MCP server, more file formats, and more).
License
MIT © 2026 Lorenz Schubert — free to use, modify and distribute, including commercially, as long as the copyright notice is kept.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lancedelgardo/deepl-i18n'
If you have feedback or need assistance with the MCP directory API, please join our Discord server