Agent skill

Acp Translate

by jrhubott in jrhubott/adaptive-cover-pro

Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration.

MITAuto-check passedWriting & Content

Install Acp Translate

skills CLI
$ npx skills add jrhubott/adaptive-cover-pro --skill acp-translate -a claude-code

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

GitHub CLI
$ gh skill install jrhubott/adaptive-cover-pro acp-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/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/acp-translate .claude/skills/acp-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
acp-translate
GitHub stars
176
Token cost
~5.8k tokens
SKILL.md length
2,021 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
MIT

At a glance

Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration.

  • Works in 4 steps: custom_components/adaptive_cover_pro/tran… → custom_components/adaptive_cover_pro/summ… → custom_components/adaptive_cover_pro/reas… → …
  • Phrases like sync translations
  • SKILL.md covers Picking the Operation, Model Strategy, Operation 1 — Sync and Operation 2 — Add Language, plus 7 more sections
  • Calls python3 and python

What it does

Acp Translate is an agent skill from jrhubott/adaptive-cover-pro. Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration. Triggers on phrases like "sync translations", "update translations", "add [language]", "drop [language]", "translate", "translation status", "retranslate".

Its SKILL.md is about 5.8k 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. It works with Home Assistant and Python. The repository describes itself as: Adaptive sun-tracking cover control for Home Assistant: blinds, awnings, and venetian tilts with climate-aware positioning and a priority override pipeline. The licence is MIT.

When your agent uses it

  • Phrases like sync translations
  • Update translations
  • Drop [language]
  • Translation status

