From e23387a384394a5dd7eb93197323db93455750ad Mon Sep 17 00:00:00 2001 From: Simon Caron <8635747+simoncaron@users.noreply.github.com> Date: Wed, 1 Jan 2025 21:57:46 -0500 Subject: [PATCH] Library headers, filters and favorites --- app/(auth)/(tabs)/(favorites)/_layout.tsx | 4 ++- .../collections/[collectionId].tsx | 13 +++++---- app/(auth)/(tabs)/(libraries)/[libraryId].tsx | 10 +++---- app/(auth)/(tabs)/(libraries)/_layout.tsx | 18 ++++++------ app/(auth)/(tabs)/(search)/index.tsx | 4 +-- app/(auth)/(tabs)/_layout.tsx | 2 +- components/filters/FilterSheet.tsx | 4 ++- translations/en.json | 28 +++++++++++++++++-- translations/fr.json | 28 +++++++++++++++++-- 9 files changed, 81 insertions(+), 30 deletions(-) diff --git a/app/(auth)/(tabs)/(favorites)/_layout.tsx b/app/(auth)/(tabs)/(favorites)/_layout.tsx index f96cd516..cd0a619e 100644 --- a/app/(auth)/(tabs)/(favorites)/_layout.tsx +++ b/app/(auth)/(tabs)/(favorites)/_layout.tsx @@ -1,8 +1,10 @@ import { nestedTabPageScreenOptions } from "@/components/stacks/NestedTabPageStack"; import { Stack } from "expo-router"; import { Platform } from "react-native"; +import { useTranslation } from "react-i18next"; export default function SearchLayout() { + const { t } = useTranslation(); return ( { const searchParams = useLocalSearchParams(); @@ -45,6 +46,8 @@ const page: React.FC = () => { ScreenOrientation.Orientation.PORTRAIT_UP ); + const { t } = useTranslation(); + const [selectedGenres, setSelectedGenres] = useAtom(genreFilterAtom); const [selectedYears, setSelectedYears] = useAtom(yearFilterAtom); const [selectedTags, setSelectedTags] = useAtom(tagsFilterAtom); @@ -244,7 +247,7 @@ const page: React.FC = () => { }} set={setSelectedGenres} values={selectedGenres} - title="Genres" + title={t("library.headers.genres")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.toLowerCase().includes(search.toLowerCase()) @@ -271,7 +274,7 @@ const page: React.FC = () => { }} set={setSelectedYears} values={selectedYears} - title="Years" + title={t("library.headers.years")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.includes(search)} /> @@ -296,7 +299,7 @@ const page: React.FC = () => { }} set={setSelectedTags} values={selectedTags} - title="Tags" + title={t("library.headers.tags")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.toLowerCase().includes(search.toLowerCase()) @@ -314,7 +317,7 @@ const page: React.FC = () => { queryFn={async () => sortOptions.map((s) => s.key)} set={setSortBy} values={sortBy} - title="Sort By" + title={t("library.headers.sort_by")} renderItemLabel={(item) => sortOptions.find((i) => i.key === item)?.value || "" } @@ -334,7 +337,7 @@ const page: React.FC = () => { queryFn={async () => sortOrderOptions.map((s) => s.key)} set={setSortOrder} values={sortOrder} - title="Sort Order" + title={t("library.headers.sort_order")} renderItemLabel={(item) => sortOrderOptions.find((i) => i.key === item)?.value || "" } diff --git a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx index a0cf2f6c..31142eef 100644 --- a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx +++ b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx @@ -302,7 +302,7 @@ const Page = () => { }} set={setSelectedGenres} values={selectedGenres} - title="Genres" + title={t("library.headers.genres")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.toLowerCase().includes(search.toLowerCase()) @@ -329,7 +329,7 @@ const Page = () => { }} set={setSelectedYears} values={selectedYears} - title="Years" + title={t("library.headers.years")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.includes(search)} /> @@ -354,7 +354,7 @@ const Page = () => { }} set={setSelectedTags} values={selectedTags} - title="Tags" + title={t("library.headers.tags")} renderItemLabel={(item) => item.toString()} searchFilter={(item, search) => item.toLowerCase().includes(search.toLowerCase()) @@ -372,7 +372,7 @@ const Page = () => { queryFn={async () => sortOptions.map((s) => s.key)} set={setSortBy} values={sortBy} - title="Sort By" + title={t("library.headers.sort_by")} renderItemLabel={(item) => sortOptions.find((i) => i.key === item)?.value || "" } @@ -392,7 +392,7 @@ const Page = () => { queryFn={async () => sortOrderOptions.map((s) => s.key)} set={setSortOrder} values={sortOrder} - title="Sort Order" + title={t("library.headers.sort_order")} renderItemLabel={(item) => sortOrderOptions.find((i) => i.key === item)?.value || "" } diff --git a/app/(auth)/(tabs)/(libraries)/_layout.tsx b/app/(auth)/(tabs)/(libraries)/_layout.tsx index 42626d43..a60b33bc 100644 --- a/app/(auth)/(tabs)/(libraries)/_layout.tsx +++ b/app/(auth)/(tabs)/(libraries)/_layout.tsx @@ -42,11 +42,11 @@ export default function IndexLayout() { side={"bottom"} sideOffset={10} > - Display + {t("library.options.display")} - Display + {t("library.options.display")} - Row + {t("library.options.row")} - List + {t("library.options.list")} - Image style + {t("library.options.image_style")} - Poster + {t("library.options.poster")} - Cover + {t("library.options.cover")} @@ -157,7 +157,7 @@ export default function IndexLayout() { > - Show titles + {t("library.options.show_titles")} - Show stats + {t("library.options.show_stats")} diff --git a/app/(auth)/(tabs)/(search)/index.tsx b/app/(auth)/(tabs)/(search)/index.tsx index ad9cae4b..4c90c264 100644 --- a/app/(auth)/(tabs)/(search)/index.tsx +++ b/app/(auth)/(tabs)/(search)/index.tsx @@ -129,7 +129,7 @@ export default function search() { if (Platform.OS === "ios") navigation.setOptions({ headerSearchBarOptions: { - placeholder: "Search...", + placeholder: t("search.search"), onChangeText: (e: any) => { router.setParams({ q: "" }); setSearch(e.nativeEvent.text); @@ -308,7 +308,7 @@ export default function search() { autoCorrect={false} returnKeyType="done" keyboardType="web-search" - placeholder={t("search.search_hint")} + placeholder={t("search.search_here")} value={search} onChangeText={(text) => setSearch(text)} /> diff --git a/app/(auth)/(tabs)/_layout.tsx b/app/(auth)/(tabs)/_layout.tsx index 39881192..17c7cb17 100644 --- a/app/(auth)/(tabs)/_layout.tsx +++ b/app/(auth)/(tabs)/_layout.tsx @@ -73,7 +73,7 @@ export default function TabLayout() { diff --git a/components/filters/FilterSheet.tsx b/components/filters/FilterSheet.tsx index fe6d9f6a..25486ce9 100644 --- a/components/filters/FilterSheet.tsx +++ b/components/filters/FilterSheet.tsx @@ -19,6 +19,7 @@ import { StyleSheet, TouchableOpacity, View, ViewProps } from "react-native"; import { Ionicons } from "@expo/vector-icons"; import { Button } from "../Button"; import { Input } from "../common/Input"; +import { useTranslation } from "react-i18next"; interface Props extends ViewProps { open: boolean; @@ -76,6 +77,7 @@ export const FilterSheet = ({ }: Props) => { const bottomSheetModalRef = useRef(null); const snapPoints = useMemo(() => ["80%"], []); + const { t } = useTranslation(); const [data, setData] = useState([]); const [offset, setOffset] = useState(0); @@ -156,7 +158,7 @@ export const FilterSheet = ({ {_data?.length} items {showSearch && ( { diff --git a/translations/en.json b/translations/en.json index 17090a71..7526a592 100644 --- a/translations/en.json +++ b/translations/en.json @@ -191,14 +191,35 @@ }, "search": { "search_title": "Search", - "search_hint": "Search here...", + "search_here": "Search here...", + "search": "Search...", "no_results_found_for": "No results found for" }, "library": { "library_title": "Library", "no_items_found": "No items found", "no_results": "No results", - "no_libraries_found": "No libraries found" + "no_libraries_found": "No libraries found", + "options": { + "display": "Display", + "row": "Row", + "list": "List", + "image_style": "Image style", + "poster": "Poster", + "cover": "Cover", + "show_titles": "Show titles", + "show_stats": "Show stats" + }, + "headers": { + "genres": "Genres", + "years": "Years", + "sort_by": "Sort By", + "sort_order": "Sort Order", + "tags": "Tags" + } + }, + "favorites": { + "favorites_title": "Favorites" }, "player": { "error": "Error", @@ -229,6 +250,7 @@ "home": "Home", "search": "Search", "library": "Library", - "custom_links": "Custom Links" + "custom_links": "Custom Links", + "favorites": "Favorites" } } diff --git a/translations/fr.json b/translations/fr.json index b0f96f2d..0e42690c 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -49,19 +49,41 @@ }, "search": { "search_title": "Recherche", - "search_hint": "Rechercher ici...", + "search_here": "Rechercher ici...", + "search": "Rechercher...", "no_results_found_for": "Aucun résultat trouvé pour" }, "library": { "library_title": "Bibliothèque", "no_items_found": "Aucun item trouvé", "no_results": "Aucun résultat", - "no_libraries_found": "Aucune bibliothèque trouvée" + "no_libraries_found": "Aucune bibliothèque trouvée", + "options": { + "display": "Affichage", + "row": "Rangée", + "list": "Liste", + "image_style": "Style d'image", + "poster": "Affiche", + "cover": "Couverture", + "show_titles": "Afficher les titres", + "show_stats": "Afficher les statistiques" + }, + "headers": { + "genres": "Genres", + "years": "Années", + "sort_by": "Trier par", + "sort_order": "Ordre de tri", + "tags": "Tags" + } + }, + "favorites": { + "favorites_title": "Favoris" }, "tabs": { "home": "Accueil", "search": "Recherche", "library": "Bibliothèque", - "custom_links": "Liens personalisés" + "custom_links": "Liens personalisés", + "favorites": "Favoris" } }