This commit is contained in:
Simon Caron
2025-01-05 16:03:19 -05:00
parent eb7fa93f9b
commit 249109a94e
8 changed files with 72 additions and 42 deletions

View File

@@ -247,7 +247,7 @@ const page: React.FC = () => {
}} }}
set={setSelectedGenres} set={setSelectedGenres}
values={selectedGenres} values={selectedGenres}
title={t("library.headers.genres")} title={t("library.filters.genres")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => searchFilter={(item, search) =>
item.toLowerCase().includes(search.toLowerCase()) item.toLowerCase().includes(search.toLowerCase())
@@ -274,7 +274,7 @@ const page: React.FC = () => {
}} }}
set={setSelectedYears} set={setSelectedYears}
values={selectedYears} values={selectedYears}
title={t("library.headers.years")} title={t("library.filters.years")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => item.includes(search)} searchFilter={(item, search) => item.includes(search)}
/> />
@@ -299,7 +299,7 @@ const page: React.FC = () => {
}} }}
set={setSelectedTags} set={setSelectedTags}
values={selectedTags} values={selectedTags}
title={t("library.headers.tags")} title={t("library.filters.tags")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => searchFilter={(item, search) =>
item.toLowerCase().includes(search.toLowerCase()) item.toLowerCase().includes(search.toLowerCase())
@@ -317,7 +317,7 @@ const page: React.FC = () => {
queryFn={async () => sortOptions.map((s) => s.key)} queryFn={async () => sortOptions.map((s) => s.key)}
set={setSortBy} set={setSortBy}
values={sortBy} values={sortBy}
title={t("library.headers.sort_by")} title={t("library.filters.sort_by")}
renderItemLabel={(item) => renderItemLabel={(item) =>
sortOptions.find((i) => i.key === item)?.value || "" sortOptions.find((i) => i.key === item)?.value || ""
} }
@@ -337,7 +337,7 @@ const page: React.FC = () => {
queryFn={async () => sortOrderOptions.map((s) => s.key)} queryFn={async () => sortOrderOptions.map((s) => s.key)}
set={setSortOrder} set={setSortOrder}
values={sortOrder} values={sortOrder}
title={t("library.headers.sort_order")} title={t("library.filters.sort_order")}
renderItemLabel={(item) => renderItemLabel={(item) =>
sortOrderOptions.find((i) => i.key === item)?.value || "" sortOrderOptions.find((i) => i.key === item)?.value || ""
} }

View File

@@ -17,6 +17,7 @@ import {
View, View,
} from "react-native"; } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useSafeAreaInsets } from "react-native-safe-area-context";
import { useTranslation } from "react-i18next";
const HOUR_HEIGHT = 30; const HOUR_HEIGHT = 30;
const ITEMS_PER_PAGE = 20; const ITEMS_PER_PAGE = 20;
@@ -177,6 +178,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
onNextPage, onNextPage,
isNextDisabled, isNextDisabled,
}) => { }) => {
const { t } = useTranslation();
return ( return (
<View className="flex flex-row justify-between items-center bg-neutral-800 w-full px-4 py-2"> <View className="flex flex-row justify-between items-center bg-neutral-800 w-full px-4 py-2">
<TouchableOpacity <TouchableOpacity
@@ -194,7 +196,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
currentPage === 1 ? "text-gray-500" : "text-white" currentPage === 1 ? "text-gray-500" : "text-white"
}`} }`}
> >
Previous {t("live_tv.previous")}
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
<Text className="text-white">Page {currentPage}</Text> <Text className="text-white">Page {currentPage}</Text>
@@ -206,7 +208,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
<Text <Text
className={`mr-1 ${isNextDisabled ? "text-gray-500" : "text-white"}`} className={`mr-1 ${isNextDisabled ? "text-gray-500" : "text-white"}`}
> >
Next {t("live_tv.next")}
</Text> </Text>
<Ionicons <Ionicons
name="chevron-forward" name="chevron-forward"

View File

@@ -7,12 +7,15 @@ import { useAtom } from "jotai";
import React from "react"; import React from "react";
import { ScrollView, View } from "react-native"; import { ScrollView, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useSafeAreaInsets } from "react-native-safe-area-context";
import { useTranslation } from "react-i18next";
export default function page() { export default function page() {
const [api] = useAtom(apiAtom); const [api] = useAtom(apiAtom);
const [user] = useAtom(userAtom); const [user] = useAtom(userAtom);
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
const { t } = useTranslation();
return ( return (
<ScrollView <ScrollView
nestedScrollEnabled nestedScrollEnabled
@@ -28,7 +31,7 @@ export default function page() {
<View className="flex flex-col space-y-2"> <View className="flex flex-col space-y-2">
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "recommended"]} queryKey={["livetv", "recommended"]}
title={"On now"} title={t("live_tv.on_now")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getRecommendedPrograms({ const res = await getLiveTvApi(api).getRecommendedPrograms({
@@ -46,7 +49,7 @@ export default function page() {
/> />
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "shows"]} queryKey={["livetv", "shows"]}
title={"Shows"} title={t("live_tv.shows")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getLiveTvPrograms({ const res = await getLiveTvApi(api).getLiveTvPrograms({
@@ -68,7 +71,7 @@ export default function page() {
/> />
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "movies"]} queryKey={["livetv", "movies"]}
title={"Movies"} title={t("live_tv.movies")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getLiveTvPrograms({ const res = await getLiveTvApi(api).getLiveTvPrograms({
@@ -86,7 +89,7 @@ export default function page() {
/> />
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "sports"]} queryKey={["livetv", "sports"]}
title={"Sports"} title={t("live_tv.sports")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getLiveTvPrograms({ const res = await getLiveTvApi(api).getLiveTvPrograms({
@@ -104,7 +107,7 @@ export default function page() {
/> />
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "kids"]} queryKey={["livetv", "kids"]}
title={"For Kids"} title={t("live_tv.for_kids")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getLiveTvPrograms({ const res = await getLiveTvApi(api).getLiveTvPrograms({
@@ -122,7 +125,7 @@ export default function page() {
/> />
<ScrollingCollectionList <ScrollingCollectionList
queryKey={["livetv", "news"]} queryKey={["livetv", "news"]}
title={"News"} title={t("live_tv.news")}
queryFn={async () => { queryFn={async () => {
if (!api) return [] as BaseItemDto[]; if (!api) return [] as BaseItemDto[];
const res = await getLiveTvApi(api).getLiveTvPrograms({ const res = await getLiveTvApi(api).getLiveTvPrograms({

View File

@@ -1,11 +1,13 @@
import { Text } from "@/components/common/Text"; import { Text } from "@/components/common/Text";
import React from "react"; import React from "react";
import { View } from "react-native"; import { View } from "react-native";
import { useTranslation } from "react-i18next";
export default function page() { export default function page() {
const { t } = useTranslation();
return ( return (
<View className="flex items-center justify-center h-full -mt-12"> <View className="flex items-center justify-center h-full -mt-12">
<Text>Coming soon</Text> <Text>{t("live_tv.coming_soon")}</Text>
</View> </View>
); );
} }

View File

@@ -303,7 +303,7 @@ const Page = () => {
}} }}
set={setSelectedGenres} set={setSelectedGenres}
values={selectedGenres} values={selectedGenres}
title={t("library.headers.genres")} title={t("library.filters.genres")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => searchFilter={(item, search) =>
item.toLowerCase().includes(search.toLowerCase()) item.toLowerCase().includes(search.toLowerCase())
@@ -330,7 +330,7 @@ const Page = () => {
}} }}
set={setSelectedYears} set={setSelectedYears}
values={selectedYears} values={selectedYears}
title={t("library.headers.years")} title={t("library.filters.years")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => item.includes(search)} searchFilter={(item, search) => item.includes(search)}
/> />
@@ -355,7 +355,7 @@ const Page = () => {
}} }}
set={setSelectedTags} set={setSelectedTags}
values={selectedTags} values={selectedTags}
title={t("library.headers.tags")} title={t("library.filters.tags")}
renderItemLabel={(item) => item.toString()} renderItemLabel={(item) => item.toString()}
searchFilter={(item, search) => searchFilter={(item, search) =>
item.toLowerCase().includes(search.toLowerCase()) item.toLowerCase().includes(search.toLowerCase())
@@ -373,7 +373,7 @@ const Page = () => {
queryFn={async () => sortOptions.map((s) => s.key)} queryFn={async () => sortOptions.map((s) => s.key)}
set={setSortBy} set={setSortBy}
values={sortBy} values={sortBy}
title={t("library.headers.sort_by")} title={t("library.filters.sort_by")}
renderItemLabel={(item) => renderItemLabel={(item) =>
sortOptions.find((i) => i.key === item)?.value || "" sortOptions.find((i) => i.key === item)?.value || ""
} }
@@ -393,7 +393,7 @@ const Page = () => {
queryFn={async () => sortOrderOptions.map((s) => s.key)} queryFn={async () => sortOrderOptions.map((s) => s.key)}
set={setSortOrder} set={setSortOrder}
values={sortOrder} values={sortOrder}
title={t("library.headers.sort_order")} title={t("library.filters.sort_order")}
renderItemLabel={(item) => renderItemLabel={(item) =>
sortOrderOptions.find((i) => i.key === item)?.value || "" sortOrderOptions.find((i) => i.key === item)?.value || ""
} }

View File

@@ -45,19 +45,19 @@ export const VideoDebugInfo: React.FC<Props> = ({ playerRef, ...props }) => {
}} }}
{...props} {...props}
> >
<Text className="font-bold">{t("item_card.playback_state")}</Text> <Text className="font-bold">{t("player.playback_state")}</Text>
<Text className="font-bold mt-2.5">{t("item_card.audio_tracks")}</Text> <Text className="font-bold mt-2.5">{t("player.audio_tracks")}</Text>
{audioTracks && {audioTracks &&
audioTracks.map((track, index) => ( audioTracks.map((track, index) => (
<Text key={index}> <Text key={index}>
{track.name} ({t("item_card.index")} {track.index}) {track.name} ({t("player.index")} {track.index})
</Text> </Text>
))} ))}
<Text className="font-bold mt-2.5">{t("item_card.subtitles_tracks")}</Text> <Text className="font-bold mt-2.5">{t("player.subtitles_tracks")}</Text>
{subtitleTracks && {subtitleTracks &&
subtitleTracks.map((track, index) => ( subtitleTracks.map((track, index) => (
<Text key={index}> <Text key={index}>
{track.name} ({t("item_card.index")} {track.index}) {track.name} ({t("player.index")} {track.index})
</Text> </Text>
))} ))}
<TouchableOpacity <TouchableOpacity
@@ -69,7 +69,7 @@ export const VideoDebugInfo: React.FC<Props> = ({ playerRef, ...props }) => {
} }
}} }}
> >
<Text className="text-white text-center">{t("item_card.refresh_tracks")}</Text> <Text className="text-white text-center">{t("player.refresh_tracks")}</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
); );

View File

@@ -242,7 +242,7 @@
"show_titles": "Show titles", "show_titles": "Show titles",
"show_stats": "Show stats" "show_stats": "Show stats"
}, },
"headers": { "filters": {
"genres": "Genres", "genres": "Genres",
"years": "Years", "years": "Years",
"sort_by": "Sort By", "sort_by": "Sort By",
@@ -272,7 +272,13 @@
"message_from_server": "Message from server: {{message}}", "message_from_server": "Message from server: {{message}}",
"video_has_finished_playing": "Video has finished playing!", "video_has_finished_playing": "Video has finished playing!",
"no_video_source": "No video source...", "no_video_source": "No video source...",
"next_episode": "Next Episode" "next_episode": "Next Episode",
"refresh_tracks": "Refresh Tracks",
"subtitle_tracks": "Subtitle Tracks:",
"audio_tracks": "Audio Tracks:",
"playback_state": "Playback State:",
"no_data_available": "No data available",
"index": "Index:"
}, },
"item_card": { "item_card": {
"next_up": "Next up", "next_up": "Next up",
@@ -298,12 +304,6 @@
"x_albums": "{{count}} albums", "x_albums": "{{count}} albums",
"artists": "Artists", "artists": "Artists",
"could_not_load_item": "Could not load item", "could_not_load_item": "Could not load item",
"refresh_tracks": "Refresh Tracks",
"subtitle_tracks": "Subtitle Tracks:",
"audio_tracks": "Audio Tracks:",
"playback_state": "Playback State:",
"no_data_available": "No data available",
"index": "Index:",
"download": { "download": {
"download_season": "Download Season", "download_season": "Download Season",
"download_x_item": "Download {{item_count}} items", "download_x_item": "Download {{item_count}} items",
@@ -312,6 +312,18 @@
"using_default_method": "Using default method" "using_default_method": "Using default method"
} }
}, },
"live_tv": {
"next": "Next",
"previous": "Previous",
"live_tv": "Live TV",
"coming_soon": "Coming soon",
"on_now": "On now",
"shows": "Shows",
"movies": "Movies",
"sports": "Sports",
"for_kids": "For Kids",
"news": "News"
},
"jellyseerr":{ "jellyseerr":{
"confirm": "Confirm", "confirm": "Confirm",
"cancel": "Cancel", "cancel": "Cancel",

View File

@@ -24,7 +24,6 @@
"clear_button": "Effacer" "clear_button": "Effacer"
}, },
"home": { "home": {
"home": "Accueil",
"no_internet": "Pas d'Internet", "no_internet": "Pas d'Internet",
"no_items": "Aucun item", "no_items": "Aucun item",
"no_internet_message": "Aucun problème, vous pouvez toujours regarder\nle contenu téléchargé.", "no_internet_message": "Aucun problème, vous pouvez toujours regarder\nle contenu téléchargé.",
@@ -243,7 +242,7 @@
"show_titles": "Afficher les titres", "show_titles": "Afficher les titres",
"show_stats": "Afficher les statistiques" "show_stats": "Afficher les statistiques"
}, },
"headers": { "filters": {
"genres": "Genres", "genres": "Genres",
"years": "Années", "years": "Années",
"sort_by": "Trier par", "sort_by": "Trier par",
@@ -273,7 +272,13 @@
"message_from_server": "Message du serveur: {{message}}", "message_from_server": "Message du serveur: {{message}}",
"video_has_finished_playing": "La vidéo a fini de jouer!", "video_has_finished_playing": "La vidéo a fini de jouer!",
"no_video_source": "Aucune source vidéo...", "no_video_source": "Aucune source vidéo...",
"next_episode": "Épisode suivant" "next_episode": "Épisode suivant",
"refresh_tracks": "Rafraîchir les pistes",
"subtitle_tracks": "Pistes de sous-titres:",
"audio_tracks": "Pistes audio:",
"playback_state": "État de lecture:",
"no_data_available": "Aucune donnée disponible",
"index": "Index:"
}, },
"item_card": { "item_card": {
"next_up": "À suivre", "next_up": "À suivre",
@@ -299,12 +304,6 @@
"x_albums": "{{count}} albums", "x_albums": "{{count}} albums",
"artists": "Artistes", "artists": "Artistes",
"could_not_load_item": "Impossible de charger l'item", "could_not_load_item": "Impossible de charger l'item",
"refresh_tracks": "Rafraîchir les pistes",
"subtitle_tracks": "Pistes de sous-titres:",
"audio_tracks": "Pistes audio:",
"playback_state": "État de lecture:",
"no_data_available": "Aucune donnée disponible",
"index": "Index:",
"download": { "download": {
"download_season": "Télécharger la saison", "download_season": "Télécharger la saison",
"download_x_item": "Télécharger {{item_count}} items", "download_x_item": "Télécharger {{item_count}} items",
@@ -313,6 +312,18 @@
"using_default_method": "Avec la méthode par défaut" "using_default_method": "Avec la méthode par défaut"
} }
}, },
"live_tv": {
"next": "Suivant",
"previous": "Précédent",
"live_tv": "TV en direct",
"coming_soon": "Bientôt",
"on_now": "En ce moment",
"shows": "Émissions",
"movies": "Films",
"sports": "Sports",
"for_kids": "Pour enfants",
"news": "Actualités"
},
"jellyseerr":{ "jellyseerr":{
"confirm": "Confirmer", "confirm": "Confirmer",
"cancel": "Annuler", "cancel": "Annuler",