From d78ac2963fe9e03e8417af97b62c5587765a8154 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Fri, 30 Jan 2026 19:38:25 +0100 Subject: [PATCH] feat(tv): add language selector --- app/(auth)/(tabs)/(home)/settings.tv.tsx | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/(auth)/(tabs)/(home)/settings.tv.tsx b/app/(auth)/(tabs)/(home)/settings.tv.tsx index 3c92b8af..3f7adc14 100644 --- a/app/(auth)/(tabs)/(home)/settings.tv.tsx +++ b/app/(auth)/(tabs)/(home)/settings.tv.tsx @@ -17,6 +17,7 @@ import { } from "@/components/tv"; import { useScaledTVTypography } from "@/constants/TVTypography"; import { useTVOptionModal } from "@/hooks/useTVOptionModal"; +import { APP_LANGUAGES } from "@/i18n"; import { apiAtom, useJellyfin, userAtom } from "@/providers/JellyfinProvider"; import { AudioTranscodeMode, @@ -49,6 +50,7 @@ export default function SettingsTV() { const currentTypographyScale = settings.tvTypographyScale || TVTypographyScale.Default; const currentCacheMode = settings.mpvCacheEnabled ?? "auto"; + const currentLanguage = settings.preferedLanguage; // Audio transcoding options const audioTranscodeModeOptions: TVOptionItem[] = useMemo( @@ -189,6 +191,23 @@ export default function SettingsTV() { [t, currentTypographyScale], ); + // Language options + const languageOptions: TVOptionItem[] = useMemo( + () => [ + { + label: t("home.settings.languages.system"), + value: undefined, + selected: !currentLanguage, + }, + ...APP_LANGUAGES.map((lang) => ({ + label: lang.label, + value: lang.value, + selected: currentLanguage === lang.value, + })), + ], + [t, currentLanguage], + ); + // Get display labels for option buttons const audioTranscodeLabel = useMemo(() => { const option = audioTranscodeModeOptions.find((o) => o.selected); @@ -220,6 +239,12 @@ export default function SettingsTV() { return option?.label || t("home.settings.buffer.cache_auto"); }, [cacheModeOptions, t]); + const languageLabel = useMemo(() => { + if (!currentLanguage) return t("home.settings.languages.system"); + const option = APP_LANGUAGES.find((l) => l.value === currentLanguage); + return option?.label || t("home.settings.languages.system"); + }, [currentLanguage, t]); + return ( @@ -480,6 +505,18 @@ export default function SettingsTV() { }) } /> + + showOptions({ + title: t("home.settings.languages.app_language"), + options: languageOptions, + onSelect: (value) => + updateSettings({ preferedLanguage: value }), + }) + } + />