Merge remote-tracking branch 'upstream/dev' into localization

This commit is contained in:
Florian Dupret 2021-05-07 08:35:12 +02:00
commit 715977397a
196 changed files with 4152 additions and 2297 deletions

19
.vscode/settings.json vendored
View file

@ -1,28 +1,19 @@
{ {
"python.formatting.provider": "black", "python.formatting.provider": "black",
"python.pythonPath": ".venv/bin/python3.9", "python.pythonPath": ".venv/bin/python3.9",
"python.linting.pylintEnabled": true, "python.linting.pylintEnabled": false,
"python.linting.enabled": true, "python.linting.enabled": true,
"python.testing.unittestEnabled": false, "python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false, "python.testing.nosetestsEnabled": false,
"python.testing.pytestEnabled": true, "python.testing.pytestEnabled": true,
"python.testing.autoTestDiscoverOnSaveEnabled": false, "python.testing.autoTestDiscoverOnSaveEnabled": false,
"python.testing.pytestArgs": ["tests"], "python.testing.pytestArgs": ["tests"],
"cSpell.enableFiletypes": [ "cSpell.enableFiletypes": ["!javascript", "!python", "!yaml"],
"!javascript",
"!python",
"!yaml"
],
"i18n-ally.localesPaths": "frontend/src/locales/messages", "i18n-ally.localesPaths": "frontend/src/locales/messages",
"i18n-ally.sourceLanguage": "en-US", "i18n-ally.sourceLanguage": "en-US",
"i18n-ally.enabledFrameworks": ["vue"], "i18n-ally.enabledFrameworks": ["vue"],
"i18n-ally.keystyle": "nested", "i18n-ally.keystyle": "nested",
"cSpell.words": [ "cSpell.words": ["compression", "hkotel", "performant", "postgres", "webp"],
"compression", "search.mode": "reuseEditor",
"hkotel", "python.linting.flake8Enabled": true
"performant",
"postgres",
"webp"
],
"search.mode": "reuseEditor"
} }

View file

