From 0d1d969e53bdb64f1fda5dbfeca2ebf641878961 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 27 Feb 2025 12:33:58 +0100 Subject: [PATCH] feat(i18n): series page --- src/components/series/BookGrid.tsx | 23 +++++++----- src/components/series/PaginatedBookGrid.tsx | 39 +++++++++------------ src/components/series/SeriesHeader.tsx | 19 ++++++---- src/i18n/messages/en/common.json | 35 +++++++++++++++++- src/i18n/messages/fr/common.json | 33 +++++++++++++++++ 5 files changed, 111 insertions(+), 38 deletions(-) diff --git a/src/components/series/BookGrid.tsx b/src/components/series/BookGrid.tsx index 24f8c77..6c1814e 100644 --- a/src/components/series/BookGrid.tsx +++ b/src/components/series/BookGrid.tsx @@ -7,6 +7,7 @@ import { MarkAsReadButton } from "@/components/ui/mark-as-read-button"; import { MarkAsUnreadButton } from "@/components/ui/mark-as-unread-button"; import { BookOfflineButton } from "@/components/ui/book-offline-button"; import { useState, useEffect } from "react"; +import { useTranslate } from "@/hooks/useTranslate"; interface BookGridProps { books: KomgaBook[]; @@ -14,10 +15,10 @@ interface BookGridProps { } // Fonction utilitaire pour obtenir les informations de statut de lecture -const getReadingStatusInfo = (book: KomgaBook) => { +const getReadingStatusInfo = (book: KomgaBook, t: (key: string, options?: any) => string) => { if (!book.readProgress) { return { - label: "Non lu", + label: t("books.status.unread"), className: "bg-yellow-500/10 text-yellow-500", }; } @@ -25,26 +26,30 @@ const getReadingStatusInfo = (book: KomgaBook) => { if (book.readProgress.completed) { const readDate = book.readProgress.readDate ? formatDate(book.readProgress.readDate) : null; return { - label: readDate ? `Lu le ${readDate}` : "Lu", + label: readDate ? t("books.status.readDate", { date: readDate }) : t("books.status.read"), className: "bg-green-500/10 text-green-500", }; } if (book.readProgress.page > 0) { return { - label: `Page ${book.readProgress.page}/${book.media.pagesCount}`, + label: t("books.status.progress", { + current: book.readProgress.page, + total: book.media.pagesCount, + }), className: "bg-blue-500/10 text-blue-500", }; } return { - label: "Non lu", + label: t("books.status.unread"), className: "bg-yellow-500/10 text-yellow-500", }; }; export function BookGrid({ books, onBookClick }: BookGridProps) { const [localBooks, setLocalBooks] = useState(books); + const { t } = useTranslate(); // Synchroniser localBooks avec les props books useEffect(() => { @@ -54,7 +59,7 @@ export function BookGrid({ books, onBookClick }: BookGridProps) { if (!localBooks.length) { return (
-

Aucun tome disponible

+

{t("books.empty")}

); } @@ -95,7 +100,7 @@ export function BookGrid({ books, onBookClick }: BookGridProps) { return (
{localBooks.map((book) => { - const statusInfo = getReadingStatusInfo(book); + const statusInfo = getReadingStatusInfo(book, t); const isRead = book.readProgress?.completed || false; const currentPage = book.readProgress?.page || 0; @@ -111,7 +116,9 @@ export function BookGrid({ books, onBookClick }: BookGridProps) { { @@ -55,26 +57,19 @@ export function PaginatedBookGrid({ const handlePageChange = async (page: number) => { setIsChangingPage(true); - // Créer un nouvel objet URLSearchParams pour manipuler les paramètres const params = new URLSearchParams(searchParams.toString()); params.set("page", page.toString()); - - // Conserver l'état du filtre unread params.set("unread", showOnlyUnread.toString()); - - // Rediriger vers la nouvelle URL avec les paramètres mis à jour await router.push(`${pathname}?${params.toString()}`); }; const handleUnreadFilter = async () => { setIsChangingPage(true); const params = new URLSearchParams(searchParams.toString()); - params.set("page", "1"); // Retourner à la première page lors du changement de filtre + params.set("page", "1"); const newUnreadState = !showOnlyUnread; setShowOnlyUnread(newUnreadState); - - // Toujours définir explicitement le paramètre unread params.set("unread", newUnreadState.toString()); await router.push(`${pathname}?${params.toString()}`); @@ -88,26 +83,26 @@ export function PaginatedBookGrid({ const startIndex = (currentPage - 1) * pageSize + 1; const endIndex = Math.min(currentPage * pageSize, totalElements); + const getShowingText = () => { + if (!totalElements) return t("books.empty"); + + return t("books.display.showing", { + start: startIndex, + end: endIndex, + total: totalElements, + }); + }; + return (
-

- {totalElements > 0 ? ( - <> - Affichage des tomes {startIndex} à{" "} - {endIndex} sur{" "} - {totalElements} - - ) : ( - "Aucun tome trouvé" - )} -

+

{getShowingText()}

@@ -117,7 +112,7 @@ export function PaginatedBookGrid({
- Chargement... + {t("books.loading")}
)} @@ -135,7 +130,7 @@ export function PaginatedBookGrid({

- Page {currentPage} sur {totalPages} + {t("books.display.page", { current: currentPage, total: totalPages })}

{ const { toast } = useToast(); const [isFavorite, setIsFavorite] = useState(false); + const { t } = useTranslate(); useEffect(() => { const checkFavorite = async () => { @@ -59,7 +61,7 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => { setIsFavorite(!isFavorite); window.dispatchEvent(new Event("favoritesChanged")); toast({ - title: !isFavorite ? "Ajouté aux favoris" : "Retiré des favoris", + title: t(isFavorite ? "series.header.favorite.remove" : "series.header.favorite.add"), description: series.metadata.title, }); } else if (response.status === 500) { @@ -90,7 +92,7 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => { if (booksReadCount === booksCount) { return { - label: "Lu", + label: t("series.header.status.read"), className: "bg-green-500/10 text-green-500", icon: BookMarked, }; @@ -98,14 +100,17 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => { if (booksInProgressCount > 0 || (booksReadCount > 0 && booksReadCount < booksCount)) { return { - label: `${booksReadCount}/${booksCount}`, + label: t("series.header.status.progress", { + read: booksReadCount, + total: booksCount, + }), className: "bg-blue-500/10 text-blue-500", icon: BookOpen, }; } return { - label: "Non lu", + label: t("series.header.status.unread"), className: "bg-yellow-500/10 text-yellow-500", icon: Book, }; @@ -120,7 +125,7 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => { @@ -134,7 +139,7 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => {
@@ -155,7 +160,7 @@ export const SeriesHeader = ({ series, refreshSeries }: SeriesHeaderProps) => { {statusInfo.label} - {series.booksCount} tome{series.booksCount > 1 ? "s" : ""} + {t("series.header.books", { count: series.booksCount })}