From 40b84103904f3d2f392bdce6fad276657c13d29c Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Wed, 1 Jan 2025 11:25:02 +0100 Subject: [PATCH] feat: enable manually setting language in settings --- app/_layout.tsx | 4 +- bun.lockb | Bin 592702 -> 592814 bytes components/settings/AppLanguageSelector.tsx | 80 ++++++++++++++++++++ components/settings/SettingToggles.tsx | 59 +++++++++++---- i18n.ts | 8 +- translations/en.json | 15 +++- utils/atoms/settings.ts | 2 +- 7 files changed, 146 insertions(+), 22 deletions(-) create mode 100644 components/settings/AppLanguageSelector.tsx diff --git a/app/_layout.tsx b/app/_layout.tsx index 8096a100..b12630a7 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -273,9 +273,9 @@ function Layout() { useEffect(() => { i18n.changeLanguage( - settings?.preferedLanguage || getLocales()[0].languageCode || "en" + settings?.preferedLanguage ?? getLocales()[0].languageCode ?? "en" ); - }, [settings]); + }, [settings?.preferedLanguage, i18n]); const appState = useRef(AppState.currentState); diff --git a/bun.lockb b/bun.lockb index 3615fd3834d30d6d36c2f08aaf1559eed8c74684..a93e42e7b04651a9145cc2f50b038acca2fcda66 100755 GIT binary patch delta 10874 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 AyZ`_I delta 10761 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 { + const [settings, updateSettings] = useSettings(); + + return ( + + + {t("home.settings.languages.title")} + + + + + {t("home.settings.languages.app_language")} + + + {t("home.settings.languages.app_language_description")} + + + + + + + {APP_LANGUAGES.find( + (l) => l.value === settings?.preferedLanguage + )?.label || t("home.settings.languages.system")} + + + + + + {t("home.settings.languages.title")} + + { + updateSettings({ + preferedLanguage: undefined, + }); + }} + > + + {t("home.settings.languages.system")} + + + {APP_LANGUAGES?.map((l) => ( + { + updateSettings({ + preferedLanguage: l.value, + }); + }} + > + {l.label} + + ))} + + + + + ); +}; diff --git a/components/settings/SettingToggles.tsx b/components/settings/SettingToggles.tsx index ef3ae116..d32b3b24 100644 --- a/components/settings/SettingToggles.tsx +++ b/components/settings/SettingToggles.tsx @@ -44,6 +44,7 @@ import { JellyseerrApi, useJellyseerr } from "@/hooks/useJellyseerr"; import { ListItem } from "@/components/ListItem"; import { JellyseerrSettings } from "./Jellyseerr"; import { useTranslation } from "react-i18next"; +import { AppLanguageSelector } from "./AppLanguageSelector"; interface Props extends ViewProps {} @@ -133,6 +134,8 @@ export const SettingToggles: React.FC = ({ ...props }) => { */} + + @@ -140,12 +143,16 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {t("home.settings.other.other_title")} + + {t("home.settings.other.other_title")} + - {t("home.settings.other.auto_rotate")} + + {t("home.settings.other.auto_rotate")} + {t("home.settings.other.auto_rotate_hint")} @@ -168,7 +175,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { `} > - {t("home.settings.other.video_orientation")} + + {t("home.settings.other.video_orientation")} + {t("home.settings.other.video_orientation_hint")} @@ -265,7 +274,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {t("home.settings.other.safe_area_in_controls")} + + {t("home.settings.other.safe_area_in_controls")} + {t("home.settings.other.safe_area_in_controls_hint")} @@ -281,8 +292,12 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {t("home.settings.other.use_popular_lists_plugin")} - {t("home.settings.other.use_popular_lists_plugin_hint")} + + {t("home.settings.other.use_popular_lists_plugin")} + + + {t("home.settings.other.use_popular_lists_plugin_hint")} + { Linking.openURL( @@ -290,7 +305,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { ); }} > - {t("home.settings.other.more_info")} + + {t("home.settings.other.more_info")} + = ({ ...props }) => { `} > - {t("home.settings.other.search_engine")} + + {t("home.settings.other.search_engine")} + {t("home.settings.other.search_engine_hint")} @@ -438,7 +457,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {t("home.settings.other.show_custom_menu_links")} + + {t("home.settings.other.show_custom_menu_links")} + {t("home.settings.other.show_custom_menu_links_hint")} @@ -449,7 +470,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { ) } > - {t("home.settings.other.more_info")} + + {t("home.settings.other.more_info")} + = ({ ...props }) => { - {t("home.settings.downloads.downloads_title")} + + {t("home.settings.downloads.downloads_title")} + = ({ ...props }) => { `} > - {t("home.settings.downloads.download_method")} + + {t("home.settings.downloads.download_method")} + {t("home.settings.downloads.download_method_hint")} @@ -531,7 +558,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { }`} > - {t("home.settings.downloads.remux_max_download")} + + {t("home.settings.downloads.remux_max_download")} + {t("home.settings.downloads.remux_max_download_hint")} @@ -562,7 +591,9 @@ export const SettingToggles: React.FC = ({ ...props }) => { }`} > - {t("home.settings.downloads.auto_download")} + + {t("home.settings.downloads.auto_download")} + {t("home.settings.downloads.auto_download_hint")} diff --git a/i18n.ts b/i18n.ts index 841150e9..edfe7202 100644 --- a/i18n.ts +++ b/i18n.ts @@ -6,8 +6,14 @@ import fr from "./translations/fr.json"; import sv from "./translations/sv.json"; import { getLocales } from "expo-localization"; +export const APP_LANGUAGES = [ + { label: "English", value: "en" }, + { label: "Français", value: "fr" }, + { label: "Svenska", value: "sv" }, +]; + i18n.use(initReactI18next).init({ - compatibilityJSON: "v3", + compatibilityJSON: "v4", resources: { en: { translation: en }, fr: { translation: fr }, diff --git a/translations/en.json b/translations/en.json index 337cf1fe..50f4b1bf 100644 --- a/translations/en.json +++ b/translations/en.json @@ -33,18 +33,19 @@ "user_info_title": "User Info", "user": "User", "server": "Server", - "log_out_button": "Log out" + "log_out_button": "Log out", + "token": "Token" }, "quick_connect": { "quick_connect_title": "Quick connect", "authorize_button": "Authorize" }, - "media":{ + "media": { "media_title": "Media", "forward_skip_length": "Forward skip length", "forward_skip_length_hint": "Choose length in seconds when skipping in video playback.", "rewind_length": "Rewind length", - "rewind_length_hint": "Choose length in seconds when skipping in video playback." + "rewind_length_hint": "Choose length in seconds when skipping in video playback." }, "audio": { "audio_title": "Audio", @@ -62,7 +63,7 @@ "subtitle_mode": "Subtitle Mode", "subtitle_mode_hint": "Subtitles are loaded based on the default and forced flags in the\nembedded metadata. Language preferences are considered when\nmultiple options are available.", "set_subtitle_track": "Set Subtitle Track From Previous Item", - "set_subtitle_track_hint" :"Try to set the subtitle track to the closest match to the last\nvideo.", + "set_subtitle_track_hint": "Try to set the subtitle track to the closest match to the last\nvideo.", "subtitle_size": "Subtitle Size", "subtitle_size_hint": "Choose a default subtitle size for direct play (only works for\nsome subtitle formats)." }, @@ -116,6 +117,12 @@ "logs": { "logs_title": "Logs", "no_logs_available": "No logs available" + }, + "languages": { + "title": "Languages", + "app_language": "App language", + "app_language_description": "Select the language for the app.", + "system": "System" } }, "downloads": { diff --git a/utils/atoms/settings.ts b/utils/atoms/settings.ts index 74d133b5..2e6675ba 100644 --- a/utils/atoms/settings.ts +++ b/utils/atoms/settings.ts @@ -99,7 +99,7 @@ const loadSettings = (): Settings => { usePopularPlugin: false, deviceProfile: "Expo", mediaListCollectionIds: [], - preferedLanguage: getLocales()[0].languageCode || "en", + preferedLanguage: undefined, searchEngine: "Jellyfin", marlinServerUrl: "", openInVLC: false,