From 31602b08eb8b96757f93a2189fe2ddf93621f2b0 Mon Sep 17 00:00:00 2001 From: neodk2004 Date: Sat, 27 Jun 2026 08:07:04 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Sprint=202=20=E2=80=94=20i18n=20Search+?= =?UTF-8?q?Messages,=20Mention-Dropdown,=20Story-Tray,=20Explore=20Grid,?= =?UTF-8?q?=20Legal-Links?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Search-Seite vollständig übersetzt (Search-Namespace in EN+DE) - Messages-Listenseite übersetzt (pageTitle, noMessages, you, relativeTime etc.) - @-Mention Dropdown: Avatar 6→9, zwei-zeilig Name+Tierart, orange Fallback - StoryTray: -mx-6 entfernt, Add-Story-Button jetzt korrekt ausgerichtet - ExploreCard: lange Rassenamen umbrechen statt aus Grid herausdrängen - Impressum/Datenschutz/AGB-Links in Profil-Seite (/pets) ergänzt --- DEBUG-List.md | 26 +++++++++++----------- messages/de.json | 22 +++++++++++++++++++ messages/en.json | 22 +++++++++++++++++++ src/app/(app)/messages/page.tsx | 30 +++++++++++++------------- src/app/(app)/pets/page.tsx | 8 +++++++ src/app/(app)/search/page.tsx | 26 +++++++++++----------- src/components/explore/ExploreCard.tsx | 2 +- src/components/stories/StoryTray.tsx | 2 +- src/components/ui/mention-textarea.tsx | 14 ++++++------ 9 files changed, 104 insertions(+), 48 deletions(-) diff --git a/DEBUG-List.md b/DEBUG-List.md index 1aa56fe..5ddd521 100644 --- a/DEBUG-List.md +++ b/DEBUG-List.md @@ -1,30 +1,30 @@ Debug: -\-Die Suchen seite ist noch nicht auf Deutsch übersetzt. +~~\-Die Suchen seite ist noch nicht auf Deutsch übersetzt.~~ ✅ ERLEDIGT -\-Die Erwähnfunktion mittels @ ist impelmentiert, aber es fehlt die Benachrichtung das man Erwähnt wurde ! Zudem ist die Auswahl nach dem tippen @ schlecht designed man kann gerade so den Avatar erkennen aber nicht den namen in der aufploppenden suche, bitte um FIX ! +\-Die Erwähnfunktion mittels @ ist impelmentiert, aber es fehlt die Benachrichtung das man Erwähnt wurde ! ~~Zudem ist die Auswahl nach dem tippen @ schlecht designed man kann gerade so den Avatar erkennen aber nicht den namen in der aufploppenden suche, bitte um FIX !~~ ✅ ERLEDIGT (Dropdown-Design) -\-Messages ist noch nicht auf Deutsch übersetzt. +~~\-Messages ist noch nicht auf Deutsch übersetzt.~~ ✅ ERLEDIGT -\-Kommentar Update; wenn man einen Kommentar postet, muss dieser zwingend sofort im Kommentar-Verlauf sichtbar werden (Optische Bestätigung das der Kommentar angekommen ist für den Nutzer), es muss sich als Nutzer Live anfühlen auch wenn der Server noch am arbeiten ist. +~~\-Kommentar Update; wenn man einen Kommentar postet, muss dieser zwingend sofort im Kommentar-Verlauf sichtbar werden (Optische Bestätigung das der Kommentar angekommen ist für den Nutzer), es muss sich als Nutzer Live anfühlen auch wenn der Server noch am arbeiten ist.~~ ✅ ERLEDIGT \-Benachrichtung wenn man "Paw-Back this post" nutzt für den Original-User des Posts. -\-Die Mobil Ansicht ist noch nicht ausgereift, das Menü ist teilweise nicht mehr erkennbar im unteren Segemet ( Startseite, Entdecken, +, Benachrichtigungen, Profil). +~~\-Die Mobil Ansicht ist noch nicht ausgereift, das Menü ist teilweise nicht mehr erkennbar im unteren Segemet ( Startseite, Entdecken, +, Benachrichtigungen, Profil).~~ ✅ ERLEDIGT -\-Mobilansicht - Add Story Button ist sehr linksbündig, keine Aufteilung vorhanden. +~~\-Mobilansicht - Add Story Button ist sehr linksbündig, keine Aufteilung vorhanden.~~ ✅ ERLEDIGT -\-Mobilansicht - Kein PawFeed Logo sichtbar, soll nur auf der Startseite erscheinen beim scrollen verschwinden. +\-Mobilansicht - Kein PawFeed Logo sichtbar, soll nur auf der Startseite erscheinen beim scrollen verschwinden. -\-Mobilansicht - wenn man bis man hin und her scrollt soll man bei langem hochscrollen einen refresh auslösen. +\-Mobilansicht - wenn man bis man hin und her scrollt soll man bei langem hochscrollen einen refresh auslösen. -\-Mobilansicht - Impressum/Datenschutz in das Profil rein legen, damit man es erreichen kann. +~~\-Mobilansicht - Impressum/Datenschutz in das Profil rein legen, damit man es erreichen kann.~~ ✅ ERLEDIGT -~~\-Mobilansicht - Nachrichten nicht aufrufbar weil kein Button vorhanden. kann gerne als Mail-Icon mitscrollend oben rechts in die ecke damit es immer erreichbar ist.~~ ✅ ERLEDIGT +~~-Mobilansicht - Nachrichten nicht aufrufbar weil kein Button vorhanden. kann gerne als Mail-Icon mitscrollend oben rechts in die ecke damit es immer erreichbar ist.~~ ✅ ERLEDIGT + +~~\-Mobilansicht - Explore Grid - bei langen Rassenamen drückt der Rassenamen aus dem Grid heraus. Anpassen entweder Grid auf 2Reihig oder Rassenamen werden mit Absatz angezeigt.~~ ✅ ERLEDIGT -\-User Delete Funktion, für den Unwahrscheinlichen fall ein User möchte sein Konto löschen wird ein Workflow benötigt, der nach einer Bestätigung mittels Tiernamen Eingabe (Auswahl eins von möglichen) den Kompletten Account löscht, sowie alle Hochgeladen Bilder/Videos und erzeugten Posts, Rückstandslos. - - +\-User Delete Funktion, für den Unwahrscheinlichen fall ein User möchte sein Konto löschen wird ein Workflow benötigt, der nach einer Bestätigung mittels Tiernamen Eingabe (Auswahl eins von möglichen) den Kompletten Account löscht, sowie alle Hochgeladen Bilder/Videos und erzeugten Posts, Rückstandslos. diff --git a/messages/de.json b/messages/de.json index 9e7ab80..b373022 100644 --- a/messages/de.json +++ b/messages/de.json @@ -150,7 +150,29 @@ "nowFollowing": "Du folgst jetzt {name}", "unfollowed": "{name} entfolgt" }, + "Search": { + "title": "Suchen", + "placeholder": "Tiere, Personen oder Hashtags suchen…", + "tabPets": "Tiere", + "tabPeople": "Personen", + "tabTags": "Tags", + "typeMore": "Mindestens 2 Zeichen eingeben", + "typeHashtag": "Hashtag eingeben zum Suchen", + "noPets": "Keine Tiere gefunden für \"{query}\"", + "noPeople": "Keine Personen gefunden für \"{query}\"", + "noTags": "Keine Beiträge mit #{tag}", + "followerCount": "{count} Follower" + }, "Messages": { + "pageTitle": "Nachrichten", + "noMessages": "Noch keine Nachrichten", + "noMessagesHint": "Besuche ein Tierprofil und tippe auf Nachricht, um ein Gespräch zu starten.", + "you": "Du", + "startConversation": "Gespräch starten", + "timeNow": "jetzt", + "relativeMinutes": "{count} Min.", + "relativeHours": "{count} Std.", + "relativeDays": "{count} T.", "today": "Heute", "yesterday": "Gestern", "empty": "Sag Hallo 👋", diff --git a/messages/en.json b/messages/en.json index 03a3a30..ac0e51d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -150,7 +150,29 @@ "nowFollowing": "You're now following {name}", "unfollowed": "Unfollowed {name}" }, + "Search": { + "title": "Search", + "placeholder": "Search pets, people or hashtags…", + "tabPets": "Pets", + "tabPeople": "People", + "tabTags": "Tags", + "typeMore": "Type at least 2 characters to search", + "typeHashtag": "Type a hashtag to search", + "noPets": "No pets found for \"{query}\"", + "noPeople": "No people found for \"{query}\"", + "noTags": "No posts tagged #{tag}", + "followerCount": "{count} followers" + }, "Messages": { + "pageTitle": "Messages", + "noMessages": "No messages yet", + "noMessagesHint": "Visit a pet's profile and tap Message to start a conversation.", + "you": "You", + "startConversation": "Start the conversation", + "timeNow": "now", + "relativeMinutes": "{count}m", + "relativeHours": "{count}h", + "relativeDays": "{count}d", "today": "Today", "yesterday": "Yesterday", "empty": "Say hello 👋", diff --git a/src/app/(app)/messages/page.tsx b/src/app/(app)/messages/page.tsx index 6b9e9e0..a9811ac 100644 --- a/src/app/(app)/messages/page.tsx +++ b/src/app/(app)/messages/page.tsx @@ -2,6 +2,7 @@ import { useRouter } from "next/navigation"; import { MessageCircle, Loader2 } from "lucide-react"; +import { useTranslations } from "next-intl"; import { useQuery } from "@tanstack/react-query"; import { useTRPC } from "@/trpc/client"; import { useActivePet } from "@/context/ActivePetContext"; @@ -9,19 +10,22 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { getAvatarUrl } from "@/lib/avatar-url"; -function formatRelativeTime(date: Date | string): string { +type TFunc = (key: string, opts?: Record) => string; + +function formatRelativeTime(date: Date | string, t: TFunc): string { const diffMs = Date.now() - new Date(date).getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMins / 60); const diffDays = Math.floor(diffHours / 24); - if (diffMins < 1) return "now"; - if (diffMins < 60) return `${diffMins}m`; - if (diffHours < 24) return `${diffHours}h`; - if (diffDays < 7) return `${diffDays}d`; + if (diffMins < 1) return t("timeNow"); + if (diffMins < 60) return t("relativeMinutes", { count: diffMins }); + if (diffHours < 24) return t("relativeHours", { count: diffHours }); + if (diffDays < 7) return t("relativeDays", { count: diffDays }); return new Date(date).toLocaleDateString(); } export default function MessagesPage() { + const t = useTranslations("Messages"); const trpc = useTRPC(); const router = useRouter(); const { activePetId } = useActivePet(); @@ -39,7 +43,7 @@ export default function MessagesPage() {

@@ -52,10 +56,8 @@ export default function MessagesPage() { {!isLoading && conversations.length === 0 && (
-

No messages yet

-

- Visit a pet's profile and tap Message to start a conversation. -

+

{t("noMessages")}

+

{t("noMessagesHint")}

)} @@ -72,7 +74,6 @@ export default function MessagesPage() { onClick={() => router.push(`/messages/${conv.id}`)} className="w-full flex items-center gap-3 px-4 py-3 hover:bg-muted/50 transition-colors text-left" > - {/* Avatar */} {avatarUrl && } @@ -80,23 +81,22 @@ export default function MessagesPage() { - {/* Content */}

{conv.otherPet.name}

- {formatRelativeTime(conv.updatedAt)} + {formatRelativeTime(conv.updatedAt, t as TFunc)}

{conv.lastMessage ? conv.lastMessage.senderPetId === activePetId - ? `You: ${conv.lastMessage.body}` + ? `${t("you")}: ${conv.lastMessage.body}` : conv.lastMessage.body - : "Start the conversation"} + : t("startConversation")}

{hasUnread && ( diff --git a/src/app/(app)/pets/page.tsx b/src/app/(app)/pets/page.tsx index c8f1116..1f8c482 100644 --- a/src/app/(app)/pets/page.tsx +++ b/src/app/(app)/pets/page.tsx @@ -24,6 +24,14 @@ export default async function PetsPage() {
+ +
+ Impressum + + Datenschutz + + AGB +
); } diff --git a/src/app/(app)/search/page.tsx b/src/app/(app)/search/page.tsx index b018ec0..f5f56c0 100644 --- a/src/app/(app)/search/page.tsx +++ b/src/app/(app)/search/page.tsx @@ -1,6 +1,7 @@ "use client"; import { useState, useCallback } from "react"; +import { useTranslations } from "next-intl"; import { useQuery } from "@tanstack/react-query"; import { Search, Layers2, Loader2, Users } from "lucide-react"; import Link from "next/link"; @@ -15,6 +16,7 @@ import { getAvatarUrl } from "@/lib/avatar-url"; import { getMediaUrl } from "@/lib/media-url"; export default function SearchPage() { + const t = useTranslations("Search"); const trpc = useTRPC(); const { activePetId } = useActivePet(); @@ -54,12 +56,12 @@ export default function SearchPage() { return (
-

Search

+

{t("title")}