Agent skill

Verify Language Switch

by reticlehq in 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.

Apache-2.0Auto-check passedFrontend & Design

Install Verify Language Switch

skills CLI
$ npx skills add reticlehq/reticle --skill verify-language-switch -a claude-code

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

GitHub CLI
$ gh skill install reticlehq/reticle verify-language-switch --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/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-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
verify-language-switch
GitHub stars
1.2k
Token cost
~2k tokens
SKILL.md length
983 words
Files
1
Skills in repo
19
Repo updated
First seen
Licence
Apache-2.0

At a glance

Prove a language switch translates what the user sees, keeps what they had already typed, and is still in force after a reload.

  • Works in 4 steps: Note what is on screen, and type something → Switch, and name what must change before… → Prove the typed value survived → …
  • A locale picker
  • SKILL.md covers Before you start, 1. Note what is on screen, and…, 2. Switch, and name what must… and 3. Prove the typed value…, plus 3 more sections
  • Calls curl and npx; reaches docs.reticle.sh

What it does

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.

When your agent uses it

  • A locale picker
  • A language menu
  • Translation files were added
  • A string is suspected of staying in the old language

Example prompts

  • “/verify-language-switch”

Requirements

  • Node.js

Workflow steps

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

  1. Note what is on screen, and type something
  2. Switch, and name what must change before you act
  3. Prove the typed value survived
  4. Reload, and prove the choice stuck

What it can do on your machine

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

    • curl
    • npx

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

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • docs.reticle.sh

    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

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.

Always · name and description, kept in context so the agent knows when to use it
~108
When it runs · the whole SKILL.md, loaded when a task matches
~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 reticlehq/reticle at commit 178e5c0, republished under its Apache-2.0 licence (© reticlehq). 983 words, ~2,024 tokens.

Download SKILL.mdSave it as .claude/skills/verify-language-switch/SKILL.md (or your agent's skills folder).
name
verify-language-switch
description
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.
license
Apache-2.0
metadata.version
3.7.0
metadata.homepage
https://www.reticle.sh
metadata.repository
https://github.com/reticlehq/reticle

A translated heading is not a translated page

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.

Before you start

  • Confirm the session can observe: 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.
  • Take the expected strings from the app, not from your head. Open its translation files (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.
  • Pick strings that are not already on the page. A language menu that lists "Español" satisfies { 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.

1. Note what is on screen, and type something

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.

2. Switch, and name what must change before you act

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.

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

3. Prove the typed value survived

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.

4. Reload, and prove the choice stuck

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.

What to assert

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.

  1. Old text gone and new text present, in at least two regions of the page.
  2. No raw translation key on screen and no missing-key error in the console.
  3. The typed value is intact, asserted with value in the query, and its label is translated.
  4. The reloaded page is still in the new language.

Honesty

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

Files

Just SKILL.md in skills/verify-language-switch of reticlehq/reticle.

Open the folder on GitHubat commit 178e5c0

Compare with similar skills

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.

Verify Language Switch compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Verify Language Switch this skillreticlehq/reticle1.2k—~2kAutomated safety check: PassApache-2.0
Chatbox i18n Translatorchatboxai/chatbox42k—~508Automated safety check: PassGPL-3.0
Enforce Rules For I18nmoeru-ai/airi50k—~1.5kAutomated safety check: PassMIT
Translation ReviewDevolutions/UniGetUI26k—~1.3kAutomated safety check: PassMIT
Lingui Best PracticesB0und/WikiSpeedrun1332 repos~4.2kAutomated safety check: PassMIT
Ok Script I18nAliceJump/ok-end-field556—~828Automated safety check: PassAGPL-3.0

Similar skills

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

    42k GitHub stars~508 tokensUpdated 15 days ago
    Frontend & DesignAuto-check passed
  • Review pending AIRI translations on Crowdin in a batch, then sync them into the repository.

    50k GitHub stars~1.5k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Translation Review

    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…

    26k GitHub stars~1.3k tokensUpdated today
    Frontend & DesignAuto-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
  • Ok Script I18n

    AliceJump/ok-end-field

    Maintain gettext translations for ok-script task UI and runtime messages.

    556 GitHub stars~828 tokensUpdated today
    Frontend & DesignAuto-check passed
  • I18next Localization

    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…

    242 GitHub stars~1.6k tokensUpdated yesterday
    Frontend & DesignAuto-check passed

More from reticlehq/reticle

All 19 skills in this repo
  • Agentic TDD

    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.

    1.2k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Whole-App Health Sweep

    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.

    1.2k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Broken UI Debugger

    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.

    1.2k GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • 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.

    1.2k GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • 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.

    1.2k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Fix What I Pointed At

    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.

    1.2k GitHub stars~878 tokensUpdated today
    Auto-check passed

Questions about Verify Language Switch

What does Verify Language Switch do?

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.

When should I use Verify Language Switch?

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.

How do I install Verify Language Switch in Claude Code?

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.

How do I install Verify Language Switch in Codex?

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.

Can I use Verify Language Switch 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 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.

What does Verify Language Switch need to run?

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.

Does Verify Language Switch access the network?

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.

Is Verify Language Switch 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 Verify Language Switch use?

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.

How many tokens does Verify Language Switch use?

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.

What are the alternatives to Verify Language Switch?

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.

Who maintains Verify Language Switch?

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.