Zum Inhalt springen
Docs

Befehlspalette

Zu einer Seite oder Ansicht springen oder ein Todo per Name finden.

Änderungen

Languages: German (default), English, Portuguese

The repository's architectural decision, rationale and consequences.

Markdown

Status: accepted · Date: 2026-10-31 · Related: ADR-0014, RNF-02

Enforcement: packages/intl/src/locale.config.ts, packages/intl/src/i18n.test.ts, apps/*/src/locales/locales.test.ts, packages/errors/src/locales.test.ts, pnpm i18n:check, apps/web/src/locales/wundklar-brand.test.ts, git grep -n '"fr"\|fr\.ts' returns empty.

Context

Wundklar documents wound care at the bedside for home-care services in Germany. Nurses, PDLs and doctors speak German; a growing share of the workforce speaks Portuguese (Brazil); English is the lingua franca for integrations and demos. The template shipped with English default and a French third catalog, neither of which matches the product. The German prototype uses the polite form ("Sie"); the Portuguese prototype uses "você" (pt-BR).

Decision

The product speaks exactly three languages:

  • de — the default and the fallback. Polite form "Sie". Clinical shorthand (AVV, HKP, KIM, PDL, Wundexpertin ICW, Pflegefachkraft) stays German in every language catalog because every user reads them that way on the German clinical form.
  • en — the second language, for integrations, demos and English-speaking colleagues.
  • pt — Portuguese (Brazil), using "você". Translates every existing template key.

French is removed. packages/intl/src/locale.config.ts is the single source of truth:

export const languages = ["de", "en", "pt"] as const;
export const fallbackLanguage: Language = "de";

The brand is Wundklar everywhere in user-facing copy (APP_BRAND_NAME, SEO titles, email From, mobile APP_NAME, camera permission text, site identity). The repository, Worker, bundle id and domain names stay wundklare so no infrastructure is renamed.

Every Wundklar error code (AVV_REQUIRED, DEVICE_NOT_ENROLLED, …, KIM_UNAVAILABLE) has an HTTP status and copy in all three languages, so later tickets inherit a complete error vocabulary.

Each ticket in .scratch/wundklar-v1/issues/ owns a >>> TXX / <<< TXX anchor block in the catalogs it writes copy to. Blocks are added once by this ticket, empty; later tickets only insert between their own lines. Nothing can edit between two tickets' anchors.

Consequences

  • The German URL is the clean path (/privacy), English is /en/privacy, Portuguese is /pt/privacy. Every SSR/sitemap/hreflang test was updated.
  • packages/email and the mobile notifications outbox ship copy in de, en and pt.
  • Mobile LANGUAGE_PREFS lists system, de, en, pt.
  • Later UI tickets write only between their own >>> / <<< lines; parallel work on different features cannot touch the same locale lines.
  • Adding a fourth language is still one languages.push(...) and one new catalog; the parity tests fail until every key exists in it.
Auf GitHub bearbeitenDie Dokumentation ist auf Englisch.