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.
Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration.
$ npx skills add jrhubott/adaptive-cover-pro --skill acp-translate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-translate --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/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-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 "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .claude/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translateType 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 jrhubott/adaptive-cover-pro --skill acp-translate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-translate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/acp-translate .agents/skills/acp-translate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .agents/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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 jrhubott/adaptive-cover-pro --skill acp-translate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-translate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/acp-translate .cursor/skills/acp-translate && 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 "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .cursor/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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/jrhubott/adaptive-cover-pro.git --path .claude/skills/acp-translate--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 jrhubott/adaptive-cover-pro --skill acp-translate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-translate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/acp-translate .gemini/skills/acp-translate && 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 "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .gemini/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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 jrhubott/adaptive-cover-pro acp-translateInstalls 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 jrhubott/adaptive-cover-pro --skill acp-translate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/acp-translate .github/skills/acp-translate && 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 "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .github/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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 jrhubott/adaptive-cover-pro --skill acp-translate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-translate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/acp-translate .opencode/skills/acp-translate && 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 "acp-translate" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-translate into .opencode/skills/acp-translate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-translate", 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.
acp-translateSync 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. 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.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit c03d682. 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.
Shell commands in SKILL.md call:
python3pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
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.
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 jrhubott/adaptive-cover-pro at commit c03d682, republished under its MIT licence (© jrhubott). 2,021 words, ~5,751 tokens.
.claude/skills/acp-translate/SKILL.md (or your agent's skills folder).Maintains four parallel translation bundles, each with en.json as the single source of truth and every other language matching its structure exactly:
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.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.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.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.
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.
| Operation | Model | Scope |
|---|---|---|
| Sync (incremental) | Haiku only | All changed/added keys — no Sonnet review |
| Add language (full rebuild) | Haiku bulk → Sonnet review | Haiku: 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):
.data_description. — these are the long help text stringsEverything 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.
Use when translations/en.json has changed and DE/FR need to catch up.
All four bundles. Run the diff + dispatch for
translations/,summary_i18n/,reason_i18n/, andtroubleshoot_i18n/. A given language's four files can have independent deltas — compute and propagate each separately. Thesummary_i18nfiles are small nested trees (flatten the same way); their dotpaths look likerules.force,cover_types.blind,geometry.slat.depth. Thereason_i18nfiles are likewise small nested trees; their dotpaths look likesolar.tracking,manual.holding_label,fragment.season_summer,engine.direct_sun. Thetroubleshoot_i18nfiles are the smallest; their dotpaths are all under onetriageroot —triage.custom_safety_bypass,triage.skip_age,triage.sun_tracking_gate_closed.
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 targetremoved: keys in target but not in enchanged: 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.If nothing to do, report "DE/FR already in sync with en.json" and exit.
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:
translations/en.json + summary_i18n/en.json + reason_i18n/en.json + troubleshoot_i18n/en.json and to its own four target filesadded + changed dotpaths to translate, per fileremoved dotpaths to strip from each targetThe subagent's job (Haiku only — no Sonnet review for Sync):
removed keys, and write it back via Bash+Python.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.
Report. Use the Output Format below.
Use to rebuild DE/FR from scratch or to add a brand-new language.
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.
Delete the existing file if rebuilding, so the subagent produces a clean file.
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:
translations/en.json, summary_i18n/en.json, reason_i18n/en.json, AND troubleshoot_i18n/en.jsontranslations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, troubleshoot_i18n/<lang>.json)The subagent's job:
translations/en.json, summary_i18n/en.json, reason_i18n/en.json, and troubleshoot_i18n/en.json trees via Bash+Python (see Reading Translation Files)..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.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.Update tooling. After subagents return:
LANGUAGES constant in scripts/validate_translations.py (unless already present).tests/test_translations.py.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.
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.
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).translations/<lang>.json, summary_i18n/<lang>.json, reason_i18n/<lang>.json, and troubleshoot_i18n/<lang>.json.scripts/validate_translations.py LANGUAGES list.tests/test_translations.py.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../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/.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).⚠️ 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):
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))
EOFLoad full en.json tree (Add language):
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:
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')
EOFUse these verbatim when dispatching. Substitute <...> placeholders before sending.
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..."}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>German (de):
French (fr):
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."
Non-EN files (in ALL FOUR of translations/, summary_i18n/, reason_i18n/, and troubleshoot_i18n/) must:
ensure_ascii=False (keep accented characters as-is, not \uXXXX).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, …).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/.
en.json (in any of translations/, summary_i18n/, or reason_i18n/).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
Just SKILL.md in .claude/skills/acp-translate of jrhubott/adaptive-cover-pro.
Open the folder on GitHubat commit c03d682
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Acp Translate this skilljrhubott/adaptive-cover-pro | 176 | — | ~5.8k | Automated safety check: Pass | MIT | |
| China Travel Kittczyliu/china-travel-kit | 194 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Technology Searchfreestylefly/wesight | 946 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Translate Popython/python-docs-zh-tw | 284 | — | ~793 | Automated safety check: Pass | Custom licence | |
| Obs Build LogsNuitka/Nuitka | 15k | — | ~849 | Automated safety check: Pass | AGPL-3.0 | |
| Update Gui TranslationsArduPilot/MethodicConfigurator | 166 | — | ~1.5k | Automated safety check: Pass | GPL-3.0 |
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.
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.
python/python-docs-zh-tw
Translates PO file entries from English to Traditional Chinese (zhTW) following project conventions.
Nuitka/Nuitka
Access and diagnose openSUSE Build Service (OBS) package build logs.
ArduPilot/MethodicConfigurator
Update existing GUI translations using AI assistance. An agent skill from ArduPilot/MethodicConfigurator.
python/python-docs-zh-tw
Checks terminology consistency against project glossary and identifies zhCN terms that need conversion to zhTW.
jrhubott/adaptive-cover-pro
Analyze an Adaptive Cover Pro diagnostics JSON file and produce a triage report.
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.
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…
Works with
Categories
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.
Acp Translate fits situations like: phrases like sync translations; update translations; drop [language]; translation status.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.