Translation Diff Export
Devolutions/UniGetUI
Compares UniGetUI JSON locale files against English, identifies untranslated or source-changed keys, and generates patch, reference, and handoff files for a target language.
A skill your agent uses when filling in or improving a lagging UI translation locale in Trilium (e.g.
$ npx skills add TriliumNext/Trilium --skill translating-locales -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TriliumNext/Trilium translating-locales --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/translating-locales .claude/skills/translating-locales && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .claude/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-localesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add TriliumNext/Trilium --skill translating-locales -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TriliumNext/Trilium translating-locales --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/translating-locales .agents/skills/translating-locales && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .agents/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TriliumNext/Trilium --skill translating-locales -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TriliumNext/Trilium translating-locales --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/translating-locales .cursor/skills/translating-locales && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .cursor/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/TriliumNext/Trilium.git --path .claude/skills/translating-locales--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add TriliumNext/Trilium --skill translating-locales -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TriliumNext/Trilium translating-locales --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/translating-locales .gemini/skills/translating-locales && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .gemini/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install TriliumNext/Trilium translating-localesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add TriliumNext/Trilium --skill translating-locales -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/translating-locales .github/skills/translating-locales && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .github/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TriliumNext/Trilium --skill translating-locales -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TriliumNext/Trilium translating-locales --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TriliumNext/Trilium.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/translating-locales .opencode/skills/translating-locales && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "translating-locales" agent skill from https://github.com/TriliumNext/Trilium/tree/main/.claude/skills/translating-locales into .opencode/skills/translating-locales/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "translating-locales", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
translating-localesA skill your agent uses when filling in or improving a lagging UI translation locale in Trilium (e.g.
Translating Locales is an agent skill from TriliumNext/Trilium. Use when filling in or improving a lagging UI translation locale in Trilium (e.g. "Romanian is behind", "bring <locale to 100% coverage", "translate the missing strings"). Covers measuring the gap vs English, drafting translations that preserve i18next placeholders, merging without diff churn, locale grammar rules (Romanian plurals/gender), the source-side pluralization workflow, how Weblate sync actually works (merging is picked up), and validation. Includes locale.mjs — don't hand-roll a JSON walker.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `romanian.md`).
It sits in Writing & Content, covering Translation. The repository describes itself as: Build your personal knowledge base with Trilium Notes. The licence is AGPL-3.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4d9cb6d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodepnpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Translating Locales loads about 3k tokens when it runs. Until then it costs about 132 tokens; SKILL.md has 1,412 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from TriliumNext/Trilium at commit 4d9cb6d, republished under its AGPL-3.0 licence (© TriliumNext). 1,412 words, ~2,999 tokens.
.claude/skills/translating-locales/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Trilium's UI is localized with i18next. English is the source of truth; other locales are normally crowd-translated via Hosted Weblate. This skill is for the maintainer case: deliberately filling a locale that lags behind (the recurring one is Romanian, ro).
Scope — this skill fills an already-registered locale. To add a brand-new locale (e.g. Polish) you must first do the one-time registration and build wiring; that's a separate task. Follow docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md to register it, then come back here to translate the strings.
en-GB is the exception and must never be filled. The en catalogues are US English, and en-GB
carries only the strings whose British spelling differs — "color_type": "Colour",
"centerContent": "Keep content centred" — falling back to en for the rest. So measure en-GB
reporting a few percent is the intended state, not a gap: an entry that merely repeats the English is
noise, and measure would then report it as untranslated anyway. Use merge en-GB <catalog> <file>
for the handful of spelling variants a change introduces, and nothing else.
Every mechanical step is locale.mjs — measure, export, validate, merge, audit. Read romanian.md for Romanian grammar and terminology.
S=.claude/skills/translating-locales/locale.mjs
node $S measure # coverage of every locale, both catalogs
node $S measure ro -v # one locale, listing missing + untranslated keys
node $S export ro client --chunk 150 # work list (English source) → a temp dir
node $S validate ro client <files…> # placeholders / whitespace / plural categories
node $S merge ro client <files…> # apply, preserving key order + formatting
node $S audit-plurals ro client # groups missing a category the locale requiresexport writes { key: englishValue }; translate into a flat { key: translatedValue } file and feed it to validate then merge. Chunking matters: a locale that is 1000+ strings behind does not fit one drafting pass, and validate/merge both take a list of files.
Weblate is linked to this repo with the GitHub pull-request push method: .github/workflows/i18n.yml triggers on push to weblate:* branches, and Weblate opens PRs into the repo (the recurring Translations update from Hosted Weblate (#…) PRs). The locale translation.json / server.json files are tracked Weblate components. Consequently:
CLAUDE.md's "only add new keys to en/translation.json" rule is about where new source strings originate (so they enter the translation pipeline), not a prohibition on landing translations for an existing locale via the repo.| Catalog | English source | Target locale |
|---|---|---|
client — the browser UI | apps/client/src/translations/en/translation.json | apps/client/src/translations/<locale>/translation.json |
entry — setup wizard, login, password reset | apps/client/src/translations/en/entry.json | apps/client/src/translations/<locale>/entry.json |
server — everything else | apps/server/src/assets/translations/en/server.json | apps/server/src/assets/translations/<locale>/server.json |
All three have their own EN↔locale pair — do all three; measure reports them side by side. entry is easy to forget: it is a separate i18next namespace loaded on its own by the three pre-login pages, so a locale can read 100% on client while its login screen is entirely English. Several of its keys (login.*, the SSO errors) are near-duplicates of server.json ones — translate them the same way.
server.json is misnamed: it is the catalog for every runtime outside the browser UI — apps/server, the Electron main process, packages/trilium-core, and the standalone worker, which loads it with ns: "server" from the copy of apps/server/src/assets that its vite build emits under server-assets. Translating it therefore covers the standalone and mobile builds too, and a missing key there is not "server-only" breakage.
node $S measure <locale> -v. Two numbers matter: missing (absent from the locale) and untranslated (present but byte-identical to English). The latter is mostly legitimate proper nouns — -v lists them so you can tell.
node $S export <locale> <catalog> --chunk 150. Chunks of ~150 strings keep each drafting pass reviewable; --out DIR if you want them somewhere specific (default: a fresh temp dir).
notiță for "note", Anulează for "Cancel", formal-plural address (Selectați). Don't invent a second term for something the file already names.validate checks all of these:{{var}}, {{- var}} (unescaped — keep the hyphen), {keyword} (single-brace, e.g. date patterns and search-engine URLs)<Trans> tags: <buildRevision />, <Note/>, <code>…</code>; HTML entities like →\n line breaks, leading/trailing spaces, trailing punctuation_one without {{count}} ("An archived note was copied here", "1 hidden note") while _other has it. validate compares a locale-only _few against _other, so put {{count}} in _few/_other and leave _one as English left it.node $S validate must print 0 errors before you merge. Then node $S merge, and check git diff --stat: a 600-string change is ~600 added lines, not thousands.
merge preserves what a naive JSON.stringify round-trip destroys:
node $S audit-plurals <locale> <catalog>
node $S measure <locale> # expect 100%; leftovers should be proper nouns
pnpm --filter client test src/services/i18n.spec.tsi18n.spec.ts is the repo's only translation test — valid JSON, no duplicate keys, plus the CKEditor message-catalog check. There is no locale-parity test and no typed-i18next, so adding a _few that English lacks is fine and won't break pnpm typecheck.
i18next only pluralizes when (a) the translation has plural-suffixed keys and (b) the call site passes { count }. So:
_few, Russian _many) to an existing plural group — EN supplies _one/_other, the locale supplies its own set. locale.mjs derives the required set from Intl.PluralRules, so validate accepts exactly the categories the locale uses and rejects the ones it doesn't."{{count}} notes"), you must:count (grep for the key; look for t("…", { count })). If it doesn't, or the key is unused, don't pluralize._one/_other in en/translation.json (this is the sanctioned place to edit EN).t("key", {count}) resolves to the suffixed keys automatically."{{count}} sources from {{sites}} sites" — only count triggers plurals).For a handful of in-place EN edits (pluralizing one key, fixing a typo), do text-level replacement — never JSON.parse → stringify the EN file, which can reformat or re-escape unrelated lines:
const fs = require("fs");
function replaceOnce(path, pairs) { // pairs: [[oldLine, [newLine1, newLine2, …]], …]
let s = fs.readFileSync(path, "utf8");
const E = s.includes("\r\n") ? "\r\n" : "\n";
for (const [oldL, newLines] of pairs) {
if (s.indexOf(oldL) === -1) throw new Error("NOT FOUND: " + oldL);
if (s.split(oldL).length > 2) throw new Error("NOT UNIQUE: " + oldL);
s = s.replace(oldL, newLines.join(E));
}
fs.writeFileSync(path, s, "utf8");
}merge won't, don't do it by hand either.merge detects it; a hand-written stringify won't.. or a placeholder when copying a reviewer's suggestion — re-run validate after applying review feedback, not just after the first draft.© TriliumNext, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in .claude/skills/translating-locales of TriliumNext/Trilium.
Open the folder on GitHubat commit 4d9cb6d
Translating Locales next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Translating Locales this skillTriliumNext/Trilium | 38k | — | ~3k | Automated safety check: Pass | AGPL-3.0 | |
| Translation Diff ExportDevolutions/UniGetUI | 26k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Sync Translationssymfony/symfony | 31k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Translation Diff ImportDevolutions/UniGetUI | 26k | — | ~750 | Automated safety check: Pass | MIT | |
| Translation Diff TranslateDevolutions/UniGetUI | 26k | — | ~934 | Automated safety check: Pass | MIT | |
| Generate Translationspayloadcms/payload | 45k | — | ~1.1k | Automated safety check: Pass | MIT |
Devolutions/UniGetUI
Compares UniGetUI JSON locale files against English, identifies untranslated or source-changed keys, and generates patch, reference, and handoff files for a target language.
symfony/symfony
Synchronize translation catalogs across maintained Symfony branches: find messages that newer branches added to the English catalogs but that are still missing from the oldest maintained branch…
Devolutions/UniGetUI
Merges translated key-value pairs from a UniGetUI JSON localization patch back into the full language file and validates the merged result.
Devolutions/UniGetUI
Translates a sparse UniGetUI JSON language patch, writes completed entries into the working copy, preserves placeholders and terminology, and prepares the patch for merge-back.
payloadcms/payload
A skill your agent uses when new translation keys are added to packages to generate new translations strings
Narcooo/inkos
Drives long-form fiction, scripts, storyboards, interactive films and long-document translation through InkOS, with every change made by a typed action.
TriliumNext/Trilium
A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.
TriliumNext/Trilium
A skill your agent uses when working on the Trilium Electron desktop app (apps/desktop) — adding or changing an electronApi method / IPC channel, touching preload.ts, main.ts, services/window.ts or…
TriliumNext/Trilium
A skill your agent uses when adding a DB migration or a new column/field to a Becca entity in Trilium ("add a migration", "new column on notes/attributes", "ALTER TABLE", "add a field to…
TriliumNext/Trilium
A skill your agent uses when adding, moving, or wiring an internal REST endpoint in Trilium (a new /api/ route) — choosing between a core-shared handler (packages/trilium-core/src/routes/index.ts…
TriliumNext/Trilium
A skill your agent uses when adding, changing, or reviewing an LLM/MCP tool in Trilium (the defineTools definitions under packages/trilium-core/src/services/llm/tools/ —…
TriliumNext/Trilium
Write, extend, and review CKEditor 5 plugins in the Trilium (TriliumNext Notes) monorepo — the rich-text-note editor under packages/ckeditor5, whose plugins live in src/plugins/.
Categories
A skill your agent uses when filling in or improving a lagging UI translation locale in Trilium (e.g. Translating Locales is an agent skill from TriliumNext/Trilium.g.
Translating Locales fits situations like: improving a lagging UI translation locale in Trilium (e.g; tasks that involve Translation.
Run `npx skills add TriliumNext/Trilium --skill translating-locales -a claude-code`. Or copy the skill folder (.claude/skills/translating-locales in TriliumNext/Trilium) into .claude/skills/translating-locales in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TriliumNext/Trilium --skill translating-locales -a codex`. Or copy the skill folder (.claude/skills/translating-locales in TriliumNext/Trilium) into .agents/skills/translating-locales in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TriliumNext/Trilium --skill translating-locales -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/translating-locales, .gemini/skills/translating-locales, .github/skills/translating-locales and .opencode/skills/translating-locales in your project.
Going by SKILL.md and its folder, Translating Locales needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, pnpm and git). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Translating Locales is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Translating Locales: Translation Diff Export (Devolutions/UniGetUI, 26k stars), Sync Translations (symfony/symfony, 31k stars), Translation Diff Import (Devolutions/UniGetUI, 26k stars) and Translation Diff Translate (Devolutions/UniGetUI, 26k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TriliumNext (a GitHub organization) maintains it in TriliumNext/Trilium, which has 38,274 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 11, 2026.
Source: TriliumNext/Trilium on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.