/** * Central translation helper. * * The active language lives in module scope so components can call `t(...)` * without threading a `language` prop through every layer. Reading `t(...)` * inside markup registers a dependency on `activeLanguage`, so switching the * language in settings re-renders every translated string. */ import { messages, type MessageEntry, type MessageKey } from "./messages"; import type { AppLanguage } from "./types"; let activeLanguage = $state("en"); export function setLanguage(next: AppLanguage) { activeLanguage = next; } export function getLanguage(): AppLanguage { return activeLanguage; } export function isGermanLanguage(): boolean { return activeLanguage === "de"; } export type TranslationValues = Record; /** Look up `key` in the active language and fill in `{placeholders}`. */ export function t(key: MessageKey, values?: TranslationValues): string { const entry: MessageEntry | undefined = messages[key]; let text: string = entry ? entry[activeLanguage] ?? entry.en : key; if (values) { for (const [name, value] of Object.entries(values)) { text = text.split(`{${name}}`).join(String(value)); } } return text; } /** Pick the singular or plural key based on `count` and pass it as `{count}`. */ export function tPlural(one: MessageKey, many: MessageKey, count: number, values?: TranslationValues): string { return t(count === 1 ? one : many, { count, ...values }); }