{ "@@locale": "en", "appTitle": "Recipe App", "retryAction": "Retry", "mealPlanTitle": "Meal plan", "mealPlanLoading": "Loading meal plan...", "mealPlanWeekPrevious": "Previous week", "mealPlanWeekNext": "Next week", "mealPlanWeekCurrent": "Current week", "mealPlanDayNoRecipe": "Nothing planned", "mealPlanSelectRecipe": "Choose recipe", "mealPlanViewRecipe": "View recipe", "mealPlanServingsLabel": "Servings", "mealPlanResetServings": "Reset", "mealPlanSaving": "Saving...", "mealPlanPlannedRecipes": "{count, plural, one {# recipe planned} other {# recipes planned}}", "@mealPlanPlannedRecipes": { "placeholders": { "count": { "type": "int" } } }, "mealPlanShoppingTitle": "Shopping list", "mealPlanPickRecipeHint": "Choose recipes above to see the combined ingredient list.", "mealPlanNoShoppingItems": "No ingredients to show for this week.", "mealPlanNoRecipesTitle": "There are no recipes to plan yet.", "mealPlanNoRecipesDescription": "Create at least one recipe first, then add it to the meal plan.", "mealPlanMissingCount": "{count, plural, one {# missing} other {# missing}}", "@mealPlanMissingCount": { "placeholders": { "count": { "type": "int" } } }, "mealPlanPartialCount": "{count, plural, one {# partially at home} other {# partially at home}}", "@mealPlanPartialCount": { "placeholders": { "count": { "type": "int" } } }, "mealPlanEnoughCount": "{count, plural, one {# at home} other {# at home}}", "@mealPlanEnoughCount": { "placeholders": { "count": { "type": "int" } } }, "mealPlanPantryCount": "{count, plural, one {# pantry staple} other {# pantry staples}}", "@mealPlanPantryCount": { "placeholders": { "count": { "type": "int" } } }, "mealPlanAllAtHome": "You already have everything at home.", "mealPlanStatusMissing": "Missing", "mealPlanStatusPartial": "Partially at home", "mealPlanStatusEnough": "At home", "mealPlanStatusPantry": "Pantry staple", "loginTitle": "Sign in", "usernameLabel": "Username", "usernameRequired": "Enter your username.", "passwordLabel": "Password", "passwordRequired": "Enter your password.", "loginAction": "Sign in", "sessionExpiredError": "Your session has expired. Sign in again.", "forbiddenError": "You do not have permission to use this feature.", "serverError": "A server error occurred. Try again in a moment.", "networkError": "Network error. Check your connection and try again.", "unexpectedError": "An unexpected error occurred.", "cancelAction": "Cancel", "saveAction": "Save", "deleteAction": "Delete", "addAction": "Add", "editTooltip": "Edit", "deleteTooltip": "Delete", "loadingLabel": "Loading...", "cannotBeUndone": "This action cannot be undone.", "yesLabel": "Yes", "noLabel": "No", "commentLabel": "Comment", "commentOptionalLabel": "Comment (optional)", "openedLabel": "Opened", "quantityLabel": "Quantity *", "quantityHint": "Enter quantity", "invalidNumber": "Invalid number", "unitLabel": "Unit *", "selectDateLabel": "Select date", "locationOptionalLabel": "Location (optional)", "locationLabel": "Location", "brandOptionalLabel": "Brand (optional)", "brandLabel": "Brand", "enterPositiveNumber": "Enter a positive number", "inventoryTitle": "Inventory", "inventoryFilterAndSort": "Filter and sorting", "inventorySortLatest": "Latest added", "inventorySortNameAsc": "Name A-Z", "inventorySortBestBeforeAsc": "Best before ascending", "inventorySortBestBeforeDesc": "Best before descending", "inventorySortLabel": "Sort", "inventoryAllFilter": "All", "inventoryEmpty": "Inventory is empty.", "inventoryLoading": "Loading inventory...", "inventoryCreateTitle": "Add inventory item", "inventoryEditTitle": "Edit inventory item", "inventorySelectProduct": "Select a product from the list.", "inventoryDeleteTitle": "Delete inventory item?", "inventoryProductLabel": "Product", "inventoryQuantityDisplayLabel": "Quantity", "inventoryLocationDisplayLabel": "Location", "inventoryBrandDisplayLabel": "Brand", "inventoryPurchaseDateLabel": "Purchase date", "inventoryBestBeforeLabel": "Best before", "inventoryPurchaseDatePrefix": "Purchase: ", "inventoryBestBeforeDatePrefix": "Best before: ", "inventoryConsumeAction": "Consume", "inventoryHistoryAction": "Consumption history", "inventoryConsumeAmountLabel": "Amount to consume *", "inventoryHistoryLoading": "Loading history...", "inventoryHistoryEmpty": "No consumption history exists.", "inventoryRecipesAction": "Recipes", "inventoryHistoryTitle": "History: {name}", "@inventoryHistoryTitle": { "placeholders": { "name": { "type": "String" } } }, "inventoryConsumeNameTitle": "Consume: {name}", "@inventoryConsumeNameTitle": { "placeholders": { "name": { "type": "String" } } }, "inventoryAvailableLabel": "Available: {quantity} {unit}", "@inventoryAvailableLabel": { "placeholders": { "quantity": { "type": "String" }, "unit": { "type": "String" } } }, "pantryDescription": "Products you always expect to have at home.", "pantryLoading": "Loading pantry...", "pantryNoLocation": "No location selected", "pantryInvalidQuantity": "Enter a valid quantity greater than 0.", "pantryRemoveTitle": "Remove from pantry?", "pantryOtherCategory": "Other", "pantryGoToRecipesTooltip": "Go to recipes", "pantryAddToInventoryTitle": "Add \"{name}\" to inventory", "@pantryAddToInventoryTitle": { "placeholders": { "name": { "type": "String" } } }, "pantryItemAdded": "{name} added to inventory.", "@pantryItemAdded": { "placeholders": { "name": { "type": "String" } } }, "pantryRemoveContent": "Do you want to remove \"{name}\"?", "@pantryRemoveContent": { "placeholders": { "name": { "type": "String" } } }, "recipesLoading": "Loading recipes...", "recipesEmpty": "No recipes found", "recipesEmptyDescription": "Add a recipe to get started.", "recipesNewTooltip": "New recipe", "recipeDetailLoading": "Loading recipe...", "recipeDetailMakePrivate": "Make private", "recipeDetailMakePublic": "Make public", "recipeDetailShareWithUser": "Share with user", "recipeDetailGoToInventory": "Go to inventory", "recipeDetailShareTitle": "Share recipe", "recipeDetailUsernameLabel": "Username", "recipeDetailUsernameHint": "e.g. anna", "recipeDetailRemoveShare": "Remove sharing", "recipeDetailShareAction": "Share", "recipeDetailDeleteTitle": "Delete recipe?", "recipeDetailNowPublic": "The recipe is now public.", "recipeDetailNowPrivate": "The recipe is now private.", "recipeDetailServings": "servings", "recipeDetailIngredients": "Ingredients", "recipeDetailInstructions": "Instructions", "recipeDetailBackToList": "Back to recipe list", "recipeDetailSharingRemoved": "Sharing removed for {user}", "@recipeDetailSharingRemoved": { "placeholders": { "user": { "type": "String" } } }, "recipeDetailSharedWith": "Recipe shared with {user}", "@recipeDetailSharedWith": { "placeholders": { "user": { "type": "String" } } }, "recipeDetailDeleteContent": "Do you want to delete \"{title}\"? This action cannot be undone.", "@recipeDetailDeleteContent": { "placeholders": { "title": { "type": "String" } } }, "recipeCreateTitle": "New recipe", "recipeCreateReviewIngredients": "Review ingredients", "recipeCreateMarkdownPlaceholder": "# Recipe name\n\n## Ingredients\n- 500 g ground beef\n- 1 onion\n\n## Instructions\nFry the onion...", "recipeCreateMarkdownHint": "Paste or write a recipe in Markdown format.", "recipeCreateNameRequired": "Recipe name cannot be empty.", "recipeCreateSaveAction": "Save recipe", "recipeCreateServingsLabel": "Number of servings (optional)", "recipeCreateIngredientsLabel": "Ingredients", "recipeCreateIngredientsHint": "Check ingredients to include and select the right product.", "recipeCreateNoProductFound": "No product found — ingredient will be skipped.", "recipeEditTitle": "Edit recipe", "recipeEditNameLabel": "Recipe name", "recipeEditNameRequired": "Enter a recipe name.", "recipeEditDescriptionLabel": "Description (optional)", "recipeEditServingsLabel": "Number of servings (optional)", "recipeEditServingsInvalid": "Enter a whole number.", "recipeEditInstructionsLabel": "Instructions (optional)", "recipeEditIngredientsLabel": "Ingredients", "recipeEditIngredientsHint": "Select product, quantity and unit for each ingredient.", "recipeEditNoIngredients": "No ingredients added yet.", "recipeEditIngredientPrefix": "Ingredient ", "recipeEditRemoveIngredient": "Remove ingredient", "recipeEditMinIngredients": "At least one ingredient is required.", "recipeEditSelectProduct": "Select product for all ingredients.", "recipeEditValidQuantity": "Enter valid quantity for all ingredients.", "recipeEditSelectUnit": "Select unit for all ingredients.", "recipeEditSaveChanges": "Save changes", "importTabDescription": "Upload a PDF or image, or enter a recipe link — the recipe will be imported and opened directly in edit mode.", "importFileTabLabel": "File / PDF", "importLinkTabLabel": "Link", "importChooseFileAction": "Choose file (PDF, PNG, JPG, WEBP, BMP)", "importFileAction": "Import file", "importFileProcessing": "Parsing recipe — this can take up to a minute...", "importLinkAction": "Import from link", "importLinkLabel": "Recipe link", "importLinkHint": "https://example.com/recipe/...", "importWriteInstead": "Write recipe instead", "errorDialogTitle": "Error", "errorDialogClose": "Close", "errorDialogCopy": "Copy", "errorDialogCopied": "Error message copied!", "profileMyProfileTab": "My profile", "profileDatabaseTab": "Database", "profileUsersTab": "Users", "profilePendingTab": "Suggestions", "profileAiTab": "AI", "profileUsernameLabel": "Username", "profileEmailLabel": "E-mail", "profileEmailHint": "Enter an e-mail address", "profileEmailInvalid": "Invalid e-mail address", "profileFirstNameLabel": "First name", "profileLastNameLabel": "Last name", "profileSaveAction": "Save changes", "profileSaved": "Profile saved!", "profileInventoryTab": "Inventory", "profilePantryTab": "Pantry", "profileProductsTab": "Products", "profileAddInventoryItem": "Add inventory item", "profileOpenInventory": "Open inventory", "profileInventoryDescription": "Update and consume items in your inventory.", "profileOpenPantry": "Open pantry", "profilePantryDescription": "Manage items you always expect to have at home.", "adminChangeRole": "Change role", "adminGivePremium": "Give Premium", "adminRemovePremium": "Remove Premium", "adminAllowSharing": "Allow recipe sharing", "adminBlockSharing": "Block recipe sharing", "adminResetPassword": "Reset password", "adminTempPasswordTitle": "Temporary password", "adminCopyAction": "Copy", "adminCloseAction": "Close", "adminEmailLabel": "E-mail", "adminEmailInvalid": "Invalid e-mail address.", "adminEmailUpdated": "E-mail updated.", "adminDeleteUser": "Delete user", "adminDeleteUserConfirm": "Delete permanently? This cannot be undone.", "adminConfirmAction": "Confirm", "adminNewUser": "New user", "adminNoUsers": "No users found.", "adminAdminRole": "Admin", "adminUserRole": "User", "adminPremiumLabel": "Premium", "adminFreeLabel": "Free", "adminSharingOn": "Sharing: On", "adminSharingOff": "Sharing: Off", "adminUsersDescription": "Manage users directly from the profile page.", "adminDowngradeToUser": "Downgrade to user", "adminUpgradeToAdmin": "Upgrade to admin", "adminSortNewest": "Sort: Newest", "adminSortOldest": "Sort: Oldest", "adminSortNameAsc": "Sort: Name A-Z", "adminSortNameDesc": "Sort: Name Z-A", "adminSortCategoryAsc": "Sort: Category A-Z", "adminSortCategoryDesc": "Sort: Category Z-A", "adminSearchProduct": "Search product", "adminShowDeleted": "Show deleted", "adminOnlyUncategorized": "Only uncategorized", "adminBulkSetCategory": "Bulk: set category", "adminProductsUpdated": "Products updated.", "adminNoAiSuggestions": "No AI suggestions to show.", "adminMergeProducts": "Merge products", "adminMergeSelectSource": "Select which product should be moved into the other:", "adminMergeSource": "Source: ", "adminMergeTarget": "Target: ", "adminMergeAction": "Merge", "adminDeleteProduct": "Delete product", "adminProductDeleted": "Product deleted.", "adminProductsRestored": "Selected products restored.", "adminProductRestored": "Product restored.", "adminNoPendingProducts": "No pending product suggestions.", "adminCategoryPrefix": "Category: ", "adminSuggestedByPrefix": "Suggested by: ", "adminDatePrefix": "Date: ", "adminApproveAction": "Approve", "adminRejectAction": "Reject", "adminPendingDescription": "Approve or reject pending product suggestions directly from the profile page.", "adminAiDescription": "Overview of AI functions exposed by the backend.", "adminPagePrefix": "Page: ", "adminNewProductLabel": "New product", "adminPasswordMustChange": "The user must change their password at next login.", "adminChangeRoleConfirm": "Change {username} to {role}?", "@adminChangeRoleConfirm": { "placeholders": { "username": { "type": "String" }, "role": { "type": "String" } } }, "adminGivePremiumConfirm": "Give Premium for {username}", "@adminGivePremiumConfirm": { "placeholders": { "username": { "type": "String" } } }, "adminRemovePremiumConfirm": "Remove Premium for {username}", "@adminRemovePremiumConfirm": { "placeholders": { "username": { "type": "String" } } }, "adminAllowSharingConfirm": "Allow recipe sharing for {username}", "@adminAllowSharingConfirm": { "placeholders": { "username": { "type": "String" } } }, "adminBlockSharingConfirm": "Block recipe sharing for {username}", "@adminBlockSharingConfirm": { "placeholders": { "username": { "type": "String" } } }, "adminResetPasswordContent": "Generate a temporary password for {username}", "@adminResetPasswordContent": { "placeholders": { "username": { "type": "String" } } }, "adminPasswordTitle": "Password for {username}", "@adminPasswordTitle": { "placeholders": { "username": { "type": "String" } } }, "adminChangeEmailTitle": "Change e-mail for {username}", "@adminChangeEmailTitle": { "placeholders": { "username": { "type": "String" } } }, "adminDeleteProductContent": "Delete {name}? The product can be restored later.", "@adminDeleteProductContent": { "placeholders": { "name": { "type": "String" } } }, "adminAiAppliedCount": "AI suggestions applied to {count} products.", "@adminAiAppliedCount": { "placeholders": { "count": { "type": "int" } } }, "adminCategoryUpdated": "Category updated for {name}", "@adminCategoryUpdated": { "placeholders": { "name": { "type": "String" } } }, "adminProductUpdated": "Product updated for {name}", "@adminProductUpdated": { "placeholders": { "name": { "type": "String" } } }, "adminPremiumConfirm": "{action} Premium for {username}?", "@adminPremiumConfirm": { "placeholders": { "action": { "type": "String" }, "username": { "type": "String" } } }, "adminSharingConfirm": "{action} recipe sharing for {username}?", "@adminSharingConfirm": { "placeholders": { "action": { "type": "String" }, "username": { "type": "String" } } }, "adminResetPasswordConfirm": "Generate a temporary password for {username}?", "@adminResetPasswordConfirm": { "placeholders": { "username": { "type": "String" } } }, "adminTempPasswordForUser": "Password for {username}:", "@adminTempPasswordForUser": { "placeholders": { "username": { "type": "String" } } }, "adminEmailEditTitle": "Change e-mail for {username}", "@adminEmailEditTitle": { "placeholders": { "username": { "type": "String" } } }, "adminEmailAction": "Change e-mail", "adminUserCreated": "User {username} created.", "@adminUserCreated": { "placeholders": { "username": { "type": "String" } } }, "adminCreateUserTitle": "Create user", "adminMinChars2": "At least 2 characters", "adminMinChars8": "At least 8 characters", "adminPasswordLabel": "Password", "adminRoleLabel": "Role", "adminCreateAction": "Create", "adminUsersDescription": "Manage users directly from the profile page.", "adminDowngradeToUser": "Downgrade to user", "adminUpgradeToAdmin": "Upgrade to admin", "adminSharingOn": "Sharing: On", "adminSharingOff": "Sharing: Off", "adminMergeProductsTitle": "Merge products", "adminMergeProductsHint": "Select which product should be moved into the other:", "adminMergeAction": "Merge", "adminMerge2Selected": "Merge 2 selected", "adminProductsMerged": "Products merged.", "adminDeleteProductTitle": "Delete product", "adminDeleteProductConfirm": "Delete {name}? The product can be restored later.", "@adminDeleteProductConfirm": { "placeholders": { "name": { "type": "String" } } }, "adminProductDeleted": "Product deleted.", "adminProductsUpdated": "Products updated.", "adminNoAiSuggestions": "No AI suggestions to show.", "adminAiSuggestionsTitle": "AI suggestions", "adminAiApplied": "AI suggestions applied to {count} products.", "@adminAiApplied": { "placeholders": { "count": { "type": "int" } } }, "adminApplySelected": "Apply ({count})", "@adminApplySelected": { "placeholders": { "count": { "type": "int" } } }, "adminUpdateSelected": "Update selected ({count})", "@adminUpdateSelected": { "placeholders": { "count": { "type": "int" } } }, "adminAiCategorizeAll": "AI-categorize uncategorized", "adminAiCategorizeSelected": "AI-categorize selected ({count})", "@adminAiCategorizeSelected": { "placeholders": { "count": { "type": "int" } } }, "adminRestoreSelected": "Restore selected ({count})", "@adminRestoreSelected": { "placeholders": { "count": { "type": "int" } } }, "adminSearchProduct": "Search product", "adminShowDeleted": "Show deleted", "adminShowUncategorized": "Uncategorized only", "adminBulkSetCategory": "Bulk: set category", "adminRemoveCategory": "Remove category", "adminNoProductsFound": "No products match the filter.", "adminInlineCategory": "Category (inline)", "adminNoCategory": "No category", "adminRestoreAction": "Restore", "required": "Required", "logoutAction": "Log out", "adminAiDescription": "Overview of AI features exposed by the backend.", "adminPagePrefix": "Page: ", "profileDatabaseDescription": "The database tab covers the same main areas as in recipe-frontend." }