Agent skill

Translate

by tagspaces in tagspaces/tagspaces

Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations.

AGPL-3.0Auto-check passedWriting & Content

Install Translate

skills CLI
$ npx skills add tagspaces/tagspaces --skill translate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tagspaces/tagspaces translate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tagspaces/tagspaces.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/translate .claude/skills/translate && rm -rf skills-src

Use ~/.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/

Facts

Skill name
translate
GitHub stars
5.3k
Token cost
~2.2k tokens
SKILL.md length
1,116 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations.

  • Works in 4 steps: Detect what needs translating → Gather translation context → Translate → …
  • Tasks that involve Translation
  • SKILL.md covers Arguments, File Paths, Step 1 — Detect what needs… and Step 2 — Gather translation…, plus 4 more sections
  • Calls node

What it does

Translate is an agent skill from tagspaces/tagspaces. Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations.

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Translation and Internationalization. It works with JavaScript. The repository describes itself as: TagSpaces is an offline, open source, document manager with tagging support. The licence is AGPL-3.0.

When your agent uses it

  • Tasks that involve Translation
  • Tasks that involve Internationalization

Example prompts

  • “/translate”

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Detect what needs translating
  2. Gather translation context
  3. Translate
  4. Write results

What it can do on your machine

Read from SKILL.md and the folder at commit 97800c3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Translate loads about 2.2k tokens when it runs. Until then it costs about 50 tokens; SKILL.md has 1,116 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~50
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from tagspaces/tagspaces at commit 97800c3, republished under its AGPL-3.0 licence (© tagspaces). 1,116 words, ~2,240 tokens.

