mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-09-14 10:47:36 +00:00
## i18n - Swedish (sv) wired end-to-end: `MESSAGE_CATALOG` in `provider.tsx` now imports `sv/common.json`; `SUPPORTED_LANGUAGES` reordered as English + alphabetical native and all eight locales marked complete. - Settings → Interface language: the per-locale status cards grid is retired now that all eight locales are populated end-to-end; the dropdown selector is the only control. - CLI change-language dialog (`scripts/menus/config_menu.sh`) picks up Swedish and matches the Monitor ordering. - Spanish catalog: label polish across the dashboard — *VM y LXC activos* / *11 VMs* / *11 detenidos*, LXC modal tabs shortened to *App / Actualiz. / Montajes / Copias*, *Limpiar / Cerrar* replacing the wrong *Claro / Cerca* in terminal controls, *En ejecución / Ejecutar* replacing the literal *Correr*. - Cross-locale normalisation across ES / DE / FR / IT / PT / SK / SV: *OK* / *Proxmox System Dashboard* / *Warn* labels stay consistent, *AVG / MAX / MIN* kept verbatim as universal abbreviations so the stats row no longer overflows. - Tailscale brand preserved verbatim across ES / FR / IT / PT — previous machine-translated variants like *"escala trasera"* / *"à grande échelle"* restored. ## Docs - `ROADMAP.md` rewritten as a short invitation to the [ProxMenux Roadmap project board](https://github.com/users/MacRimi/projects/1). `ROADMAP.es.md` removed — it mirrored the same outdated version-milestone plan and the docs site keeps the Spanish surface for users who need it. - `release.md` annotated with nine pending sections for the v1.2.4.1 beta cycle. ## AppImage - `ProxMenux-1.2.4.1-beta.AppImage` replaces the previous `ProxMenux-1.2.4.AppImage`. Sidecar `ProxMenux-Monitor.AppImage.sha256` regenerated.
41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
export const LANGUAGE_STORAGE_KEY = "proxmenux-ui-language"
|
|
export const DEFAULT_LANGUAGE = "en"
|
|
|
|
export type LanguageCode = "en" | "es" | "fr" | "de" | "it" | "pt" | "sk" | "sv"
|
|
|
|
export type LanguageStatus = "complete" | "partial" | "needs-translation"
|
|
|
|
export interface SupportedLanguage {
|
|
code: LanguageCode
|
|
englishName: string
|
|
nativeName: string
|
|
status: LanguageStatus
|
|
}
|
|
|
|
export const SUPPORTED_LANGUAGES: SupportedLanguage[] = [
|
|
{ code: "en", englishName: "English", nativeName: "English", status: "complete" },
|
|
{ code: "de", englishName: "German", nativeName: "Deutsch", status: "complete" },
|
|
{ code: "es", englishName: "Spanish", nativeName: "Español", status: "complete" },
|
|
{ code: "fr", englishName: "French", nativeName: "Français", status: "complete" },
|
|
{ code: "it", englishName: "Italian", nativeName: "Italiano", status: "complete" },
|
|
{ code: "pt", englishName: "Portuguese", nativeName: "Português", status: "complete" },
|
|
{ code: "sk", englishName: "Slovak", nativeName: "Slovenčina", status: "complete" },
|
|
{ code: "sv", englishName: "Swedish", nativeName: "Svenska", status: "complete" },
|
|
]
|
|
|
|
export function isSupportedLanguage(value: string | null | undefined): value is LanguageCode {
|
|
return SUPPORTED_LANGUAGES.some((language) => language.code === value)
|
|
}
|
|
|
|
export function detectBrowserLanguage(): LanguageCode {
|
|
if (typeof navigator === "undefined") return DEFAULT_LANGUAGE
|
|
|
|
const candidates = [navigator.language, ...(navigator.languages || [])]
|
|
for (const candidate of candidates) {
|
|
const code = candidate?.split("-")[0]?.toLowerCase()
|
|
if (isSupportedLanguage(code)) return code
|
|
}
|
|
|
|
return DEFAULT_LANGUAGE
|
|
}
|