Files
Epicure/apps/web/messages/en.json
T
Arnaud 51e6722f4c feat: custom recipe cover color/icon + mute auto placeholder palette (v0.51.0)
Two changes to the no-photo cover placeholder shipped last version:

1. Muted the gradient palette (100/40-opacity tints instead of solid -200/
   -950 stops) — the original was too saturated next to real cover photos
   in the same grid, per feedback.
2. New coverIcon/coverColor columns on recipes (nullable text, migration
   0048, additive-only) let the author pin a specific color+icon from the
   recipe editor instead of the automatic per-id pick. getRecipePlaceholder
   now checks these first, falling back to the deterministic hash pick when
   unset — existing recipes are unaffected until edited.

Wired coverIcon/coverColor through every explicit-column recipe select
that feeds a grid card (explore trending/recent, search, feed, for-you) —
the relational-query call sites (recipes page, collections, profile pages)
already return all columns and needed no changes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 10:32:31 +02:00

1505 lines
66 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"marketing": {
"nav": {
"features": "Features",
"about": "About",
"openApp": "Open app",
"login": "Log in",
"signup": "Sign up",
"signupClosed": "Signups closed"
},
"footer": {
"about": "About",
"privacy": "Privacy",
"terms": "Terms",
"contact": "Contact",
"copyright": "© {year} Epicure"
},
"home": {
"heroTitle": "Your AI-powered recipe book",
"heroSubtitle": "Generate, organize, and share recipes — plan meals, track your pantry, and cook with an assistant that can act on your behalf.",
"ctaPrimary": "Get started free",
"ctaSecondary": "See features",
"bottomCtaTitle": "Start cooking smarter",
"bottomCtaSubtitle": "Free to start. No credit card required.",
"highlights": {
"ai": { "title": "AI recipe generation", "description": "Generate a full recipe from an idea, a photo, or a URL — vision and text models work together to write the details." },
"assistant": { "title": "Cooking assistant", "description": "Ask cooking questions anytime — it can even draft a recipe or shopping list right in the conversation, for you to review and confirm." },
"mealPlan": { "title": "Meal planning", "description": "Plan your week, generate a plan with AI, and turn it straight into a shopping list." },
"pantry": { "title": "Pantry tracking", "description": "Know what you have on hand — scan it in, and let recipes account for it automatically." },
"cookMode": { "title": "Hands-free cook mode", "description": "A distraction-free, step-by-step view for actually cooking — large text, timers, no scrolling with messy hands." },
"variations": { "title": "Recipe variations", "description": "Ask for a dietary twist, an ingredient swap, or a whole new spin on a recipe — AI proposes a variation, you decide whether to keep it." },
"social": { "title": "Share & discover", "description": "Follow other cooks, rate and comment on recipes, and control exactly who can see yours." },
"batchCook": { "title": "Batch cooking", "description": "Cook once, eat all week — dedicated batch-cook planning with fridge/freezer guidance." },
"recommendations": { "title": "Personalized recommendations", "description": "A For You feed ranked from what you've favorited and rated, plus meal/drink pairing suggestions for any recipe." }
}
},
"features": {
"title": "Everything you need to cook smarter",
"subtitle": "From a single idea to a finished, organized recipe collection.",
"cta": "Try it free",
"items": {
"ai": { "title": "AI recipe generation", "description": "Generate a recipe from a short idea, a URL, or a description — dish or drink, automatically detected." },
"photoImport": { "title": "Import from a photo", "description": "A vision model recognizes what's in the photo, then a text model writes the full recipe from that description." },
"assistant": { "title": "Cooking assistant with tool-calling", "description": "A conversational assistant for cooking questions that can also draft a recipe or shopping-list additions for you to confirm — nothing saves without your say." },
"mealPlan": { "title": "AI meal planning", "description": "Generate a week of meals around your preferences, dietary needs, and what's already in your pantry." },
"cookMode": { "title": "Hands-free cook mode", "description": "A distraction-free, step-by-step cooking view — large text, built-in timers, made for a kitchen counter, not a desk." },
"variations": { "title": "Recipe variations", "description": "Adapt a recipe for a diet, an excluded ingredient, or a creative twist — AI proposes changes, you review and confirm before anything is saved." },
"recommendations": { "title": "Personalized recommendations", "description": "A For You feed ranked from what you've favorited and rated, plus meal/drink pairing suggestions for any recipe." },
"substitution": { "title": "Ingredient substitution", "description": "Out of something, or avoiding it? Get AI-suggested swaps for any ingredient, right from the recipe." },
"pantry": { "title": "Pantry tracking", "description": "Track what you have — scan barcodes or photos — and let it inform meal planning and shopping lists." },
"shoppingList": { "title": "Shopping lists", "description": "Multiple lists, shared with others, auto-populated from recipes or meal plans." },
"social": { "title": "Follows, ratings & comments", "description": "A social layer for recipes — follow other cooks, rate and review, with granular visibility controls including followers-only." },
"batchCook": { "title": "Batch cooking", "description": "Plan cook-once-eat-all-week sessions with per-dish fridge/freezer guidance." }
}
},
"about": {
"title": "About Epicure",
"paragraphs": [
"Epicure started as a simple idea: a recipe book that actually keeps up with how you cook — planning, pantry, and AI all in one place instead of five different apps.",
"It's an independent project, built and maintained by one person, growing based on what's actually useful to the people using it."
]
},
"contact": {
"title": "Get in touch",
"subtitle": "Questions, feedback, or something broken — email us and we'll get back to you."
}
},
"nav": {
"menu": "Menu",
"recipes": "Recipes",
"explore": "Explore",
"search": "Search",
"feed": "Feed",
"collections": "Collections",
"mealPlan": "Meal Plan",
"nutrition": "Nutrition",
"pantry": "Pantry",
"shopping": "Shopping",
"settings": "Settings",
"admin": "Admin",
"signOut": "Sign out",
"apiKeys": "API keys",
"webhooks": "Webhooks",
"language": "Language",
"notifications": "Notifications",
"viewProfile": "View profile",
"support": "Support",
"lightMode": "Light mode",
"darkMode": "Dark mode",
"systemMode": "System"
},
"notifications": {
"title": "Notifications",
"empty": "No notifications yet.",
"markAllRead": "Mark all as read",
"viewAll": "View all",
"loading": "Loading…",
"loadMore": "Load more",
"loadFailed": "Failed to load notifications. Check your connection and try again.",
"retry": "Retry",
"unread": "Unread",
"follow": "{name} followed you",
"comment": "{name} commented on your recipe",
"reply": "{name} replied to your comment",
"reaction": "{name} reacted to your comment",
"rating": "{name} rated your recipe",
"mention": "{name} mentioned you in a comment",
"detail": {
"comment": "{name} commented on your recipe \"{title}\"",
"rating": "{name} rated your recipe \"{title}\" {stars} stars",
"leftoverExpiring": "Your \"{dish}\" from \"{title}\" is about to expire — eat it soon!",
"shoppingListChecked": "{name} checked off \"{item}\" in \"{list}\"",
"shoppingListItemsAdded": "{name} added {countLabel} to \"{list}\""
},
"pushTitle": {
"follow": "New follower",
"comment": "New comment",
"reply": "New reply",
"reaction": "New reaction",
"rating": "New rating",
"mention": "You were mentioned",
"leftoverExpiring": "Leftovers expiring soon",
"shoppingListUpdate": "Shopping list update"
}
},
"recipe": {
"byAuthor": "by {name}",
"source": "Source",
"importedFrom": "Imported from {host}",
"share": "Share",
"shareLinkCopied": "Link copied to clipboard",
"shareCopyFailed": "Failed to copy link",
"shareNotPublicNotice": "This link will only work once the recipe is set to Public — link copied anyway.",
"print": "Print",
"qrCodeAlt": "QR code linking to this recipe",
"qrCodeCaption": "Scan to view online",
"ingredients": "Ingredients",
"instructions": "Instructions",
"photos": "Photos",
"batchCookBadge": "Batch cooking",
"batchCookPrep": "Prep",
"batchCookDishesTitle": "Dishes & storage",
"batchCookFridgeDays": "Fridge: {days}d",
"batchCookFreezerFriendly": "Freezer-friendly",
"batchCookDayOf": "On the day",
"batchCookMarkCooked": "Mark as cooked today",
"batchCookMarkSuccess": "Marked as cooked",
"batchCookMarkFailed": "Failed to mark as cooked",
"batchCookExpiresOn": "Cooked — good until {date}",
"servings": "{count} servings",
"prep": "{mins}m prep",
"cook": "{mins}m cook",
"total": "{mins}m total",
"edit": "Edit",
"variations": "Variations",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"noIngredientsSteps": "No ingredients or steps yet.",
"generateContent": "Generate with AI",
"editManually": "Edit manually",
"deleted": "Recipe deleted",
"deleteFailed": "Delete failed",
"imported": "Recipe imported! Review before publishing.",
"adapted": "Adapted recipe saved as draft",
"adaptFailed": "Failed to adapt recipe",
"adaptUnchanged": "The adapted recipe came out identical to the original — nothing was saved.",
"adaptConstraintRequired": "Select at least one ingredient to exclude or add a constraint",
"adaptTooltip": "Adapt",
"adaptTitle": "Adapt this recipe",
"adaptDescription": "Tap ingredients to exclude them. AI will find the best substitutes while preserving the dish.",
"excludeIngredients": "Exclude ingredients",
"excludedCount": "{count} excluded",
"additionalConstraints": "Additional constraints",
"optional": "optional",
"adapting": "Adapting recipe — this may take 2030 seconds…",
"adaptingButton": "Adapting…",
"adaptButton": "Adapt recipe",
"clearExclusions": "Clear",
"variationsDirectionsPlaceholder": "e.g. make it vegan, use only pantry staples, reduce sugar…",
"regenerateWithAi": "Regenerate with AI",
"regenerateTitle": "Regenerate with AI",
"regenerateDescription": "Describe what to change — the rest of the recipe stays as-is. This updates the draft you're editing; you'll still need to save.",
"regenerateInstructionLabel": "What should change?",
"regenerateInstructionPlaceholder": "e.g. make it spicier, swap in chicken instead of beef, halve the servings…",
"regenerateCancel": "Cancel",
"regenerating": "Regenerating…",
"regenerateApply": "Regenerate",
"regenerated": "Draft updated — review and save your changes.",
"regenerateFailed": "Failed to regenerate recipe",
"historyRestoreFailed": "Failed to restore version",
"pairingMealFailed": "Failed to suggest pairings",
"pairingDrinkFailed": "Failed to suggest drinks",
"pairingGenerateFailed": "Failed to generate \"{name}\"",
"pairingSaveFailed": "Failed to save \"{name}\"",
"pairingSuccess": "Recipe generated — review before publishing",
"pairingBulkSuccess": "{count} recipes generated — find them in your library",
"pairingDialogTitle": "Complete the meal",
"pairingDialogDescription": "AI-suggested dishes that pair well with this recipe. Generate any of them as a new recipe.",
"forkTooltip": "Fork this recipe",
"forked": "Recipe forked to your library",
"forkFailed": "Failed to fork recipe",
"forkLimitReached": "Recipe limit reached for your tier",
"duplicateTooltip": "Duplicate this recipe",
"duplicated": "Recipe duplicated",
"forkedFrom": "Forked from {title}",
"pairingFindingLabel": "Finding perfect pairings…",
"pairingSuggestButton": "Suggest pairings",
"pairingRegenerate": "Regenerate",
"pairingGenerateButton": "Generate",
"pairingGeneratingButton": "Generating {current}/{total}…",
"pairingGeneratingLabel": "Generating recipe {current} of {total}…",
"pairingRoleStarter": "Starter",
"pairingRoleSide": "Side",
"pairingRoleSalad": "Salad",
"pairingRoleBread": "Bread",
"pairingRoleDrink": "Drink",
"pairingRoleDessert": "Dessert",
"pairingRoleSauce": "Sauce",
"drinksDialogTitle": "Drink pairings",
"drinksDialogDescription": "AI-suggested drinks that complement this recipe.",
"drinksSuggestButton": "Suggest drinks",
"drinksExamplesLabel": "e.g.",
"drinksTypeWine": "Wine",
"drinksTypeBeer": "Beer",
"drinksTypeCocktail": "Cocktail",
"drinksTypeSpirit": "Spirit",
"drinksTypeNonAlcoholic": "Non-alcoholic",
"drinksTypeHot": "Hot",
"cookAction": "Cook",
"adaptConstraintPlaceholder": "e.g. Make it vegan, lower the calories, use pantry staples only, gluten-free…",
"photoImportFailed": "Failed to import recipe from photo.",
"photoNoRecipeFound": "No recipe could be recognized in that photo. Try a clearer picture of the ingredients or instructions.",
"importFromPhoto": "Import from Photo",
"urlImportTitle": "Import recipe from URL",
"urlImportDescription": "Paste a recipe URL and AI will extract the ingredients and instructions.",
"urlImportLabel": "Recipe URL",
"urlImportButton": "Import",
"urlImportingButton": "Importing…",
"urlImportFetchFailed": "Failed to import recipe",
"urlImportSaveFailed": "Failed to save imported recipe",
"urlImportSuccess": "Recipe imported! Review before publishing.",
"diffTitleLabel": "Title",
"diffDescriptionLabel": "Description",
"diffIngredientsLabel": "Ingredients",
"diffStepsLabel": "Steps",
"viewGrid": "Grid view",
"viewList": "List view",
"viewCompact": "Compact view",
"updatedLabel": "Updated {date}",
"addToCollection": "Add to collection",
"addToCollectionTitle": "Add {count, plural, one {1 recipe} other {{count} recipes}} to a collection",
"newCollectionOption": "New collection…",
"newCollectionNamePlaceholder": "Collection name",
"addToCollectionSuccess": "{count, plural, one {1 recipe} other {{count} recipes}} added to \"{name}\"",
"addToCollectionFailed": "Failed to add to collection",
"createCollectionFailed": "Failed to create collection",
"noCollectionsYet": "You don't have any collections yet.",
"versionHistoryTitle": "Version History",
"versionsLoading": "Loading versions...",
"versionsEmpty": "No versions yet. Versions are saved automatically when you edit this recipe.",
"versionCompare": "Compare",
"versionCompareWith": "Compare v{version} with current",
"versionRestore": "Restore",
"versionRestored": "Recipe restored to version {version}",
"versionDetailLoading": "Loading...",
"versionDetailSummary": "{ingredients, plural, one {1 ingredient} other {{ingredients} ingredients}}, {steps, plural, one {1 step} other {{steps} steps}}",
"recognizingPhoto": "Recognizing what's in the photo…",
"writingRecipe": "Writing the recipe…",
"pairMealTooltip": "Pair meal",
"historyTooltip": "History",
"translateTooltip": "Translate",
"drinksTooltip": "Drinks",
"variationsTooltip": "Variations",
"viewPublicly": "View publicly",
"shoppingListCreateFailed": "Failed to create list",
"shoppingListAddFailed": "Failed to add ingredients",
"bulkDeleted": "{count, plural, one {1 recipe deleted} other {{count} recipes deleted}}",
"bulkVisibility": "{count, plural, one {1 recipe set to {visibility}} other {{count} recipes set to {visibility}}}",
"bulkDeleteFailed": "Delete failed",
"bulkUpdateFailed": "Update failed",
"bulkDeleteConfirmTitle": "{count, plural, one {Delete 1 recipe?} other {Delete {count} recipes?}}",
"bulkDeleteConfirmDescription": "This action cannot be undone.",
"bulkTagsButton": "Tags",
"bulkTagsTitle": "{count, plural, one {Edit tags on 1 recipe} other {Edit tags on {count} recipes}}",
"bulkTagsAddLabel": "Add tags",
"bulkTagsAddPlaceholder": "Type a tag and press Enter",
"bulkTagsAddButton": "Add",
"bulkTagsRemoveLabel": "Remove existing tags",
"bulkTagsUpdated": "{count, plural, one {Tags updated on 1 recipe} other {Tags updated on {count} recipes}}",
"bulkExportButton": "Export",
"bulkExportFailed": "Export failed",
"moveToCollectionTitle": "Move {count, plural, one {1 recipe} other {{count} recipes}} to a collection",
"moveToCollectionSuccess": "{count, plural, one {1 recipe} other {{count} recipes}} moved to \"{name}\"",
"deselectAll": "Deselect all",
"selectAll": "Select all",
"clickToSelect": "Click cards to select",
"selectedCount": "{count} selected",
"select": "Select",
"visibilityMenuLabel": "Visibility",
"makePublic": "Make public",
"makeUnlisted": "Make unlisted",
"makeFollowersOnly": "Make followers only",
"makePrivate": "Make private",
"visibility": {
"private": "Private",
"followers": "Followers only",
"unlisted": "Unlisted",
"public": "Public"
},
"difficulty": {
"easy": "Easy",
"medium": "Medium",
"hard": "Hard"
},
"recipeType": {
"dish": "Dish",
"drink": "Drink"
},
"dietary": {
"vegan": "Vegan",
"vegetarian": "Vegetarian",
"glutenFree": "Gluten-free",
"dairyFree": "Dairy-free",
"nutFree": "Nut-free",
"halal": "Halal",
"kosher": "Kosher"
}
},
"ai": {
"generate": {
"title": "Generate recipe with AI",
"description": "Describe what you want to cook and AI will create a complete recipe.",
"descriptionFull": "Describe a dish in words or snap a photo — AI builds the full recipe.",
"tabDescribe": "Describe",
"tabPhoto": "From photo",
"surpriseMe": "Surprise me",
"prompt": "What do you want to cook?",
"placeholder": "e.g. A creamy mushroom risotto with parmesan, serves 4, easy difficulty",
"language": "Recipe language",
"difficulty": "Difficulty",
"anyDifficulty": "Any",
"button": "Generate",
"generating": "Generating…",
"success": "Recipe generated! Review and edit before publishing.",
"error": "Failed to generate recipe",
"saveError": "Failed to save generated recipe",
"uploadClick": "Click to upload",
"uploadDrag": "or drag a food photo",
"uploadFormats": "JPEG, PNG or WebP · AI will reverse-engineer the recipe",
"analyzing": "Analyzing…",
"analyzePhoto": "Analyzing dish photo…",
"recognizeDish": "Recognize dish",
"photoSuccess": "Recipe recognized! Review and edit before publishing.",
"photoError": "Failed to analyze photo",
"contentGenerated": "Ingredients and steps generated!",
"contentGenerateFailed": "Generation failed",
"contentSaveFailed": "Failed to save generated content",
"generatingContent": "Generating recipe content…",
"photoAnalysisNote": "AI will analyze this dish and infer ingredients, quantities, and cooking steps."
},
"variations": {
"title": "AI Recipe Variations",
"description": "Generate creative variations of this recipe — dietary adaptations, flavor twists, technique changes.",
"generate": "Generate 3 variations",
"generating": "Generating variations…",
"regenerate": "Regenerate",
"apply": "Apply",
"applying": "Applying…",
"ingredientChanges": "Ingredient changes",
"stepChanges": "Step changes",
"success": "Variation created — review and edit before publishing.",
"error": "Failed to generate variations",
"saveError": "Failed to save variation",
"noChanges": "This variation didn't actually change anything — nothing was saved.",
"wait": "This may take 2030 seconds",
"directions": "Directions",
"optional": "optional",
"stepLabel": "Step {n}"
},
"translate": {
"title": "Translate Recipe",
"description": "Translate this recipe's title, description, ingredients, and steps into another language.",
"targetLanguage": "Target language",
"button": "Translate",
"translating": "Translating…",
"success": "Translation saved as new draft recipe.",
"error": "Failed to translate recipe",
"saveError": "Failed to save translated recipe",
"wait": "This may take 2030 seconds"
}
},
"settings": {
"title": "Settings",
"subtitle": "Manage your account, preferences, and integrations.",
"profile": "Profile",
"language": "Language",
"units": "Units",
"metric": "Metric",
"imperial": "Imperial",
"security": "Security",
"aiModels": "AI & Models",
"notifications": "Notifications",
"nutrition": "Nutrition",
"apiKeys": "API Keys",
"webhooks": "Webhooks",
"usage": {
"title": "Usage this month",
"description": "Resets at the start of each month ({month}).",
"aiCalls": "AI calls",
"recipes": "Recipes created",
"storage": "Storage",
"unlimited": "Unlimited"
},
"byok": {
"title": "Your API Keys (BYOK)",
"description": "Use your own API keys instead of the app's shared quota. Keys are encrypted at rest."
},
"modelPrefs": {
"title": "Model Preferences",
"description": "Choose which model to use for each task. Defaults to your first configured provider."
},
"apiKeysPage": {
"title": "API Keys",
"description": "Manage API keys for programmatic access to the Epicure API.",
"docsLink": "View API documentation"
},
"pushNotifications": {
"title": "Push Notifications",
"description": "Get notified when someone comments on your recipes or likes your content."
},
"nutritionGoals": {
"title": "Daily Nutrition Goals",
"description": "Set your daily targets. These are shown as progress bars on your meal plan.",
"viewDiaryCta": "View nutrition diary",
"caloriesLabel": "Calories (kcal/day)",
"proteinLabel": "Protein (g/day)",
"carbsLabel": "Carbs (g/day)",
"fatLabel": "Fat (g/day)",
"caloriesPlaceholder": "e.g. 2000",
"proteinPlaceholder": "e.g. 50",
"carbsPlaceholder": "e.g. 250",
"fatPlaceholder": "e.g. 70",
"saveButton": "Save goals",
"saving": "Saving...",
"saveSuccess": "Nutrition goals saved",
"saveError": "Failed to save nutrition goals"
},
"webhooksPage": {
"title": "Webhooks",
"description": "Receive HTTP callbacks when events happen in your Epicure account."
}
},
"support": {
"title": "Support",
"subtitle": "Report a bug, share a suggestion, or ask a question — we read every message.",
"typeLabel": "Type",
"typeBug": "Bug report",
"typeSuggestion": "Suggestion",
"typeQuestion": "Question",
"titleLabel": "Title",
"titlePlaceholder": "Short summary of the issue or idea",
"descriptionLabel": "Description",
"descriptionPlaceholder": "What happened, what you expected, and steps to reproduce (if a bug) — or details on your suggestion/question.",
"attachmentsLabel": "Attachments",
"attachmentsHint": "Screenshots or files, up to {count}. Images, PDF, text, JSON, or zip — 10MB max each.",
"attachmentAdd": "Add file",
"attachmentUploading": "Uploading…",
"removeAttachment": "Remove attachment",
"attachmentLimitReached": "You can attach up to {count} files.",
"attachmentTooLarge": "\"{name}\" exceeds the 10MB limit.",
"attachmentUploadFailed": "Failed to upload \"{name}\".",
"submitButton": "Submit",
"submitting": "Submitting…",
"submitSuccess": "Thanks! We received your message.",
"submitFailed": "Failed to submit — try again.",
"historyTitle": "Your tickets",
"noTickets": "You haven't submitted anything yet.",
"viewIssue": "View issue",
"status": {
"open": "Open",
"triaged": "Triaged",
"closed": "Closed"
},
"type": {
"bug": "Bug",
"suggestion": "Suggestion",
"question": "Question"
}
},
"print": {
"footer": "Printed from Epicure",
"day": "Day",
"srv": " · {count} srv",
"days": {
"mon": "Monday",
"tue": "Tuesday",
"wed": "Wednesday",
"thu": "Thursday",
"fri": "Friday",
"sat": "Saturday",
"sun": "Sunday"
}
},
"publicShoppingList": {
"sharedList": "Shared shopping list",
"wantYourOwn": "Want your own shopping lists?",
"anonymousEditor": "Someone with the link",
"editableBadge": "Anyone with this link can edit"
},
"publicRecipe": {
"publicRecipeBy": "Public recipe by",
"viewInLibrary": "View in your library",
"signUpFree": "Sign up free",
"logIn": "Log in",
"wantToSave": "Want to save this recipe?",
"wantToSaveDescription": "Create a free account to save recipes, scale servings, and build your own library.",
"getStartedFree": "Get started free"
},
"substitute": {
"fetchError": "Couldn't fetch substitutes.",
"titleFor": "Substitute for {ingredient}",
"substitutesFor": "Substitutes for",
"finding": "Finding substitutes…",
"noneFound": "No substitutions found."
},
"recipeChat": {
"sorry": "Sorry, I couldn't answer that.",
"error": "Something went wrong. Please try again.",
"suggestion1": "Can I substitute any ingredients?",
"suggestion2": "How do I know when it's done?",
"suggestion3": "Can I make this ahead of time?",
"suggestion4": "What can I serve with this?",
"ariaLabel": "Ask AI about this recipe",
"title": "Ask about this recipe",
"intro": "Ask anything about this recipe — ingredients, techniques, substitutions, timing…",
"inputPlaceholder": "Ask a question…",
"send": "Send message"
},
"chatHistory": {
"searchAriaLabel": "Search chat history",
"searchPlaceholder": "Search past questions…",
"searching": "Searching…",
"noResults": "No matching messages",
"close": "Close",
"clearAriaLabel": "Clear chat history",
"clearConfirmTitle": "Clear this conversation?",
"clearConfirmDescription": "This deletes the saved history for this chat. This can't be undone.",
"clearCancel": "Cancel",
"clearConfirm": "Clear history",
"cleared": "Chat history cleared",
"clearFailed": "Failed to clear chat history"
},
"cookingChat": {
"sorry": "Sorry, I couldn't answer that.",
"error": "Something went wrong. Please try again.",
"suggestion1": "How do I know when oil is hot enough?",
"suggestion2": "What's a good substitute for buttermilk?",
"suggestion3": "How long can I keep leftovers in the fridge?",
"suggestion4": "What's the difference between simmering and boiling?",
"ariaLabel": "Ask a cooking question",
"title": "Cooking assistant",
"subtitle": "Ask any cooking question — not tied to a specific recipe",
"intro": "Ask anything about cooking — techniques, substitutions, timing, equipment…",
"inputPlaceholder": "Ask a question…",
"send": "Send message",
"proposalSummary": "{ingredients} ingredients · {steps} steps",
"proposalCreateButton": "Create recipe",
"proposalDiscardButton": "Discard",
"proposalCreated": "Recipe created — opening editor…",
"proposalDiscarded": "Discarded",
"proposalCreateFailed": "Failed to create recipe",
"shoppingProposalTitle": "{count, plural, one {1 item} other {{count} items}} for your shopping list",
"shoppingProposalMore": "+{count} more",
"shoppingProposalAddButton": "Add to list"
},
"conversations": {
"menuAriaLabel": "Conversations",
"newConversation": "New conversation",
"loading": "Loading…",
"empty": "No conversations yet.",
"untitled": "Untitled",
"renameSave": "Save",
"renameCancel": "Cancel",
"renameAriaLabel": "Rename",
"deleteAriaLabel": "Delete",
"deleteConfirmTitle": "Delete this conversation?",
"deleteConfirmDescription": "This deletes the conversation and all its messages. This can't be undone.",
"deleteCancel": "Cancel",
"deleteConfirm": "Delete",
"createFailed": "Failed to start a new conversation",
"renameFailed": "Failed to rename conversation",
"deleteFailed": "Failed to delete conversation"
},
"servingScaler": {
"servings": "Servings",
"reset": "Reset",
"aiScale": "AI Scale",
"scaling": "Scaling…",
"aiScaledNote": "AI-scaled quantities shown below",
"dismissAiScaling": "Dismiss AI scaling"
},
"people": {
"searching": "Searching…"
},
"messages": {
"loading": "Loading…",
"noMessagesYet": "No messages yet. Say hi!",
"sendFailed": "Failed to send",
"placeholder": "Type a message…",
"noConversationsYet": "No conversations yet. Visit a profile to say hi.",
"unknownUser": "Unknown",
"noMessagesPreview": "No messages yet",
"selectConversation": "Select a conversation",
"messageButton": "Message",
"startConversationFailed": "Failed to start conversation",
"title": "Messages",
"loadOlder": "Load older messages",
"loadingOlder": "Loading…",
"send": "Send message"
},
"nutritionPanel": {
"estimateButton": "Estimate nutrition",
"reEstimateButton": "Re-estimate",
"estimating": "Estimating…",
"estimatingNutrition": "Estimating nutrition…",
"title": "Nutrition per serving",
"estimateFailed": "Failed to estimate nutrition",
"error": "Something went wrong",
"protein": "Protein",
"carbs": "Carbs",
"fat": "Fat",
"fiber": "Fiber",
"sodium": "Sodium",
"manualBadge": "Manually entered",
"estimateInsteadButton": "Estimate with AI instead"
},
"nutritionDiary": {
"title": "Nutrition Diary",
"subtitle": "Your daily nutrition intake, computed from what you've cooked.",
"dateLabel": "Date",
"today": "Today",
"loading": "Loading…",
"loadError": "Couldn't load your nutrition diary. Please try again.",
"goalNotSet": "You haven't set daily nutrition goals yet.",
"setGoalsCta": "Set goals",
"calories": "Calories",
"protein": "Protein",
"carbs": "Carbs",
"fat": "Fat",
"fiber": "Fiber",
"sodium": "Sodium",
"entriesTitle": "Recipes cooked",
"noEntries": "Nothing logged for this day. Mark a recipe as \"cooked\" to see it here.",
"servingsLabel": "{count, plural, one {1 serving} other {{count} servings}}",
"nutritionUnknownBadge": "Nutrition unknown",
"unknownNote": "{count, plural, one {1 entry has no nutrition data and isn't included in the totals above.} other {{count} entries have no nutrition data and aren't included in the totals above.}}"
},
"explore": {
"title": "Explore",
"tabDiscover": "Discover",
"searchPlaceholder": "Search recipes and people…",
"peopleHeading": "People",
"recipesHeading": "Recipes",
"maxMinutes": "Max minutes",
"aiSearchPlaceholder": "e.g. quick weeknight dinners, Italian comfort food…",
"anyDifficulty": "Any difficulty",
"anyType": "Any type",
"resultsFoundSingular": "{count} recipe found",
"resultsFoundPlural": "{count} recipes found",
"noResultsTitle": "No results for “{query}”",
"noResultsHint": "Try different keywords or remove filters",
"loadMore": "Load more",
"recipeIdeas": "Recipe ideas",
"recipeIdeasHint": "Tell the AI what you're in the mood for, or let it surprise you.",
"generating": "Generating…",
"getIdeas": "Get ideas",
"surpriseMe": "Surprise me",
"generateFullRecipe": "Generate full recipe",
"trendingThisWeek": "Trending this week",
"noTrending": "No trending recipes yet. Be the first to share one!",
"recentlyAdded": "Recently added",
"noRecent": "No public recipes yet."
},
"common": {
"expand": "Expand to fullscreen",
"collapse": "Exit fullscreen",
"loading": "Loading…",
"error": "Something went wrong",
"save": "Save",
"saved": "Saved",
"saveFailed": "Failed to save",
"exportMarkdown": "Export as Markdown",
"copyMarkdown": "Copy as Markdown",
"downloadMarkdown": "Download as Markdown",
"copiedToClipboard": "Copied to clipboard",
"copyFailed": "Failed to copy to clipboard",
"print": "Print",
"share": "Share",
"deleteFailed": "Delete failed",
"updateFailed": "Update failed",
"deleted": "Deleted",
"cancel": "Cancel",
"delete": "Delete",
"confirm": "Confirm",
"back": "Back",
"difficulty": "Difficulty",
"anyDifficulty": "Any",
"editManually": "Edit manually",
"surpriseMe": "Surprise me",
"generatingContent": "Generating recipe content…",
"decrease": "Decrease",
"increase": "Increase"
},
"auth": {
"signIn": "Sign in",
"signInTitle": "Sign in to your recipe library",
"signInLoading": "Signing in…",
"signInFailed": "Sign in failed",
"signUp": "Sign up",
"signUpTitle": "Create account",
"signUpSubtitle": "Start building your recipe library",
"signUpLoading": "Creating account…",
"signUpFailed": "Sign up failed",
"signUpSuccess": "Account created — check your email to verify",
"continueWithGoogle": "Continue with Google",
"continueWithGithub": "Continue with GitHub",
"continueWithDiscord": "Continue with Discord",
"continueWithAuthentik": "Continue with Authentik",
"email": "Email",
"emailPlaceholder": "you@example.com",
"password": "Password",
"name": "Name",
"namePlaceholder": "Your name",
"forgotPassword": "Forgot password?",
"forgotPasswordTitle": "Forgot password",
"forgotPasswordSent": "Check your inbox",
"forgotPasswordDescription": "Enter your email and we'll send you a reset link.",
"forgotPasswordSentDescription": "If an account exists for that email, you'll receive a reset link shortly.",
"forgotPasswordFailed": "Failed to send reset email",
"sendResetLink": "Send reset link",
"sendingLink": "Sending…",
"resetPasswordTitle": "Reset password",
"resetPasswordDescription": "Enter a new password for your account.",
"newPassword": "New password",
"confirmPassword": "Confirm password",
"updatePassword": "Update password",
"updatingPassword": "Updating…",
"invalidToken": "Invalid or missing reset token.",
"resetPasswordMismatch": "Passwords don't match",
"resetPasswordFailed": "Reset failed — link may have expired",
"resetPasswordSuccess": "Password updated",
"noAccount": "No account? Sign up",
"alreadyHaveAccount": "Already have an account? Sign in",
"backToSignIn": "Back to sign in",
"emailNotVerified": "Email not verified",
"checkInboxVerification": "Check your inbox for a verification email.",
"resendVerification": "Resend verification email",
"resendingSending": "Sending…",
"resendFailed": "Failed to resend",
"resendSuccess": "Verification email sent — check your inbox",
"or": "or",
"twoFactorTitle": "Two-factor authentication",
"twoFactorAppDescription": "Enter the 6-digit code from your authenticator app.",
"twoFactorBackupDescription": "Enter one of your backup codes.",
"twoFactorCodeLabel": "Code",
"twoFactorBackupCodeLabel": "Backup code",
"twoFactorVerify": "Verify",
"twoFactorVerifying": "Verifying…",
"twoFactorInvalidCode": "Invalid code",
"twoFactorUseBackupCode": "Use a backup code instead",
"twoFactorUseApp": "Use your authenticator app instead"
},
"batchCooking": {
"title": "Batch cooking",
"subtitle": "Cook once, eat well all week",
"empty": "No batch-cooking sessions yet",
"newSession": "New batch-cooking session",
"dishCount": "{count, plural, one {# dish} other {# dishes}}",
"wizardTitle": "Plan a batch-cooking session",
"wizardDescription": "Choose how many meals to cover — we'll design a shared shopping list and one prep session for all of them.",
"describe": "Describe what you're after",
"describePlaceholder": "e.g. Mediterranean flavors, use up the squash in my pantry, kid-friendly…",
"dinners": "Dinners",
"lunches": "Lunches",
"servingsPerMeal": "Servings per meal",
"dietaryPrefs": "Dietary preferences",
"dietaryPrefsPlaceholder": "e.g. vegetarian, no shellfish",
"anyDifficulty": "Any",
"generate": "Generate",
"generating": "Generating…",
"generateSuccess": "Batch-cooking session created",
"generateFailed": "Failed to generate"
},
"recipes": {
"title": "Recipes",
"subtitle": "Your personal recipe library",
"new": "New recipe",
"newTitle": "New recipe",
"newSubtitle": "Build your recipe from scratch",
"editTitle": "Edit recipe",
"importUrl": "Import URL",
"generate": "Generate",
"batchCooking": "Batch cooking",
"search": "Search recipes…",
"noRecipes": "No recipes yet",
"noMatch": "No recipes match",
"clearSearch": "Clear search",
"createFirst": "Create your first recipe",
"resultSingular": "{count} recipe",
"resultPlural": "{count} recipes",
"for": "for",
"filterByTag": "Filter by tag…",
"sortRecentlyUpdated": "Recently updated",
"sortOldestUpdated": "Oldest updated",
"sortNewestFirst": "Newest first",
"sortOldestFirst": "Oldest first",
"sortTitleAZ": "Title AZ",
"sortTitleZA": "Title ZA",
"sort": "Sort",
"sortBy": "Sort by",
"filter": "Filter",
"all": "All",
"anyDifficulty": "Any difficulty",
"visibilityLabel": "Visibility",
"difficultyLabel": "Difficulty",
"tagLabel": "Tag",
"batchCookLabel": "Batch cooking",
"batchCookOnly": "Batch cooking only",
"batchCookExclude": "Hide batch cooking",
"recipeTypeLabel": "Type",
"clearFilters": "Clear filters",
"tabMine": "My Recipes",
"tabFavorites": "Favorites",
"favoritesCount": "{count} favorited recipe",
"favoritesCountPlural": "{count} favorited recipes",
"favoritesEmpty": "No favorited recipes yet — tap the heart on any recipe to save it here.",
"favoritesEmptyTitle": "No favorites yet",
"exploreRecipes": "Explore recipes",
"emptyStateDescription": "Create your own, import from a URL, or let AI generate one to get started."
},
"recipeNotes": {
"title": "Your private notes",
"visibilityHint": "Only visible to you — never shared with the recipe's author or anyone else.",
"placeholder": "e.g. I used less salt than the recipe calls for, great with rice instead of pasta…",
"save": "Save",
"saving": "Saving…",
"saved": "Note saved",
"saveFailed": "Failed to save note"
},
"recipeForm": {
"titleLabel": "Title *",
"titleRequired": "Title is required",
"titlePlaceholder": "My amazing recipe",
"descriptionLabel": "Description",
"descriptionPlaceholder": "What makes this recipe special…",
"recipeType": "Type",
"recipeTypeDish": "Dish",
"recipeTypeDrink": "Drink / cocktail",
"servings": "Servings",
"servingsDrink": "Makes (servings)",
"prepMins": "Prep (min)",
"cookMins": "Cook (min)",
"difficulty": "Difficulty",
"visibilityMenuLabel": "Visibility",
"tags": "Tags",
"tagsHelp": "Press Enter to add · Backspace to remove last · max 20 tags",
"tagsPlaceholder": "Add tags… (press Enter)",
"removeTagAriaLabel": "Remove tag {tag}",
"dietaryTags": "Dietary tags",
"nutritionToggle": "Add nutrition info manually",
"nutritionToggleHelp": "Per serving. Turns off the AI-estimate action on the recipe page — clear these fields (turn this off) to let AI estimate it instead.",
"calories": "Calories (kcal)",
"photos": "Photos",
"cover": "Cover",
"coverHint": "Only used when this recipe has no photo.",
"coverReset": "Reset to automatic",
"ingredients": "Ingredients",
"amount": "Amount",
"unit": "Unit",
"ingredient": "Ingredient",
"note": "Note",
"addIngredient": "Add ingredient",
"setCover": "Set as cover",
"removePhoto": "Remove",
"expand": "Expand",
"steps": "Steps",
"stepPlaceholder": "Step {n}…",
"timerSeconds": "Timer (s)",
"addStep": "Add step",
"saving": "Saving…",
"saveChanges": "Save changes",
"createRecipe": "Create recipe",
"updateSuccess": "Recipe updated",
"createSuccess": "Recipe created",
"saveError": "Failed to save recipe",
"ingredientsRequired": "Add at least one ingredient",
"stepsRequired": "Add at least one step",
"discardChangesTitle": "Discard changes?",
"discardChangesDescription": "You have unsaved changes. If you leave now, they will be lost.",
"keepEditing": "Keep editing",
"discardChanges": "Discard changes",
"batchCookToggle": "This is a batch-cook recipe",
"batchCookToggleHelp": "Split this recipe into several dishes cooked together, each with its own storage and reheat guidance.",
"dishes": "Dishes",
"addDish": "Add dish",
"dishName": "Dish name",
"dishDescription": "Description",
"fridgeDays": "Fridge (days)",
"freezerFriendly": "Freezer-friendly",
"freezerNote": "Freezer note",
"dayOfInstructions": "Day-of instructions",
"dishesRequired": "Add at least one dish",
"dayOfInstructionsRequired": "Every dish needs day-of instructions",
"appliesTo": "Applies to",
"sharedPrep": "Shared prep"
},
"canCook": {
"title": "What can I cook?",
"subtitle": "Recipes you can make with your pantry",
"emptyPantry": "Your pantry is empty",
"addPantryItems": "Add pantry items",
"readyToCook": "Ready to cook",
"almostThere": "Almost there (7099%)",
"partialMatches": "Partial matches",
"noMatches": "No strong matches found",
"missing": "Missing",
"ingredientProgress": "{matched}/{total} ingredients",
"useItUp": "Use it up"
},
"mealPlan": {
"title": "Meal Plan",
"nutritionBar": {
"dailyAverageVsGoals": "Daily average vs. your goals",
"calories": "Calories",
"protein": "Protein",
"carbs": "Carbs",
"fat": "Fat",
"missingDataSingular": "{count} planned meal missing nutrition data — estimate it from the recipe page for a more accurate picture.",
"missingDataPlural": "{count} planned meals missing nutrition data — estimate it from the recipe page for a more accurate picture."
},
"shoppingLists": "Shopping lists",
"print": "Print",
"shareTitle": "Share this week's plan",
"shareDescription": "Invite household members to view or edit this week's meal plan.",
"sharedWithYou": "Shared with you",
"sharedPlanOf": "{name}'s plan",
"weekOf": "Week of {date}",
"sharedMealPlanTitle": "{name}'s Meal Plan",
"batchCookBadge": "Batch cooking",
"batchCooking": "Batch cooking",
"pickDishTitle": "Which dish from \"{recipe}\"?",
"pickDishDescription": "This is a batch-cooking session — pick the specific dish for this slot.",
"back": "Back",
"addTo": "Add to {day} {meal}",
"searchRecipes": "Search recipes…",
"servings": "Servings",
"servingsAbbrev": "{count} srv",
"difficulty": "Difficulty",
"noRecipes": "No recipes found",
"addFailed": "Failed to add",
"addedToPantry": "{count, plural, one {1 item added to pantry} other {{count} items added to pantry}}",
"moveToPantryFailed": "Failed to move items to pantry",
"aisleOther": "Other",
"listEmptyState": "This list is empty.",
"checkedCount": "{checked}/{total} checked",
"searchItemsPlaceholder": "Search items…",
"sortByCategory": "By category",
"sortByAlpha": "Alphabetical",
"sortByUnchecked": "Unchecked first",
"noSearchResults": "No items match your search.",
"autoCategorize": "Auto-categorize",
"autoCategorizeSuccess": "{count, plural, one {1 item categorized} other {{count} items categorized}}",
"autoCategorizeNoneFound": "Couldn't guess a category for the remaining items",
"removeItemConfirmTitle": "Remove item?",
"removeItemConfirmDescription": "Remove \"{name}\" from this list?",
"moveToPantry": "Move {count} to pantry",
"listCreated": "List created",
"days": {
"mon": "Mon",
"tue": "Tue",
"wed": "Wed",
"thu": "Thu",
"fri": "Fri",
"sat": "Sat",
"sun": "Sun"
},
"meals": {
"breakfast": "Breakfast",
"lunch": "Lunch",
"dinner": "Dinner",
"snack": "Snack"
},
"generateWithAi": "Generate with AI",
"aiModalDescription": "AI will generate a full week of meals and create draft recipes for you.",
"dietaryPrefs": "Dietary preferences",
"dietaryPrefsPlaceholder": "e.g. vegetarian, gluten-free, low-carb…",
"aiPantryNote": "Your pantry items will be considered when available.",
"generating": "Generating…",
"generate": "Generate",
"cancel": "Cancel",
"aiGenerated": "Meal plan generated!",
"includePantryItems": "Include pantry items",
"pantryMode": "Pantry mode — maximize use of what you have",
"pantryModeDescription": "Prefer meals that use multiple pantry ingredients and minimize extra shopping.",
"targetNutritionGoals": "Target my nutrition goals",
"targetNutritionGoalsDescription": "Nudge the AI to aim for your daily calorie and macro targets across the day's meals.",
"removeFailed": "Failed to remove",
"generationFailed": "Generation failed",
"anyDifficulty": "Any",
"aiPhaseAnalyzing": "Analyzing your preferences…",
"aiPhasePlanning": "Planning breakfast, lunch & dinner…",
"aiPhaseSelecting": "Selecting recipes for each day…",
"aiPhaseBalancing": "Balancing nutrition across the week…",
"aiPhaseFinalizing": "Finalizing your meal plan…",
"newList": "New list",
"newListTitle": "New shopping list",
"listNameLabel": "Name",
"listNamePlaceholder": "Weekly groceries",
"generateFromWeek": "Generate from meal plan week (optional)",
"generateFromWeekHint": "Picks Monday of the selected week",
"generateFromThisWeek": "Add to shopping list",
"generateFromThisWeekHint": "Merges every recipe's ingredients from this week, summing matching ones and flagging what's already in your pantry.",
"shoppingListWeekName": "Groceries for {week}",
"listCreateFailed": "Failed to create",
"listCreating": "Creating…",
"listCreate": "Create",
"pickRecipe": "Pick recipe",
"addEntry": "+ Add",
"removeEntry": "Remove meal",
"markCooked": "Mark as cooked",
"markCookedSuccess": "Marked as cooked",
"markCookedFailed": "Failed to mark as cooked",
"exportCalendar": "Export to calendar",
"previousWeek": "Previous week",
"nextWeek": "Next week",
"clearDay": "Clear day",
"clearWeek": "Clear week",
"clearDayConfirmTitle": "Clear {day}?",
"clearWeekConfirmTitle": "Clear the whole week?",
"clearConfirmDescription": "This removes every planned meal shown — it doesn't delete the recipes themselves.",
"clearedSuccess": "{count, plural, one {1 meal cleared} other {{count} meals cleared}}"
},
"pantry": {
"title": "Pantry",
"subtitle": "Track what you have on hand",
"canCook": "What can I cook?",
"expiringSoonSuggestionsTitle": "Use it up soon",
"seeAll": "See all",
"expiringLeftoversTitle": "Leftovers expiring soon",
"expiringToday": "Eat today",
"expiringInDays": "{days}d left",
"itemNamePlaceholder": "Item name",
"qtyPlaceholder": "Qty",
"unitPlaceholder": "Unit",
"add": "Add",
"addFailed": "Failed to add",
"removeFailed": "Failed to remove",
"removeConfirmTitle": "Remove item?",
"removeConfirmDescription": "Remove \"{name}\" from your pantry?",
"empty": "No pantry items yet.",
"emptyDescription": "Add items by hand, or scan a barcode / photo to fill it in fast.",
"expired": "Expired",
"expiresInDays": "Expires in {days}d",
"expiresOn": "Expires {date}",
"printItemCountSingular": "{count} item",
"printItemCountPlural": "{count} items",
"noItems": "No items in pantry.",
"colItem": "Item",
"colQuantity": "Quantity",
"colExpires": "Expires",
"expiredDaysAgo": "Expired {days}d ago",
"scan": "Scan",
"scanTitle": "Add by scan",
"scanDescription": "Scan a barcode or take a photo to quickly add pantry items.",
"scanBarcodeOption": "Scan barcode",
"scanPhotoOption": "Take/upload photo",
"scanBarcodeTitle": "Scan barcode",
"scanBarcodeDescription": "Point your camera at a product barcode.",
"scanConfirmTitle": "Confirm item",
"scanConfirmDescription": "Review and edit before adding to your pantry.",
"scanAnalyzingTitle": "Analyzing photo",
"scanAnalyzingDescription": "Identifying items in your photo…",
"scanBack": "Back",
"scanAddToPantry": "Add to pantry",
"scanAdded": "Added to pantry",
"scanLookupFailed": "Barcode lookup failed",
"scanNotFound": "Product not found. Try a photo scan instead.",
"scanPhotoFailed": "Photo scan failed",
"scanNoItemsFound": "No items recognized in this photo",
"cameraError": "Couldn't access the camera"
},
"feed": {
"title": "Feed",
"followEmpty": "Follow chefs to see their recipes here.",
"followEmptyDescription": "Your following feed fills up as soon as you follow a few people.",
"followEmptyDescriptionExplore": "Search for people above and follow a few chefs to see their recipes here.",
"findPeople": "Find people to follow",
"noNew": "No new recipes from people you follow.",
"following": "Following",
"trending": "Trending",
"trendingEmpty": "No trending recipes this week.",
"forYou": "For You",
"forYouEmpty": "Favorite or rate some recipes to get personalized picks here.",
"loading": "Loading…",
"loadMore": "Load more",
"loadFailed": "Failed to load recipes. Check your connection and try again.",
"retry": "Retry"
},
"shoppingLists": {
"title": "Shopping Lists",
"subtitle": "Plan your grocery runs",
"qrCodeAlt": "QR code linking to this shopping list",
"qrCodeCaption": "Scan to view online",
"empty": "No shopping lists yet",
"emptyDescription": "Generate one from a meal plan, or start one from scratch.",
"listEmpty": "Empty",
"generated": "Generated",
"shareTitle": "Share shopping list",
"shareDescription": "Invite household members to view or edit this list.",
"sharedWithYou": "Shared with you",
"sendToGroceryDelivery": "Send to grocery delivery",
"copyAsText": "Copy list as text",
"sendToInstacart": "Send to Instacart",
"copiedToClipboard": "List copied to clipboard",
"exportBuildFailed": "Could not build export",
"instacartNotConfigured": "Instacart isn't configured yet",
"alreadyInPantry": "Already in pantry",
"items": "{checked}/{total} items",
"itemsChecked": "{checked}/{total} items checked",
"fromMealPlan": " · From meal plan",
"itemCount": "{count} item",
"itemCountPlural": "{count} items",
"addToList": "Add to list",
"dialogTitle": "Add to shopping list",
"dialogDescription": "Add the ingredients of <strong>{title}</strong> to a shopping list.",
"scaledSuffix": "scaled)",
"loadingLists": "Loading your lists…",
"modeExisting": "Add to existing list",
"modeNew": "Create new list",
"listNamePlaceholder": "List name",
"ingredientsWillBeAdded": "{count, plural, one {1 ingredient will be added.} other {{count} ingredients will be added.}}",
"adding": "Adding…",
"addIngredients": "Add ingredients",
"addedCount": "{count} ingredients added to list",
"actionsMenuLabel": "List actions",
"rename": "Rename",
"renameListTitle": "Rename list",
"renameListLabel": "List name",
"renaming": "Saving…",
"listRenamed": "List renamed",
"listRenameFailed": "Failed to rename list",
"deleteListConfirmTitle": "Delete list?",
"deleteListConfirmDescription": "This action cannot be undone. The list and all its items will be permanently deleted.",
"listDeleted": "List deleted",
"listDeleteFailed": "Failed to delete list",
"changeCategory": "Change category",
"deleteItem": "Delete item",
"aisleOther": "Other",
"newCategoryPlaceholder": "New category…",
"addCategory": "Add",
"categories": {
"produce": "Produce",
"dairyEggs": "Dairy & Eggs",
"meatSeafood": "Meat & Seafood",
"bakery": "Bakery",
"frozen": "Frozen",
"pantry": "Pantry",
"spicesCondiments": "Spices & Condiments",
"beverages": "Beverages"
}
},
"collections": {
"title": "Collections",
"subtitle": "Curate your favorite recipes into collections",
"empty": "No collections yet",
"emptyDescription": "Group your recipes by theme, occasion, or however makes sense to you.",
"emptyCollection": "No recipes in this collection yet.",
"public": "Public",
"recipeCount": "{count} recipe",
"recipeCountPlural": "{count} recipes",
"discoverTitle": "Discover",
"discoverSubtitle": "Trending and recently shared public collections",
"myCollectionsLink": "My collections",
"trendingThisWeek": "Trending this week",
"recentlyAdded": "Recently added",
"noTrending": "No trending collections yet",
"noRecent": "No public collections yet",
"exportPdf": "Export as PDF",
"shareTitle": "Share collection",
"shareDescription": "Invite people to view or edit this collection.",
"new": "New collection",
"newTitle": "New collection",
"nameLabel": "Name",
"namePlaceholder": "Weekend dinners",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Optional…",
"makePublic": "Make public",
"creating": "Creating…",
"create": "Create",
"createFailed": "Failed to create",
"forking": "Forking…",
"forkCollection": "Fork collection",
"forkFailed": "Fork failed",
"selectRecipes": "Select",
"moveToCollection": "Move to…",
"removeFromCollection": "Remove",
"removedFromCollection": "{count, plural, one {1 recipe removed from this collection} other {{count} recipes removed from this collection}}",
"removeFromCollectionFailed": "Failed to remove from collection",
"removeFromCollectionConfirmTitle": "{count, plural, one {Remove 1 recipe from this collection?} other {Remove {count} recipes from this collection?}}",
"removeFromCollectionConfirmDescription": "The recipe itself won't be deleted, just removed from this collection."
},
"shareDialog": {
"invite": "Invite",
"emailPlaceholder": "Email address",
"owner": "Owner",
"viewer": "Viewer",
"editor": "Editor",
"loadingMembers": "Loading members…",
"noMembers": "No members yet.",
"invitationSent": "Invitation sent",
"alreadyMember": "Already a member",
"userNotFound": "User not found",
"inviteFailed": "Could not invite user",
"loadMembersFailed": "Could not load members",
"memberRemoved": "Member removed",
"removeMemberFailed": "Could not remove member",
"enterEmail": "Enter an email address",
"publicLinkTitle": "Public link",
"publicLinkDescription": "Anyone with the link can view this list.",
"publicLinkToggleFailed": "Could not update the public link",
"publicEditableTitle": "Allow editing",
"publicEditableDescription": "Anyone with the link can check off, add, and reorder items — no account needed.",
"copyLink": "Copy link",
"linkCopied": "Link copied",
"copyLinkFailed": "Could not copy link"
},
"social": {
"followed": "Following",
"unfollowed": "Unfollowed",
"commentFailed": "Failed to post comment",
"deleted": "Deleted",
"ratingSaved": "Rating saved",
"collectionCreated": "Collection created",
"collectionForked": "Collection forked to your library",
"inviteSent": "Invitation sent",
"memberRemoved": "Member removed",
"replyPlaceholder": "Reply…",
"commentPlaceholder": "Share your thoughts…",
"commentsTitle": "Comments",
"noCommentsYet": "No comments yet. Be the first!",
"deleteCommentTitle": "Delete comment?",
"deleteCommentDescription": "This action cannot be undone.",
"blockConfirmTitle": "Block @{username}?",
"blockConfirmDescription": "They won't be able to follow you or comment on your recipes.",
"blockConfirmAction": "Block",
"loadMoreComments": "Load more comments",
"loadingMoreComments": "Loading…",
"postButton": "Post",
"postingButton": "Posting…",
"replyButton": "Reply",
"reportButton": "Report",
"ratingFailed": "Failed to rate",
"cookedItPrompt": "Cooked it? Rate it and share a photo",
"reviewTextPlaceholder": "How did it turn out?",
"reviewPhotoAdd": "Add photo",
"reviewPhotoUploading": "Uploading…",
"reviewPhotoFailed": "Failed to upload photo",
"reviewSubmit": "Post review",
"reviewSubmitting": "Posting…",
"reviewsTitle": "{count, plural, one {# review} other {# reviews}}",
"justNow": "just now",
"minutesAgo": "{mins}m ago",
"hoursAgo": "{hours}h ago",
"daysAgo": "{days}d ago",
"signInToReact": "Sign in to react to comments",
"reactionFailed": "Failed to update reaction",
"addReaction": "Add {type} reaction",
"removeReaction": "Remove {type} reaction",
"favoriteAdd": "Save recipe",
"favoriteRemove": "Unsave recipe"
},
"cookingMode": {
"cooking": "Cooking",
"stepOf": "Step {current} of {total}",
"batchPrepLabel": "Prep",
"ingredients": "Ingredients",
"startTimer": "Start timer",
"timerDone": "Done",
"pause": "Pause",
"reset": "Reset",
"previous": "Previous",
"next": "Next",
"finish": "Done!",
"voiceNotSupported": "Voice not supported in this browser",
"voiceError": "Voice error — try again",
"enableVoice": "Enable voice control",
"stopVoice": "Stop voice",
"toggleIngredients": "Toggle ingredients",
"pageTitle": "Cooking: {title}",
"pageTitleFallback": "Cooking Mode",
"shortcutsTitle": "Shortcuts & commands",
"keyboardSection": "Keyboard",
"voiceSection": "Voice commands",
"enableMicFirst": "Enable voice via the mic button first.",
"stepRepeatPrefix": "Step {n}: ",
"shortcuts": {
"nextStep": "Next step",
"prevStep": "Previous step",
"startTimer": "Start timer",
"toggleHelp": "Toggle this panel",
"exitMode": "Exit cook mode"
},
"voiceLabels": {
"nextCmd": "next / continue",
"prevCmd": "previous / back",
"timerCmd": "timer / start",
"stopCmd": "stop / pause",
"resetCmd": "reset",
"repeatCmd": "repeat / again",
"nextLabel": "Next step",
"prevLabel": "Previous step",
"timerLabel": "Start timer",
"stopLabel": "Pause timer",
"resetLabel": "Reset timer",
"repeatLabel": "Re-read step"
}
},
"settingsForm": {
"notificationCategories": {
"title": "Notification categories",
"description": "Choose which push notifications you want to receive.",
"follow": "New followers",
"comment": "Comments on your recipes",
"reply": "Replies to your comments",
"reaction": "Reactions to your comments",
"rating": "Ratings on your recipes",
"mention": "Mentions in comments",
"leftoverExpiring": "Leftovers expiring soon",
"shoppingList": "Shared shopping list updates"
},
"profile": "Profile",
"changePhoto": "Change photo",
"useGravatar": "Use Gravatar",
"useGravatarDescription": "Show a Gravatar photo when you haven't uploaded one — sends an MD5 hash of your email to gravatar.com. Off by default.",
"removePhoto": "Remove photo",
"avatarUploadSuccess": "Profile photo updated",
"avatarUploadFailed": "Failed to update profile photo",
"avatarRemoved": "Profile photo removed",
"displayName": "Display name",
"username": "Username",
"usernameDescription": "Your profile URL and how people find you when following or mentioning you.",
"usernameInvalid": "3-20 characters: lowercase letters, numbers, and underscores only.",
"usernameTaken": "That username is already taken.",
"email": "Email",
"emailReadOnly": "Email cannot be changed here.",
"saving": "Saving…",
"title": "Settings",
"subtitle": "Manage your account and preferences",
"language": "Language",
"languageDescription": "Choose your preferred language for the app and AI-generated content.",
"changeEmail": "Change email",
"newEmail": "New email address",
"changeEmailDescription": "A verification link will be sent to your new address before it takes effect.",
"sendVerification": "Send verification",
"sendingVerification": "Sending…",
"emailChangeSent": "Verification email sent. Check your inbox.",
"emailChangeFailed": "Failed to send verification email.",
"changePassword": "Change password",
"currentPassword": "Current password",
"newPassword": "New password",
"confirmPassword": "Confirm new password",
"passwordMismatch": "Passwords don't match.",
"changingPassword": "Changing…",
"changePasswordButton": "Change password",
"passwordChanged": "Password changed successfully.",
"passwordChangeFailed": "Failed to change password.",
"downloadData": "Download my data",
"downloadDataDescription": "Get a JSON export of all the personal data Epicure holds about you — your profile, recipes, activity, and settings.",
"downloadDataButton": "Download my data",
"twoFactorTitle": "Two-factor authentication",
"twoFactorDescription": "Require a code from an authenticator app in addition to your password when signing in.",
"twoFactorEnableButton": "Enable",
"twoFactorDisableButton": "Disable",
"twoFactorEnabled": "Two-factor authentication enabled",
"twoFactorDisabled": "Two-factor authentication disabled",
"twoFactorEnableFailed": "Failed to start setup",
"twoFactorDisableFailed": "Failed to disable",
"twoFactorConfirmPasswordTitle": "Confirm your password",
"twoFactorConfirmPasswordDescription": "Enter your password to set up two-factor authentication.",
"twoFactorContinue": "Continue",
"twoFactorCancel": "Cancel",
"twoFactorSetupTitle": "Set up two-factor authentication",
"twoFactorSetupDescription": "Scan this code with your authenticator app (like Google Authenticator or 1Password), then enter the 6-digit code it shows.",
"twoFactorQrAlt": "QR code for two-factor authentication setup",
"twoFactorBackupCodesLabel": "Backup codes",
"twoFactorBackupCodesHint": "Save these somewhere safe — each one can be used once to sign in if you lose access to your authenticator app.",
"twoFactorCopyCodes": "Copy codes",
"twoFactorCodesCopied": "Copied",
"twoFactorCopyFailed": "Failed to copy",
"twoFactorCodeLabel": "6-digit code",
"twoFactorVerifyAndEnable": "Verify & enable",
"twoFactorInvalidCode": "Invalid code",
"twoFactorDisableTitle": "Disable two-factor authentication",
"twoFactorDisableDescription": "Your account will only need your password to sign in.",
"webhookCreateFailed": "Failed to create webhook",
"webhookDeleteFailed": "Failed to delete webhook",
"webhookUpdateFailed": "Failed to update webhook",
"redeliverySuccess": "Redelivery queued",
"redeliveryFailed": "Failed to redeliver",
"apiKeyCreateFailed": "Failed to create API key",
"apiKeyRevokeFailed": "Failed to revoke API key",
"apiKeyNamePlaceholder": "e.g. My app",
"apiKeyNameLabel": "Key name",
"apiKeyCreating": "Creating…",
"apiKeyCreate": "Create",
"apiKeyRevealNotice": "Save this key — it will not be shown again.",
"copy": "Copy",
"copied": "Copied!",
"dismiss": "Dismiss",
"noApiKeys": "No API keys yet.",
"createdOn": "Created {date}",
"lastUsedOn": "Last used {date}",
"neverUsed": "Never used",
"revoke": "Revoke",
"apiKeyScopeFull": "Full access",
"apiKeyScopeRead": "Read-only",
"apiKeyScopeHelp": "Read-only keys can only make GET requests — they can't create, edit, or delete anything.",
"webhookUrlPlaceholder": "https://example.com/webhook",
"webhookAdding": "Adding…",
"webhookAddButton": "Add webhook",
"webhookDocsLink": "View webhook docs & Zapier integration →",
"endpointUrlLabel": "Endpoint URL",
"eventsLabel": "Events",
"eventsHint": "Select which events trigger this webhook. Leave all unchecked to receive all events.",
"secretRevealNotice": "Save this signing secret — it will not be shown again.",
"secretUsageHint": "Use it to verify the X-Epicure-Signature header on incoming requests.",
"noWebhooks": "No webhooks yet.",
"addedOn": "Added {date}",
"active": "Active",
"inactive": "Inactive",
"allEvents": "All events",
"deliveries": "Deliveries",
"disable": "Disable",
"enable": "Enable",
"noDeliveriesYet": "No deliveries yet.",
"modelDefaultPlaceholder": "Default",
"modelNamePlaceholder": "e.g. llama3.2",
"copyFailed": "Failed to copy to clipboard",
"byokSaved": "{provider} key saved",
"byokSaveFailed": "Failed to save key",
"byokRemoved": "{provider} key removed",
"byokRemoveFailed": "Failed to remove key",
"byokConfigured": "Configured",
"byokOllamaHint": "Set via OLLAMA_BASE_URL env var",
"byokSaving": "Saving…",
"byokSave": "Save",
"byokFooter": "Your keys are encrypted at rest. When set, they override the app's default keys for your account.",
"modelSaved": "Model preferences saved",
"modelSaveFailed": "Failed to save",
"useCaseText": "Text generation",
"useCaseTextDesc": "Recipe generation, variations, translations, adapt",
"useCaseVision": "Vision / photo import",
"useCaseVisionDesc": "Dish recognition, recipe import from photo",
"useCaseMealPlan": "Meal planning",
"useCaseMealPlanDesc": "Weekly meal plan generation",
"providerLabel": "Provider",
"modelLabel": "Model",
"defaultAuto": "Default (auto)",
"modelDefault": "Default",
"modelSaving": "Saving…",
"saveModelPrefs": "Save model preferences",
"userUpdated": "User updated successfully",
"userUpdateFailed": "Failed to save",
"adminSettingsSaved": "Settings saved",
"adminSettingsFailed": "Failed to save settings",
"nutritionGoalsSaved": "Nutrition goals saved",
"bio": "Bio",
"publicBio": "Public bio",
"publicBioDescription": "Shown on your public profile.",
"publicBioPlaceholder": "Tell other cooks about yourself…",
"privateBio": "AI context (private)",
"privateBioDescription": "Never shown publicly. Injected into AI prompts to personalise suggestions — add your dietary preferences, kitchen equipment, cooking skill level, allergies, etc.",
"privateBioPlaceholder": "e.g. I'm vegetarian, have a stand mixer and an air fryer, intermediate cook, allergic to tree nuts, prefer Mediterranean flavours…",
"privateAccount": "Private account",
"privateAccountDescription": "When on, your profile and recipes won't appear in search or discovery (Explore, Trending, For You). People who already follow you keep seeing your recipes."
},
"profilePage": {
"tabRecipes": "Recipes",
"tabHistory": "Cooking History",
"tabPhotos": "Photos",
"statTotalCooked": "Total times cooked",
"statStreak": "Current streak",
"statLastCooked": "Last cooked",
"streakDays": "{count, plural, one {# day} other {# days}}",
"noneYet": "None yet",
"recentActivity": "Recent activity",
"noHistoryYet": "No cooking history yet.",
"noPhotosYet": "No photos yet.",
"previous": "Previous",
"next": "Next",
"pageOf": "Page {page} of {total}"
}
}