mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-05 13:38:27 +01:00
livetv
This commit is contained in:
@@ -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 || ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 || ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user