The landing page was hardcoded English, so switching languages had no visible effect on it — added a "Landing" namespace to both message catalogs and wired src/app/page.tsx up via getTranslations, matching the pattern already used by other server-rendered pages.
523 lines
20 KiB
JSON
523 lines
20 KiB
JSON
{
|
|
"Nav": {
|
|
"home": "Home",
|
|
"myPets": "My Pets",
|
|
"explore": "Explore",
|
|
"search": "Search",
|
|
"notifications": "Notifications",
|
|
"messages": "Messages",
|
|
"invite": "Invite Friends",
|
|
"newPost": "New Post",
|
|
"addPet": "Add Pet",
|
|
"account": "Account",
|
|
"profile": "Profile"
|
|
},
|
|
"PostType": {
|
|
"title": "Create",
|
|
"photo": "Photo Post",
|
|
"story": "Story",
|
|
"video": "Video Post",
|
|
"milestone": "Milestone",
|
|
"newPost": "New Post",
|
|
"newStory": "New Story",
|
|
"newMilestone": "New Milestone",
|
|
"newVideo": "New Video"
|
|
},
|
|
"Feed": {
|
|
"emptyTitle": "Your feed is empty",
|
|
"emptyBody": "Follow some pets to see their posts here.",
|
|
"findPets": "Find Pets"
|
|
},
|
|
"Welcome": {
|
|
"title": "Welcome to PawFeed!",
|
|
"subtitle": "Here's what your pet can do:",
|
|
"close": "Close",
|
|
"understood": "Got it",
|
|
"ctaHint": "Press + in the nav to create your first post.",
|
|
"photosTitle": "Photos & Videos",
|
|
"photosDesc": "Share moments from your pet's life — single images, carousels, or short videos.",
|
|
"storiesTitle": "Stories",
|
|
"storiesDesc": "24 h stories disappear automatically. See who viewed your story.",
|
|
"milestonesTitle": "Milestones",
|
|
"milestonesDesc": "Celebrate birthdays, adoption anniversaries, first outings and more.",
|
|
"dmsTitle": "DMs",
|
|
"dmsDesc": "Message other pets directly — perfect for playdates or questions.",
|
|
"healthTitle": "Health Tracking",
|
|
"healthDesc": "Track weight, vaccinations and vet visits. Share the Health Card with your vet."
|
|
},
|
|
"Explore": {
|
|
"title": "Explore",
|
|
"trending": "Trending",
|
|
"all": "All",
|
|
"allBreeds": "All breeds",
|
|
"loadMore": "Load more",
|
|
"noPetsYet": "No {species} pets yet",
|
|
"noTrending": "No trending content yet — check back soon",
|
|
"trendingHashtags": "Trending hashtags",
|
|
"hotPosts": "Hot posts · last 48 h"
|
|
},
|
|
"PetForm": {
|
|
"name": "Pet name",
|
|
"namePlaceholder": "Enter pet name",
|
|
"nameRequired": "This field is required.",
|
|
"nameMaxLength": "Pet name must be 30 characters or fewer.",
|
|
"species": "Species",
|
|
"selectSpecies": "Select species",
|
|
"speciesRequired": "Please select a species.",
|
|
"breed": "Breed",
|
|
"selectBreed": "Select breed (optional)",
|
|
"selectSpeciesFirst": "Select a species first",
|
|
"noBreedsFound": "No breeds found.",
|
|
"bio": "Bio",
|
|
"bioPlaceholder": "Tell us about {petName}…",
|
|
"bioPlaceholderFallback": "Tell us about your pet…",
|
|
"adoptionStory": "Adoption story",
|
|
"adoptionStoryPlaceholder": "How did {petName} join your family?",
|
|
"adoptionStoryPlaceholderFallback": "How did your pet join your family?",
|
|
"birthday": "Birthday",
|
|
"birthdayHint": "For birthday reminders",
|
|
"adoptedAt": "Adoption date",
|
|
"adoptedAtHint": "For anniversary reminders",
|
|
"addPet": "Add Pet",
|
|
"saveChanges": "Save changes",
|
|
"petCreated": "Pet profile created",
|
|
"changesSaved": "Changes saved",
|
|
"error": "Something went wrong. Please try again."
|
|
},
|
|
"DateWheelPicker": {
|
|
"selectDate": "Select date",
|
|
"apply": "Apply"
|
|
},
|
|
"LegalUpdateBanner": {
|
|
"title": "Our Terms of Service or Privacy Policy have changed",
|
|
"readFull": "Read the full text",
|
|
"acknowledge": "Got it",
|
|
"disagree": "Disagree — delete my account"
|
|
},
|
|
"AvatarUpload": {
|
|
"uploadPhoto": "Upload photo",
|
|
"changePhoto": "Change photo",
|
|
"savePetFirst": "Save your pet first to upload a photo.",
|
|
"uploadFailed": "Upload failed — please try again",
|
|
"photoUpdated": "Profile photo updated",
|
|
"fileTooLarge": "Photo must be under 10 MB.",
|
|
"invalidType": "Upload a JPG, PNG, or WebP image.",
|
|
"uploading": "Uploading…"
|
|
},
|
|
"Onboarding": {
|
|
"addFirstPet": "Add your first pet",
|
|
"addFirstPetDesc": "Your pet will be their own star on PawFeed.",
|
|
"addPhoto": "Add a profile photo",
|
|
"addPhotoDesc": "Give your pet a face on PawFeed. You can always change this later.",
|
|
"done": "Done",
|
|
"skipForNow": "Skip for now"
|
|
},
|
|
"Language": {
|
|
"switch": "Language",
|
|
"en": "English",
|
|
"de": "Deutsch"
|
|
},
|
|
"PostCard": {
|
|
"justNow": "just now",
|
|
"minutesAgo": "{count}m ago",
|
|
"hoursAgo": "{count}h ago",
|
|
"daysAgo": "{count}d ago",
|
|
"editCaption": "Edit caption",
|
|
"deletePost": "Delete post",
|
|
"reportPost": "Report post",
|
|
"blockPet": "Block {name}",
|
|
"captionPlaceholder": "Write a caption…",
|
|
"charsRemaining": "{count} characters remaining",
|
|
"saveCaption": "Save caption",
|
|
"cancel": "Cancel",
|
|
"more": "more",
|
|
"less": "less",
|
|
"deleteTitle": "Delete this post?",
|
|
"deleteDesc": "This will permanently delete the post and all its photos. This can't be undone.",
|
|
"keepPost": "Keep post",
|
|
"yesDelete": "Yes, delete",
|
|
"captionUpdated": "Caption updated",
|
|
"captionUpdateError": "Couldn't update caption. Please try again.",
|
|
"postDeleted": "Post deleted",
|
|
"deleteError": "Couldn't delete post. Please try again."
|
|
},
|
|
"Comments": {
|
|
"title": "Comments",
|
|
"justNow": "now",
|
|
"empty": "No comments yet — be the first!",
|
|
"placeholder": "Add a comment…",
|
|
"post": "Post",
|
|
"sending": "Sending…",
|
|
"postError": "Couldn't post comment. Please try again.",
|
|
"deleteError": "Couldn't delete comment. Please try again.",
|
|
"countSingular": "1 comment",
|
|
"countPlural": "{count} comments"
|
|
},
|
|
"RelativeTime": {
|
|
"justNow": "now",
|
|
"minutes": "{count}m",
|
|
"hours": "{count}h",
|
|
"days": "{count}d"
|
|
},
|
|
"Follow": {
|
|
"follow": "Follow",
|
|
"following": "Following",
|
|
"unfollow": "Unfollow",
|
|
"unfollowTitle": "Unfollow {name}?",
|
|
"unfollowDesc": "You'll stop seeing {name}'s posts in your feed.",
|
|
"keepFollowing": "Keep following",
|
|
"followError": "Something went wrong. Try again.",
|
|
"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 👋",
|
|
"placeholder": "Message…",
|
|
"charsLeft": "{count} characters left",
|
|
"sendError": "Failed to send message. Try again."
|
|
},
|
|
"FeedList": {
|
|
"forYou": "For you",
|
|
"recent": "Recent",
|
|
"allCaughtUp": "You're all caught up. Follow more pets to see more posts.",
|
|
"discoveryBanner": "You're not following anyone yet — here's what other pets like yours are sharing."
|
|
},
|
|
"ProfileTabs": {
|
|
"posts": "Posts",
|
|
"milestones": "Milestones",
|
|
"noPosts": "No posts yet",
|
|
"noMilestones": "No milestones yet"
|
|
},
|
|
"ExploreCard": {
|
|
"followerSingular": "1 follower",
|
|
"followerPlural": "{count} followers",
|
|
"yourPet": "Your pet"
|
|
},
|
|
"Health": {
|
|
"pageTitle": "Health — {petName}",
|
|
"shareCard": "Share Card",
|
|
"tabWeight": "Weight",
|
|
"tabVet": "Vet Visits",
|
|
"tabVaccines": "Vaccines",
|
|
"cancel": "Cancel",
|
|
"save": "Save",
|
|
"weight": {
|
|
"add": "Add Weight",
|
|
"noEntries": "No weight entries yet",
|
|
"singular": "1 entry",
|
|
"plural": "{count} entries",
|
|
"labelDate": "Date",
|
|
"labelWeight": "Weight (kg)",
|
|
"placeholderWeight": "e.g. 4.2",
|
|
"labelNotes": "Notes (optional)",
|
|
"placeholderNotes": "e.g. after morning walk",
|
|
"toastAdded": "Weight entry added",
|
|
"toastDeleted": "Entry deleted",
|
|
"toastError": "Failed to save weight entry",
|
|
"toastDeleteError": "Failed to delete entry",
|
|
"toastValidation": "Please fill in date and a valid weight",
|
|
"chartHistory": "History"
|
|
},
|
|
"vet": {
|
|
"add": "Add Visit",
|
|
"noEntries": "No vet visits yet",
|
|
"singular": "1 visit",
|
|
"plural": "{count} visits",
|
|
"labelDate": "Date",
|
|
"labelVet": "Vet / Clinic (optional)",
|
|
"placeholderVet": "e.g. Dr. Müller",
|
|
"labelReason": "Reason *",
|
|
"placeholderReason": "e.g. Annual checkup",
|
|
"labelNotes": "Notes (optional)",
|
|
"placeholderNotes": "Diagnosis, treatment, medications…",
|
|
"toastAdded": "Vet visit added",
|
|
"toastDeleted": "Entry deleted",
|
|
"toastError": "Failed to save vet visit",
|
|
"toastDeleteError": "Failed to delete entry",
|
|
"toastValidation": "Please fill in date and reason"
|
|
},
|
|
"vaccines": {
|
|
"add": "Add Vaccine",
|
|
"noEntries": "No vaccines recorded yet",
|
|
"singular": "1 vaccine",
|
|
"plural": "{count} vaccines",
|
|
"labelName": "Vaccine Name *",
|
|
"placeholderName": "e.g. Rabies, DHPP",
|
|
"labelDateGiven": "Date Given *",
|
|
"labelNextDue": "Next Due (optional)",
|
|
"labelNotes": "Notes (optional)",
|
|
"placeholderNotes": "Batch number, clinic…",
|
|
"badgeOverdue": "Overdue",
|
|
"badgeDue": "Due {date}",
|
|
"textGiven": "Given {date}",
|
|
"toastAdded": "Vaccine added",
|
|
"toastDeleted": "Entry deleted",
|
|
"toastError": "Failed to save vaccine",
|
|
"toastDeleteError": "Failed to delete entry",
|
|
"toastValidation": "Please fill in vaccine name and date given"
|
|
},
|
|
"feeding": {
|
|
"sectionTitle": "Feeding",
|
|
"edit": "Edit",
|
|
"add": "Add Feeding Info",
|
|
"labelFoodType": "Food type",
|
|
"labelFeedingTimes": "Feedings per day",
|
|
"labelDailyAmount": "Daily amount (g)",
|
|
"labelBrand": "Brand (optional)",
|
|
"labelSpecialDiet": "Special diet / allergies (optional)",
|
|
"placeholderFoodType": "e.g. Dry food, Wet food, BARF",
|
|
"placeholderFeedingTimes": "e.g. 2",
|
|
"placeholderDailyAmount": "e.g. 200",
|
|
"placeholderBrand": "e.g. Royal Canin",
|
|
"placeholderSpecialDiet": "e.g. Grain-free, chicken allergy…",
|
|
"noInfo": "No feeding info saved yet.",
|
|
"timesPerDay": "{count}x per day",
|
|
"gramsPerDay": "{amount} g / day",
|
|
"toastSaved": "Feeding info saved",
|
|
"toastDeleted": "Feeding info removed",
|
|
"toastError": "Could not save feeding info",
|
|
"toastDeleteError": "Could not remove feeding info"
|
|
},
|
|
"share": {
|
|
"title": "Share Health Card — {petName}",
|
|
"description": "Anyone with this link can view {petName}'s health data — weight, vaccines, and vet visits. No login required.",
|
|
"validityLabel": "Validity period",
|
|
"expiryDays": "{count} days",
|
|
"generate": "Generate",
|
|
"validUntil": "Valid until",
|
|
"openPdf": "Open as PDF / Print",
|
|
"regenerateTitle": "Regenerate link",
|
|
"regenerateDesc": "Creates a new link and invalidates the current one. Useful for revoking access.",
|
|
"toastGenerateError": "Could not generate link",
|
|
"toastRegenerateSuccess": "New link created — old link is now invalid",
|
|
"toastRegenerateError": "Could not regenerate link"
|
|
}
|
|
},
|
|
"DeleteAccount": {
|
|
"trigger": "Delete account",
|
|
"warningTitle": "Delete your account?",
|
|
"warningIntro": "This action is irreversible. The following will be permanently deleted:",
|
|
"itemPets": "All pet profiles",
|
|
"itemPosts": "All posts, comments, and reactions",
|
|
"itemMedia": "All photos and videos",
|
|
"itemMessages": "All chats and messages",
|
|
"itemHealth": "All health records",
|
|
"itemAccount": "Your PawFeed account",
|
|
"cancel": "Cancel",
|
|
"understand": "I understand, continue",
|
|
"confirmTitle": "Confirmation required",
|
|
"confirmIntro": "Enter the name of one of your pets to confirm deletion:",
|
|
"inputPlaceholder": "Enter pet name…",
|
|
"confirmDelete": "Permanently delete account",
|
|
"deleting": "Deleting account…",
|
|
"doneTitle": "Account successfully deleted.",
|
|
"doneRedirect": "You're being redirected…",
|
|
"unknownError": "Unknown error",
|
|
"genericError": "Something went wrong"
|
|
},
|
|
"NotificationsPage": {
|
|
"title": "Notifications",
|
|
"emptyTitle": "No notifications yet",
|
|
"emptyDesc": "When pets follow you or react to your posts, you'll see it here.",
|
|
"typeFollow": "started following you",
|
|
"typeReaction": "reacted to your post",
|
|
"commentedPrefix": "commented:",
|
|
"typeCommentNoBody": "commented on your post",
|
|
"typeMessage": "sent you a message",
|
|
"typeMention": "mentioned you in a comment",
|
|
"typePawBack": "shared your post (Paw-Back)",
|
|
"typeBirthday": "🎂 Happy Birthday! Create an anniversary post.",
|
|
"typeAdoptionDay": "🏠 Today is adoption day! Celebrate the anniversary."
|
|
},
|
|
"PhotoPostForm": {
|
|
"captionPlaceholder": "Write a caption…",
|
|
"captionError": "Caption must be 500 characters or fewer.",
|
|
"charactersRemaining": "{count} characters remaining",
|
|
"shareCta": "Share Post",
|
|
"sharing": "Sharing…",
|
|
"successToast": "Post shared",
|
|
"errorToast": "Couldn't share your post. Please try again.",
|
|
"noPetSelected": "No active pet selected.",
|
|
"noPhoto": "Please add at least one photo."
|
|
},
|
|
"StoryForm": {
|
|
"addPhoto": "Add a photo",
|
|
"disappearsNote": "Stories disappear after 24 hours",
|
|
"changePhoto": "Change photo",
|
|
"postCta": "Post Story",
|
|
"posting": "Posting…",
|
|
"successToast": "Story posted",
|
|
"errorToast": "Couldn't post your story. Please try again.",
|
|
"noPetSelected": "No active pet selected.",
|
|
"fileTooLarge": "Photo must be under 10 MB.",
|
|
"invalidType": "Upload a JPG, PNG, or WebP image.",
|
|
"uploadFailed": "Upload failed — please try again."
|
|
},
|
|
"MilestoneForm": {
|
|
"questionLabel": "What's the milestone?",
|
|
"selectPlaceholder": "Select a milestone…",
|
|
"litterDetailsLabel": "Litter details",
|
|
"optional": "(optional)",
|
|
"litterPlaceholder": "e.g. 5 healthy kittens, born 13 June…",
|
|
"charactersRemaining": "{count} characters remaining",
|
|
"photoLabel": "Photo",
|
|
"addPhoto": "Add a photo",
|
|
"change": "Change",
|
|
"noteLabel": "Add a note",
|
|
"notePlaceholder": "Add a note… (optional)",
|
|
"shareCta": "Share Milestone",
|
|
"sharing": "Sharing…",
|
|
"successToast": "Milestone shared",
|
|
"errorToast": "Couldn't share this milestone. Please try again.",
|
|
"fileTooLarge": "Photo must be under 10 MB.",
|
|
"invalidType": "Upload a JPG, PNG, or WebP image.",
|
|
"uploadFailed": "Upload failed — please try again."
|
|
},
|
|
"VideoUploadForm": {
|
|
"selectVideo": "Select a video",
|
|
"formatHint": "MP4, MOV or WebM · up to 500 MB · max 3 minutes",
|
|
"selectVideoAria": "Select video",
|
|
"changeVideo": "Choose a different video",
|
|
"captionLabel": "Caption",
|
|
"captionPlaceholder": "Write a caption…",
|
|
"charactersLeft": "{count} left",
|
|
"uploading": "Uploading…",
|
|
"processingDone": "Uploaded — video is being processed",
|
|
"uploadFailedGeneric": "Upload failed — please try again",
|
|
"cancel": "Cancel",
|
|
"postVideo": "Post video",
|
|
"invalidType": "Upload an MP4, MOV, or WebM video.",
|
|
"fileTooLarge": "Video must be under 500 MB.",
|
|
"uploadSuccessToast": "Video uploaded — processing in the background",
|
|
"uploadFailedToast": "Upload failed: {msg}"
|
|
},
|
|
"StoryViewer": {
|
|
"closeStory": "Close story",
|
|
"storyAriaLabel": "{petName}'s story",
|
|
"sheetTitleZero": "No views yet",
|
|
"sheetTitleSingular": "Seen by 1 pet",
|
|
"sheetTitlePlural": "Seen by {count} pets",
|
|
"noViewersYet": "No one has viewed this story yet."
|
|
},
|
|
"StoryTray": {
|
|
"storiesAriaLabel": "Stories",
|
|
"addStory": "Add story",
|
|
"newStoryTitle": "New Story"
|
|
},
|
|
"RepostCard": {
|
|
"pawedBackBy": "Pawed-back by"
|
|
},
|
|
"OnboardingGuidelines": {
|
|
"title": "Before you get started",
|
|
"subtitle": "A quick overview of our community guidelines.",
|
|
"linksIntro": "Full details in our",
|
|
"termsLink": "Terms of Service",
|
|
"privacyLink": "Privacy Policy (incl. cookies)",
|
|
"continueCta": "I understand, continue"
|
|
},
|
|
"UploadConsent": {
|
|
"title": "Two quick confirmations",
|
|
"subtitle": "Before you create your first pet, we need your explicit consent to the following.",
|
|
"contentRightsLabel": "I confirm that I own all rights to the photos and videos I upload, and that they do not infringe any third party's copyright.",
|
|
"dataProcessingLabel": "I consent to my data being transferred to Clerk (authentication), Cloudflare (media storage), Mux (video processing), and Supabase (database) to provide the service.",
|
|
"linksIntro": "Details on the service providers we use are in our",
|
|
"privacyLink": "Privacy Policy",
|
|
"continueCta": "Confirm and continue"
|
|
},
|
|
"PetsPage": {
|
|
"title": "My Pets",
|
|
"addPet": "Add Pet",
|
|
"emptyTitle": "Add your first pet",
|
|
"emptyDesc": "Give your pet their own profile on PawFeed."
|
|
},
|
|
"PetProfile": {
|
|
"editProfile": "Edit profile",
|
|
"health": "Health",
|
|
"managedBy": "Managed by @{username}",
|
|
"statsPosts": "posts",
|
|
"statsFollowers": "followers",
|
|
"statsFollowing": "following",
|
|
"adoptionStory": "Adoption story"
|
|
},
|
|
"FollowersPage": {
|
|
"title": "{count} Followers",
|
|
"empty": "{petName} doesn't have any followers yet."
|
|
},
|
|
"FollowingPage": {
|
|
"title": "Following {count}",
|
|
"empty": "{petName} isn't following anyone yet."
|
|
},
|
|
"ProfileActions": {
|
|
"message": "Message",
|
|
"cannotStartConversation": "Cannot start conversation.",
|
|
"moreOptions": "More options",
|
|
"reportProfile": "Report profile",
|
|
"blockPet": "Block {petName}"
|
|
},
|
|
"ReportSheet": {
|
|
"title": "Report",
|
|
"reasonQuestion": "Why are you reporting this?",
|
|
"reasonSpam": "Spam",
|
|
"reasonHarassment": "Harassment or bullying",
|
|
"reasonInappropriate": "Inappropriate content",
|
|
"reasonMisinformation": "False or misleading information",
|
|
"reasonOther": "Something else",
|
|
"notesPlaceholder": "Add details (optional)",
|
|
"charactersRemaining": "{count} characters remaining",
|
|
"submit": "Submit Report",
|
|
"cancel": "Don't report",
|
|
"successToast": "Report submitted. We'll review it shortly.",
|
|
"errorToast": "Couldn't submit your report. Please try again."
|
|
},
|
|
"BlockDialog": {
|
|
"title": "Block {petName}?",
|
|
"description": "{petName}'s posts and profile will be hidden from you. They won't know you blocked them.",
|
|
"cancel": "Don't block",
|
|
"confirm": "Block",
|
|
"successToast": "You've blocked {petName}",
|
|
"errorToast": "Couldn't block this pet. Please try again."
|
|
},
|
|
"Landing": {
|
|
"tagline": "Where pets are the stars. Profiles, posts, and stories — built for dogs, cats, and birds.",
|
|
"getStarted": "Get started",
|
|
"logIn": "Log in",
|
|
"previewAlt": "The PawFeed feed, showing pet posts from Noctis and Bubi",
|
|
"featuresHeading": "Built for the pet, not the person",
|
|
"feature1Title": "Pets, not humans, are the profile",
|
|
"feature1Body": "Every dog, cat, or bird gets its own identity — its own posts, followers, and story, separate from its owner's.",
|
|
"feature2Title": "Posts, stories & short video",
|
|
"feature2Body": "Photos, short-form video, and 24-hour stories — all built around what your pet is up to.",
|
|
"feature3Title": "Health tracking",
|
|
"feature3Body": "Weight logs, vet visits, and vaccine records in one place — shareable with a vet via a private link.",
|
|
"feature4Title": "Pet-to-pet messaging",
|
|
"feature4Body": "Direct messages happen between pets, not owners — matching how the whole platform is built.",
|
|
"footerImpressum": "Imprint",
|
|
"footerDatenschutz": "Privacy Policy",
|
|
"footerAgb": "Terms"
|
|
}
|
|
}
|