Example prompts

  • “sync translations”
  • “update translations”
  • “add [language]”
  • “/acp-translate”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. custom_components/adaptive_cover_pro/translations/ — the standard HA translation files (title, config, options, entity, selector…
  2. custom_components/adaptive_cover_pro/summary_i18n/ — the config-summary label bundle (en.json / de.json / fr.json), a nested tree of…
  3. custom_components/adaptive_cover_pro/reason_i18n/ — the pipeline-reason label bundle (en.json / de.json / fr.json), a nested tree of…
  4. custom_components/adaptive_cover_pro/troubleshoot_i18n/ — the diagnostics-triage finding bundle (en.json / de.json / fr.json), a nested…

What it can do on your machine

Read from SKILL.md and the folder at commit c03d682. 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:

    • python3
    • python

    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

Acp Translate loads about 5.8k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 2,021 words of instructions outside code blocks.

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

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 jrhubott/adaptive-cover-pro at commit c03d682, republished under its MIT licence (© jrhubott). 2,021 words, ~5,751 tokens.

Download SKILL.mdSave it as .claude/skills/acp-translate/SKILL.md (or your agent's skills folder).
name
acp-translate
description
Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration. Triggers on phrases like "sync translations", "update translations", "add [language]", "drop [language]", "translate", "translation status", "retranslate".

ACP Translate

Maintains four parallel translation bundles, each with en.json as the single source of truth and every other language matching its structure exactly:

  1. custom_components/adaptive_cover_pro/translations/ — the standard HA translation files (title, config, options, entity, selector, services). Validated by hassfest against HA's strict schema.
  2. custom_components/adaptive_cover_pro/summary_i18n/ — the config-summary label bundle (en.json / de.json / fr.json), a nested tree of dotted-key → template strings consumed by _build_config_summary in config_flow.py. This lives outside translations/ on purpose: it is a custom config_summary category that hassfest's schema forbids as a top-level key in translations/en.json, so it is loaded directly by _load_summary_labels instead of via async_get_translations.
  3. custom_components/adaptive_cover_pro/reason_i18n/ — the pipeline-reason label bundle (en.json / de.json / fr.json), a nested tree of dotted reason-code → Python str.format template strings consumed by the pure reason_i18n.py resolver to localize pipeline decision-trace reasons, position explanations, and control-state reasons on sensor.* attributes and for the companion Lovelace card. This also lives outside translations/ on purpose: it is not an HA translation category, so it is loaded directly by reason_i18n.py's resolver instead of via async_get_translations.
  4. custom_components/adaptive_cover_pro/troubleshoot_i18n/ — the diagnostics-triage finding bundle (en.json / de.json / fr.json), a nested tree of dotted TriageCode → str.format template strings consumed by troubleshoot_i18n.py to render TRIAGE_RULES findings in the config-flow Troubleshoot step, the config summary, and scripts/triage_json.py. Same rationale as the two above: not an HA translation category, loaded directly by its own resolver. Every new triage rule adds a leaf here, so this bundle changes whenever diagnostics/triage.py gains a row.

⚠️ Every operation below applies to ALL FOUR directories. When syncing, adding, or dropping a language, process translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, and troubleshoot_i18n/<lang>.json. The summary_i18n/en.json source of truth must stay byte-identical (flattened) to the code-owned _SUMMARY_LABELS_EN (config_flow.py) + COVER_TYPE_LABELS_EN / GEOMETRY_LABELS_EN (cover_types/_summary_labels.py) dicts — a drift guard in tests/test_config_flow_summary_i18n.py / tests/test_policy_summary_i18n.py enforces this. Likewise, the reason_i18n/en.json source of truth must stay byte-identical (flattened) to the code-owned _REASON_TEMPLATES_EN dict (reason_i18n.py) — a drift guard in tests/test_reason_i18n.py enforces this, and troubleshoot_i18n/en.json has the identical relationship to _TRIAGE_TEMPLATES_EN (troubleshoot_i18n.py), guarded by tests/test_troubleshoot_i18n.py. If you change those code dicts, regenerate the matching en.json first, then sync de/fr.

Officially shipped languages: en, de, fr. Any new language is added only on explicit maintainer request via this skill.

Picking the Operation

Match what the user asks for:

User says…Operation
"sync translations", "update translations", "propagate the en.json changes"Sync
"add [language]", "rebuild [language] from scratch", "retranslate [language]"Add language
"drop [language]", "remove [language]", "stop shipping [language]"Drop language
"translation status", "how are translations doing", "check translations"Status

If ambiguous, ask the user one clarifying question before proceeding.


Model Strategy

OperationModelScope
Sync (incremental)Haiku onlyAll changed/added keys — no Sonnet review
Add language (full rebuild)Haiku bulk → Sonnet reviewHaiku: all 766 keys; Sonnet: only data_description keys (see below)

Why Haiku-only for Sync: Incremental changes are small and build on an existing high-quality baseline. Placeholder preservation is verified by tests. Sonnet review is not cost-justified for small diffs.

Why Sonnet for Add language data_descriptions: Full rebuilds produce ~286 long help-text strings with domain concepts (azimuth, elevation, glare zones, climate modes). These benefit from a register/accuracy pass. Step descriptions, labels, and error/abort messages are simple enough for Haiku alone.

Sonnet review-pass key pattern (Add language only):

  • Any dotpath containing .data_description. — these are the long help text strings

Everything else stays with Haiku output.

Cost budget: ~$0.03 per 2-language sync; ~$0.25 per 2-language full rebuild. If a run seems headed above $0.50 for one language, stop and ask the user.


Operation 1 — Sync

Use when translations/en.json has changed and DE/FR need to catch up.

Steps

All four bundles. Run the diff + dispatch for translations/, summary_i18n/, reason_i18n/, and troubleshoot_i18n/. A given language's four files can have independent deltas — compute and propagate each separately. The summary_i18n files are small nested trees (flatten the same way); their dotpaths look like rules.force, cover_types.blind, geometry.slat.depth. The reason_i18n files are likewise small nested trees; their dotpaths look like solar.tracking, manual.holding_label, fragment.season_summer, engine.direct_sun. The troubleshoot_i18n files are the smallest; their dotpaths are all under one triage root — triage.custom_safety_bypass, triage.skip_age, triage.sun_tracking_gate_closed.

  1. Diff. Load all translation files (all four directories) via Bash+Python (see Reading Translation Files — do NOT use the Read tool). Flatten each to dot-path keys. For each non-en file compute:

    • added: keys in en but not in target
    • removed: keys in target but not in en
    • changed: keys where the en value text changed since the target was last generated. Detect by heuristic: if target[k] looks like an obvious placeholder (equals en[k] verbatim, or is a short English phrase when the rest of the file is clearly in the target language), treat it as changed. When unsure, retranslate — cost of a re-translation is negligible.
  2. If nothing to do, report "DE/FR already in sync with en.json" and exit.

  3. Dispatch one subagent per language in parallel (single message, two Agent tool calls). Each subagent handles all FOUR of that language's files (translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, and troubleshoot_i18n/<lang>.json) and receives:

    • Absolute paths to translations/en.json + summary_i18n/en.json + reason_i18n/en.json + troubleshoot_i18n/en.json and to its own four target files
    • The list of added + changed dotpaths to translate, per file
    • The list of removed dotpaths to strip from each target
    • The language name and ISO code

    The subagent's job (Haiku only — no Sonnet review for Sync):

    • Extract the values at the requested dotpaths from en.json via Bash+Python (see Reading Translation Files — do NOT use the Read tool directly on these files).
    • Run the Haiku translation prompt (see Subagent Prompt Templates) on all of them.
    • Load the target file, merge in the new values, delete removed keys, and write it back via Bash+Python.
    • Return a one-paragraph summary: counts added/changed/removed, any placeholder-preservation warnings, cost estimate.
  4. Verify. Run ./scripts/validate_translations.py --ci (covers translations/ only — it does not validate summary_i18n/, reason_i18n/, or troubleshoot_i18n/) and venv/bin/python -m pytest tests/test_translations.py tests/test_config_flow_summary_i18n.py tests/test_policy_summary_i18n.py tests/test_reason_i18n.py tests/test_troubleshoot_i18n.py -q. If either fails, report the failure verbatim and stop. Do not attempt a second auto-sync round.

  5. Report. Use the Output Format below.


Operation 2 — Add Language

Use to rebuild DE/FR from scratch or to add a brand-new language.

Steps
  1. Validate. The language code must be a valid HA locale (BCP-47 form: de, fr, es, pt-BR, zh-Hans, etc.). If en, refuse — we don't retranslate English. If the file already exists and the user did not say "rebuild" or "retranslate", confirm they want to overwrite.

  2. Delete the existing file if rebuilding, so the subagent produces a clean file.

  3. Dispatch one subagent per requested language in parallel. If the user says "add DE and FR", send a single message with two Agent tool calls. Each subagent builds all FOUR files for its language and receives:

    • Absolute paths to translations/en.json, summary_i18n/en.json, reason_i18n/en.json, AND troubleshoot_i18n/en.json
    • Absolute paths to the four target files it must write (translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, troubleshoot_i18n/<lang>.json)
    • Language name + ISO code
    • The domain-term glossary (see below) — customized per language

    The subagent's job:

    • Load the full translations/en.json, summary_i18n/en.json, reason_i18n/en.json, and troubleshoot_i18n/en.json trees via Bash+Python (see Reading Translation Files).
    • Pass 1 — Haiku bulk: Run the Haiku translation prompt on all keys from all four files. Capture output as a JSON object.
    • Pass 2 — Sonnet review (data_descriptions only): Filter the Haiku output to include ONLY keys containing .data_description. (these exist only in translations/, not the other three bundles) — do not send any other keys to Sonnet. reason_i18n and troubleshoot_i18n have no data_description keys at all, so they never enter the Sonnet pass — they stay Haiku-only, same as summary_i18n's non-data_description keys. Run the Sonnet review prompt on this filtered subset. Merge corrected values back into the Haiku output.
    • Write translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, AND troubleshoot_i18n/<lang>.json via Bash+Python: each with the same nested structure as its en.json source, 2-space indent, ensure_ascii=False, trailing newline.
    • Return a summary: key counts written per file, how many data_description keys were reviewed by Sonnet, placeholder warnings, cost estimate.
  4. Update tooling. After subagents return:

    • Add the language code to the LANGUAGES constant in scripts/validate_translations.py (unless already present).
    • Update any per-language lists in tests/test_translations.py.
  5. Verify. Run ./scripts/validate_translations.py --ci (covers translations/ only — it does not validate summary_i18n/, reason_i18n/, or troubleshoot_i18n/) and venv/bin/python -m pytest tests/test_translations.py tests/test_config_flow_summary_i18n.py tests/test_policy_summary_i18n.py tests/test_reason_i18n.py tests/test_troubleshoot_i18n.py -q. Do not proceed to commit if either fails.

  6. Report. If the language is new (not in the previously-shipped set), remind the user to update README's supported-languages list and add a release-notes line.


Show full SKILL.md (661 more words)Show less

Operation 3 — Drop Language

  1. Confirm the language is not en, de, or fr. If the user asks to drop one of the core three, explicitly confirm with them before proceeding (this changes the officially supported set).
  2. Delete ALL FOUR of translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, and troubleshoot_i18n/<lang>.json.
  3. Remove the code from scripts/validate_translations.py LANGUAGES list.
  4. Remove any language-specific expectations from tests/test_translations.py.
  5. Run venv/bin/python -m pytest tests/test_translations.py tests/test_config_flow_summary_i18n.py tests/test_policy_summary_i18n.py tests/test_reason_i18n.py tests/test_troubleshoot_i18n.py -q to confirm.
  6. Report what was removed.

Operation 4 — Status

  1. Run ./scripts/validate_translations.py (no flags) and show its dashboard output. This covers translations/ only — it does not validate summary_i18n/, reason_i18n/, or troubleshoot_i18n/.
  2. Run venv/bin/python -m pytest tests/test_translations.py tests/test_config_flow_summary_i18n.py tests/test_policy_summary_i18n.py tests/test_reason_i18n.py tests/test_troubleshoot_i18n.py -q and show pass/fail counts (covers all four bundles' parity + the en-source drift guards).
  3. No subagents, no writes.

Reading Translation Files

⚠️ The translations/ JSON files exceed the Read tool's 25,000-token limit. Never use the Read tool directly on translations/en.json, de.json, or fr.json. Use Bash+Python instead. The summary_i18n/, reason_i18n/ and troubleshoot_i18n/ files are smaller (~10 KB) and Read-safe, but use the same Bash+Python flatten/merge flow for consistency and to keep the write format identical (2-space indent, ensure_ascii=False, trailing newline).

Extract specific dotpath values from en.json (Sync):

bash
python3 << 'EOF'
import json, functools

def get_path(d, dotpath):
    return functools.reduce(lambda x, k: x[k], dotpath.split('.'), d)

with open('/path/to/en.json') as f:
    en = json.load(f)

dotpaths = ['config.step.blind_spot.data.blind_spot_left', ...]
print(json.dumps({p: get_path(en, p) for p in dotpaths}, ensure_ascii=False, indent=2))
EOF

Load full en.json tree (Add language):

bash
python3 -c "
import json
with open('/path/to/en.json') as f:
    d = json.load(f)
print(json.dumps(d, ensure_ascii=False))
"

Load, update, and write back a target file:

bash
python3 << 'EOF'
import json

with open('/path/to/de.json') as f:
    target = json.load(f)

# Apply changes (set dotpath values, remove keys, etc.)
# target['config']['step']['blind_spot']['data']['blind_spot_left'] = 'Neuer Wert'

with open('/path/to/de.json', 'w') as f:
    json.dump(target, f, ensure_ascii=False, indent=2)
    f.write('\n')
EOF

Subagent Prompt Templates

Use these verbatim when dispatching. Substitute <...> placeholders before sending.

Haiku translation prompt (used for ALL operations)
You are translating Home Assistant integration UI strings from English to <LANGUAGE_NAME> (<LANG_CODE>).

Source file: <ABSOLUTE_PATH_TO_EN_JSON>
⚠️ Do NOT use the Read tool on this file — it exceeds the token limit and will error.
Use the Bash tool with Python to extract the values you need.

Translate ONLY these dotpath keys (flattened form):
<LIST_OF_DOTPATHS>

To extract source values, use the Bash tool:
  python3 -c "
  import json, functools
  def get(d, p): return functools.reduce(lambda x,k: x[k], p.split('.'), d)
  en = json.load(open('<ABSOLUTE_PATH_TO_EN_JSON>'))
  paths = [<COMMA_SEPARATED_QUOTED_DOTPATHS>]
  print(json.dumps({p: get(en, p) for p in paths}, ensure_ascii=False, indent=2))
  "

To update the target file, use the Bash tool:
  python3 -c "
  import json, functools
  def set_path(d, p, v):
      keys = p.split('.'); functools.reduce(lambda x,k: x[k], keys[:-1], d)[keys[-1]] = v
  with open('<ABSOLUTE_PATH_TO_TARGET_JSON>') as f: t = json.load(f)
  # set_path(t, 'config.step.blind_spot.data.blind_spot_left', 'translated value')
  with open('<ABSOLUTE_PATH_TO_TARGET_JSON>', 'w') as f:
      json.dump(t, f, ensure_ascii=False, indent=2); f.write('\n')
  "

Translation rules — non-negotiable:
1. Preserve every placeholder exactly as-is: {summary}, {entity}, {position}, {hours}, {minutes}, {name}, {version}, etc.
2. Preserve markdown and formatting: **bold**, newlines (\n), bullet markers (-), numbered lists, backticks.
3. Preserve HTML/XML-style tags if present (<br>, <b>, etc.).
4. Preserve unit symbols (%, °, m, cm, K) and numeric values verbatim.
5. Use these domain terms consistently — do NOT invent alternatives:
<DOMAIN_GLOSSARY_FOR_LANGUAGE>
6. Keep the register close to Home Assistant's UI voice: clear, concise, second-person imperative for instructions ("Select…", "Enter…", "Configure…").
7. Do NOT translate proper names, entity IDs, integration names, or mdi: icon references.

Self-review — before outputting, check each translation for:
- ✅ All {placeholders} present and unchanged
- ✅ Domain terms match the glossary above
- ✅ No English words left in output (except proper names and technical terms from the glossary)
- ✅ Register is natural for a technical UI (not overly formal or casual)

Output format: a single JSON object mapping each input dotpath to its translation. Nothing else. No commentary, no markdown fences.

Example output:
{"config.step.geometry.title": "Géométrie du cache", "config.step.geometry.description": "Configurez les dimensions..."}
Sonnet review prompt (Add language only — data_description keys only)
Review these <LANGUAGE_NAME> translations of Home Assistant config-flow help text (data_description fields). These are long strings explaining configuration options to end users — they require accurate domain terminology and natural register.

Fix translations that:
- Sound stiff, machine-translated, or overly literal
- Misrepresent a technical concept (azimuth, elevation, tilt, glare zone, cover pipeline, FOV)
- Use inconsistent register with HA's UI voice
- Drop or alter a placeholder — if a placeholder is missing, flag it as ERROR: do not silently fix

Domain terms that must be used consistently:
<DOMAIN_GLOSSARY_FOR_LANGUAGE>

Do NOT change translations that are already correct and natural.

Return the SAME JSON shape with the same keys, corrected values only where needed. Output JSON only, no commentary.

⚠️ Input contains ONLY data_description keys. Do not add, remove, or rename any keys.

Input:
<FILTERED_HAIKU_OUTPUT — DATA_DESCRIPTION_KEYS_ONLY>
Domain glossary (append to both Haiku and Sonnet prompts per language)

German (de):

  • azimuth → Azimut
  • elevation → Höhe
  • tilt → Neigung
  • slat → Lamelle
  • glare zone → Blendungszone
  • cover → Beschattung
  • awning → Markise
  • blind → Jalousie
  • venetian blind → Jalousie (mit Lamellen)
  • climate mode → Klimamodus
  • override → Übersteuerung / Überschreibung
  • manual override → Manuelle Übersteuerung
  • force override → Zwangsübersteuerung
  • motion sensor → Bewegungssensor
  • presence → Anwesenheit
  • field of view / FOV → Sichtfeld / FOV
  • occupancy → Anwesenheit / Belegung
  • acceptance angle → Akzeptanzwinkel
  • sunset → Sonnenuntergang

French (fr):

  • azimuth → azimut
  • elevation → élévation
  • tilt → inclinaison
  • slat → lamelle
  • glare zone → zone d'éblouissement
  • cover → protection / store
  • awning → store banne
  • blind → store
  • venetian blind → store vénitien
  • climate mode → mode climatique
  • override → dérogation
  • manual override → dérogation manuelle
  • force override → dérogation forcée
  • motion sensor → détecteur de mouvement
  • presence → présence
  • field of view / FOV → champ de vision / FOV
  • occupancy → présence / occupation
  • acceptance angle → angle d'acceptation
  • sunset → coucher du soleil

For other languages, tell the subagent to "use the HA community standard translation of these terms for <language>; when in doubt prefer the shortest unambiguous term."


File Format

Non-EN files (in ALL FOUR of translations/, summary_i18n/, reason_i18n/, and troubleshoot_i18n/) must:

  • Be valid JSON, 2-space indent.
  • Use ensure_ascii=False (keep accented characters as-is, not \uXXXX).
  • End with exactly one trailing newline.
  • Preserve the matching en.json's nested structure exactly — for translations/ every top-level section including services; for summary_i18n/ the full nested label tree (rules, weather, cover_types, geometry, …); for reason_i18n/ the full nested reason-code tree (solar, manual, fragment, engine, …).
  • Contain no mdi: icon references, no zero-width characters, no empty string values.

⚠️ Placeholder parity is critical for summary_i18n/ and reason_i18n/. Each label is a Python str.format template; the translated value must carry the IDENTICAL set of {field} placeholders — including any format specs, e.g. {distance:.2f} — and escaped literal {{/}} as the English source, or the consuming code raises at render time (_build_config_summary for summary_i18n/; the reason_i18n.py resolver for reason_i18n/). tests/test_config_flow_summary_i18n.py enforces this per key for summary_i18n/; tests/test_reason_i18n.py (test_reason_placeholder_parity_de_fr) enforces it for reason_i18n/.


Safety Rules

  • Never delete en.json (in any of translations/, summary_i18n/, or reason_i18n/).
  • Never write a translation file without running the validator and tests afterwards.
  • Never silently drop keys from a target file. If a key was removed from en.json, the Sync operation must list it under "removed" in the report.
  • If Haiku output fails JSON parse, retry once; if still failing, dispatch Sonnet for that batch as a fallback. Do not return partial results.
  • Respect the cost budget. If a projected run exceeds $0.50 for one language, stop and ask the user.

Output Format

After any Sync or Add run, report:

Translation <sync|add> complete (branch: <current-branch>)

translations/  en: <N> keys (unchanged)
  de.json: +<A> added, ~<C> changed, -<R> removed → <T> keys
  fr.json: +<A> added, ~<C> changed, -<R> removed → <T> keys
summary_i18n/  en: <N> keys (unchanged)
  de.json: +<A> added, ~<C> changed, -<R> removed → <T> keys
  fr.json: +<A> added, ~<C> changed, -<R> removed → <T> keys
reason_i18n/  en: <N> keys (unchanged)
  de.json: +<A> added, ~<C> changed, -<R> removed → <T> keys
  fr.json: +<A> added, ~<C> changed, -<R> removed → <T> keys

Validator: ✅  Tests: ✅ (<N> passed)
Cost estimate: ~$<X> (Haiku: <N> keys; Sonnet review: <N> data_description keys or "none — Sync")

Warnings:
- <any placeholder preservation issues, or "none">

Drop and Status operations use a shorter free-form report.

© jrhubott, MIT. 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/acp-translate of jrhubott/adaptive-cover-pro.

Open the folder on GitHubat commit c03d682

Compare with similar skills

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

Acp Translate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Acp Translate this skilljrhubott/adaptive-cover-pro176—~5.8kAutomated safety check: PassMIT
China Travel Kittczyliu/china-travel-kit194—~1.3kAutomated safety check: PassMIT
Technology Searchfreestylefly/wesight946—~3.3kAutomated safety check: PassMIT
Translate Popython/python-docs-zh-tw284—~793Automated safety check: PassCustom licence
Obs Build LogsNuitka/Nuitka15k—~849Automated safety check: PassAGPL-3.0
Update Gui TranslationsArduPilot/MethodicConfigurator166—~1.5kAutomated safety check: PassGPL-3.0

Similar skills

  • China Travel Kit

    tczyliu/china-travel-kit

    Research and plan first-time independent trips in China with bilingual, source-aware city data and official live-check entry points.

    194 GitHub stars~1.3k tokensUpdated 1 mo ago
    Writing & ContentAuto-check passed
  • Technology Search

    freestylefly/wesight

    Search tech blogs, developer forums, and IT media (TechCrunch, Hacker News, 36氪, etc.) for software and hardware industry updates with heat ranking and EN↔CN translation.

    946 GitHub stars~3.3k tokensUpdated 9 days ago
    Writing & ContentAuto-check passed
  • Translate Po

    python/python-docs-zh-tw

    Official

    Translates PO file entries from English to Traditional Chinese (zhTW) following project conventions.

    284 GitHub stars~793 tokensUpdated today
    Writing & ContentAuto-check passed
  • Obs Build Logs

    Nuitka/Nuitka

    Access and diagnose openSUSE Build Service (OBS) package build logs.

    15k GitHub stars~849 tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Update Gui Translations

    ArduPilot/MethodicConfigurator

    Update existing GUI translations using AI assistance. An agent skill from ArduPilot/MethodicConfigurator.

    166 GitHub stars~1.5k tokensUpdated today
    Writing & ContentAuto-check passed
  • Check Terminology

    python/python-docs-zh-tw

    Official

    Checks terminology consistency against project glossary and identifies zhCN terms that need conversion to zhTW.

    284 GitHub stars~705 tokensUpdated today
    Writing & ContentAuto-check passed

More from jrhubott/adaptive-cover-pro

  • Acp Diagnose

    jrhubott/adaptive-cover-pro

    Analyze an Adaptive Cover Pro diagnostics JSON file and produce a triage report.

    176 GitHub stars~958 tokensUpdated yesterday
    Auto-check passed
  • Acp Issue Diagnose

    jrhubott/adaptive-cover-pro

    Triage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue.

    176 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed
  • Acp Live Diagnose

    jrhubott/adaptive-cover-pro

    Root-cause a misbehaving Adaptive Cover Pro cover on a RUNNING Home Assistant install by pulling live diagnostics over the HA MCP, correlating against the recorder, proving the mechanism with a…

    176 GitHub stars~3.8k tokensUpdated yesterday
    Auto-check passed

Questions about Acp Translate

What does Acp Translate do?

Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration. Acp Translate is an agent skill from jrhubott/adaptive-cover-pro.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration.

When should I use Acp Translate?

Acp Translate fits situations like: phrases like sync translations; update translations; drop [language]; translation status.

How do I install Acp Translate in Claude Code?

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

How do I install Acp Translate in Codex?

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

Can I use Acp 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 jrhubott/adaptive-cover-pro --skill acp-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/acp-translate, .gemini/skills/acp-translate, .github/skills/acp-translate and .opencode/skills/acp-translate in your project.

What does Acp Translate need to run?

Going by SKILL.md and its folder, Acp Translate needs the command-line tools its instructions call (python3 and python). Our summary lists: Python 3.

Does Acp 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 Acp 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 Acp Translate use?

Acp Translate is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Acp Translate use?

About 5.8k tokens (SKILL.md is roughly 23k 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 Acp Translate?

Skills that share tags, products or a category with Acp Translate: China Travel Kit (tczyliu/china-travel-kit, 194 stars), Technology Search (freestylefly/wesight, 946 stars), Translate Po (python/python-docs-zh-tw, 284 stars) and Obs Build Logs (Nuitka/Nuitka, 15k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Acp Translate?

jrhubott (a GitHub user) maintains it in jrhubott/adaptive-cover-pro, which has 176 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 9, 2026.

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