Guide

Internationalization

The dashboard ships English and Italian. Locale policy lives in packages/i18n; the dashboard wires it into @nuxtjs/i18n with strategy: 'no_prefix' (the locale is a user preference, not a URL segment).

The dashboard ships English and Italian. Locale policy lives in packages/i18n; the dashboard wires it into @nuxtjs/i18n with strategy: 'no_prefix' (the locale is a user preference, not a URL segment).

Where things live

ConcernLocation
Locale definitionspackages/i18n/src (locales, defaultLocale, localeCookieName)
Dictionariesapps/dashboard/i18n/locales/<locale>/, split by scope
Translation toolingpackages/i18n/scripts/
Staleness reportingLunaria via lunaria.config.ts

Commands

aube run i18n:report    # per-key translation report
aube run i18n:schema    # verify every locale matches the English schema
aube run i18n:status    # Lunaria staleness report (reads git history)

i18n:status shows which translations went stale relative to the English source; it reads git history, so it needs the dictionaries committed. CI runs the schema check, so a key added to English without its translations fails the build.

Adding or changing messages

  1. Add the key to the English dictionary in the right scope file.
  2. Add the same key to every other locale (Italian today) — the schema check enforces parity.
  3. Use the key from components via the standard @nuxtjs/i18n composables.

Adding a locale

  1. Declare the locale in packages/i18n (locales, LocaleCode).
  2. Create apps/dashboard/i18n/locales/<code>/ with a full set of dictionaries.
  3. Run aube run i18n:schema until parity is clean, and commit so Lunaria can track staleness.
Copyright © 2026