RomM Frontend: i18n / Localization

SkillDev tools

Guides your agent to add and manage translations for the RomM frontend correctly.

Use RomM Frontend: i18n / Localization in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add RomM Frontend: i18n / Localization and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use the RomM Frontend: i18n / Localization skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

RomM Frontend: i18n / LocalizationStart free
About this skill

Internationalization for the RomM frontend (both v1 and v2). Use whenever adding, renaming, or removing any user-visible string / translation key under frontend/src/locales/. Covers the en_US-is-source rule, the requirement to add every new key to ALL locale directories in the same change, namespace

What this skill tells your AI

The instructions your AI receives, as published by rommapp/romm in .claude/skills/frontend-i18n/SKILL.md and read by ahel’s review.

User-visible strings are never hard-coded in components; they come from locale files via vue-i18n ($t(...) in templates/composites; utils may call i18n.global.t(...); v2 lib primitives must not call $t at all, text passes via props/slots).

Structure

  • Locales live in frontend/src/locales/<locale>/<namespace>.json, loaded by dynamic glob import in src/locales/index.ts.
  • 18 locales: en_US (default + fallback), en_GB, bg_BG, cs_CZ, de_DE, es_ES, fr_FR, hu_HU, it_IT, ja_JP, ko_KR, pl_PL, pt_BR, ro_RO, ru_RU, tr_TR, zh_CN, zh_TW.
  • Namespaces are per-feature files (e.g. collection, common, console, detail, emulator, gallery, home, library, login, navigation, patcher, platform, scan, settings, task).

The rule (enforced in CI)

  • en_US is the source of truth, but every key added to en_US must be added to all other locale directories in the same change. Never leave a key English-only.
  • en_US uses US spelling: "favorites", "color", "canceled". British forms belong in en_GB only. This bites tests too: an e2e or unit assertion on a label must expect the en_US string.
  • Actually translate the value into each locale's language: never paste English into non-English locales.
  • Editing an existing string counts: changing en_US means re-translating that key in every other locale.
  • Reuse each locale's established terms: grep a sibling key for how it renders "metadata", "provider", etc.
  • Copying the English value is a last-resort placeholder, only when no translation is available, and must be flagged to revisit.
  • Removing or renaming a key means doing it across every locale.

Verify before handoff

python3 frontend/src/locales/check_i18n_locales.py
python3 frontend/src/locales/check_i18n_sorted.py   # add --fix to auto-sort

check_i18n_locales.py compares every non-English locale against en_US and fails on any missing file, missing key, or extra key. check_i18n_sorted.py fails if any locale JSON file's keys aren't sorted alphabetically (run with --fix to sort them in place). CI runs both scripts (.github/workflows/i18n.yml) on any change under frontend/src/locales/**; both must pass.

Adding a new language

Create a new folder under frontend/src/locales/ mirroring en_US/'s files, then translate. Open the PR against master (see the docs/Contributing flow). This is the one i18n change where a new locale directory is expected.

Signals

GitHub stars
13k
Forks
747
Last commit
Oct 2026
Advanced
Item type
skill
Key
frontend-i18n
Source
github.com/rommapp/romm