- settings.test.ts mocks @fusion/core; add SUPPORTED_LOCALES to the mock so the
new language enum import resolves (shard 1).
- LanguageSelector.css used the banned --text-secondary token; switch to the
canonical --text-muted (shard 2 text-token-canonicalization guard).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add useLanguage (three-tier persistence mirroring useTheme: localStorage cache
+ server GlobalSettings write-through + hydrate-on-mount, local choice wins)
and a LanguageSelector rendered in the Settings Appearance section. Switching
applies in place via i18n.changeLanguage — no reload, so unsaved state and
in-flight agent views survive. Endonyms name each language in its own script.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>