Official agent skill

Sanity I18n Translate

by sanity-io in sanity-io/sanity

Use the <Translate i18n component correctly, especially its components map and componentProps.

OfficialMITAuto-check passedFrontend & Design

Install Sanity I18n Translate

skills CLI
$ npx skills add sanity-io/sanity --skill sanity-i18n-translate -a claude-code

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

GitHub CLI
$ gh skill install sanity-io/sanity sanity-i18n-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/sanity-io/sanity.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/sanity-i18n-translate .claude/skills/sanity-i18n-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
sanity-i18n-translate
GitHub stars
6.4k
Token cost
~1.1k tokens
SKILL.md length
388 words
Files
1
Skills in repo
34
Repo updated
First seen
Licence
MIT

At a glance

Use the <Translate i18n component correctly, especially its components map and componentProps.

  • Rendering locale strings that contain markup
  • SKILL.md covers Start Here, Law: never define components…, How to fix each shape and Gotchas, plus 1 more section
  • Reaches sanity.io
  • Embedded components

What it does

Sanity I18n Translate is an agent skill from sanity-io/sanity, published by the product's own GitHub organization. Use the <Translate i18n component correctly, especially its components map and componentProps. Use when rendering locale strings that contain markup or embedded components, when adding or reviewing <Translate usages, or when the @repo/i18n/no-inline-translate-components lint rule fires.

Its SKILL.md is about 1.1k 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. The repository describes itself as: Sanity Studio – Rapidly configure content workspaces powered by structured content. The licence is MIT.

When your agent uses it

  • Rendering locale strings that contain markup
  • Embedded components
  • Reviewing <Translate usages
  • The @repo/i18n/no-inline-translate-components lint rule fires

Example prompts

  • “/sanity-i18n-translate”

What it can do on your machine

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

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).

    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:

    • sanity.io

    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

Sanity I18n Translate loads about 1.1k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 388 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
~1.1k

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 sanity-io/sanity at commit efa15fb, republished under its MIT licence (© sanity-io). 388 words, ~1,123 tokens.