@ -6,12 +6,12 @@
:80 { :80 {
@proxied path /api/* /docs /openapi.json @proxied path /api/* /docs /openapi.json
root * /app/dist encode gzip zstd
encode gzip
uri strip_suffix / uri strip_suffix /
handle_path /api/recipes/image/* { # Handles Recipe Images / Assets
root * /app/data/img/ handle_path /api/media/recipes/* {
root * /app/data/recipes/
file_server file_server
} }
@ -20,8 +20,8 @@
} }
handle { handle {
try_files {path}.html {path} / root * /app/dist
try_files {path}.html {path} /index.html
file_server file_server
} }
} }

9
Caddyfile.dev Normal file
View file

@ -0,0 +1,9 @@
{
admin off
}
localhost {
handle /mealie/* {
reverse_proxy http://127.0.0.1:9090
}
}

View file

@ -57,14 +57,16 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
## Key Features ## Key Features
- 🔍 Fuzzy search - 🔍 Fuzzy search
- 🏷️ Tag recipes with categories or tags to flexible sorting - 🏷️ Tag recipes with categories or tags for flexible sorting
- 🕸 Import recipes from around the web by URL - 🕸 Import recipes from around the web by URL
- 💪 Powerful bulk Category/Tag assignment
- 📱 Beautiful Mobile Views - 📱 Beautiful Mobile Views
- 📆 Create Meal Plans - 📆 Create Meal Plans
- 🛒 Generate shopping lists - 🛒 Generate shopping lists
- 🐳 Easy setup with Docker - 🐳 Easy setup with Docker
- 🎨 Customize your interface with color themes layouts - 🎨 Customize your interface with color themes
- 💾 Export all your data in any format with Jinja2 Templates, with easy data restoration from the user interface. - 💾 Export all your data in any format with Jinja2 Templates
- 🔒 Keep your data safe with automated backup and easy restore options
- 🌍 localized in many languages - 🌍 localized in many languages
- Plus tons more! - Plus tons more!
- Flexible API - Flexible API

View file

@ -1,12 +1,10 @@
import json import json
import re import re
from pathlib import Path from pathlib import Path
from typing import Optional
import slugify import slugify
from jinja2 import Template from jinja2 import Template
from mealie.app import app from mealie.app import app
from pydantic import BaseModel
CWD = Path(__file__).parent CWD = Path(__file__).parent
OUT_FILE = CWD.joinpath("output", "app_routes.py") OUT_FILE = CWD.joinpath("output", "app_routes.py")

View file

@ -2,25 +2,32 @@ class AppRoutes:
def __init__(self) -> None: def __init__(self) -> None:
self.prefix = "/api" self.prefix = "/api"
self.users_sign_ups = "/api/users/sign-ups"
self.auth_token = "/api/auth/token" self.auth_token = "/api/auth/token"
self.auth_token_long = "/api/auth/token/long" self.auth_token_long = "/api/auth/token/long"
self.auth_refresh = "/api/auth/refresh" self.auth_refresh = "/api/auth/refresh"
self.users_sign_ups = "/api/users/sign-ups"
self.users = "/api/users" self.users = "/api/users"
self.users_self = "/api/users/self" self.users_self = "/api/users/self"
self.users_api_tokens = "/api/users-tokens"
self.groups = "/api/groups" self.groups = "/api/groups"
self.groups_self = "/api/groups/self" self.groups_self = "/api/groups/self"
self.recipes = "/api/recipes" self.recipes_summary = "/api/recipes/summary"
self.recipes_summary_untagged = "/api/recipes/summary/untagged"
self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
self.recipes_category = "/api/recipes/category" self.recipes_category = "/api/recipes/category"
self.recipes_tag = "/api/recipes/tag" self.recipes_tag = "/api/recipes/tag"
self.categories = "/api/categories"
self.recipes_tags = "/api/recipes/tags/"
self.recipes_create = "/api/recipes/create" self.recipes_create = "/api/recipes/create"
self.recipes_create_url = "/api/recipes/create-url" self.recipes_create_url = "/api/recipes/create-url"
self.categories = "/api/categories"
self.categories_empty = "/api/categories/empty"
self.tags = "/api/tags"
self.tags_empty = "/api/tags/empty"
self.about_events = "/api/about/events"
self.meal_plans_all = "/api/meal-plans/all" self.meal_plans_all = "/api/meal-plans/all"
self.meal_plans_create = "/api/meal-plans/create" self.meal_plans_create = "/api/meal-plans/create"
self.meal_plans_this_week = "/api/meal-plans/this-week" self.meal_plans_this_week = "/api/meal-plans/this-week"
self.meal_plans_today = "/api/meal-plans/today" self.meal_plans_today = "/api/meal-plans/today"
self.meal_plans_today_image = "/api/meal-plans/today/image"
self.site_settings_custom_pages = "/api/site-settings/custom-pages" self.site_settings_custom_pages = "/api/site-settings/custom-pages"
self.site_settings = "/api/site-settings" self.site_settings = "/api/site-settings"
self.site_settings_webhooks_test = "/api/site-settings/webhooks/test" self.site_settings_webhooks_test = "/api/site-settings/webhooks/test"
@ -30,8 +37,12 @@ class AppRoutes:
self.backups_export_database = "/api/backups/export/database" self.backups_export_database = "/api/backups/export/database"
self.backups_upload = "/api/backups/upload" self.backups_upload = "/api/backups/upload"
self.migrations = "/api/migrations" self.migrations = "/api/migrations"
self.debug = "/api/debug"
self.debug_statistics = "/api/debug/statistics"
self.debug_version = "/api/debug/version" self.debug_version = "/api/debug/version"
self.debug_last_recipe_json = "/api/debug/last-recipe-json" self.debug_last_recipe_json = "/api/debug/last-recipe-json"
self.debug_log = "/api/debug/log"
self.utils_download = "/api/utils/download"
def users_sign_ups_token(self, token): def users_sign_ups_token(self, token):
return f"{self.prefix}/users/sign-ups/{token}" return f"{self.prefix}/users/sign-ups/{token}"
@ -48,21 +59,36 @@ class AppRoutes:
def users_id_password(self, id): def users_id_password(self, id):
return f"{self.prefix}/users/{id}/password" return f"{self.prefix}/users/{id}/password"
def users_api_tokens_token_id(self, token_id):
return f"{self.prefix}/users-tokens/{token_id}"
def groups_id(self, id): def groups_id(self, id):
return f"{self.prefix}/groups/{id}" return f"{self.prefix}/groups/{id}"
def categories_category(self, category):
return f"{self.prefix}/categories/{category}"
def recipes_tags_tag(self, tag):
return f"{self.prefix}/recipes/tags/{tag}"
def recipes_recipe_slug(self, recipe_slug): def recipes_recipe_slug(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}" return f"{self.prefix}/recipes/{recipe_slug}"
def recipes_recipe_slug_image(self, recipe_slug): def recipes_recipe_slug_image(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/image" return f"{self.prefix}/recipes/{recipe_slug}/image"
def recipes_recipe_slug_assets(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/assets"
def categories_category(self, category):
return f"{self.prefix}/categories/{category}"
def tags_tag(self, tag):
return f"{self.prefix}/tags/{tag}"
def media_recipes_recipe_slug_images_file_name(self, recipe_slug, file_name):
return f"{self.prefix}/media/recipes/{recipe_slug}/images/{file_name}"
def media_recipes_recipe_slug_assets_file_name(self, recipe_slug, file_name):
return f"{self.prefix}/media/recipes/{recipe_slug}/assets/{file_name}"
def about_events_id(self, id):
return f"{self.prefix}/about/events/{id}"
def meal_plans_plan_id(self, plan_id): def meal_plans_plan_id(self, plan_id):
return f"{self.prefix}/meal-plans/{plan_id}" return f"{self.prefix}/meal-plans/{plan_id}"
@ -72,8 +98,8 @@ class AppRoutes:
def site_settings_custom_pages_id(self, id): def site_settings_custom_pages_id(self, id):
return f"{self.prefix}/site-settings/custom-pages/{id}" return f"{self.prefix}/site-settings/custom-pages/{id}"
def themes_theme_name(self, theme_name): def themes_id(self, id):
return f"{self.prefix}/themes/{theme_name}" return f"{self.prefix}/themes/{id}"
def backups_file_name_download(self, file_name): def backups_file_name_download(self, file_name):
return f"{self.prefix}/backups/{file_name}/download" return f"{self.prefix}/backups/{file_name}/download"
@ -84,14 +110,14 @@ class AppRoutes:
def backups_file_name_delete(self, file_name): def backups_file_name_delete(self, file_name):
return f"{self.prefix}/backups/{file_name}/delete" return f"{self.prefix}/backups/{file_name}/delete"
def migrations_type_file_name_import(self, type, file_name): def migrations_import_type_file_name_import(self, import_type, file_name):
return f"{self.prefix}/migrations/{type}/{file_name}/import" return f"{self.prefix}/migrations/{import_type}/{file_name}/import"
def migrations_type_file_name_delete(self, type, file_name): def migrations_import_type_file_name_delete(self, import_type, file_name):
return f"{self.prefix}/migrations/{type}/{file_name}/delete" return f"{self.prefix}/migrations/{import_type}/{file_name}/delete"
def migrations_type_upload(self, type): def migrations_import_type_upload(self, import_type):
return f"{self.prefix}/migrations/{type}/upload" return f"{self.prefix}/migrations/{import_type}/upload"
def debug_log_num(self, num): def debug_log_num(self, num):
return f"{self.prefix}/debug/log/{num}" return f"{self.prefix}/debug/log/{num}"

View file

@ -6,6 +6,8 @@ services:
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: mealie container_name: mealie
restart: always restart: always
depends_on:
- "postgres"
ports: ports:
- 9090:80 - 9090:80
environment: environment:

View file

@ -1,4 +1,4 @@
# v0.5.0 COOL TITLE GOES HERE # v0.5.0 Too Many Changes!
**App Version: v0.5.0** **App Version: v0.5.0**
@ -9,7 +9,13 @@
!!! error "Breaking Changes" !!! error "Breaking Changes"
#### Database #### Database
Database version has been bumped from v0.4.x -> v0.5.0. You will need to export and import your data. Database version has been bumped from v0.4.x -> v0.5.0. You will need to export and import your data. Moving forward, we will be using database migrations (BETA) to do this automatically. Note that you still must backup your data. If you don't, it's entirely possible something may go wrong and you could lose your data on upgrade.
#### Image Directory
the /data/img directory has been depreciated. All images are now stored in the /recipes/{slug}/image directory. Images should be migrated automatically, but you may experience issues related to this change.
#### API Usage
If you have been using the API directly, many of the routes and status codes have changed. You may experience issues with directly consuming the API.
## Bug Fixes ## Bug Fixes
- Fixed #332 - Language settings are saved for one browser - Fixed #332 - Language settings are saved for one browser
@ -21,7 +27,10 @@
### Highlights ### Highlights
- Beta Support for Postgres! 🎉 See the getting started page for details - Beta Support for Postgres! 🎉 See the getting started page for details
- Recipe Steps now support sections, assets, and additional settings. - Recipe Features
- Step Sections
- Recipe Assets
- Additional View Settings.
- New Toolbox Page! - New Toolbox Page!
- Bulk assign categories and tags by keyword search - Bulk assign categories and tags by keyword search
- Title case all Categories or Tags with 1 click - Title case all Categories or Tags with 1 click
@ -32,7 +41,17 @@
- Delete - Delete
- Download (As Json) - Download (As Json)
- Copy Link - Copy Link
- Rating can be updated without entering the editor - Closes #25 - New Profile Dashboard!
- Edit Your Profile
- Create/Edit Themes
- View other users in your Group
- See what's for dinner
- Manage Long Live API Tokens (New)
- New Admin Dashboard! 🎉
- Now you can get some insight on your application with application statics and events.
- See uncategorized/untagged recipes and organize them!
- Backup/Restore right from your dashboard
- See server side events. Now you can know who deleted your favorite recipe!
### Performance ### Performance
- Images are now served up by the Caddy increase performance and offloading some loads from the API server - Images are now served up by the Caddy increase performance and offloading some loads from the API server
@ -40,6 +59,16 @@
- All images are now converted to .webp for better compression - All images are now converted to .webp for better compression
### General ### General
- New 'Dark' Theme Packages with Mealie
- Updated Recipe Card Sections Toolbar
- New Sort Options (They work this time!)
- Alphabetical
- Rating
- Created Date
- Updated Date
- Shuffle (Random Sort)
- New 'Random' Recipe button on recipe sections. Random recipes are selected from the filtered results below. For example, on the "Cakes" category page, you will only get recipes in the "Cakes" category.
- Rating can be updated without entering the editor - Closes #25
- Updated recipe editor styles and moved notes to below the steps. - Updated recipe editor styles and moved notes to below the steps.
- Redesigned search bar - Redesigned search bar
- 'Dinner this week' shows a warning when no meal is planned yet - 'Dinner this week' shows a warning when no meal is planned yet
@ -47,7 +76,7 @@
- More localization - More localization
- Start date for Week is now selectable - Start date for Week is now selectable
- Languages are now managed through Crowdin - Languages are now managed through Crowdin
- The main App bar went through a major overhaul - Application Bar was Rewritten
- Sidebar can now be toggled everywhere. - Sidebar can now be toggled everywhere.
- New and improved mobile friendly bottom bar - New and improved mobile friendly bottom bar
- Improved styling for search bar in desktop - Improved styling for search bar in desktop

View file

@ -1,5 +1,19 @@
# Organizing Recipes # Organizing Recipes
Below are some general guidelines that were considered when creating the organization structure for recipes.
## From The Community
> My categories are mostly based on the 'course' they belong to. Appetizers, Starters, Main course, but also sauces or beverages. When I'm looking for an idea for an every day dinner, I just browse "main course".
>
> My tags are for picking the exact type of meal I'm looking for, based on my mood or my guests' diet, like gluten-free, vegetarian, sweet-sour or casserole. They can also act as sub-categories, like "alcohol" for beverages or "hot meal" for a main course.
>
> User: [sephrat](https://github.com/sephrat)
## Structure
!!! tip !!! tip
Below is a suggestion of guidelines my wife and I use for organizing our recipes within Mealie. Mealie is fairly flexible, so feel free to utilize how you'd like! 👍 Below is a suggestion of guidelines my wife and I use for organizing our recipes within Mealie. Mealie is fairly flexible, so feel free to utilize how you'd like! 👍

File diff suppressed because one or more lines are too long

59
frontend/src/api/about.js Normal file
View file

@ -0,0 +1,59 @@
import { baseURL } from "./api-utils";
import { apiReq } from "./api-utils";
const prefix = baseURL + "about";
const aboutURLs = {
version: `${prefix}/version`,
debug: `${prefix}`,
lastRecipe: `${prefix}/last-recipe-json`,
demo: `${prefix}/is-demo`,
log: num => `${prefix}/log/${num}`,
statistics: `${prefix}/statistics`,
events: `${prefix}/events`,
event: id => `${prefix}/events/${id}`,
};
export const aboutAPI = {
async getEvents() {
const resposne = await apiReq.get(aboutURLs.events);
return resposne.data;
},
async deleteEvent(id) {
const resposne = await apiReq.delete(aboutURLs.event(id));
return resposne.data;
},
async deleteAllEvents() {
const resposne = await apiReq.delete(aboutURLs.events);
return resposne.data;
},
// async getAppInfo() {
// const response = await apiReq.get(aboutURLs.version);
// return response.data;
// },
// async getDebugInfo() {
// const response = await apiReq.get(aboutURLs.debug);
// return response.data;
// },
// async getLogText(num) {
// const response = await apiReq.get(aboutURLs.log(num));
// return response.data;
// },
// async getLastJson() {
// const response = await apiReq.get(aboutURLs.lastRecipe);
// return response.data;
// },
// async getIsDemo() {
// const response = await apiReq.get(aboutURLs.demo);
// return response.data;
// },
// async getStatistics() {
// const response = await apiReq.get(aboutURLs.statistics);
// return response.data;
// },
};

View file

@ -1,7 +1,7 @@
const baseURL = "/api/"; const baseURL = "/api/";
import axios from "axios"; import axios from "axios";
import { store } from "../store"; import { store } from "../store";
import utils from "@/utils"; import { utils } from "@/utils";
axios.defaults.headers.common["Authorization"] = `Bearer ${store.getters.getToken}`; axios.defaults.headers.common["Authorization"] = `Bearer ${store.getters.getToken}`;

View file

@ -11,6 +11,7 @@ import { userAPI } from "./users";
import { signupAPI } from "./signUps"; import { signupAPI } from "./signUps";
import { groupAPI } from "./groups"; import { groupAPI } from "./groups";
import { siteSettingsAPI } from "./siteSettings"; import { siteSettingsAPI } from "./siteSettings";
import { aboutAPI } from "./about";
/** /**
* The main object namespace for interacting with the backend database * The main object namespace for interacting with the backend database
@ -30,4 +31,5 @@ export const api = {
users: userAPI, users: userAPI,
signUps: signupAPI, signUps: signupAPI,
groups: groupAPI, groups: groupAPI,
about: aboutAPI,
}; };

View file

@ -8,11 +8,13 @@ const debugURLs = {
debug: `${prefix}`, debug: `${prefix}`,
lastRecipe: `${prefix}/last-recipe-json`, lastRecipe: `${prefix}/last-recipe-json`,
demo: `${prefix}/is-demo`, demo: `${prefix}/is-demo`,
log: num => `${prefix}/log/${num}`,
statistics: `${prefix}/statistics`,
}; };
export const metaAPI = { export const metaAPI = {
async getAppInfo() { async getAppInfo() {
let response = await apiReq.get(debugURLs.version); const response = await apiReq.get(debugURLs.version);
return response.data; return response.data;
}, },
@ -21,13 +23,23 @@ export const metaAPI = {
return response.data; return response.data;
}, },
async getLogText(num) {
const response = await apiReq.get(debugURLs.log(num));
return response.data;
},
async getLastJson() { async getLastJson() {
let response = await apiReq.get(debugURLs.lastRecipe); const response = await apiReq.get(debugURLs.lastRecipe);
return response.data; return response.data;
}, },
async getIsDemo() { async getIsDemo() {
let response = await apiReq.get(debugURLs.demo); const response = await apiReq.get(debugURLs.demo);
return response.data;
},
async getStatistics() {
const response = await apiReq.get(debugURLs.statistics);
return response.data; return response.data;
}, },
}; };

View file

@ -14,9 +14,9 @@ const recipeURLs = {
recipe: slug => prefix + slug, recipe: slug => prefix + slug,
update: slug => prefix + slug, update: slug => prefix + slug,
delete: slug => prefix + slug, delete: slug => prefix + slug,
createAsset: slug => `${prefix}${slug}/assets`,
recipeImage: slug => `${prefix}${slug}/image`, recipeImage: slug => `${prefix}${slug}/image`,
updateImage: slug => `${prefix}${slug}/image`, updateImage: slug => `${prefix}${slug}/image`,
createAsset: slug => `${prefix}${slug}/asset`,
}; };
export const recipeAPI = { export const recipeAPI = {
@ -84,7 +84,7 @@ export const recipeAPI = {
fd.append("extension", fileObject.name.split(".").pop()); fd.append("extension", fileObject.name.split(".").pop());
fd.append("name", name); fd.append("name", name);
fd.append("icon", icon); fd.append("icon", icon);
let response = apiReq.post(recipeURLs.createAsset(recipeSlug), fd); const response = apiReq.post(recipeURLs.createAsset(recipeSlug), fd);
return response; return response;
}, },
@ -135,14 +135,18 @@ export const recipeAPI = {
}, },
recipeImage(recipeSlug) { recipeImage(recipeSlug) {
return `/api/recipes/image/${recipeSlug}/original.webp`; return `/api/media/recipes/${recipeSlug}/images/original.webp`;
}, },
recipeSmallImage(recipeSlug) { recipeSmallImage(recipeSlug) {
return `/api/recipes/image/${recipeSlug}/min-original.webp`; return `/api/media/recipes/${recipeSlug}/images/min-original.webp`;
}, },
recipeTinyImage(recipeSlug) { recipeTinyImage(recipeSlug) {
return `/api/recipes/image/${recipeSlug}/tiny-original.webp`; return `/api/media/recipes/${recipeSlug}/images/tiny-original.webp`;
},
recipeAssetPath(recipeSlug, assetName) {
return `api/media/recipes/${recipeSlug}/assets/${assetName}`;
}, },
}; };

View file

@ -6,10 +6,10 @@ const prefix = baseURL + "themes";
const settingsURLs = { const settingsURLs = {
allThemes: `${baseURL}themes`, allThemes: `${baseURL}themes`,
specificTheme: themeName => `${prefix}/${themeName}`, specificTheme: id => `${prefix}/${id}`,
createTheme: `${prefix}/create`, createTheme: `${prefix}/create`,
updateTheme: themeName => `${prefix}/${themeName}`, updateTheme: id => `${prefix}/${id}`,
deleteTheme: themeName => `${prefix}/${themeName}`, deleteTheme: id => `${prefix}/${id}`,
}; };
export const themeAPI = { export const themeAPI = {
@ -32,22 +32,18 @@ export const themeAPI = {
); );
}, },
update(themeName, colors) { update(data) {
const body = {
name: themeName,
colors: colors,
};
return apiReq.put( return apiReq.put(
settingsURLs.updateTheme(themeName), settingsURLs.updateTheme(data.id),
body, data,
() => i18n.t("settings.theme.error-updating-theme"), () => i18n.t("settings.theme.error-updating-theme"),
() => i18n.t("settings.theme.theme-updated") () => i18n.t("settings.theme.theme-updated")
); );
}, },
delete(themeName) { delete(id) {
return apiReq.delete( return apiReq.delete(
settingsURLs.deleteTheme(themeName), settingsURLs.deleteTheme(id),
null, null,
() => i18n.t("settings.theme.error-deleting-theme"), () => i18n.t("settings.theme.error-deleting-theme"),
() => i18n.t("settings.theme.theme-deleted") () => i18n.t("settings.theme.theme-deleted")

View file

@ -16,17 +16,10 @@ const usersURLs = {
userID: id => `${userPrefix}/${id}`, userID: id => `${userPrefix}/${id}`,
password: id => `${userPrefix}/${id}/password`, password: id => `${userPrefix}/${id}/password`,
resetPassword: id => `${userPrefix}/${id}/reset-password`, resetPassword: id => `${userPrefix}/${id}/reset-password`,
userAPICreate: `${userPrefix}/api-tokens`,
userAPIDelete: id => `${userPrefix}/api-tokens/${id}`,
}; };
function deleteErrorText(response) {
switch (response.data.detail) {
case "SUPER_USER":
return i18n.t("user.error-cannot-delete-super-user");
default:
return i18n.t("user.you-are-not-allowed-to-delete-this-user");
}
}
export const userAPI = { export const userAPI = {
async login(formData) { async login(formData) {
let response = await apiReq.post(authURLs.token, formData, null, function() { let response = await apiReq.post(authURLs.token, formData, null, function() {
@ -90,4 +83,21 @@ export const userAPI = {
() => i18n.t("user.password-has-been-reset-to-the-default-password") () => i18n.t("user.password-has-been-reset-to-the-default-password")
); );
}, },
async createAPIToken(name) {
const response = await apiReq.post(usersURLs.userAPICreate, { name });
return response.data;
},
async deleteAPIToken(id) {
const response = await apiReq.delete(usersURLs.userAPIDelete(id));
return response.data;
},
};
const deleteErrorText = response => {
switch (response.data.detail) {
case "SUPER_USER":
return i18n.t("user.error-cannot-delete-super-user");
default:
return i18n.t("user.you-are-not-allowed-to-delete-this-user");
}
}; };

View file

@ -100,7 +100,10 @@ export default {
} }
}, },
flat() { flat() {
if (this.selected) {
return this.selected.length > 0 && this.solo; return this.selected.length > 0 && this.solo;
}
return false;
}, },
}, },
methods: { methods: {

View file

@ -3,7 +3,7 @@
<div class="text-center"> <div class="text-center">
<h3>{{ buttonText }}</h3> <h3>{{ buttonText }}</h3>
</div> </div>
<v-text-field v-model="color" hide-details class="ma-0 pa-0" solo v-show="$vuetify.breakpoint.mdAndUp"> <v-text-field v-model="color" hide-details class="ma-0 pa-0" solo >
<template v-slot:append> <template v-slot:append>
<v-menu v-model="menu" top nudge-bottom="105" nudge-left="16" :close-on-content-click="false"> <v-menu v-model="menu" top nudge-bottom="105" nudge-left="16" :close-on-content-click="false">
<template v-slot:activator="{ on }"> <template v-slot:activator="{ on }">
@ -17,15 +17,7 @@
</v-menu> </v-menu>
</template> </template>
</v-text-field> </v-text-field>
<div class="text-center" v-show="$vuetify.breakpoint.smAndDown">
<v-menu v-model="menu" top nudge-bottom="105" nudge-left="16" :close-on-content-click="false">
<template v-slot:activator="{ on, attrs }">
<v-chip label :color="`${color}`" dark v-bind="attrs" v-on="on">
{{ color }}
</v-chip>
</template>
</v-menu>
</div>
</div> </div>
</template> </template>

View file

@ -1,8 +1,8 @@
<template> <template>
<div> <div>
<v-checkbox <v-checkbox
v-for="option in options" v-for="(option, index) in options"
:key="option.text" :key="index"
class="mb-n4 mt-n3" class="mb-n4 mt-n3"
dense dense
:label="option.text" :label="option.text"
@ -62,5 +62,3 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped></style>

View file

@ -21,7 +21,7 @@
<script> <script>
import { api } from "@/api"; import { api } from "@/api";
import utils from "@/utils"; import { utils } from "@/utils";
import MealPlanCard from "./MealPlanCard"; import MealPlanCard from "./MealPlanCard";
export default { export default {
components: { components: {

View file

@ -82,7 +82,7 @@
const CREATE_EVENT = "created"; const CREATE_EVENT = "created";
import DatePicker from "@/components/FormHelpers/DatePicker"; import DatePicker from "@/components/FormHelpers/DatePicker";
import { api } from "@/api"; import { api } from "@/api";
import utils from "@/utils"; import { utils } from "@/utils";
import MealPlanCard from "./MealPlanCard"; import MealPlanCard from "./MealPlanCard";
export default { export default {
components: { components: {

View file

@ -8,7 +8,7 @@
<v-list-item-title class=" mb-1">{{ name }} </v-list-item-title> <v-list-item-title class=" mb-1">{{ name }} </v-list-item-title>
<v-list-item-subtitle> {{ description }} </v-list-item-subtitle> <v-list-item-subtitle> {{ description }} </v-list-item-subtitle>
<div class="d-flex justify-center align-center"> <div class="d-flex justify-center align-center">
<RecipeChips :items="tags" :title="false" :limit="1" :small="true" :isCategory="false" /> <RecipeChips :truncate="true" :items="tags" :title="false" :limit="1" :small="true" :isCategory="false" />
<v-rating <v-rating
color="secondary" color="secondary"
class="ml-auto" class="ml-auto"

View file

@ -14,19 +14,17 @@
<v-list-item-title class="pl-2" v-text="item.name"></v-list-item-title> <v-list-item-title class="pl-2" v-text="item.name"></v-list-item-title>
</v-list-item-content> </v-list-item-content>
<v-list-item-action> <v-list-item-action>
<v-btn <v-btn v-if="!edit" color="primary" icon :href="assetURL(item.fileName)" target="_blank" top>
v-if="!edit"
color="primary"
icon
:href="`/api/recipes/${slug}/asset?file_name=${item.fileName}`"
target="_blank"
top
>
<v-icon> mdi-download</v-icon> <v-icon> mdi-download</v-icon>
</v-btn> </v-btn>
<v-btn v-else color="error" icon @click="deleteAsset(i)" top> <div v-else>
<v-btn color="error" icon @click="deleteAsset(i)" top>
<v-icon>mdi-delete</v-icon> <v-icon>mdi-delete</v-icon>
</v-btn> </v-btn>
<v-btn color="primary" icon @click="copyLink(item.name, item.fileName)" top>
<v-icon>mdi-content-copy</v-icon>
</v-btn>
</div>
</v-list-item-action> </v-list-item-action>
</v-list-item> </v-list-item>
</v-list> </v-list>
@ -107,7 +105,15 @@ export default {
], ],
}; };
}, },
computed: {
baseURL() {
return window.location.origin;
},
},
methods: { methods: {
assetURL(assetName) {
return api.recipes.recipeAssetPath(this.slug, assetName);
},
setFileObject(obj) { setFileObject(obj) {
this.fileObject = obj; this.fileObject = obj;
}, },
@ -124,6 +130,14 @@ export default {
deleteAsset(index) { deleteAsset(index) {
this.value.splice(index, 1); this.value.splice(index, 1);
}, },
copyLink(name, fileName) {
const assetLink = api.recipes.recipeAssetPath(this.slug, fileName);
const copyText = `![${name}](${assetLink})`;
navigator.clipboard.writeText(copyText).then(
() => console.log("Copied", copyText),
() => console.log("Copied Failed", copyText)
);
},
}, },
}; };
</script> </script>

View file

@ -56,7 +56,7 @@
import BulkAdd from "@/components/Recipe/Parts/Helpers/BulkAdd"; import BulkAdd from "@/components/Recipe/Parts/Helpers/BulkAdd";
import VueMarkdown from "@adapttive/vue-markdown"; import VueMarkdown from "@adapttive/vue-markdown";
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import utils from "@/utils"; import { utils } from "@/utils";
export default { export default {
components: { components: {
BulkAdd, BulkAdd,

View file

@ -66,7 +66,7 @@
<script> <script>
import VueMarkdown from "@adapttive/vue-markdown"; import VueMarkdown from "@adapttive/vue-markdown";
import utils from "@/utils"; import { utils } from "@/utils";
export default { export default {
components: { components: {
VueMarkdown, VueMarkdown,

View file

@ -35,7 +35,7 @@
<script> <script>
import VueMarkdown from "@adapttive/vue-markdown"; import VueMarkdown from "@adapttive/vue-markdown";
import utils from "@/utils"; import { utils } from "@/utils";
export default { export default {
components: { components: {
VueMarkdown, VueMarkdown,

View file

@ -25,7 +25,7 @@
<v-card-actions> <v-card-actions>
<Rating :value="rating" :name="name" :slug="slug" :small="true" /> <Rating :value="rating" :name="name" :slug="slug" :small="true" />
<v-spacer></v-spacer> <v-spacer></v-spacer>
<RecipeChips :items="tags" :title="false" :limit="2" :small="true" :isCategory="false" /> <RecipeChips :truncate="true" :items="tags" :title="false" :limit="2" :small="true" :isCategory="false" />
<ContextMenu :slug="slug" /> <ContextMenu :slug="slug" />
</v-card-actions> </v-card-actions>
</v-card> </v-card>

View file

@ -27,16 +27,27 @@
<v-row> <v-row>
<v-col cols="12" sm="12" md="4" lg="4"> <v-col cols="12" sm="12" md="4" lg="4">
<Ingredients :edit="true" v-model="value.recipeIngredient" /> <Ingredients :edit="true" v-model="value.recipeIngredient" />
<v-card class="mt-6">
<h2 class="mt-6">{{ $t("recipe.categories") }}</h2> <v-card-title class="py-2">
{{ $t("recipe.categories") }}
</v-card-title>
<v-divider class="mx-2"></v-divider>
<v-card-text>
<CategoryTagSelector <CategoryTagSelector
:return-object="false" :return-object="false"
v-model="value.recipeCategory" v-model="value.recipeCategory"
:show-add="true" :show-add="true"
:show-label="false" :show-label="false"
/> />
</v-card-text>
</v-card>
<h2 class="mt-4">{{ $t("tag.tags") }}</h2> <v-card class="mt-2">
<v-card-title class="py-2">
{{ $t("tag.tags") }}
</v-card-title>
<v-divider class="mx-2"></v-divider>
<v-card-text>
<CategoryTagSelector <CategoryTagSelector
:return-object="false" :return-object="false"
v-model="value.tags" v-model="value.tags"
@ -44,6 +55,8 @@
:tag-selector="true" :tag-selector="true"
:show-label="false" :show-label="false"
/> />
</v-card-text>
</v-card>
<Nutrition v-model="value.nutrition" :edit="true" /> <Nutrition v-model="value.nutrition" :edit="true" />
<Assets v-model="value.assets" :edit="true" :slug="value.slug" /> <Assets v-model="value.assets" :edit="true" :slug="value.slug" />
<ExtrasEditor :extras="value.extras" @save="saveExtras" /> <ExtrasEditor :extras="value.extras" @save="saveExtras" />

View file

@ -124,7 +124,7 @@
</template> </template>
<script> <script>
import utils from "@/utils"; import { utils } from "@/utils";
import { api } from "@/api"; import { api } from "@/api";
export default { export default {

View file

@ -1,29 +1,13 @@
<template> <template>
<v-card
color="accent"
class="custom-transparent d-flex justify-start align-center text-center time-card-flex"
tile
v-if="showCards"
>
<v-card flat color="rgb(255, 0, 0, 0.0)">
<v-icon large color="white" class="mx-2"> mdi-clock-outline </v-icon>
</v-card>
<v-card
v-for="(time, index) in allTimes"
:key="index"
class="d-flex justify-start align-center text-center time-card-flex"
flat
color="rgb(255, 0, 0, 0.0)"
>
<v-card-text class="caption white--text py-2">
<div> <div>
<strong> {{ time.name }} </strong> <v-chip label color="accent custom-transparent" class="ma-1" v-for="(time, index) in allTimes" :key="index">
<v-icon left>
mdi-clock-outline
</v-icon>
{{ time.name }} |
{{ time.value }}
</v-chip>
</div> </div>
<div>{{ time.value }}</div>
</v-card-text>
</v-card>
</v-card>
</template> </template>
<script> <script>

View file

@ -11,7 +11,7 @@
:to="`/recipes/${urlParam}/${getSlug(category)}`" :to="`/recipes/${urlParam}/${getSlug(category)}`"
:key="category" :key="category"
> >
{{ category }} {{ truncateText(category) }}
</v-chip> </v-chip>
</div> </div>
</template> </template>
@ -19,6 +19,9 @@
<script> <script>
export default { export default {
props: { props: {
truncate: {
default: false,
},
items: { items: {
default: [], default: [],
}, },
@ -34,6 +37,7 @@ export default {
small: { small: {
default: false, default: false,
}, },
maxWidth: {},
}, },
computed: { computed: {
allCategories() { allCategories() {
@ -58,6 +62,14 @@ export default {
if (matches.length > 0) return matches[0].slug; if (matches.length > 0) return matches[0].slug;
} }
}, },
truncateText(text, length = 20, clamp) {
if (!this.truncate) return text;
clamp = clamp || "...";
var node = document.createElement("div");
node.innerHTML = text;
var content = node.textContent;
return content.length > length ? content.slice(0, length) + clamp : content;
},
}, },
}; };
</script> </script>

View file

@ -1,14 +1,14 @@
<template> <template>
<div> <div>
<v-card-title class="headline"> <v-card-title class="headline">
{{ name }} {{ recipe.name }}
</v-card-title> </v-card-title>
<v-card-text> <v-card-text>
<vue-markdown :source="description"> </vue-markdown> <vue-markdown :source="recipe.description"> </vue-markdown>
<v-row dense disabled> <v-row dense disabled>
<v-col> <v-col>
<v-btn <v-btn
v-if="yields" v-if="recipe.recipeYield"
dense dense
small small
:hover="false" :hover="false"
@ -18,62 +18,62 @@
color="secondary darken-1" color="secondary darken-1"
class="rounded-sm static" class="rounded-sm static"
> >
{{ yields }} {{ recipe.recipeYield }}
</v-btn> </v-btn>
</v-col> </v-col>
<Rating :value="rating" :name="name" :slug="slug" /> <Rating :value="recipe.rating" :name="recipe.name" :slug="recipe.slug" />
</v-row> </v-row>
<v-row> <v-row>
<v-col cols="12" sm="12" md="4" lg="4"> <v-col cols="12" sm="12" md="4" lg="4">
<Ingredients :value="ingredients" :edit="false" /> <Ingredients :value="recipe.recipeIngredient" :edit="false" />
<div v-if="medium"> <div v-if="medium">
<v-card class="mt-2" v-if="categories.length > 0"> <v-card class="mt-2" v-if="recipe.recipeCategory.length > 0">
<v-card-title class="py-2"> <v-card-title class="py-2">
{{ $t("recipe.categories") }} {{ $t("recipe.categories") }}
</v-card-title> </v-card-title>
<v-divider class="mx-2"></v-divider> <v-divider class="mx-2"></v-divider>
<v-card-text> <v-card-text>
<RecipeChips :items="categories" /> <RecipeChips :items="recipe.recipeCategory" />
</v-card-text> </v-card-text>
</v-card> </v-card>
<v-card class="mt-2" v-if="tags.length > 0"> <v-card class="mt-2" v-if="recipe.tags.length > 0">
<v-card-title class="py-2"> <v-card-title class="py-2">
{{ $t("tag.tags") }} {{ $t("tag.tags") }}
</v-card-title> </v-card-title>
<v-divider class="mx-2"></v-divider> <v-divider class="mx-2"></v-divider>
<v-card-text> <v-card-text>
<RecipeChips :items="tags" :isCategory="false" /> <RecipeChips :items="recipe.tags" :isCategory="false" />
</v-card-text> </v-card-text>
</v-card> </v-card>
<Nutrition :value="nutrition" :edit="false" /> <Nutrition v-if="recipe.settings.showNutrition" :value="recipe.nutrition" :edit="false" />
<Assets :value="assets" :edit="false" :slug="slug" /> <Assets v-if="recipe.settings.showAssets" :value="recipe.assets" :edit="false" :slug="recipe.slug" />
</div> </div>
</v-col> </v-col>
<v-divider v-if="medium" class="my-divider" :vertical="true"></v-divider> <v-divider v-if="medium" class="my-divider" :vertical="true"></v-divider>
<v-col cols="12" sm="12" md="8" lg="8"> <v-col cols="12" sm="12" md="8" lg="8">
<Instructions :value="instructions" :edit="false" /> <Instructions :value="recipe.recipeInstructions" :edit="false" />
<Notes :value="notes" :edit="false" /> <Notes :value="recipe.notes" :edit="false" />
</v-col> </v-col>
</v-row> </v-row>
<div v-if="!medium"> <div v-if="!medium">
<RecipeChips :title="$t('recipe.categories')" :items="categories" /> <RecipeChips :title="$t('recipe.categories')" :items="recipe.recipeCategory" />
<RecipeChips :title="$t('tag.tags')" :items="tags" /> <RecipeChips :title="$t('tag.tags')" :items="recipe.tags" />
<Nutrition :value="nutrition" :edit="false" /> <Nutrition v-if="recipe.settings.showNutrition" :value="recipe.nutrition" :edit="false" />
<Assets :value="assets" :edit="false" :slug="slug" /> <Assets v-if="recipe.settings.showAssets" :value="recipe.assets" :edit="false" :slug="recipe.slug" />
</div> </div>
<v-row class="mt-2 mb-1"> <v-row class="mt-2 mb-1">
<v-col></v-col> <v-col></v-col>
<v-btn <v-btn
v-if="orgURL" v-if="recipe.orgURL"
dense dense
small small
:hover="false" :hover="false"
type="label" type="label"
:ripple="false" :ripple="false"
elevation="0" elevation="0"
:href="orgURL" :href="recipe.orgURL"
color="secondary darken-1" color="secondary darken-1"
target="_blank" target="_blank"
class="rounded-sm mr-4" class="rounded-sm mr-4"
@ -88,7 +88,7 @@
<script> <script>
import Nutrition from "@/components/Recipe/Parts/Nutrition"; import Nutrition from "@/components/Recipe/Parts/Nutrition";
import VueMarkdown from "@adapttive/vue-markdown"; import VueMarkdown from "@adapttive/vue-markdown";
import utils from "@/utils"; import { utils } from "@/utils";
import RecipeChips from "./RecipeChips"; import RecipeChips from "./RecipeChips";
import Rating from "@/components/Recipe/Parts/Rating"; import Rating from "@/components/Recipe/Parts/Rating";
import Notes from "@/components/Recipe/Parts/Notes"; import Notes from "@/components/Recipe/Parts/Notes";
@ -107,19 +107,7 @@ export default {
Rating, Rating,
}, },
props: { props: {
name: String, recipe: Object,
slug: String,
description: String,
ingredients: Array,
instructions: Array,
categories: Array,
tags: Array,
notes: Array,
rating: Number,
yields: String,
orgURL: String,
nutrition: Object,
assets: Array,
}, },
data() { data() {
return { return {

View file

@ -1,7 +1,11 @@
<template> <template>
<div>
<slot v-bind="{ downloading, downloadFile }">
<v-btn color="accent" text :loading="downloading" @click="downloadFile"> <v-btn color="accent" text :loading="downloading" @click="downloadFile">
{{ showButtonText }} {{ showButtonText }}
</v-btn> </v-btn>
</slot>
</div>
</template> </template>
<script> <script>

View file

@ -1,10 +1,12 @@
<template> <template>
<v-form ref="file"> <v-form ref="file">
<input ref="uploader" class="d-none" type="file" @change="onFileChanged" /> <input ref="uploader" class="d-none" type="file" @change="onFileChanged" />
<v-btn :loading="isSelecting" @click="onButtonClick" color="accent" :text="textBtn"> <slot v-bind="{ isSelecting, onButtonClick }">
<v-btn :loading="isSelecting" @click="onButtonClick" :small="small" color="accent" :text="textBtn">
<v-icon left> {{ icon }}</v-icon> <v-icon left> {{ icon }}</v-icon>
{{ text ? text : defaultText }} {{ text ? text : defaultText }}
</v-btn> </v-btn>
</slot>
</v-form> </v-form>
</template> </template>
@ -13,6 +15,9 @@ const UPLOAD_EVENT = "uploaded";
import { api } from "@/api"; import { api } from "@/api";
export default { export default {
props: { props: {
small: {
default: false,
},
post: { post: {
type: Boolean, type: Boolean,
default: true, default: true,

View file

@ -1,39 +1,61 @@
<template> <template>
<div class="mt-n5" v-if="recipes"> <div v-if="recipes">
<v-card flat class="transparent" height="60px"> <v-app-bar color="transparent" flat class="mt-n1 rounded" v-if="!disableToolbar">
<v-card-text> <v-icon large left v-if="title">
<v-row v-if="title != null"> {{ titleIcon }}
<v-col> </v-icon>
<v-btn-toggle group> <v-toolbar-title class="headline"> {{ title }} </v-toolbar-title>
<v-btn text>
{{ title.toUpperCase() }}
</v-btn>
</v-btn-toggle>
</v-col>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-col align="end"> <v-btn text @click="navigateRandom">
<v-menu offset-y v-if="sortable"> <v-icon left>
mdi-dice-multiple
</v-icon>
{{ $t("general.random") }}
</v-btn>
<v-menu offset-y left v-if="$listeners.sort">
<template v-slot:activator="{ on, attrs }"> <template v-slot:activator="{ on, attrs }">
<v-btn-toggle group> <v-btn text v-bind="attrs" v-on="on" :loading="sortLoading">
<v-btn text v-bind="attrs" v-on="on"> <v-icon left>
mdi-sort
</v-icon>
{{ $t("general.sort") }} {{ $t("general.sort") }}
</v-btn> </v-btn>
</v-btn-toggle>
</template> </template>
<v-list> <v-list>
<v-list-item @click="$emit('sort-recent')"> <v-list-item @click="sortRecipes(EVENTS.az)">
<v-list-item-title>{{ $t("general.recent") }}</v-list-item-title> <v-icon left>
</v-list-item> mdi-order-alphabetical-ascending
<v-list-item @click="$emit('sort')"> </v-icon>
<v-list-item-title>{{ $t("general.sort-alphabetically") }}</v-list-item-title> <v-list-item-title>{{ $t("general.sort-alphabetically") }}</v-list-item-title>
</v-list-item> </v-list-item>
<v-list-item @click="sortRecipes(EVENTS.rating)">
<v-icon left>
mdi-star
</v-icon>
<v-list-item-title>{{ $t("general.rating") }}</v-list-item-title>
</v-list-item>
<v-list-item @click="sortRecipes(EVENTS.created)">
<v-icon left>
mdi-new-box
</v-icon>
<v-list-item-title>{{ $t("general.created") }}</v-list-item-title>
</v-list-item>
<v-list-item @click="sortRecipes(EVENTS.updated)">
<v-icon left>
mdi-update
</v-icon>
<v-list-item-title>{{ $t("general.updated") }}</v-list-item-title>
</v-list-item>
<v-list-item @click="sortRecipes(EVENTS.shuffle)">
<v-icon left>
mdi-shuffle-variant
</v-icon>
<v-list-item-title>{{ $t("general.shuffle") }}</v-list-item-title>
</v-list-item>
</v-list> </v-list>
</v-menu> </v-menu>
</v-col> </v-app-bar>
</v-row> <div v-if="recipes" class="mt-2">
</v-card-text>
</v-card>
<div v-if="recipes">
<v-row v-if="!viewScale"> <v-row v-if="!viewScale">
<v-col :sm="6" :md="6" :lg="4" :xl="3" v-for="recipe in recipes.slice(0, cardLimit)" :key="recipe.name"> <v-col :sm="6" :md="6" :lg="4" :xl="3" v-for="recipe in recipes.slice(0, cardLimit)" :key="recipe.name">
<RecipeCard <RecipeCard
@ -85,15 +107,21 @@
<script> <script>
import RecipeCard from "../Recipe/RecipeCard"; import RecipeCard from "../Recipe/RecipeCard";
import MobileRecipeCard from "@/components/Recipe/MobileRecipeCard"; import MobileRecipeCard from "@/components/Recipe/MobileRecipeCard";
import { utils } from "@/utils";
const SORT_EVENT = "sort";
export default { export default {
components: { components: {
RecipeCard, RecipeCard,
MobileRecipeCard, MobileRecipeCard,
}, },
props: { props: {
sortable: { disableToolbar: {
default: false, default: false,
}, },
titleIcon: {
default: "mdi-tag-multiple-outline",
},
title: { title: {
default: null, default: null,
}, },
@ -110,8 +138,16 @@ export default {
}, },
data() { data() {
return { return {
sortLoading: false,
cardLimit: 30, cardLimit: 30,
loading: false, loading: false,
EVENTS: {
az: "az",
rating: "rating",
created: "created",
updated: "updated",
shuffle: "shuffle",
},
}; };
}, },
watch: { watch: {
@ -150,6 +186,37 @@ export default {
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
this.loading = false; this.loading = false;
}, },
navigateRandom() {
const recipe = utils.recipe.randomRecipe(this.recipes);
this.$router.push(`/recipe/${recipe.slug}`);
},
sortRecipes(sortType) {
this.sortLoading = true;
let sortTarget = [...this.recipes];
switch (sortType) {
case this.EVENTS.az:
utils.recipe.sortAToZ(sortTarget);
break;
case this.EVENTS.rating:
utils.recipe.sortByRating(sortTarget);
break;
case this.EVENTS.created:
utils.recipe.sortByCreated(sortTarget);
break;
case this.EVENTS.updated:
utils.recipe.sortByUpdated(sortTarget);
break;
case this.EVENTS.shuffle:
utils.recipe.shuffle(sortTarget);
break;
default:
console.log("Unknown Event", sortType);
return;
}
this.$emit(SORT_EVENT, sortTarget);
this.sortLoading = false;
},
}, },
}; };
</script> </script>

View file

@ -0,0 +1,142 @@
<template>
<div>
<BaseDialog
:title="$t('settings.backup.create-heading')"
titleIcon="mdi-database"
@submit="createBackup"
:submit-text="$t('general.create')"
:loading="loading"
>
<template v-slot:open="{ open }">
<v-btn @click="open" class="mx-2" small :color="color"> <v-icon left> mdi-plus </v-icon> Custom </v-btn>
</template>
<v-card-text class="mt-6">
<v-text-field dense :label="$t('settings.backup.backup-tag')" v-model="tag"></v-text-field>
</v-card-text>
<v-card-actions class="mt-n9 flex-wrap">
<v-switch v-model="fullBackup" :label="switchLabel"></v-switch>
<v-spacer></v-spacer>
</v-card-actions>
<v-expand-transition>
<div v-if="!fullBackup">
<v-card-text class="mt-n4">
<v-row>
<v-col sm="4">
<p>{{ $t("general.options") }}</p>
<ImportOptions @update-options="updateOptions" class="mt-5" />
</v-col>
<v-col>
<p>{{ $t("general.templates") }}</p>
<v-checkbox
v-for="template in availableTemplates"
:key="template"
class="mb-n4 mt-n3"
dense
:label="template"
@click="appendTemplate(template)"
></v-checkbox>
</v-col>
</v-row>
</v-card-text>
</div>
</v-expand-transition>
</BaseDialog>
</div>
</template>
<script>
import BaseDialog from "./BaseDialog";
import ImportOptions from "@/components/FormHelpers/ImportOptions";
import { api } from "@/api";
export default {
props: {
color: { default: "primary" },
},
components: {
BaseDialog,
ImportOptions,
},
data() {
return {
tag: null,
fullBackup: true,
loading: false,
options: {
recipes: true,
settings: true,
themes: true,
pages: true,
users: true,
groups: true,
},
availableTemplates: [],
selectedTemplates: [],
};
},
computed: {
switchLabel() {
if (this.fullBackup) {
return this.$t("settings.backup.full-backup");
} else return this.$t("settings.backup.partial-backup");
},
},
mounted() {
this.resetData();
this.getAvailableBackups();
},
methods: {
resetData() {
this.tag = null;
this.fullBackup = true;
this.loading = false;
this.options = {
recipes: true,
settings: true,
themes: true,
pages: true,
users: true,
groups: true,
};
this.availableTemplates = [];
this.selectedTemplates = [];
},
updateOptions(options) {
this.options = options;
},
async getAvailableBackups() {
const response = await api.backups.requestAvailable();
response.templates.forEach(element => {
this.availableTemplates.push(element);
});
},
async createBackup() {
this.loading = true;
const data = {
tag: this.tag,
options: {
recipes: this.options.recipes,
settings: this.options.settings,
pages: this.options.pages,
themes: this.options.themes,
users: this.options.users,
groups: this.options.groups,
},
templates: this.selectedTemplates,
};
if (await api.backups.create(data)) {
this.$emit("created");
}
this.loading = false;
},
appendTemplate(templateName) {
if (this.selectedTemplates.includes(templateName)) {
let index = this.selectedTemplates.indexOf(templateName);
if (index !== -1) {
this.selectedTemplates.splice(index, 1);
}
} else this.selectedTemplates.push(templateName);
},
},
};
</script>

View file

@ -3,14 +3,14 @@
<slot name="open" v-bind="{ open }"> </slot> <slot name="open" v-bind="{ open }"> </slot>
<v-dialog v-model="dialog" :width="modalWidth + 'px'" :content-class="top ? 'top-dialog' : undefined"> <v-dialog v-model="dialog" :width="modalWidth + 'px'" :content-class="top ? 'top-dialog' : undefined">
<v-card class="pb-10" height="100%"> <v-card class="pb-10" height="100%">
<v-app-bar dark :color="color" class="mt-n1 mb-2"> <v-app-bar dark :color="color" class="mt-n1 mb-0">
<v-icon large left> <v-icon large left>
{{ titleIcon }} {{ titleIcon }}
</v-icon> </v-icon>
<v-toolbar-title class="headline"> {{ title }} </v-toolbar-title> <v-toolbar-title class="headline"> {{ title }} </v-toolbar-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
</v-app-bar> </v-app-bar>
<v-progress-linear v-if="loading" indeterminate color="primary"></v-progress-linear> <v-progress-linear class="mt-1" v-if="loading" indeterminate color="primary"></v-progress-linear>
<slot> </slot> <slot> </slot>
<v-card-actions> <v-card-actions>
<slot name="card-actions"> <slot name="card-actions">
@ -18,8 +18,12 @@
{{ $t("general.cancel") }} {{ $t("general.cancel") }}
</v-btn> </v-btn>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="error" text @click="deleteEvent" v-if="$listeners.delete">
{{ $t("general.delete") }}
</v-btn>
<v-btn color="success" @click="submitEvent"> <v-btn color="success" @click="submitEvent">
{{ $t("general.submit") }} {{ submitText }}
</v-btn> </v-btn>
</slot> </slot>
</v-card-actions> </v-card-actions>
@ -31,6 +35,7 @@
</template> </template>
<script> <script>
import i18n from "@/i18n";
export default { export default {
props: { props: {
color: { color: {
@ -51,16 +56,34 @@ export default {
top: { top: {
default: false, default: false,
}, },
submitText: {
default: () => i18n.t("general.create"),
},
}, },
data() { data() {
return { return {
dialog: false, dialog: false,
submitted: false,
}; };
}, },
computed: {
determineClose() {
return this.submitted && !this.loading;
},
},
watch: {
determineClose() {
this.submitted = false;
this.dialog = false;
},
dialog(val) {
if (val) this.submitted = false;
},
},
methods: { methods: {
submitEvent() { submitEvent() {
this.$emit("submit"); this.$emit("submit");
this.close(); this.submitted = true;
}, },
open() { open() {
this.dialog = true; this.dialog = true;
@ -68,6 +91,10 @@ export default {
close() { close() {
this.dialog = false; this.dialog = false;
}, },
deleteEvent() {
this.$emit("delete");
this.submitted = true;
},
}, },
}; };
</script> </script>

View file

@ -15,7 +15,7 @@
</v-toolbar-items> </v-toolbar-items>
</v-toolbar> </v-toolbar>
<v-card-title> {{ name }} </v-card-title> <v-card-title> {{ name }} </v-card-title>
<v-card-subtitle class="mb-n3"> {{ $d(new Date(date), "medium") }} </v-card-subtitle> <v-card-subtitle class="mb-n3" v-if="date"> {{ $d(new Date(date), "medium") }} </v-card-subtitle>
<v-divider></v-divider> <v-divider></v-divider>
<v-card-text> <v-card-text>
@ -48,7 +48,7 @@
</template> </template>
<script> <script>
import ImportOptions from "./ImportOptions"; import ImportOptions from "@/components/FormHelpers/ImportOptions";
import TheDownloadBtn from "@/components/UI/Buttons/TheDownloadBtn.vue"; import TheDownloadBtn from "@/components/UI/Buttons/TheDownloadBtn.vue";
import { backupURLs } from "@/api/backup"; import { backupURLs } from "@/api/backup";
export default { export default {

View file

@ -0,0 +1,81 @@
<template>
<div class="mt-2">
<v-card>
<v-card-title class="headline">
Log
<v-spacer></v-spacer>
<v-text-field
class="ml-auto shrink mb-n7"
solo
label="Log Lines"
type="number"
append-icon="mdi-refresh-circle"
v-model="lines"
@click:append="getLogText"
suffix="lines"
single-line
>
</v-text-field>
<TheDownloadBtn :button-text="$t('about.download-log')" download-url="/api/debug/log">
<template v-slot:default="{ downloadFile }">
<v-btn bottom right relative fab icon color="primary" @click="downloadFile">
<v-icon> mdi-download </v-icon>
</v-btn>
</template>
</TheDownloadBtn>
</v-card-title>
<v-divider></v-divider>
<v-card-text>
<div v-for="(item, index) in splitText" :key="index" :class="getClass(item)">
{{ item }}
</div>
</v-card-text>
</v-card>
</div>
</template>
<script>
import TheDownloadBtn from "@/components/UI/Buttons/TheDownloadBtn";
import { api } from "@/api";
export default {
components: { TheDownloadBtn },
data() {
return {
lines: 200,
text: "",
};
},
mounted() {
this.getLogText();
},
computed: {
splitText() {
return this.text.split("/n");
},
},
methods: {
async getLogText() {
this.text = await api.meta.getLogText(this.lines);
},
getClass(text) {
const isError = text.includes("ERROR:");
if (isError) {
return "log--error";
}
},
},
};
</script>
<style scoped>
.log-text {
background-color: #e0e0e077;
}
.log--error {
color: #ef5350;
}
.line-number {
color: black;
font-weight: bold;
}
</style>

View file

@ -0,0 +1,103 @@
w<template>
<v-card v-bind="$attrs" :class="classes" class="v-card--material pa-3">
<div class="d-flex grow flex-wrap">
<slot name="avatar">
<v-sheet
:color="color"
:max-height="icon ? 90 : undefined"
:width="icon ? 'auto' : '100%'"
elevation="6"
class="text-start v-card--material__heading mb-n6 mt-n10 pa-7"
dark
>
<v-icon v-if="icon" size="40" v-text="icon" />
<div v-if="text" class="headline font-weight-thin" v-text="text" />
</v-sheet>
</slot>
<div v-if="$slots['after-heading']" class="ml-auto">
<slot name="after-heading" />
</div>
</div>
<slot />
<template v-if="$slots.actions">
<v-divider class="mt-2" />
<v-card-actions class="pb-0">
<slot name="actions" />
</v-card-actions>
</template>
<template v-if="$slots.bottom">
<v-divider class="mt-2" v-if="!$slots.actions" />
<div class="pb-0">
<slot name="bottom" />
</div>
</template>
</v-card>
</template>
<script>
export default {
name: "MaterialCard",
props: {
avatar: {
type: String,
default: "",
},
color: {
type: String,
default: "primary",
},
icon: {
type: String,
default: undefined,
},
image: {
type: Boolean,
default: false,
},
text: {
type: String,
default: "",
},
title: {
type: String,
default: "",
},
},
computed: {
classes() {
return {
"v-card--material--has-heading": this.hasHeading,
"mt-3": this.$vuetify.breakpoint.name == "xs" || this.$vuetify.breakpoint.name == "sm"
};
},
hasHeading() {
return false;
},
hasAltHeading() {
return false;
},
},
};
</script>
<style lang="sass">
.v-card--material
&__avatar
position: relative
top: -64px
margin-bottom: -32px
&__heading
position: relative
top: -40px
transition: .3s ease
z-index: 1
</style>

View file

@ -2,7 +2,7 @@
<div> <div>
<v-navigation-drawer v-model="showSidebar" width="180px" clipped app> <v-navigation-drawer v-model="showSidebar" width="180px" clipped app>
<template v-slot:prepend> <template v-slot:prepend>
<v-list-item two-line v-if="isLoggedIn"> <v-list-item two-line v-if="isLoggedIn" to="/admin/profile">
<v-list-item-avatar color="accent" class="white--text"> <v-list-item-avatar color="accent" class="white--text">
<img :src="userProfileImage" v-if="!hideImage" @error="hideImage = true" /> <img :src="userProfileImage" v-if="!hideImage" @error="hideImage = true" />
<div v-else> <div v-else>
@ -133,20 +133,15 @@ export default {
to: "/admin/profile", to: "/admin/profile",
title: this.$t("settings.profile"), title: this.$t("settings.profile"),
}, },
{
icon: "mdi-format-color-fill",
to: "/admin/themes",
title: this.$t("general.themes"),
},
{
icon: "mdi-food",
to: "/admin/meal-planner",
title: this.$t("meal-plan.meal-planner"),
},
]; ];
}, },
adminLinks() { adminLinks() {
return [ return [
{
icon: "mdi-view-dashboard",
to: "/admin/dashboard",
title: this.$t("general.dashboard"),
},
{ {
icon: "mdi-cog", icon: "mdi-cog",
to: "/admin/settings", to: "/admin/settings",
@ -162,11 +157,6 @@ export default {
to: "/admin/manage-users", to: "/admin/manage-users",
title: this.$t("settings.manage-users"), title: this.$t("settings.manage-users"),
}, },
{
icon: "mdi-backup-restore",
to: "/admin/backups",
title: this.$t("settings.backup-and-exports"),
},
{ {
icon: "mdi-database-import", icon: "mdi-database-import",
to: "/admin/migrations", to: "/admin/migrations",

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -9,5 +9,14 @@
"day": "numeric", "day": "numeric",
"weekday": "long", "weekday": "long",
"year": "numeric" "year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric",
"hour12": true
} }
} }

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Anvend", "apply": "Anvend",
@ -35,7 +36,9 @@
"close": "Luk", "close": "Luk",
"confirm": "Bekræft", "confirm": "Bekræft",
"create": "Opret", "create": "Opret",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Slet", "delete": "Slet",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Hent", "download": "Hent",
@ -61,6 +64,7 @@
"no": "Nej", "no": "Nej",
"ok": "Ok", "ok": "Ok",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Tilfældig", "random": "Tilfældig",
"recent": "Seneste", "recent": "Seneste",
"recipes": "Opskrifter", "recipes": "Opskrifter",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tirsdag", "tuesday": "Tirsdag",
"update": "Opdater", "update": "Opdater",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Brugere", "users": "Brugere",

View file

@ -14,10 +14,10 @@
"demo-status": "Demostatus", "demo-status": "Demostatus",
"development": "Entwicklung", "development": "Entwicklung",
"download-log": "Protokoll herunterladen", "download-log": "Protokoll herunterladen",
"download-recipe-json": "Rezept JSON herunterladen", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Keine Demo", "not-demo": "Keine Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite Datei", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Entfernen der Kategorie fehlgeschlagen", "category-deletion-failed": "Entfernen der Kategorie fehlgeschlagen",
"category-filter": "Kategoriefilter", "category-filter": "Kategoriefilter",
"category-update-failed": "Aktualisieren der Kategorie fehlgeschlagen", "category-update-failed": "Aktualisieren der Kategorie fehlgeschlagen",
"category-updated": "Kategorie aktualisiert" "category-updated": "Kategorie aktualisiert",
"category": "Category"
}, },
"general": { "general": {
"apply": "Anwenden", "apply": "Anwenden",
@ -35,7 +36,9 @@
"close": "Schließen", "close": "Schließen",
"confirm": "Bestätigen", "confirm": "Bestätigen",
"create": "Erstellen", "create": "Erstellen",
"created": "Erstellt",
"current-parenthesis": "(Neueste)", "current-parenthesis": "(Neueste)",
"dashboard": "Dashboard",
"delete": "Löschen", "delete": "Löschen",
"disabled": "Deaktiviert", "disabled": "Deaktiviert",
"download": "Herunterladen", "download": "Herunterladen",
@ -61,6 +64,7 @@
"no": "Nein", "no": "Nein",
"ok": "Okay", "ok": "Okay",
"options": "Optionen:", "options": "Optionen:",
"rating": "Bewertung",
"random": "Zufall", "random": "Zufall",
"recent": "Neueste", "recent": "Neueste",
"recipes": "Rezepte", "recipes": "Rezepte",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Dienstag", "tuesday": "Dienstag",
"update": "Aktualisieren", "update": "Aktualisieren",
"updated": "Aktualisiert",
"upload": "Hochladen", "upload": "Hochladen",
"url": "URL", "url": "URL",
"users": "Benutzer", "users": "Benutzer",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -70,17 +74,19 @@
"save": "Save", "save": "Save",
"settings": "Settings", "settings": "Settings",
"sort": "Sort", "sort": "Sort",
"sort-alphabetically": "A-Z", "sort-alphabetically": "Alphabetical",
"status": "Status", "status": "Status",
"submit": "Submit", "submit": "Submit",
"success-count": "Success: {count}", "success-count": "Success: {count}",
"sunday": "Sunday", "sunday": "Sunday",
"shuffle": "Shuffle",
"templates": "Templates:", "templates": "Templates:",
"themes": "Themes", "themes": "Themes",
"thursday": "Thursday", "thursday": "Thursday",
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -1,66 +1,70 @@
{ {
"404": { "404": {
"page-not-found": "404 Page Not Found", "page-not-found": "404 Página No Encontrada",
"take-me-home": "Take me Home" "take-me-home": "Ir a Inicio"
}, },
"about": { "about": {
"about-mealie": "About Mealie", "about-mealie": "Acerca de Mealie",
"api-docs": "API Docs", "api-docs": "Documentación API",
"api-port": "API Port", "api-port": "Puerto API",
"application-mode": "Application Mode", "application-mode": "Modo de Aplicación",
"database-type": "Database Type", "database-type": "Tipo de base de datos",
"default-group": "Default Group", "default-group": "Grupo Predeterminado",
"demo": "Demo", "demo": "Versión Demo",
"demo-status": "Demo Status", "demo-status": "Estado Demo",
"development": "Development", "development": "Desarrollo",
"download-log": "Download Log", "download-log": "Descargar Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "No Demo",
"production": "Production", "production": "Producción",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Versión"
}, },
"category": { "category": {
"category-created": "Category created", "category-created": "Categoría creada",
"category-creation-failed": "Category creation failed", "category-creation-failed": "Error al crear categoría",
"category-deleted": "Category Deleted", "category-deleted": "Categoría Eliminada",
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Error al eliminar categoría",
"category-filter": "Category Filter", "category-filter": "Filtros de Categorías",
"category-update-failed": "Category update failed", "category-update-failed": "Error al actualizar categoría",
"category-updated": "Category updated" "category-updated": "Categoría actualizada",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Aplicar",
"cancel": "Cancel", "cancel": "Cancelar",
"close": "Close", "close": "Cerrar",
"confirm": "Confirm", "confirm": "Confirmar",
"create": "Create", "create": "Crear",
"current-parenthesis": "(Current)", "created": "Created",
"delete": "Delete", "current-parenthesis": "(Actual)",
"disabled": "Disabled", "dashboard": "Dashboard",
"download": "Download", "delete": "Eliminar",
"edit": "Edit", "disabled": "Deshabilitado",
"enabled": "Enabled", "download": "Descargar",
"exception": "Exception", "edit": "Editar",
"failed-count": "Failed: {count}", "enabled": "Habilitado",
"failure-uploading-file": "Failure uploading file", "exception": "Excepción",
"field-required": "Field Required", "failed-count": "Error: {count}",
"file-folder-not-found": "File/folder not found", "failure-uploading-file": "Error al cargar el archivo",
"file-uploaded": "File uploaded", "field-required": "Campo Requerido",
"filter": "Filter", "file-folder-not-found": "No se ha encontrado el archivo o la carpeta",
"friday": "Friday", "file-uploaded": "Archivo cargado",
"get": "Get", "filter": "Filtro",
"groups": "Groups", "friday": "Viernes",
"image": "Image", "get": "Obtener",
"image-upload-failed": "Image upload failed", "groups": "Grupos",
"import": "Import", "image": "Imagen",
"keyword": "Keyword", "image-upload-failed": "Error al subir la imagen",
"link": "Link", "import": "Importar",
"keyword": "Etiqueta",
"link": "Enlace",
"monday": "Monday", "monday": "Monday",
"name": "Name", "name": "Name",
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,27 +85,28 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",
"wednesday": "Wednesday", "wednesday": "Wednesday",
"yes": "Yes" "yes": "Si"
}, },
"group": { "group": {
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?", "are-you-sure-you-want-to-delete-the-group": "Por favor, confirma que deseas eliminar <b>{groupName}<b/>",
"cannot-delete-default-group": "Cannot delete default group", "cannot-delete-default-group": "No se puede eliminar el grupo predeterminado",
"cannot-delete-group-with-users": "Cannot delete group with users", "cannot-delete-group-with-users": "No se puede eliminar el grupo con usuarios",
"confirm-group-deletion": "Confirm Group Deletion", "confirm-group-deletion": "Confirmar Eliminación de Grupo",
"create-group": "Create Group", "create-group": "Crear Grupo",
"error-updating-group": "Error updating group", "error-updating-group": "Error al actualizar grupo",
"group": "Group", "group": "Grupo",
"group-deleted": "Group deleted", "group-deleted": "Grupo eliminado",
"group-deletion-failed": "Group deletion failed", "group-deletion-failed": "Error al eliminar grupo",
"group-id-with-value": "Group ID: {groupID}", "group-id-with-value": "ID del Grupo: {groupID}",
"group-name": "Group Name", "group-name": "Nombre del Grupo",
"group-not-found": "Group not found", "group-not-found": "Grupo no encontrado",
"groups": "Groups", "groups": "Grupos",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators", "groups-can-only-be-set-by-administrators": "Los grupos sólo pueden ser establecidos por administradores",
"user-group": "User Group", "user-group": "User Group",
"user-group-created": "User Group Created", "user-group-created": "User Group Created",
"user-group-creation-failed": "User Group Creation Failed" "user-group-creation-failed": "User Group Creation Failed"
@ -110,13 +115,13 @@
"create-a-new-meal-plan": "Create a New Meal Plan", "create-a-new-meal-plan": "Create a New Meal Plan",
"dinner-this-week": "Dinner This Week", "dinner-this-week": "Dinner This Week",
"dinner-today": "Dinner Today", "dinner-today": "Dinner Today",
"edit-meal-plan": "Edit Meal Plan", "edit-meal-plan": "Editar Plan de Comida",
"end-date": "End Date", "end-date": "Fecha de Finalización",
"group": "Group (Beta)", "group": "Grupo (Beta)",
"meal-planner": "Meal Planner", "meal-planner": "Plan de Comidas",
"meal-plans": "Meal Plans", "meal-plans": "Planes de Comidas",
"mealplan-created": "Mealplan created", "mealplan-created": "Plan de Comida creado",
"mealplan-creation-failed": "Mealplan creation failed", "mealplan-creation-failed": "Error al crear Plan de Comida",
"mealplan-deleted": "Mealplan Deleted", "mealplan-deleted": "Mealplan Deleted",
"mealplan-deletion-failed": "Mealplan deletion failed", "mealplan-deletion-failed": "Mealplan deletion failed",
"mealplan-update-failed": "Mealplan update failed", "mealplan-update-failed": "Mealplan update failed",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Mode démo", "demo-status": "Mode démo",
"development": "Développement", "development": "Développement",
"download-log": "Télécharger les logs", "download-log": "Télécharger les logs",
"download-recipe-json": "Télécharger le JSON de la recette", "download-recipe-json": "Dernier JSON récupéré",
"not-demo": "Non", "not-demo": "Non",
"production": "Production", "production": "Production",
"sqlite-file": "Fichier SQLite", "database-url": "URL de la base de données",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "La suppression de la catégorie a échoué", "category-deletion-failed": "La suppression de la catégorie a échoué",
"category-filter": "Filtre par catégories", "category-filter": "Filtre par catégories",
"category-update-failed": "La mise à jour de la catégorie a échoué", "category-update-failed": "La mise à jour de la catégorie a échoué",
"category-updated": "Catégorie mise à jour" "category-updated": "Catégorie mise à jour",
"category": "Catégorie"
}, },
"general": { "general": {
"apply": "Appliquer", "apply": "Appliquer",
@ -35,7 +36,9 @@
"close": "Supprimer", "close": "Supprimer",
"confirm": "Confirmer", "confirm": "Confirmer",
"create": "Créer", "create": "Créer",
"created": "Créé",
"current-parenthesis": "(Actuel)", "current-parenthesis": "(Actuel)",
"dashboard": "Tableau de bord",
"delete": "Supprimer", "delete": "Supprimer",
"disabled": "Désactivé", "disabled": "Désactivé",
"download": "Télécharger", "download": "Télécharger",
@ -55,12 +58,13 @@
"image-upload-failed": "Le téléchargement de l'image a échoué", "image-upload-failed": "Le téléchargement de l'image a échoué",
"import": "Importer", "import": "Importer",
"keyword": "Mot-clé", "keyword": "Mot-clé",
"link": "Link", "link": "Lien",
"monday": "Lundi", "monday": "Lundi",
"name": "Nom", "name": "Nom",
"no": "Non", "no": "Non",
"ok": "OK", "ok": "OK",
"options": "Options :", "options": "Options :",
"rating": "Note",
"random": "Aléatoire", "random": "Aléatoire",
"recent": "Récent", "recent": "Récent",
"recipes": "Recettes", "recipes": "Recettes",
@ -81,6 +85,7 @@
"token": "Jeton", "token": "Jeton",
"tuesday": "Mardi", "tuesday": "Mardi",
"update": "Mettre à jour", "update": "Mettre à jour",
"updated": "Mis à jour",
"upload": "Importer", "upload": "Importer",
"url": "URL", "url": "URL",
"users": "Utilisateurs", "users": "Utilisateurs",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -1,389 +1,394 @@
{ {
"404": { "404": {
"page-not-found": "404 Page Not Found", "page-not-found": "404 Pagina Non Trovata",
"take-me-home": "Take me Home" "take-me-home": "Vai alla Home"
}, },
"about": { "about": {
"about-mealie": "About Mealie", "about-mealie": "Info su Mealie",
"api-docs": "API Docs", "api-docs": "Documentazione API",
"api-port": "API Port", "api-port": "Porta API",
"application-mode": "Application Mode", "application-mode": "Modalità",
"database-type": "Database Type", "database-type": "Tipo Database",
"default-group": "Default Group", "default-group": "Gruppo Predefinito",
"demo": "Demo", "demo": "Demo",
"demo-status": "Demo Status", "demo-status": "Stato Demo",
"development": "Development", "development": "In Sviluppo",
"download-log": "Download Log", "download-log": "Scarica Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Ultimo JSON",
"not-demo": "Not Demo", "not-demo": "Non Demo",
"production": "Production", "production": "Produzione",
"sqlite-file": "SQLite File", "database-url": "URL Database",
"version": "Version" "version": "Versione"
}, },
"category": { "category": {
"category-created": "Category created", "category-created": "Categoria creata",
"category-creation-failed": "Category creation failed", "category-creation-failed": "Creazione categoria fallita",
"category-deleted": "Category Deleted", "category-deleted": "Categoria Eliminata",
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Eliminazione categoria fallita",
"category-filter": "Category Filter", "category-filter": "Filtro Categoria",
"category-update-failed": "Category update failed", "category-update-failed": "Aggiornamento categoria fallito",
"category-updated": "Category updated" "category-updated": "Categoria aggiornata",
"category": "Categoria"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Applica",
"cancel": "Cancel", "cancel": "Cancella",
"close": "Close", "close": "Chiudi",
"confirm": "Confirm", "confirm": "Conferma",
"create": "Create", "create": "Crea",
"current-parenthesis": "(Current)", "created": "Created",
"delete": "Delete", "current-parenthesis": "(Corrente)",
"disabled": "Disabled", "dashboard": "Pannello di controllo",
"delete": "Elimina",
"disabled": "Disabilitato",
"download": "Download", "download": "Download",
"edit": "Edit", "edit": "Modifica",
"enabled": "Enabled", "enabled": "Abilitato",
"exception": "Exception", "exception": "Eccezione",
"failed-count": "Failed: {count}", "failed-count": "Fallito: {count}",
"failure-uploading-file": "Failure uploading file", "failure-uploading-file": "Caricamento file fallito",
"field-required": "Field Required", "field-required": "Campo obbligatorio",
"file-folder-not-found": "File/folder not found", "file-folder-not-found": "Cartella/File non trovato",
"file-uploaded": "File uploaded", "file-uploaded": "File caricato",
"filter": "Filter", "filter": "Filtro",
"friday": "Friday", "friday": "Venerdì",
"get": "Get", "get": "Ottieni",
"groups": "Groups", "groups": "Gruppi",
"image": "Image", "image": "Immagine",
"image-upload-failed": "Image upload failed", "image-upload-failed": "Caricamento immagine fallito",
"import": "Import", "import": "Importa",
"keyword": "Keyword", "keyword": "Parola chiave",
"link": "Link", "link": "Link",
"monday": "Monday", "monday": "Lunedì",
"name": "Name", "name": "Nome",
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Opzioni:",
"random": "Random", "rating": "Rating",
"recent": "Recent", "random": "Casuale",
"recipes": "Recipes", "recent": "Recente",
"rename-object": "Rename {0}", "recipes": "Ricette",
"reset": "Reset", "rename-object": "Rinomina {0}",
"saturday": "Saturday", "reset": "Reimposta",
"save": "Save", "saturday": "Sabato",
"settings": "Settings", "save": "Salva",
"sort": "Sort", "settings": "Impostazioni",
"sort": "Ordina",
"sort-alphabetically": "A-Z", "sort-alphabetically": "A-Z",
"status": "Status", "status": "Stato",
"submit": "Submit", "submit": "Invia",
"success-count": "Success: {count}", "success-count": "Successo: {count}",
"sunday": "Sunday", "sunday": "Domenica",
"templates": "Templates:", "templates": "Modelli:",
"themes": "Themes", "themes": "Temi",
"thursday": "Thursday", "thursday": "Giovedì",
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Martedì",
"update": "Update", "update": "Aggiorna",
"upload": "Upload", "updated": "Updated",
"upload": "Carica",
"url": "URL", "url": "URL",
"users": "Users", "users": "Utenti",
"wednesday": "Wednesday", "wednesday": "Mercoledì",
"yes": "Yes" "yes": ""
}, },
"group": { "group": {
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?", "are-you-sure-you-want-to-delete-the-group": "Sei sicuro di volerlo eliminare <b>{groupName}<b/>'?",
"cannot-delete-default-group": "Cannot delete default group", "cannot-delete-default-group": "Impossibile eliminare il gruppo predefinito",
"cannot-delete-group-with-users": "Cannot delete group with users", "cannot-delete-group-with-users": "Impossibile eliminare il gruppo con utenti",
"confirm-group-deletion": "Confirm Group Deletion", "confirm-group-deletion": "Conferma Eliminazione Gruppo",
"create-group": "Create Group", "create-group": "Crea Gruppo",
"error-updating-group": "Error updating group", "error-updating-group": "Errore aggiornamento gruppo",
"group": "Group", "group": "Gruppo",
"group-deleted": "Group deleted", "group-deleted": "Gruppo eliminato",
"group-deletion-failed": "Group deletion failed", "group-deletion-failed": "Eliminazione gruppo fallita",
"group-id-with-value": "Group ID: {groupID}", "group-id-with-value": "ID Gruppo:{groupID}",
"group-name": "Group Name", "group-name": "Nome Gruppo",
"group-not-found": "Group not found", "group-not-found": "Gruppo non trovato",
"groups": "Groups", "groups": "Gruppi",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators", "groups-can-only-be-set-by-administrators": "I gruppi possono essere impostati solo dagli amministratori",
"user-group": "User Group", "user-group": "Gruppo Utente",
"user-group-created": "User Group Created", "user-group-created": "Gruppo Utente Creato",
"user-group-creation-failed": "User Group Creation Failed" "user-group-creation-failed": "Creazione Gruppo Utente Fallita"
}, },
"meal-plan": { "meal-plan": {
"create-a-new-meal-plan": "Create a New Meal Plan", "create-a-new-meal-plan": "Crea un Nuovo Piano Alimentare",
"dinner-this-week": "Dinner This Week", "dinner-this-week": "Cena Questa Settimana",
"dinner-today": "Dinner Today", "dinner-today": "Cena Oggi",
"edit-meal-plan": "Edit Meal Plan", "edit-meal-plan": "Modifica Piano Alimentare",
"end-date": "End Date", "end-date": "Data Fine",
"group": "Group (Beta)", "group": "Gruppo (Beta)",
"meal-planner": "Meal Planner", "meal-planner": "Piano Alimentare",
"meal-plans": "Meal Plans", "meal-plans": "Piani Alimentari",
"mealplan-created": "Mealplan created", "mealplan-created": "Piano allimentare creato",
"mealplan-creation-failed": "Mealplan creation failed", "mealplan-creation-failed": "Creazione piano alimentare fallita",
"mealplan-deleted": "Mealplan Deleted", "mealplan-deleted": "Piano Alimentare Eliminato",
"mealplan-deletion-failed": "Mealplan deletion failed", "mealplan-deletion-failed": "Eliminazione piano alimentare fallita",
"mealplan-update-failed": "Mealplan update failed", "mealplan-update-failed": "Aggiornamento piano alimentare fallito",
"mealplan-updated": "Mealplan Updated", "mealplan-updated": "Piano Alimentare Aggiornato",
"no-meal-plan-defined-yet": "No meal plan defined yet", "no-meal-plan-defined-yet": "Ancora nessun piano alimentare definito",
"no-meal-planned-for-today": "No meal planned for today", "no-meal-planned-for-today": "Nessun piano alimentare per oggi",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans", "only-recipes-with-these-categories-will-be-used-in-meal-plans": "Solo ricette con queste categorie possono essere utilizzate un un Piano Alimentare",
"planner": "Planner", "planner": "Pianificatore",
"quick-week": "Quick Week", "quick-week": "Settimana Veloce",
"shopping-list": "Shopping List", "shopping-list": "Lista della Spesa",
"start-date": "Start Date" "start-date": "Data Inizio"
}, },
"migration": { "migration": {
"chowdown": { "chowdown": {
"description": "Migrate data from Chowdown", "description": "Migra dati da Chowdown",
"title": "Chowdown" "title": "Chowdown"
}, },
"migration-data-removed": "Migration data removed", "migration-data-removed": "Dati di migrazione rimossi",
"nextcloud": { "nextcloud": {
"description": "Migrate data from a Nextcloud Cookbook intance", "description": "Migra i dati da Nextcloud Cookbook",
"title": "Nextcloud Cookbook" "title": "Nextcloud Cookbook"
}, },
"no-migration-data-available": "No Migration Data Avaiable", "no-migration-data-available": "Dati Di Migrazione Non Disponibili",
"recipe-migration": "Recipe Migration" "recipe-migration": "Migrazione Ricetta"
}, },
"new-recipe": { "new-recipe": {
"bulk-add": "Bulk Add", "bulk-add": "Aggiungi In Massa",
"error-message": "Looks like there was an error parsing the URL. Check the log and debug/last_recipe.json to see what went wrong.", "error-message": "Sembra che ci sia stato un errore nell'analisi dell'URL. Controlla il log e debug/last_recipe.json per vedere cosa è andato storto.",
"from-url": "Import a Recipe", "from-url": "Importa ricetta",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list", "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Incolla nei dati delle tue ricette. Ogni riga sarà trattata come un elemento in una lista",
"recipe-url": "Recipe URL", "recipe-url": "URL Ricetta",
"url-form-hint": "Copy and paste a link from your favorite recipe website" "url-form-hint": "Copia e incolla un link dal tuo sito di ricette preferito"
}, },
"page": { "page": {
"all-recipes": "All Recipes", "all-recipes": "Tutte le ricette",
"home-page": "Home Page", "home-page": "Home Page",
"new-page-created": "New page created", "new-page-created": "Nuova pagina creata",
"page-creation-failed": "Page creation failed", "page-creation-failed": "Creazione pagina fallita",
"page-deleted": "Page deleted", "page-deleted": "Pagina eliminata",
"page-deletion-failed": "Page deletion failed", "page-deletion-failed": "Eliminazione pagina fallita",
"page-update-failed": "Page update failed", "page-update-failed": "Aggiornamento pagina fallito",
"page-updated": "Page updated", "page-updated": "Pagina aggiornata",
"pages-update-failed": "Pages update failed", "pages-update-failed": "Aggiornamento pagine fallito",
"pages-updated": "Pages updated", "pages-updated": "Pagine aggiornate",
"recent": "Recent" "recent": "Recente"
}, },
"recipe": { "recipe": {
"add-key": "Add Key", "add-key": "Aggiungi Chiave",
"api-extras": "API Extras", "api-extras": "API Extras",
"assets": "Assets", "assets": "Risorse",
"calories": "Calories", "calories": "Calorie",
"calories-suffix": "calories", "calories-suffix": "calorie",
"carbohydrate-content": "Carbohydrate", "carbohydrate-content": "Carboidrati",
"categories": "Categories", "categories": "Categorie",
"delete-confirmation": "Are you sure you want to delete this recipe?", "delete-confirmation": "Sei sicuro di voler eliminare questa ricetta?",
"delete-recipe": "Delete Recipe", "delete-recipe": "Elimina Ricetta",
"description": "Description", "description": "Descrizione",
"fat-content": "Fat", "fat-content": "Grassi",
"fiber-content": "Fiber", "fiber-content": "Fibre",
"grams": "grams", "grams": "grammi",
"ingredient": "Ingredient", "ingredient": "Ingrediente",
"ingredients": "Ingredients", "ingredients": "Ingredienti",
"instructions": "Instructions", "instructions": "Istruzioni",
"key-name-required": "Key Name Required", "key-name-required": "Nome Chiave Richiesto",
"landscape-view-coming-soon": "Landscape View (Coming Soon)", "landscape-view-coming-soon": "Vista Orizzontale (Prossimamente)",
"milligrams": "milligrams", "milligrams": "milligrammi",
"new-asset": "New Asset", "new-asset": "Nuova Risorsa",
"new-key-name": "New Key Name", "new-key-name": "Nuovo Nome Chiave",
"no-white-space-allowed": "No White Space Allowed", "no-white-space-allowed": "Nessun Spazio Consentito",
"note": "Note", "note": "Nota",
"notes": "Notes", "notes": "Note",
"nutrition": "Nutrition", "nutrition": "Nutrienti",
"object-key": "Object Key", "object-key": "Chiave Oggetto",
"object-value": "Object Value", "object-value": "Valore Oggetto",
"original-url": "Original URL", "original-url": "URL Originale",
"perform-time": "Cook Time", "perform-time": "Tempo Cottura",
"prep-time": "Prep Time", "prep-time": "Tempo Preparazione",
"protein-content": "Protein", "protein-content": "Proteine",
"public-recipe": "Public Recipe", "public-recipe": "Ricetta Pubblica",
"recipe-created": "Recipe created", "recipe-created": "Ricetta creata",
"recipe-creation-failed": "Recipe creation failed", "recipe-creation-failed": "Creatione ricetta fallita",
"recipe-deleted": "Recipe deleted", "recipe-deleted": "Ricetta eliminata",
"recipe-image": "Recipe Image", "recipe-image": "Immagine Ricetta",
"recipe-image-updated": "Recipe image updated", "recipe-image-updated": "Immagine ricetta aggiornata",
"recipe-name": "Recipe Name", "recipe-name": "Nome Ricetta",
"recipe-settings": "Recipe Settings", "recipe-settings": "Impostazioni Ricetta",
"recipe-update-failed": "Recipe update failed", "recipe-update-failed": "Aggiornamento ricetta fallito",
"recipe-updated": "Recipe updated", "recipe-updated": "Ricetta aggiornata",
"servings": "Servings", "servings": "Portate",
"show-assets": "Show Assets", "show-assets": "Mostra Risorse",
"show-nutrition-values": "Show Nutrition Values", "show-nutrition-values": "Mostra Valori Nutrizionali",
"sodium-content": "Sodium", "sodium-content": "Sodio",
"step-index": "Step: {step}", "step-index": "Passo: {step}",
"sugar-content": "Sugar", "sugar-content": "Zuccheri",
"title": "Title", "title": "Titolo",
"total-time": "Total Time", "total-time": "Tempo Totale",
"unable-to-delete-recipe": "Unable to Delete Recipe", "unable-to-delete-recipe": "Impossibile eliminare ricetta",
"view-recipe": "View Recipe" "view-recipe": "Vedi Ricetta"
}, },
"search": { "search": {
"and": "and", "and": "e",
"exclude": "Exclude", "exclude": "Escludi",
"include": "Include", "include": "Includi",
"max-results": "Max Results", "max-results": "Risultati Massimi",
"or": "Or", "or": "O",
"search": "Search", "search": "Cerca",
"search-mealie": "Search Mealie (press /)", "search-mealie": "Cerca Mealie (premi /)",
"search-placeholder": "Search...", "search-placeholder": "Cerca...",
"tag-filter": "Tag Filter" "tag-filter": "Filtro Tag"
}, },
"settings": { "settings": {
"add-a-new-theme": "Add a New Theme", "add-a-new-theme": "Aggiungi un Nuovo Tema",
"admin-settings": "Admin Settings", "admin-settings": "Impostazioni Amministratore",
"available-backups": "Available Backups", "available-backups": "Backups Disponibili",
"backup": { "backup": {
"backup-created-at-response-export_path": "Backup Created at {path}", "backup-created-at-response-export_path": "Backup Creato in {path}",
"backup-deleted": "Backup deleted", "backup-deleted": "Backup eliminato",
"backup-tag": "Backup Tag", "backup-tag": "Tag Backup",
"create-heading": "Create a Backup", "create-heading": "Crea un Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File", "error-creating-backup-see-log-file": "Errore nella creazione del Backup. Vedi il file di log",
"full-backup": "Full Backup", "full-backup": "Backup Completo",
"import-summary": "Import Summary", "import-summary": "Importa Riepilogo",
"partial-backup": "Partial Backup", "partial-backup": "Backup Parziale",
"unable-to-delete-backup": "Unable to Delete Backup." "unable-to-delete-backup": "Impossibile rimuovere backup."
}, },
"backup-and-exports": "Backups", "backup-and-exports": "Backups",
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.", "backup-info": "I backup sono esportati in formato standard JSON insieme a tutte le immagine salvate nei file di sistema. Nella tua cartella di backup troverai un file .zip contenente tutto le ricette JSON e immagini del database. In aggiunta, se hai selezionato un file markdown, anche questo verrà salvato nel file .zip. Per importare il backup, deve essere salvato nella cartella di backup. Backup automatici vengono eseguiti ogni giorno alle 03:00.",
"change-password": "Change Password", "change-password": "Modifica Password",
"current": "Version:", "current": "Versione:",
"custom-pages": "Custom Pages", "custom-pages": "Pagine Personalizzate",
"edit-page": "Edit Page", "edit-page": "Modifica Pagina",
"first-day-of-week": "First day of the week", "first-day-of-week": "Primo giorno della settimana",
"group-settings-updated": "Group Settings Updated", "group-settings-updated": "Impostazioni Gruppo Aggiornate",
"homepage": { "homepage": {
"all-categories": "All Categories", "all-categories": "Tutte le Categorie",
"card-per-section": "Card Per Section", "card-per-section": "Scheda Per Sezione",
"home-page": "Home Page", "home-page": "Home Page",
"home-page-sections": "Home Page Sections", "home-page-sections": "Sezioni Home Page",
"show-recent": "Show Recent" "show-recent": "Mostra Recenti"
}, },
"language": "Language", "language": "Lingua",
"latest": "Latest", "latest": "Recenti",
"local-api": "Local API", "local-api": "API Locale",
"locale-settings": "Locale settings", "locale-settings": "Impostazioni regionali",
"manage-users": "Manage Users", "manage-users": "Gestisci Utenti",
"migrations": "Migrations", "migrations": "Migrazioni",
"new-page": "New Page", "new-page": "Nuova Pagina",
"page-name": "Page Name", "page-name": "Nome Pagina",
"pages": "Pages", "pages": "Pagine",
"profile": "Profile", "profile": "Profilo",
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries", "remove-existing-entries-matching-imported-entries": "Rimuovi le voci esistenti corrispondenti alle voci importate",
"set-new-time": "Set New Time", "set-new-time": "Imposta Nuova Ora",
"settings-update-failed": "Settings update failed", "settings-update-failed": "Aggiornamento impostazioni fallito",
"settings-updated": "Settings updated", "settings-updated": "Impostazioni aggiornate",
"site-settings": "Site Settings", "site-settings": "Impostazioni Sito",
"theme": { "theme": {
"accent": "Accent", "accent": "Accento",
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?", "are-you-sure-you-want-to-delete-this-theme": "Sei sicuro di voler eliminare questo tema?",
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.", "choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Scegli l'aspetto die Mealie. Seleziona la di seguire le impostazioni di sistema, oppure segli tema scuro o chiaro.",
"dark": "Dark", "dark": "Scuro",
"dark-mode": "Dark Mode", "dark-mode": "Modalità Scura",
"default-to-system": "Default to system", "default-to-system": "Predefinito di sistema",
"delete-theme": "Delete Theme", "delete-theme": "Elimina Tema",
"error": "Error", "error": "Errore",
"error-creating-theme-see-log-file": "Error creating theme. See log file.", "error-creating-theme-see-log-file": "Errore creazione tema. Guarda i log.",
"error-deleting-theme": "Error deleting theme", "error-deleting-theme": "Errore eliminazione tema",
"error-updating-theme": "Error updating theme", "error-updating-theme": "Errore aggiornamento tema",
"info": "Info", "info": "Info",
"light": "Light", "light": "Chiaro",
"primary": "Primary", "primary": "Primario",
"secondary": "Secondary", "secondary": "Secondario",
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.", "select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Seleziona un tema dalla tendina oppure creane uno nuovo. Nota che il tema predefinito verrà impostato a tutti gli utenti che non hanno selezionato un tema.",
"success": "Success", "success": "Successo",
"theme": "Theme", "theme": "Tema",
"theme-deleted": "Theme deleted", "theme-deleted": "Tema eliminato",
"theme-name": "Theme Name", "theme-name": "Nome Tema",
"theme-name-is-required": "Theme Name is required.", "theme-name-is-required": "Nome Tema obbligatorio.",
"theme-saved": "Theme Saved", "theme-saved": "Tema Salvato",
"theme-settings": "Theme Settings", "theme-settings": "Impostazioni Tema",
"theme-updated": "Theme updated", "theme-updated": "Tema aggiornato",
"warning": "Warning" "warning": "Avviso"
}, },
"toolbox": { "toolbox": {
"assign-all": "Assign All", "assign-all": "Assegna Tutto",
"bulk-assign": "Bulk Assign", "bulk-assign": "Assegna Bulk",
"new-name": "New Name", "new-name": "Nuovo nome",
"no-unused-items": "No Unused Items", "no-unused-items": "Nessun Elemento Inutilizzato",
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected", "recipes-affected": "Nessuna Ricetta Interessata|Una Ricetta Interessata|{count} Ricette Interessate",
"remove-unused": "Remove Unused", "remove-unused": "Rimuovi Inutilizzate",
"title-case-all": "Title Case All", "title-case-all": "Maiuscole Ovunque",
"toolbox": "Toolbox" "toolbox": "Strumenti"
}, },
"webhooks": { "webhooks": {
"meal-planner-webhooks": "Meal Planner Webhooks", "meal-planner-webhooks": "Webhooks Pianificatore Alimentare",
"test-webhooks": "Test Webhooks", "test-webhooks": "Testa Webhooks",
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at", "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Gli URL elencati sotto riceveranno dei webhooks contenenti i dati delle ricette per il piano alimentare nel giorno programmato. I Webhooks correnti verrano eseguiti alle",
"webhook-url": "Webhook URL" "webhook-url": "URL Webhook"
} }
}, },
"signup": { "signup": {
"display-name": "Display Name", "display-name": "Mostra Nome",
"error-signing-up": "Error Signing Up", "error-signing-up": "Errore Registrazione",
"sign-up": "Sign Up", "sign-up": "Registrati",
"sign-up-link-created": "Sign up link created", "sign-up-link-created": "Link di registrazione creato",
"sign-up-link-creation-failed": "Sign up link creation failed", "sign-up-link-creation-failed": "Creazione del link di registrazione fallita",
"sign-up-links": "Sign Up Links", "sign-up-links": "Link Registrazione",
"sign-up-token-deleted": "Sign Up Token Deleted", "sign-up-token-deleted": "Token Registrazione Eliminato",
"sign-up-token-deletion-failed": "Sign up token deletion failed", "sign-up-token-deletion-failed": "Eliminazione token registrazione fallita",
"welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator." "welcome-to-mealie": "Benvenuto a Mealie! Per diventare un utente hai bisogno di un link di invito alla registazione. Se non hai ricevuto il link non puoi registrarti. Per ricevere il link contatta l'amministratore."
}, },
"tag": { "tag": {
"tag-created": "Tag created", "tag-created": "Tag creato",
"tag-creation-failed": "Tag creation failed", "tag-creation-failed": "Creazione tag fallita",
"tag-deleted": "Tag deleted", "tag-deleted": "Tag eliminato",
"tag-deletion-failed": "Tag deletion failed", "tag-deletion-failed": "Eliminazione tag fallita",
"tag-update-failed": "Tag update failed", "tag-update-failed": "Aggiornamento tag fallito",
"tag-updated": "Tag updated", "tag-updated": "Tag aggiornato",
"tags": "Tags" "tags": "Tags"
}, },
"user": { "user": {
"admin": "Admin", "admin": "Amministratore",
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?", "are-you-sure-you-want-to-delete-the-link": "Sei sicuro di voler eliminare il link <b>{link}<b/>?",
"are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user <b>{activeName} ID: {activeId}<b/>?", "are-you-sure-you-want-to-delete-the-user": "Sei dicuro di voler eliminare l'utente <b>{activeName} ID: {activeId}<b/>?",
"confirm-link-deletion": "Confirm Link Deletion", "confirm-link-deletion": "Conferma Eliminazione Link",
"confirm-password": "Confirm Password", "confirm-password": "Conferma Password",
"confirm-user-deletion": "Confirm User Deletion", "confirm-user-deletion": "Conferma Eliminazione Utente",
"could-not-validate-credentials": "Could Not Validate Credentials", "could-not-validate-credentials": "Credenziale Non Valide",
"create-link": "Create Link", "create-link": "Crea Link",
"create-user": "Create User", "create-user": "Crea Utente",
"current-password": "Current Password", "current-password": "Password Corrente",
"e-mail-must-be-valid": "E-mail must be valid", "e-mail-must-be-valid": "E-mail deve essere valida",
"edit-user": "Edit User", "edit-user": "Modifica Utente",
"email": "Email", "email": "Email",
"error-cannot-delete-super-user": "Error! Cannot Delete Super User", "error-cannot-delete-super-user": "Errore! Impossibile Eliminare Super User",
"existing-password-does-not-match": "Existing password does not match", "existing-password-does-not-match": "La nuova password non corrisponde",
"full-name": "Full Name", "full-name": "Nome",
"incorrect-username-or-password": "Incorrect username or password", "incorrect-username-or-password": "Passwor o nome untete sbagliato",
"link-id": "Link ID", "link-id": "Link ID",
"link-name": "Link Name", "link-name": "Link Nome",
"login": "Login", "login": "Login",
"logout": "Logout", "logout": "Logout",
"new-password": "New Password", "new-password": "Nuova Password",
"new-user": "New User", "new-user": "Nuovo Utente",
"password": "Password", "password": "Password",
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password", "password-has-been-reset-to-the-default-password": "La password è stata reimpostata a quella di default",
"password-must-match": "Password must match", "password-must-match": "Le password devono essere uguali",
"password-reset-failed": "Password reset failed", "password-reset-failed": "Reimpostazione della password fallita",
"password-updated": "Password updated", "password-updated": "Password aggiornata",
"reset-password": "Reset Password", "reset-password": "Reimposta Password",
"sign-in": "Sign in", "sign-in": "Accedi",
"total-mealplans": "Total MealPlans", "total-mealplans": "Totale Piani Alimentari",
"total-users": "Total Users", "total-users": "Totale Utenti",
"upload-photo": "Upload Photo", "upload-photo": "Carica Foto",
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password", "use-8-characters-or-more-for-your-password": "Usa 8 caratteri o piú per la password",
"user-created": "User created", "user-created": "Utente creato",
"user-creation-failed": "User creation failed", "user-creation-failed": "Creazione utente fallita",
"user-deleted": "User deleted", "user-deleted": "Utente eliminato",
"user-id": "User ID", "user-id": "ID Utente",
"user-id-with-value": "User ID: {id}", "user-id-with-value": "ID Utente:{id}",
"user-password": "User Password", "user-password": "Password Utente",
"user-successfully-logged-in": "User Successfully Logged In", "user-successfully-logged-in": "Autenticato Con Successo",
"user-update-failed": "User update failed", "user-update-failed": "Aggiornamento Utenete Fallito",
"user-updated": "User updated", "user-updated": "Utente Aggiornato",
"users": "Users", "users": "Utenti",
"webhook-time": "Webhook Time", "webhook-time": "Ora Webhook",
"webhooks-enabled": "Webhooks Enabled", "webhooks-enabled": "Webhooks Abilitati",
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user", "you-are-not-allowed-to-create-a-user": "Non sei autorizzato per la creazione di utenti",
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user" "you-are-not-allowed-to-delete-this-user": "Non sei autorizzato per la eliminazione di utenti"
} }
} }

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo status", "demo-status": "Demo status",
"development": "Versies in ontwikkeling", "development": "Versies in ontwikkeling",
"download-log": "Logbestand downloaden", "download-log": "Logbestand downloaden",
"download-recipe-json": "Download Recept JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Niet Demo", "not-demo": "Niet Demo",
"production": "Productie", "production": "Productie",
"sqlite-file": "SQLite bestand", "database-url": "Database URL",
"version": "Versie" "version": "Versie"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Categorie verwijderen mislukt", "category-deletion-failed": "Categorie verwijderen mislukt",
"category-filter": "Categorie Filter", "category-filter": "Categorie Filter",
"category-update-failed": "Categorie bijwerken mislukt", "category-update-failed": "Categorie bijwerken mislukt",
"category-updated": "Categorie bijgewerkt" "category-updated": "Categorie bijgewerkt",
"category": "Category"
}, },
"general": { "general": {
"apply": "Toepassen", "apply": "Toepassen",
@ -35,7 +36,9 @@
"close": "Sluiten", "close": "Sluiten",
"confirm": "Bevestigen", "confirm": "Bevestigen",
"create": "Maak", "create": "Maak",
"created": "Created",
"current-parenthesis": "(Huidig)", "current-parenthesis": "(Huidig)",
"dashboard": "Dashboard",
"delete": "Verwijderen", "delete": "Verwijderen",
"disabled": "Uitgeschakeld", "disabled": "Uitgeschakeld",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "Nee", "no": "Nee",
"ok": "Ok", "ok": "Ok",
"options": "Opties:", "options": "Opties:",
"rating": "Rating",
"random": "Willekeurig", "random": "Willekeurig",
"recent": "Recent(e)", "recent": "Recent(e)",
"recipes": "Recepten", "recipes": "Recepten",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Dinsdag", "tuesday": "Dinsdag",
"update": "Bijwerken", "update": "Bijwerken",
"updated": "Updated",
"upload": "Uploaden", "upload": "Uploaden",
"url": "URL", "url": "URL",
"users": "Gebruikers", "users": "Gebruikers",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Status demo", "demo-status": "Status demo",
"development": "Wersja testowa", "development": "Wersja testowa",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Nie demo", "not-demo": "Nie demo",
"production": "Produkcyjna", "production": "Produkcyjna",
"sqlite-file": "Plik SQLite'a", "database-url": "Database URL",
"version": "Wersja" "version": "Wersja"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Zastosuj", "apply": "Zastosuj",
@ -35,7 +36,9 @@
"close": "Zamknij", "close": "Zamknij",
"confirm": "Potwierdź", "confirm": "Potwierdź",
"create": "Utwórz", "create": "Utwórz",
"created": "Created",
"current-parenthesis": "(Bieżący)", "current-parenthesis": "(Bieżący)",
"dashboard": "Dashboard",
"delete": "Usuń", "delete": "Usuń",
"disabled": "Wyłączone", "disabled": "Wyłączone",
"download": "Pobierz", "download": "Pobierz",
@ -61,6 +64,7 @@
"no": "Nie", "no": "Nie",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Losowa", "random": "Losowa",
"recent": "Najnowsze", "recent": "Najnowsze",
"recipes": "Przepisy", "recipes": "Przepisy",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Wtorek", "tuesday": "Wtorek",
"update": "Uaktualnij", "update": "Uaktualnij",
"updated": "Updated",
"upload": "Prześlij", "upload": "Prześlij",
"url": "URL", "url": "URL",
"users": "Użytkownicy", "users": "Użytkownicy",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Fechar", "close": "Fechar",
"confirm": "Confirmar", "confirm": "Confirmar",
"create": "Criar", "create": "Criar",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Eliminar", "delete": "Eliminar",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Transferir", "download": "Transferir",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Aleatório", "random": "Aleatório",
"recent": "Recent", "recent": "Recent",
"recipes": "Receitas", "recipes": "Receitas",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Atualizar", "update": "Atualizar",
"updated": "Updated",
"upload": "Enviar", "upload": "Enviar",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Stäng", "close": "Stäng",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Skapa", "create": "Skapa",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Ta bort", "delete": "Ta bort",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Ladda ner", "download": "Ladda ner",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "Ok", "ok": "Ok",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Slumpa", "random": "Slumpa",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Uppdatera", "update": "Uppdatera",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

View file

@ -14,10 +14,10 @@
"demo-status": "Demo Status", "demo-status": "Demo Status",
"development": "Development", "development": "Development",
"download-log": "Download Log", "download-log": "Download Log",
"download-recipe-json": "Download Recipe JSON", "download-recipe-json": "Last Scraped JSON",
"not-demo": "Not Demo", "not-demo": "Not Demo",
"production": "Production", "production": "Production",
"sqlite-file": "SQLite File", "database-url": "Database URL",
"version": "Version" "version": "Version"
}, },
"category": { "category": {
@ -27,7 +27,8 @@
"category-deletion-failed": "Category deletion failed", "category-deletion-failed": "Category deletion failed",
"category-filter": "Category Filter", "category-filter": "Category Filter",
"category-update-failed": "Category update failed", "category-update-failed": "Category update failed",
"category-updated": "Category updated" "category-updated": "Category updated",
"category": "Category"
}, },
"general": { "general": {
"apply": "Apply", "apply": "Apply",
@ -35,7 +36,9 @@
"close": "Close", "close": "Close",
"confirm": "Confirm", "confirm": "Confirm",
"create": "Create", "create": "Create",
"created": "Created",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"dashboard": "Dashboard",
"delete": "Delete", "delete": "Delete",
"disabled": "Disabled", "disabled": "Disabled",
"download": "Download", "download": "Download",
@ -61,6 +64,7 @@
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"options": "Options:", "options": "Options:",
"rating": "Rating",
"random": "Random", "random": "Random",
"recent": "Recent", "recent": "Recent",
"recipes": "Recipes", "recipes": "Recipes",
@ -81,6 +85,7 @@
"token": "Token", "token": "Token",
"tuesday": "Tuesday", "tuesday": "Tuesday",
"update": "Update", "update": "Update",
"updated": "Updated",
"upload": "Upload", "upload": "Upload",
"url": "URL", "url": "URL",
"users": "Users", "users": "Users",

Some files were not shown because too many files have changed in this diff Show more