---
paths:
  - "apps/**/*.html"
  - "apps/**/*.ts"
  - "libs/**/*.html"
  - "libs/**/*.ts"
---

# Localization

User-visible strings (templates, toasts, dialogs, ARIA labels, validation messages) must be localized via `I18nPipe` in templates or `I18nService.t()` in TypeScript.

When adding a new key:

- **Only edit the `en` locale** — Crowdin handles every other language.
- **Add it to every app that uses it.** Shared library strings need the key in each consuming app's `messages.json`:
  - browser — `apps/browser/src/_locales/en/messages.json`
  - web — `apps/web/src/locales/en/messages.json`
  - desktop — `apps/desktop/src/locales/en/messages.json`
  - cli — `apps/cli/src/locales/en/messages.json`