Download SKILL.mdSave it as .claude/skills/translate/SKILL.md (or your agent's skills folder).
name
translate
description
Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations.

Translate Skill

Automatically translate new or untranslated strings from the English locale files to all other locale files, maintaining consistency with each language's existing translations.

The app uses two i18next namespaces, each backed by its own JSON file per locale:

  • core → core.json (main app strings, default namespace)
  • peri → peri.json (peripheral content: onboarding ob*, help-tour hts*, Pro teaser slides pts*, months / weekday abbreviations, proTeaser*Headline/Subtext)

Both files are flat key-value JSON with no nesting (keySeparator: false).

Arguments

  • No argument or all: process all languages and both namespaces.
  • A language code (e.g., de_DE, ja, bg): process only that language; both namespaces.
  • A namespace name (core or peri): process all languages but only that namespace.
  • lang=<code> and/or ns=<core|peri> (any order, comma-separated): scope the run.
    • e.g. lang=de_DE,ns=peri, ns=peri, lang=ja
  • report: only show what's missing/untranslated, don't translate. Combinable with lang=/ns=.

File Paths

  • Sources of truth: src/renderer/locales/en/core.json and src/renderer/locales/en/peri.json
  • Target locales: every subdirectory of src/renderer/locales/ except en/
  • Each locale should contain both core.json and peri.json (flat key-value JSON, no nesting). If peri.json is missing for a locale, generate it from scratch.

Step 1 — Detect what needs translating

For each namespace in scope (default: both core and peri):

  1. Read the English source file (src/renderer/locales/en/<ns>.json).
  2. List all directories under src/renderer/locales/ to discover target languages.
  3. If a specific language was requested, only process that one; otherwise process all.
  4. For each target locale, read src/renderer/locales/<lng>/<ns>.json and compare against English:
    • Missing keys: present in English but absent in the target file. (If the target file itself is missing, treat every English key as missing.)
    • Untranslated keys: value in the target is identical to the English value AND the key is NOT in the skip-list (see below).
    • Orphan keys: present in the target but absent from English (candidates for removal).
  5. Print a summary table per namespace:
    [ns=peri]
    Language  | Missing | Untranslated | Orphan
    ----------|---------|--------------|-------
    de_DE     |    3    |      1       |   0
    ja        |    3    |      5       |   0
    ...
  6. If the argument was report, stop here. Otherwise, ask the user for confirmation before proceeding (unless --yes was passed).
Skip-list for untranslated detection

These keys are expected to have the same value as English in many/all languages. Do NOT flag them as untranslated:

  • Keys where the English value is a single symbol, number, or punctuation (e.g., "-", "/")
  • Keys where the English value is a proper noun or brand name only (e.g., "TagSpaces", "Mapique")
  • Keys where the English value is a widely-used English loanword that many languages keep as-is (e.g., "Ok", "Email", "Kanban")
  • When in doubt, check if at least 5 other languages also have the same value as English — if so, it's likely intentional.

Step 2 — Gather translation context

For each (language, namespace) pair that needs translations:

  1. Read the target file for that language and namespace, plus the same locale's other namespace file (e.g. when translating peri.json, also read core.json for context). This is critical because peri.json is small (~142 keys) and won't carry enough style signal on its own.
  2. Select a context sample of ~50 existing translated key-value pairs drawn from both namespaces. Prioritize:
    • Strings thematically similar to the ones being translated (e.g., if translating onboarding slides, sample any existing onboarding-adjacent strings; if translating Pro teaser copy, sample existing marketing/feature descriptions).
    • A mix of short labels and longer descriptive strings to capture both terse and verbose style.
  3. This sample will be used as a style and terminology reference when translating, ensuring:
    • Consistent tone and formality level (formal "Sie" vs informal "du" in German, etc.)
    • Consistent term choices (e.g., if "folder" has been translated as "Ordner" in German, keep using "Ordner")
    • Consistent punctuation patterns

Step 3 — Translate

For each (language, namespace) pair, translate all missing and untranslated keys:

  1. Use the English value as the source text.
  2. Reference the context sample from Step 2 for style/terminology consistency.
  3. Apply the following rules strictly:
Show full SKILL.md (531 more words)Show less
Translation Rules
  • NEVER modify en/core.json or en/peri.json — both are read-only for this skill.
  • Preserve {{variables}} exactly — template placeholders like {{fileName}}, {{version}}, {{count}}, {{folderName}} must appear in the translation unchanged. Do not translate, reorder, or remove them.
  • Preserve HTML tags exactly — tags like <br>, <b>, </b>, <a> etc. must remain intact.
  • Keep technical terms in English across all languages: TagSpaces, Kanban, Markdown, HTML, S3, WebDAV, AI, URL, QR, EXIF, FolderViz, Mapique, JSON, PDF, EPUB, CSV, ZIP, GPX, KML, Pro.
  • German (de_DE) specific: Use "Tags" for tags, NOT "Schlagwort/Schlagwörter". The English loanword "Tags" is the project standard.
  • Match existing tone: If a language uses formal address (e.g., "Sie" in German, "Vous" in French), maintain that. If informal, maintain that. Determine this from the existing translations.
  • Natural phrasing: Translations should read naturally in the target language, not be word-for-word calques from English.
  • Translate language by language (not key by key) to maintain internal consistency within each locale. Within a language, finish one namespace before starting the next so style stays unified across both files.

Step 4 — Write results

For each modified locale + namespace:

  1. Construct the full target JSON with:
    • The same key order as the matching English file (en/core.json for core, en/peri.json for peri). This keeps diffs clean and structure consistent.
    • All existing translations preserved (only missing/untranslated keys get new values).
    • Orphan keys removed (keys not present in the corresponding English file).
  2. Write the file using the Write tool or Edit tool as appropriate. End the file with a single trailing newline (matches existing files).
  3. Validate JSON: After writing, verify the file is valid JSON (use node -e "JSON.parse(require('fs').readFileSync('path'))" or equivalent).
  4. Print a final summary, one row per (language, namespace):
    Language  | NS    | Added | Updated | Removed | Status
    ----------|-------|-------|---------|---------|-------
    de_DE     | core  |   3   |    1    |    0    |  OK
    de_DE     | peri  |   2   |    0    |    0    |  OK
    ja        | core  |   3   |    5    |    0    |  OK
    ja        | peri  |   0   |    0    |    0    |  OK
    ...

Performance Strategy

  • For a single language + single namespace: process directly in the main conversation.
  • For all 33 languages and/or both namespaces: use the Agent tool to parallelize. Launch multiple agents, each handling a batch of ~4-5 languages (and both namespaces together so style stays consistent within a locale). Each agent receives:
    • The full English core.json and peri.json
    • The list of missing/untranslated keys per (language, namespace) (from Step 1)
    • The target language files to process (both namespaces)
    • These translation rules

Edge Cases

CaseHandling
Value same as English but intentionalUse the skip-list; also check if 5+ other languages have the same value
New language directory with empty/missing core.json or peri.jsonGenerate a complete translation from scratch for the missing file(s)
Locale has core.json but no peri.jsonCreate peri.json from scratch, translating every English peri key
Locale has peri.json but no core.jsonSame in reverse — unusual but handle symmetrically
Key has only whitespace or empty string in targetTreat as untranslated
English value contains line breaks (\n)Preserve line breaks in translation
English value is very long (100+ chars)Translate fully, do not truncate
Key moved between core and peri namespacesDetect by checking if an "orphan" in core appears in en/peri.json (or vice versa). Report as informational only; do not auto-migrate translations — the namespace split is a separate manual operation.

© tagspaces, 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

Files

Just SKILL.md in .claude/skills/translate of tagspaces/tagspaces.

Open the folder on GitHubat commit 97800c3

Compare with similar skills

Translate 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.

Translate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Translate this skilltagspaces/tagspaces5.3k—~2.2kAutomated safety check: PassAGPL-3.0
Frappe Core TranslationImpertio-Studio/Frappe_Claude_Skill_Package187—~1.9kAutomated safety check: PassMIT
Lingui Best PracticesB0und/WikiSpeedrun1332 repos~4.2kAutomated safety check: PassMIT
Translation Diff ExportDevolutions/UniGetUI26k—~1.1kAutomated safety check: PassMIT
Translation Diff TranslateDevolutions/UniGetUI26k—~934Automated safety check: PassMIT
Plane UI Translationmakeplane/plane61k—~16kAutomated safety check: PassAGPL-3.0

Similar skills

  • Frappe Core Translation

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when implementing translations/i18n in Frappe v14-v16 apps.

    187 GitHub stars~1.9k tokensUpdated 21 days ago
    Writing & ContentAuto-check passed
  • Lingui Best Practices

    B0und/WikiSpeedrun

    Implement internationalization with Lingui in React and JavaScript applications.

    133 GitHub starsUsed in 2 repos~4.2k tokens
    Frontend & DesignAuto-check passed
  • 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.

    26k GitHub stars~1.1k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Translation Diff Translate

    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.

    26k GitHub stars~934 tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Plane UI Translation

    makeplane/plane

    Sets the rules for translating and updating Plane's UI strings across locales: do-not-translate terms, plural forms, placeholders and AI translation review.

    61k GitHub stars~16k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Translation Source Sync

    Devolutions/UniGetUI

    Synchronizes the UniGetUI English language file with source-code usage, identifies missing translation keys, removes unused entries, reports localization drift, and can reorder locale files to match…

    26k GitHub stars~1.2k tokensUpdated yesterday
    Writing & ContentAuto-check passed

Works with

Questions about Translate

What does Translate do?

Translate new or untranslated i18n strings from the English locale files (core.json + peri.json) into all other locales, maintaining consistency with each language's existing translations. Translate is an agent skill from tagspaces/tagspaces.json) into all other locales, maintaining consistency with each language's existing translations.

When should I use Translate?

Translate fits situations like: tasks that involve Translation; tasks that involve Internationalization.

How do I install Translate in Claude Code?

Run `npx skills add tagspaces/tagspaces --skill translate -a claude-code`. Or copy the skill folder (.claude/skills/translate in tagspaces/tagspaces) into .claude/skills/translate in your project. Claude Code loads it when a task matches its description.

How do I install Translate in Codex?

Run `npx skills add tagspaces/tagspaces --skill translate -a codex`. Or copy the skill folder (.claude/skills/translate in tagspaces/tagspaces) into .agents/skills/translate in your project. Codex loads it when a task matches its description.

Can I use Translate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tagspaces/tagspaces --skill translate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/translate, .gemini/skills/translate, .github/skills/translate and .opencode/skills/translate in your project.

What does Translate need to run?

Going by SKILL.md and its folder, Translate needs the command-line tools its instructions call (node).

Does Translate access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Translate safe to install?

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.

What licence does Translate use?

Translate 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.

How many tokens does Translate use?

About 2.2k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Translate?

Skills that share tags, products or a category with Translate: Frappe Core Translation (Impertio-Studio/Frappe_Claude_Skill_Package, 187 stars), Lingui Best Practices (B0und/WikiSpeedrun, 133 stars), Translation Diff Export (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.

Who maintains Translate?

tagspaces (a GitHub organization) maintains it in tagspaces/tagspaces, which has 5,308 GitHub stars. The repository was last updated on October 6, 2026.

Source: tagspaces/tagspaces on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.