Chatbox i18n Translator
chatboxai/chatbox
Translates new or changed i18n keys from a Chatbox Pro diff, staged changes or a commit range, writing the locale JSON files directly with a built-in glossary.
Prove a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload.
$ npx skills add reticlehq/reticle --skill verify-language-switch -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install reticlehq/reticle verify-language-switch --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/reticlehq/reticle.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/verify-language-switch .claude/skills/verify-language-switch && 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 "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .claude/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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/reticlehq/reticle/tree/main/skills/verify-language-switchType 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 reticlehq/reticle --skill verify-language-switch -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install reticlehq/reticle verify-language-switch --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reticlehq/reticle.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/verify-language-switch .agents/skills/verify-language-switch && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .agents/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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 reticlehq/reticle --skill verify-language-switch -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install reticlehq/reticle verify-language-switch --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reticlehq/reticle.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/verify-language-switch .cursor/skills/verify-language-switch && 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 "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .cursor/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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/reticlehq/reticle.git --path skills/verify-language-switch--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 reticlehq/reticle --skill verify-language-switch -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install reticlehq/reticle verify-language-switch --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reticlehq/reticle.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/verify-language-switch .gemini/skills/verify-language-switch && 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 "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .gemini/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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 reticlehq/reticle verify-language-switchInstalls 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 reticlehq/reticle --skill verify-language-switch -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/reticlehq/reticle.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/verify-language-switch .github/skills/verify-language-switch && 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 "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .github/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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 reticlehq/reticle --skill verify-language-switch -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install reticlehq/reticle verify-language-switch --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/reticlehq/reticle.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/verify-language-switch .opencode/skills/verify-language-switch && 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 "verify-language-switch" agent skill from https://github.com/reticlehq/reticle/tree/main/skills/verify-language-switch into .opencode/skills/verify-language-switch/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verify-language-switch", 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.
verify-language-switchProve a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload.
Verify Language Switch is an agent skill from reticlehq/reticle. Prove a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload. Use when i18n, a locale picker, a language menu or translation files were added or changed, when a string is suspected of staying in the old language or showing a raw translation key, or when a user reports losing their form or their language choice after switching or refreshing.
Its SKILL.md is about 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 Frontend & Design, covering Internationalization and Translation. The repository describes itself as: AI agents can generate code, but still struggle to understand what they build. Reticle brings Jev-style machine-native runtime perception to web & desktop applications. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 178e5c0. 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:
curlnpxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
docs.reticle.shFrom 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.
Verify Language Switch loads about 2k tokens when it runs. Until then it costs about 108 tokens; SKILL.md has 983 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 reticlehq/reticle at commit 178e5c0, republished under its Apache-2.0 licence (© reticlehq). 983 words, ~2,024 tokens.
.claude/skills/verify-language-switch/SKILL.md (or your agent's skills folder).Clicking the language menu and seeing one word change proves one string was wired up. It does not prove the rest of the page followed, that the field the user was in the middle of filling still holds what they typed, or that the choice outlives a refresh. Those are three separate bugs. Each ships regularly, and glancing at the page after the click catches none of them.
Reticle can prove all three in the running app, with no test code. Not installed? RETICLE_INSTALL_SOURCE=npx_skill npx @reticlehq/server@latest init, then the install-and-verify skill.
reticle_session({ action: "list" }). A hidden or throttled tab can accept a click and render nothing. If it is not healthy, report the run as blocked, not passed.locales/, messages/, i18n/) and copy the target-language value for each string you will assert on. A translation you guessed can fail on a correct app, and one you half-remember can pass on a wrong one.{ kind: "text", contains: "Español" } before you click, and the verdict comes back already_true. Assert on the translated heading or a nav label instead, and scope the predicate to the region it lives in.reticle_look({ action: "page", sessionId })Write down two or three visible strings in the current language from different regions of the page: the heading, a nav label, a button. One string proves one component; two regions prove the switch reached the page.
Then type a value into a form field, so step 3 has something to find:
reticle_look({ action: "page", sessionId, mode: "interactive" })
reticle_act({ sessionId, ref: "<a text field>", action: "fill", args: { value: "reticle-i18n-4471" } })The result must show valueChanged: true. Use a value nothing else on the page contains, so step 3 proves this input survived rather than a default being refilled.
Get the switch control's ref from the interactive look. A <select> takes action: "select" with { value }; a button or menu item takes click.
reticle_act_and_wait({ sessionId, ref: "<language control>", action: "select", args: { value: "es" }, until: { kind: "allOf", predicates: [
{ kind: "text", contains: "<heading in the new language>", scope: "h1" },
{ kind: "text", contains: "<heading in the old language>", absent: true },
{ kind: "text", contains: "<nav label in the new language>", scope: "nav" },
{ kind: "text", contains: "<the heading's translation key, e.g. home.title>", absent: true },
{ kind: "console", level: "error", absent: true },
]}})Each clause catches a different bug. New text present and old text absent proves the switch replaced the string rather than rendering both. The second region proves it was not one component. The translation-key clause catches the string that fell back to its key because the target locale is missing it. The console clause catches the i18n library reporting a missing key as an error. If yours reports at warn, add { kind: "console", level: "warn", contains: "missing", absent: true }.
If the app stores the choice on the server, add { kind: "net", urlContains: "/api/preferences", ok: true } with the app's real endpoint, so a switch that only changed the client is not reported as saved.
If the switch is a full page load (a ?lang=es query or an /es/ prefix that reloads the document), the SDK is torn down mid-wait and this verdict will be unknown. Use reticle_navigate({ sessionId, url: "<the app's origin>/es/<route>" }) and run the text assertions on the session that comes back. Then report step 3 as lost by design: a switch that reloads the document discards the user's typed input, and that is a finding, not a pass.
reticle_assert({ sessionId, predicate: { kind: "allOf", predicates: [
{ kind: "element", query: { testid: "<the field>", value: "reticle-i18n-4471" } },
{ kind: "element", query: { role: "textbox", name: "<the field's label in the new language>" } },
]}})Query the field by testid, because its accessible name is now translated and the name you saw in step 1 will miss. Keep value in the query: without it the predicate collapses to "the field exists", which passes on a field the switch emptied. The second clause proves the label translated with the rest of the page; a form that keeps its values but leaves its labels in the old language is a partial switch.
If the app keeps form state in a registered store, add { kind: "state", path: "<form path>", equals: "reticle-i18n-4471" }. A field that re-rendered empty while the store kept the value, or the reverse, is the desync only the store read finds.
Use a real reload, not a navigate to the URL you are already on:
reticle_navigate({ sessionId, reload: true })It must answer confirmed: true with a sessionId. Assert on that session, which is the reloaded page:
reticle_assert({ sessionId: "<sessionId from the reload>", predicate: { kind: "allOf", predicates: [
{ kind: "text", contains: "<heading in the new language>", scope: "h1" },
{ kind: "text", contains: "<heading in the old language>", absent: true },
]}})If the reload is not confirmed, report persistence as unknown. reticle_run({ tool: "reticle_storage", sessionId, args: {} }) shows where the choice lives (a localStorage key, a cookie); that is evidence about the mechanism, not a verdict.
Do not reach for durable: true on the step 2 call as a shortcut here. It reloads the page the moment the switch verifies, which wipes the form before step 3 can prove it survived. The order matters: switch, then form, then reload.
Only verified: "yes" is a pass. "no" is a finding, "unknown" means Reticle could not tell, and "no-fault" means nothing was declared. None of them is evidence the switch works.
value in the query, and its label is translated.A verdict here is about one language pair, the strings you named and the one field you typed in. Say which they were. A page with forty strings where you asserted three has thirty-seven unverified strings, so report them as unchecked, not as passing. Right-to-left layout, date and number formats, and pluralisation are separate checks this skill does not make. If a string stayed untranslated, give its file:line from reticle_look({ action: "element", sessionId, ref }), which is the finding the user actually needs. Switch the language back before handing back, or the next person's session opens in the wrong language and looks like a regression.
Capability reference: curl https://docs.reticle.sh/capabilities.md. Everything else: curl https://docs.reticle.sh/llms.txt.
© reticlehq, Apache-2.0. 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 skills/verify-language-switch of reticlehq/reticle.
Open the folder on GitHubat commit 178e5c0
Verify Language Switch 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 |
|---|---|---|---|---|---|---|
| Verify Language Switch this skillreticlehq/reticle | 1.2k | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Chatbox i18n Translatorchatboxai/chatbox | 42k | — | ~508 | Automated safety check: Pass | GPL-3.0 | |
| Enforce Rules For I18nmoeru-ai/airi | 50k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Translation ReviewDevolutions/UniGetUI | 26k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Lingui Best PracticesB0und/WikiSpeedrun | 133 | 2 repos | ~4.2k | Automated safety check: Pass | MIT | |
| Ok Script I18nAliceJump/ok-end-field | 556 | — | ~828 | Automated safety check: Pass | AGPL-3.0 |
chatboxai/chatbox
Translates new or changed i18n keys from a Chatbox Pro diff, staged changes or a commit range, writing the locale JSON files directly with a built-in glossary.
moeru-ai/airi
Review pending AIRI translations on Crowdin in a batch, then sync them into the repository.
Devolutions/UniGetUI
Reviews UniGetUI .json language files for localization quality, detects parity issues, English-equal entries, wrong-script content, and cross-language outliers, then generates a dataset for…
B0und/WikiSpeedrun
Implement internationalization with Lingui in React and JavaScript applications.
AliceJump/ok-end-field
Maintain gettext translations for ok-script task UI and runtime messages.
i18next/i18next-cli
Takes an app from hardcoded strings to a localized, continuously translated one with i18next (Locize optional): stack detection, config, wrapping strings in t(), key extraction, Locize sync, and AI…
reticlehq/reticle
Applies red-green TDD to behavior unit tests cannot reach, by stating the expected outcome against the running app with Reticle before writing the feature.
reticlehq/reticle
Sweeps a running web app by clicking every reachable control, then reports dead buttons, console errors, failed requests and mismatches between API data and the screen.
reticlehq/reticle
Finds why a running web app misbehaves when the console is empty and the code looks fine, by reading the click, request, store and console together.
reticlehq/reticle
Drives and verifies Electron or Tauri desktop apps through Reticle, which sees the renderer and the IPC calls that a browser-based testing tool cannot observe.
reticlehq/reticle
Finds out why a passing test suite sits on top of a broken app by comparing what the running app does with what the tests claim, using Reticle.
reticlehq/reticle
Picks up bugs a person flagged by pointing at elements in the running app, each mark carrying the element, their note and the source file and line, then fixes and verifies them.
Categories
Prove a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload. Verify Language Switch is an agent skill from reticlehq/reticle. Prove a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload.
Verify Language Switch fits situations like: A locale picker; A language menu; translation files were added; A string is suspected of staying in the old language.
Run `npx skills add reticlehq/reticle --skill verify-language-switch -a claude-code`. Or copy the skill folder (skills/verify-language-switch in reticlehq/reticle) into .claude/skills/verify-language-switch in your project. Claude Code loads it when a task matches its description.
Run `npx skills add reticlehq/reticle --skill verify-language-switch -a codex`. Or copy the skill folder (skills/verify-language-switch in reticlehq/reticle) into .agents/skills/verify-language-switch 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 reticlehq/reticle --skill verify-language-switch -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/verify-language-switch, .gemini/skills/verify-language-switch, .github/skills/verify-language-switch and .opencode/skills/verify-language-switch in your project.
Going by SKILL.md and its folder, Verify Language Switch needs the command-line tools its instructions call (curl and npx). Our summary lists: Node.js.
SKILL.md names 1 domain. In commands or code: docs.reticle.sh; the agent is likely to contact it when it follows the instructions. 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.
Verify Language Switch is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 8.1k 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 Verify Language Switch: Chatbox i18n Translator (chatboxai/chatbox, 42k stars), Enforce Rules For I18n (moeru-ai/airi, 50k stars), Translation Review (Devolutions/UniGetUI, 26k stars) and Lingui Best Practices (B0und/WikiSpeedrun, 133 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
reticlehq (a GitHub organization) maintains it in reticlehq/reticle, which has 1,197 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 9, 2026.
Source: reticlehq/reticle on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.