From cd8aba32d8ade2e71ef497761ea68abecf6596da Mon Sep 17 00:00:00 2001 From: Simon Caron <8635747+simoncaron@users.noreply.github.com> Date: Mon, 13 Jan 2025 00:03:41 -0500 Subject: [PATCH] Jellyseerr --- app/(auth)/(tabs)/(favorites)/_layout.tsx | 3 +- .../jellyseerr/person/[personId].tsx | 7 +++-- .../series/[id].tsx | 4 ++- components/DownloadItem.tsx | 8 +++-- components/jellyseerr/Cast.tsx | 4 ++- components/jellyseerr/DetailFacts.tsx | 30 ++++++++++--------- components/jellyseerr/RequestModal.tsx | 25 +++++++++------- components/series/JellyseerrSeasons.tsx | 4 +-- translations/en.json | 28 +++++++++++++++++ translations/fr.json | 28 +++++++++++++++++ 10 files changed, 106 insertions(+), 35 deletions(-) diff --git a/app/(auth)/(tabs)/(favorites)/_layout.tsx b/app/(auth)/(tabs)/(favorites)/_layout.tsx index b4c4452e..b408eab6 100644 --- a/app/(auth)/(tabs)/(favorites)/_layout.tsx +++ b/app/(auth)/(tabs)/(favorites)/_layout.tsx @@ -1,9 +1,10 @@ import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageStack"; import { Stack } from "expo-router"; import { Platform } from "react-native"; -import { t } from "i18next"; +import { useTranslation } from "react-i18next"; export default function SearchLayout() { + const { t } = useTranslation(); return ( item.id.toString()} logo={ - Born{" "} + {t("jellyseerr.born")}{" "} {new Date(data?.details?.birthday!!).toLocaleDateString( `${locale}-${region}`, { diff --git a/app/(auth)/(tabs)/(home,libraries,search,favorites)/series/[id].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites)/series/[id].tsx index 2758010b..a62405e1 100644 --- a/app/(auth)/(tabs)/(home,libraries,search,favorites)/series/[id].tsx +++ b/app/(auth)/(tabs)/(home,libraries,search,favorites)/series/[id].tsx @@ -16,9 +16,11 @@ import { useLocalSearchParams, useNavigation } from "expo-router"; import { useAtom } from "jotai"; import React, { useEffect, useMemo } from "react"; import { View } from "react-native"; +import { useTranslation } from "react-i18next"; const page: React.FC = () => { const navigation = useNavigation(); + const { t } = useTranslation(); const params = useLocalSearchParams(); const { id: seriesId, seasonIndex } = params as { id: string; @@ -85,7 +87,7 @@ const page: React.FC = () => { ( diff --git a/components/DownloadItem.tsx b/components/DownloadItem.tsx index eede13f5..dcb14128 100644 --- a/components/DownloadItem.tsx +++ b/components/DownloadItem.tsx @@ -32,7 +32,7 @@ import { MediaSourceSelector } from "./MediaSourceSelector"; import ProgressCircle from "./ProgressCircle"; import { RoundButton } from "./RoundButton"; import { SubtitleTrackSelector } from "./SubtitleTrackSelector"; -import { useTranslation } from "react-i18next"; +import { t } from "i18next"; interface DownloadProps extends ViewProps { items: BaseItemDto[]; @@ -56,7 +56,7 @@ export const DownloadItems: React.FC = ({ const [user] = useAtom(userAtom); const [queue, setQueue] = useAtom(queueAtom); const [settings] = useSettings(); - const { t } = useTranslation(); + const { processes, startBackgroundDownload, downloadedFiles } = useDownload(); const { startRemuxing } = useRemuxHlsToMp4(); @@ -393,7 +393,9 @@ export const DownloadSingleItem: React.FC<{ return ( ( diff --git a/components/jellyseerr/Cast.tsx b/components/jellyseerr/Cast.tsx index fd6fc753..8dcdd785 100644 --- a/components/jellyseerr/Cast.tsx +++ b/components/jellyseerr/Cast.tsx @@ -5,15 +5,17 @@ import React from "react"; import { FlashList } from "@shopify/flash-list"; import { Text } from "@/components/common/Text"; import PersonPoster from "@/components/jellyseerr/PersonPoster"; +import { useTranslation } from "react-i18next"; const CastSlide: React.FC< { details?: MovieDetails | TvDetails } & ViewProps > = ({ details, ...props }) => { + const { t } = useTranslation(); return ( details?.credits?.cast && details?.credits?.cast?.length > 0 && ( - Cast + {t("jellyseerr.cast")} = ({ details, className, ...props }) => { const { jellyseerrUser } = useJellyseerr(); + const { t } = useTranslation(); const locale = useMemo(() => { return jellyseerrUser?.settings?.locale || "en"; @@ -144,21 +146,21 @@ const DetailFacts: React.FC< return ( details && ( - Details + {t("jellyseerr.details")} - + {details.keywords.some( (keyword) => keyword.id === ANIME_KEYWORD_ID - ) && } + ) && } ( {r.type === 3 ? ( @@ -184,13 +186,13 @@ const DetailFacts: React.FC< ))} /> - - - - - + + + + + ( @@ -199,14 +201,14 @@ const DetailFacts: React.FC< ))} /> n.name )} /> - n.name)} /> + n.name)} /> s.name)} /> diff --git a/components/jellyseerr/RequestModal.tsx b/components/jellyseerr/RequestModal.tsx index 2f735bd7..1f7180e7 100644 --- a/components/jellyseerr/RequestModal.tsx +++ b/components/jellyseerr/RequestModal.tsx @@ -10,6 +10,7 @@ import {MediaRequestBody} from "@/utils/jellyseerr/server/interfaces/api/request import {BottomSheetModalMethods} from "@gorhom/bottom-sheet/lib/typescript/types"; import {Button} from "@/components/Button"; import {Text} from "@/components/common/Text"; +import { useTranslation } from "react-i18next"; interface Props { id: number; @@ -36,6 +37,8 @@ const RequestModal = forwardRef(); const {data: serviceSettings} = useQuery({ @@ -103,7 +106,7 @@ const RequestModal = forwardRef modalRequestProps?.seasons?.length ? `Season (${modalRequestProps?.seasons})` : undefined, + () => modalRequestProps?.seasons?.length ? t("jellyseerr.season_x", {seasons: modalRequestProps?.seasons}) : undefined, [modalRequestProps?.seasons] ); @@ -148,7 +151,7 @@ const RequestModal = forwardRef - Advanced + {t("jellyseerr.advanced")} {seasonTitle && {seasonTitle} } @@ -161,27 +164,27 @@ const RequestModal = forwardRef item.name} placeholderText={defaultProfile.name} keyExtractor={(item) => item.id.toString()} - label={"Quality Profile"} + label={t("jellyseerr.quality_profile")} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, profileId: item?.id })) } - title={"Quality Profile"} + title={t("jellyseerr.quality_profile")} /> item.id.toString()} - label={"Root Folder"} + label={t("jellyseerr.root_folder")} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, rootFolder: item.path }))} - title={"Root Folder"} + title={t("jellyseerr.root_folder")} /> item.label} placeholderText={defaultTags.map(t => t.label).join(",")} keyExtractor={(item) => item.id.toString()} - label={"Tags"} + label={t("jellyseerr.tags")} onSelected={(...item) => item && setRequestOverrides((prev) => ({ ...prev, tags: item.map(i => i.id) })) } - title={"Tags"} + title={t("jellyseerr.tags")} /> item.displayName} placeholderText={jellyseerrUser!!.displayName} keyExtractor={(item) => item.id.toString() || ""} - label={"Request As"} + label={t("jellyseerr.request_as")} onSelected={(item) => item && setRequestOverrides((prev) => ({ ...prev, userId: item?.id })) } - title={"Request As"} + title={t("jellyseerr.request_as")} /> ) @@ -221,7 +224,7 @@ const RequestModal = forwardRef - Request + {t("jellyseerr.request_button")} diff --git a/components/series/JellyseerrSeasons.tsx b/components/series/JellyseerrSeasons.tsx index 41afafdb..320043b2 100644 --- a/components/series/JellyseerrSeasons.tsx +++ b/components/series/JellyseerrSeasons.tsx @@ -256,8 +256,8 @@ const JellyseerrSeasons: React.FC<{ {[0].map(() => { diff --git a/translations/en.json b/translations/en.json index d64a3f8b..e35b55b6 100644 --- a/translations/en.json +++ b/translations/en.json @@ -365,6 +365,9 @@ "none": "None", "download": { "download_season": "Download Season", + "download_series": "Download Series", + "download_episode": "Download Episode", + "download_movie": "Download Movie", "download_x_item": "Download {{item_count}} items", "download_button": "Download", "using_optimized_server": "Using optimized server", @@ -397,6 +400,31 @@ "request_button": "Request", "are_you_sure_you_want_to_request_all_seasons": "Are you sure you want to request all seasons?", "failed_to_login": "Failed to login", + "cast": "Cast", + "details": "Details", + "status": "Status", + "original_title": "Original Title", + "series_type": "Series Type", + "release_dates": "Release Dates", + "first_air_date": "First Air Date", + "next_air_date": "Next Air Date", + "revenue": "Revenue", + "budget": "Budget", + "original_language": "Original Language", + "production_country": "Production Country", + "studios": "Studios", + "network": "Network", + "currently_streaming_on": "Currently Streaming on", + "advanced": "Advanced", + "request_as": "Request As", + "tags": "Tags", + "quality_profile": "Quality Profile", + "root_folder": "Root Folder", + "season_x": "Season {{seasons}}", + "season_number": "Season {{season_number}}", + "number_episodes": "{{episode_number}} Episodes", + "born": "Born", + "appearances": "Appearances", "toasts": { "jellyseer_does_not_meet_requirements": "Jellyseerr server does not meet minimum version requirements! Please update to at least 2.0.0", "jellyseerr_test_failed": "Jellyseerr test failed. Please try again.", diff --git a/translations/fr.json b/translations/fr.json index 2ca9a929..c3b4001b 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -365,6 +365,9 @@ "none": "Aucun", "download": { "download_season": "Télécharger la saison", + "download_series": "Télécharger la série", + "download_episode": "Télécharger l'épisode", + "download_movie": "Télécharger le film", "download_x_item": "Télécharger {{item_count}} items", "download_button": "Télécharger", "using_optimized_server": "Avec le serveur de versions optimisées", @@ -397,6 +400,31 @@ "request_button": "Demander", "are_you_sure_you_want_to_request_all_seasons": "Êtes-vous sûr de vouloir demander toutes les saisons?", "failed_to_login": "Échec de la connexion", + "cast": "Distribution", + "details": "Détails", + "status": "Statut", + "original_title": "Titre original", + "series_type": "Type de série", + "release_dates": "Dates de sortie", + "first_air_date": "Date de première diffusion", + "next_air_date": "Date de prochaine diffusion", + "revenue": "Revenu", + "budget": "Budget", + "original_language": "Langue originale", + "production_country": "Pays de production", + "studios": "Studios", + "network": "Réseaux", + "currently_streaming_on": "En diffusion continue sur", + "advanced": "Avancé", + "request_as": "Demander en tant que", + "tags": "Tags", + "quality_profile": "Profil de qualité", + "root_folder": "Dossier racine", + "season_x": "Saison {{seasons}}", + "season_number": "Saison {{season_number}}", + "number_episodes": "{{episode_number}} épisodes", + "born": "Né(e) le", + "appearances": "Apparitions", "toasts": { "jellyseer_does_not_meet_requirements": "Jellyseer ne répond pas aux exigences! Veuillez mettre à jour au moins vers la version 2.0.0.", "jellyseerr_test_failed": "Échec du test de Jellyseerr",