Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Names internationalization (i18n) translation keys semantically and hierarchically by feature and context (checkout.button.submit), so a key describes where and what a string is — not its English words — and survives a copy change. Use when adding, reviewing, or reorganizing i18n keys in locale files (JSON, YAML, .po, Fluent) or t()/useTranslation lookups. Do NOT use to translate the strings themselves, to pick plural categories, or to choose an i18n library.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 239% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 245% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 246% | 0% |
An i18n key is an identifier, not a copy of the text. Name it for where the string lives and what role it plays — settings.notifications.emailToggle — so the same key keeps working after the visible words change and so every key can be found by static tooling.
Asked to add a key for a UI string, the base model tends to (1) derive the key from the English value, (2) drop every key at the top level with no namespace, and (3) build keys at runtime by concatenating a variable. All three make the catalog brittle. This skill applies the opposite discipline.
checkout.button.submit, profile.avatar.uploadLabelclickHereToPay, submitYourOrderNow (these are the English text in disguise — reword "Submit" to "Place order" and the key is now a lie)title, save, or error without colliding.billing.card.saveButton and profile.form.saveButton — two distinct keyssave at the root reused by both screens — a collision waiting to happent('errors.' + code), t(\row.${i}.label\), or anything built from user input) cannot be discovered by extractors, unused-key linters, or missing-translation checks, so a locale can silently ship with a hole.const KEY = { E_TIMEOUT: 'errors.timeout', E_AUTH: 'errors.auth' }; t(KEY[code])t('errors.' + code)dialog.delete.confirmButton (survives "Delete" → "Yes, remove it")deleteText, areYouSurePromptcommon.cancel, common.save) can live in a shared namespace and be reused. But do not force one key to serve two contexts whose copy can diverge — the moment one side is reworded, split them into separate keys.Naming a new key, reviewing key names in a diff, or reorganizing a locale catalog.
Translating the string values, choosing plural categories (see cldr-plural-categories), enforcing a term glossary (see translate-with-glossary), or picking an i18n framework.
Other measured skills in the registry, with their headline benchmark lift.