i18n Translation Skill
Translate Camunda Modeler i18n plugin UI strings into a target language. The German (de) translation is
the most complete and serves as the authoritative source for all keys and their meaning.
When to use
- Adding a brand-new language to the plugin
- Filling gaps in an existing language (keys present in German but missing in the target)
- Regenerating or replacing an entire language's translations
Inputs
The user provides:
- Target language — a language name (e.g. "Spanish", "Italian") or locale code (e.g. "es", "ja")
Workflow
Step 1: Determine locale code and label
Map the user's input to:
- A locale code for file/folder naming (e.g.
es, ja, ko). Use the same conventions as existing
locales in the project — lowercase, hyphens for regional variants (e.g. pt-br, zh-Hans).
- A variable-safe key for use in JS imports (replace
- with _, e.g. pt_br, zh_Hans).
- A display label in the target language's native script (e.g. "Español", "日本語").
Confirm the locale code, JS key, and display label with the user before proceeding.
Step 2: Read the German base files
Read all four German translation source files to get the complete set of keys:
client/bpmnjs-i18n-extension/languages/de/bpmn-js.js
client/bpmnjs-i18n-extension/languages/de/dmn-js.js
client/bpmnjs-i18n-extension/languages/de/properties-panel.js
client/bpmnjs-i18n-extension/languages/de/other.js
Each file exports a default object of { 'English key': 'German translation' } pairs.
Step 3: Determine which keys need translation
- New language: All keys from all four German files need translation.
- Existing language: Read the target language's files, diff against the German files, and identify
missing keys. Only translate the missing ones — do not overwrite existing translations.
Step 4: Translate
For each key that needs translation, translate the German value into the target language.
Translation rules:
- The object keys (left side) are English strings used as lookup identifiers by the modeler runtime.
Never modify the keys. Only translate the values (right side).
- Preserve
{parameter} placeholders exactly as they appear (e.g. {element}, {count}, {semantic}).
- Keep technical terms that are industry-standard and not typically translated:
BPMN, DMN, FEEL, CMMN, PMML, Gateway, Pool, Lane, Token, ID, XML, JSON, ISO 8601, EL, JUEL, Groovy,
JRuby, Python, Java, JavaScript, Zeebe, Camunda, UTC, QName.
- For BPMN/DMN domain terms (e.g. "Boundary Event", "Intermediate Catch Event", "Decision Table",
"Hit Policy"), use the established translations for that language if they exist in the BPMN/DMN
community. If unsure, keep the English term and add the translation in parentheses.
- Preserve trailing/leading spaces if the German value has them — they are intentional for UI concatenation.
- Match the casing style of the German translations (e.g. if German capitalizes the first word only,
do the same in the target language, respecting that language's conventions).
- Strings like
'-', 'BPMN', 'DMN', 'ID', 'FEEL', 'Foo' that are identical in German and
English should remain identical in the target language too.
Translate in batches per file. After each file, briefly summarize the count of translated keys.
Step 5: Write the translation files
Each of the four files must follow this exact format. See references/file-template.md for the full template.
Key points:
- No per-file license header (the project is licensed MIT centrally via
LICENSE)
- Use
export default { ... }; syntax
- Keep keys in the same order as the German source file
- One key-value pair per line, single-quoted strings, trailing comma on each entry
For existing languages where you are filling gaps: insert the new keys at the position matching
their order in the German file, so the file stays consistently ordered.
Step 6: Write the barrel file
Create or verify the barrel file at client/bpmnjs-i18n-extension/languages/<locale>.js:
import bpmnJs from './<locale>/bpmn-js';
import dmnJs from './<locale>/dmn-js';
import propertiesPanel from './<locale>/properties-panel';
import other from './<locale>/other';
export default {
...bpmnJs,
...dmnJs,
...propertiesPanel,
...other,
};
Include the license header. Match the exact style of de.js.
Step 7: Register the language (new languages only)
Skip this step if the language already exists in the plugin.
client/bpmnjs-i18n-extension/translate.js — Add an import for the new locale and include it
in the languages object. Place the import alphabetically among existing imports.
client/config/I18nPlugin.js — Add a new entry to the options array with the locale's JS key
as value and the native display label as label. Place it alphabetically by label.
Step 8: Summary
After all files are written, output a summary:
- Language added/updated: name and locale code
- Files created or modified (with paths)
- Total keys translated
- Reminder to run
npm run build and test in the modeler
1---2name: i18n-translate3description: Translate Camunda Modeler i18n plugin keys into a target language, using the German translation as the authoritative base. Use this skill whenever the user wants to add a new language, translate keys, fill in missing translations for an existing language, or update/complete a partial translation in the camunda-modeler-i18n-plugin repository. Also trigger when the user mentions locale codes, language names, or talks about translating the modeler UI.4---56# i18n Translation Skill78Translate Camunda Modeler i18n plugin UI strings into a target language. The German (de) translation is9the most complete and serves as the authoritative source for all keys and their meaning.1011## When to use1213- Adding a brand-new language to the plugin14- Filling gaps in an existing language (keys present in German but missing in the target)15- Regenerating or replacing an entire language's translations1617## Inputs1819The user provides:2021- **Target language** — a language name (e.g. "Spanish", "Italian") or locale code (e.g. "es", "ja")2223## Workflow2425### Step 1: Determine locale code and label2627Map the user's input to:2829- A **locale code** for file/folder naming (e.g. `es`, `ja`, `ko`). Use the same conventions as existing30 locales in the project — lowercase, hyphens for regional variants (e.g. `pt-br`, `zh-Hans`).31- A **variable-safe key** for use in JS imports (replace `-` with `_`, e.g. `pt_br`, `zh_Hans`).32- A **display label** in the target language's native script (e.g. "Español", "日本語").3334Confirm the locale code, JS key, and display label with the user before proceeding.3536### Step 2: Read the German base files3738Read all four German translation source files to get the complete set of keys:3940```41client/bpmnjs-i18n-extension/languages/de/bpmn-js.js42client/bpmnjs-i18n-extension/languages/de/dmn-js.js43client/bpmnjs-i18n-extension/languages/de/properties-panel.js44client/bpmnjs-i18n-extension/languages/de/other.js45```4647Each file exports a default object of `{ 'English key': 'German translation' }` pairs.4849### Step 3: Determine which keys need translation5051- **New language**: All keys from all four German files need translation.52- **Existing language**: Read the target language's files, diff against the German files, and identify53 missing keys. Only translate the missing ones — do not overwrite existing translations.5455### Step 4: Translate5657For each key that needs translation, translate the **German value** into the target language.5859Translation rules:6061- The **object keys** (left side) are English strings used as lookup identifiers by the modeler runtime.62 **Never modify the keys.** Only translate the values (right side).63- Preserve `{parameter}` placeholders exactly as they appear (e.g. `{element}`, `{count}`, `{semantic}`).64- Keep technical terms that are industry-standard and not typically translated:65 BPMN, DMN, FEEL, CMMN, PMML, Gateway, Pool, Lane, Token, ID, XML, JSON, ISO 8601, EL, JUEL, Groovy,66 JRuby, Python, Java, JavaScript, Zeebe, Camunda, UTC, QName.67- For BPMN/DMN domain terms (e.g. "Boundary Event", "Intermediate Catch Event", "Decision Table",68 "Hit Policy"), use the established translations for that language if they exist in the BPMN/DMN69 community. If unsure, keep the English term and add the translation in parentheses.70- Preserve trailing/leading spaces if the German value has them — they are intentional for UI concatenation.71- Match the casing style of the German translations (e.g. if German capitalizes the first word only,72 do the same in the target language, respecting that language's conventions).73- Strings like `'-'`, `'BPMN'`, `'DMN'`, `'ID'`, `'FEEL'`, `'Foo'` that are identical in German and74 English should remain identical in the target language too.7576Translate in batches per file. After each file, briefly summarize the count of translated keys.7778### Step 5: Write the translation files7980Each of the four files must follow this exact format. See [references/file-template.md](references/file-template.md) for the full template.8182Key points:8384- No per-file license header (the project is licensed MIT centrally via `LICENSE`)85- Use `export default { ... };` syntax86- Keep keys in the same order as the German source file87- One key-value pair per line, single-quoted strings, trailing comma on each entry8889For **existing languages** where you are filling gaps: insert the new keys at the position matching90their order in the German file, so the file stays consistently ordered.9192### Step 6: Write the barrel file9394Create or verify the barrel file at `client/bpmnjs-i18n-extension/languages/<locale>.js`:9596```javascript97import bpmnJs from './<locale>/bpmn-js';98import dmnJs from './<locale>/dmn-js';99import propertiesPanel from './<locale>/properties-panel';100import other from './<locale>/other';101102export default {103 ...bpmnJs,104 ...dmnJs,105 ...propertiesPanel,106 ...other,107};108```109110Include the license header. Match the exact style of `de.js`.111112### Step 7: Register the language (new languages only)113114Skip this step if the language already exists in the plugin.1151161. **`client/bpmnjs-i18n-extension/translate.js`** — Add an import for the new locale and include it117 in the `languages` object. Place the import alphabetically among existing imports.1181192. **`client/config/I18nPlugin.js`** — Add a new entry to the `options` array with the locale's JS key120 as `value` and the native display label as `label`. Place it alphabetically by label.121122### Step 8: Summary123124After all files are written, output a summary:125126- Language added/updated: name and locale code127- Files created or modified (with paths)128- Total keys translated129- Reminder to run `npm run build` and test in the modeler