Download SKILL.mdSave it as .claude/skills/sanity-i18n-translate/SKILL.md (or your agent's skills folder).
name
sanity-i18n-translate
description
Use the <Translate> i18n component correctly, especially its components map and componentProps. Use when rendering locale strings that contain markup or embedded components, when adding or reviewing <Translate> usages, or when the @repo/i18n/no-inline-translate-components lint rule fires.

Sanity i18n Translate

Start Here

<Translate> (from packages/sanity/src/core/i18n/Translate.tsx) renders locale resources that contain markup, eg 'Search for "<Red>{{keyword}}</Red>"'. The components prop maps tag names in the locale string to React components or intrinsic HTML tag names.

Prefer the plain t() function when the message has no markup — <Translate> is more expensive to render.

Law: never define components inline

Components in the components map MUST be stable, module-scope components. Never define them inline during render — each render then creates a new component identity, so React unmounts and remounts the subtree (losing state, DOM, and focus). This is the same class of bug as react/no-unstable-nested-components, and it is enforced for <Translate> by the in-repo oxlint rule @repo/i18n/no-inline-translate-components (implemented in the @repo/oxlint-plugin-i18n workspace package, wired via jsPlugins in .oxlintrc.json).

The rule only sees object literals written directly in the JSX attribute. Maps built during render some other way (useMemo, useCallback, factory calls) are just as wrong — hoist those too, even though the rule cannot flag them.

tsx
// ❌ Wrong - new component identity every render (and fails the lint rule)
;<Translate t={t} i18nKey="key" components={{Badge: ({children}) => <strong>{children}</strong>}} />

// ❌ Wrong - useMemo does not fix the identity problem across dependency changes
const components = useMemo(() => ({Badge: ({children}) => <b>{children}</b>}), [])

How to fix each shape

Plain HTML wrapper — map to the intrinsic tag name as a string. Strings never receive componentProps, so no stray DOM attributes:

tsx
<Translate t={t} i18nKey="key" components={{Code: 'code', Emphasis: 'em'}} />

Static markup (fixed link, styled wrapper) — hoist a module-scope component:

tsx
function DocsLink({children}: {children?: ReactNode}) {
  return <a href="https://www.sanity.io/docs">{children}</a>
}

;<Translate t={t} i18nKey="key" components={{DocsLink}} />

Component that needs data from render — hoist it and pass the data through componentProps. The object is forwarded to every non-string component in the map (including exotic ones like memo components), so declare only the props each component reads:

tsx
function VersionBadge({children, tone}: {children?: ReactNode; tone?: BadgeTone}) {
  return <VersionInlineBadge $tone={tone}>{children}</VersionInlineBadge>
}

;<Translate
  t={t}
  i18nKey="key"
  components={{VersionBadge}}
  componentProps={{tone: getReleaseTone(release)}}
/>
Show full SKILL.md (150 more words)Show less

Gotchas

  • componentProps drives the generic: literal values widen ({tone: 'caution'} infers {tone: string}). Use as const on literals that must stay narrow: componentProps={{tone: 'caution' as const}}.
  • TComponentProps is constrained to object - primitives and null are compile errors.
  • Components receive children only for wrapping tags (<X>...</X>); self-closing tags (<X/>) render the component without children. Declare children optional.
  • Unmapped lowercase tags only render when listed in RECOGNIZED_HTML_TAGS in Translate.tsx; anything else falls back to interpolated plain text with a console warning.
  • Do not call component factories (eg getVersionInlineBadge) inside the hoisted component either - that recreates the render-time identity problem one level down, and the React Compiler lint flags it. Render the underlying component with a prop instead.

Reference implementations

  • packages/sanity/src/core/releases/tool/detail/ReleaseActivityListItem.tsx - componentProps passing an event object.
  • packages/@sanity/vision/src/components/VisionGuiResult.tsx - componentProps passing data to a self-closing component pair.
  • packages/sanity/src/core/studio/components/navbar/search/components/common/FilterLabel.tsx - several components sharing one componentProps object.
  • packages/sanity/src/core/i18n/__tests__/Translate.test.tsx - behavior coverage, including memo components and non-forwarding to intrinsic tags.

© sanity-io, 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 .agents/skills/sanity-i18n-translate of sanity-io/sanity.

Open the folder on GitHubat commit efa15fb

Compare with similar skills

Sanity I18n 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.

Sanity I18n Translate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Sanity I18n Translate this skillsanity-io/sanity6.4k—~1.1kAutomated safety check: PassMIT
Impeccablebestofjs/bestofjs3.1k26 repos~2.6kAutomated safety check: PassMIT
Chatbox i18n Translatorchatboxai/chatbox42k—~508Automated safety check: PassGPL-3.0
Internationalization Workflow with i18niOfficeAI/AionUi33k1 repos~1.9kAutomated safety check: PassApache-2.0
Enforce Rules For I18nmoeru-ai/airi50k—~1.5kAutomated safety check: PassMIT
Claude Desktop Chinese Localizationjavaht/claude-desktop-zh-cn7.5k—~1.6kAutomated safety check: PassMIT

Similar skills

  • Impeccable

    bestofjs/bestofjs

    A skill your agent uses when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a…

    3.1k GitHub starsUsed in 26 repos~2.6k tokens
    Frontend & DesignAuto-check passed
  • 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 17 days ago
    Frontend & DesignAuto-check passed
  • Standards for keeping all user-facing text translatable: read the i18n config first, use namespaced keys, reuse shared strings and follow the key naming rules.

    33k GitHub starsUsed in 1 repo~1.9k tokens
    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
  • Claude Desktop Chinese Localization

    javaht/claude-desktop-zh-cn

    Adds missing Simplified and Traditional Chinese translations to the Claude Desktop Chinese patch across three layers, then checks how many mappings actually hit.

    7.5k GitHub stars~1.6k tokensUpdated 6 days ago
    Frontend & DesignAuto-check passed
  • Taro UI Guide

    jd-opensource/taro-ui

    Guides installing, configuring, styling and using taro-ui (At* components) in Taro apps for WeChat, Alipay, H5 and React Native.

    4.7k GitHub stars~1.3k tokensUpdated 16 days ago
    Frontend & DesignAuto-check passed

More from sanity-io/sanity

All 34 skills in this repo
  • Playwright CLI

    sanity-io/sanity

    Official

    Automates browser interactions for web testing, form filling, screenshots, and data extraction.

    6.4k GitHub starsUsed in 18 repos~1.9k tokens
    Auto-check passed
  • Find Skills

    sanity-io/sanity

    Official

    Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities.

    6.4k GitHub starsUsed in 67 repos~1.2k tokens
    Auto-check passed
  • Official

    React and Next.js performance optimization guidelines from Vercel Engineering.

    6.4k GitHub starsUsed in 129 repos~1.6k tokens
    Auto-check passed
  • Before And After

    sanity-io/sanity

    Official

    Add existing screenshots or screen recordings to a GitHub pull request as a before/after or preview block.

    6.4k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check passed
  • React Devtools

    sanity-io/sanity

    Official

    React DevTools CLI for AI agents. An agent skill from sanity-io/sanity.

    6.4k GitHub starsUsed in 3 repos~2.1k tokens
    Auto-check passed
  • TDD

    sanity-io/sanity

    Official

    Test-driven development with red-green-refactor loop. An agent skill from sanity-io/sanity.

    6.4k GitHub starsUsed in 20 repos~1k tokens
    Auto-check passed

Questions about Sanity I18n Translate

What does Sanity I18n Translate do?

Use the <Translate i18n component correctly, especially its components map and componentProps. Sanity I18n Translate is an agent skill from sanity-io/sanity, published by the product's own GitHub organization. Use the <Translate i18n component correctly, especially its components map and componentProps.

When should I use Sanity I18n Translate?

Sanity I18n Translate fits situations like: rendering locale strings that contain markup; embedded components; reviewing <Translate usages; the @repo/i18n/no-inline-translate-components lint rule fires.

How do I install Sanity I18n Translate in Claude Code?

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

How do I install Sanity I18n Translate in Codex?

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

Can I use Sanity I18n 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 sanity-io/sanity --skill sanity-i18n-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/sanity-i18n-translate, .gemini/skills/sanity-i18n-translate, .github/skills/sanity-i18n-translate and .opencode/skills/sanity-i18n-translate in your project.

What does Sanity I18n Translate need to run?

SKILL.md names no scripts, command-line tools or credentials: Sanity I18n Translate is instructions for the agent only.

Does Sanity I18n Translate access the network?

SKILL.md names 1 domain. In commands or code: sanity.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Sanity I18n 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 Sanity I18n Translate use?

Sanity I18n 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 Sanity I18n Translate use?

About 1.1k tokens (SKILL.md is roughly 4.5k 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 Sanity I18n Translate?

Skills that share tags, products or a category with Sanity I18n Translate: Impeccable (bestofjs/bestofjs, 3.1k stars), Chatbox i18n Translator (chatboxai/chatbox, 42k stars), Internationalization Workflow with i18n (iOfficeAI/AionUi, 33k stars) and Enforce Rules For I18n (moeru-ai/airi, 50k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Sanity I18n Translate?

sanity-io (a GitHub organization, an official publisher) maintains it in sanity-io/sanity, which has 6,352 GitHub stars. The repository holds 34 skills in this directory. The repository was last updated on October 9, 2026.

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