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.pythonPath": ".venv/bin/python3.9",
"python.linting.pylintEnabled": true,
"python.linting.pylintEnabled": false,
"python.linting.enabled": true,
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false,
"python.testing.pytestEnabled": true,
"python.testing.autoTestDiscoverOnSaveEnabled": false,
"python.testing.pytestArgs": ["tests"],
"cSpell.enableFiletypes": [
"!javascript",
"!python",
"!yaml"
],
"cSpell.enableFiletypes": ["!javascript", "!python", "!yaml"],
"i18n-ally.localesPaths": "frontend/src/locales/messages",
"i18n-ally.sourceLanguage": "en-US",
"i18n-ally.enabledFrameworks": ["vue"],
"i18n-ally.keystyle": "nested",
"cSpell.words": [
"compression",
"hkotel",
"performant",
"postgres",
"webp"
],
"search.mode": "reuseEditor"
"cSpell.words": ["compression", "hkotel", "performant", "postgres", "webp"],
"search.mode": "reuseEditor",
"python.linting.flake8Enabled": true
}

View file

@ -6,12 +6,12 @@
:80 {
@proxied path /api/* /docs /openapi.json
root * /app/dist
encode gzip
encode gzip zstd
uri strip_suffix /
handle_path /api/recipes/image/* {
root * /app/data/img/
# Handles Recipe Images / Assets
handle_path /api/media/recipes/* {
root * /app/data/recipes/
file_server
}
@ -20,8 +20,8 @@
}
handle {
try_files {path}.html {path} /
root * /app/dist
try_files {path}.html {path} /index.html
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
- 🔍 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
- 💪 Powerful bulk Category/Tag assignment
- 📱 Beautiful Mobile Views
- 📆 Create Meal Plans
- 🛒 Generate shopping lists
- 🐳 Easy setup with Docker
- 🎨 Customize your interface with color themes layouts
- 💾 Export all your data in any format with Jinja2 Templates, with easy data restoration from the user interface.
- 🎨 Customize your interface with color themes
- 💾 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
- Plus tons more!
- Flexible API

View file

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

View file

@ -2,25 +2,32 @@ class AppRoutes:
def __init__(self) -> None:
self.prefix = "/api"
self.users_sign_ups = "/api/users/sign-ups"
self.auth_token = "/api/auth/token"
self.auth_token_long = "/api/auth/token/long"
self.auth_refresh = "/api/auth/refresh"
self.users_sign_ups = "/api/users/sign-ups"
self.users = "/api/users"
self.users_self = "/api/users/self"
self.users_api_tokens = "/api/users-tokens"
self.groups = "/api/groups"
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_tag = "/api/recipes/tag"
self.categories = "/api/categories"
self.recipes_tags = "/api/recipes/tags/"
self.recipes_create = "/api/recipes/create"
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_create = "/api/meal-plans/create"
self.meal_plans_this_week = "/api/meal-plans/this-week"
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 = "/api/site-settings"
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_upload = "/api/backups/upload"
self.migrations = "/api/migrations"
self.debug = "/api/debug"
self.debug_statistics = "/api/debug/statistics"
self.debug_version = "/api/debug/version"
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):
return f"{self.prefix}/users/sign-ups/{token}"
@ -48,21 +59,36 @@ class AppRoutes:
def users_id_password(self, id):
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):
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):
return f"{self.prefix}/recipes/{recipe_slug}"
def recipes_recipe_slug_image(self, recipe_slug):
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):
return f"{self.prefix}/meal-plans/{plan_id}"
@ -72,8 +98,8 @@ class AppRoutes:
def site_settings_custom_pages_id(self, id):
return f"{self.prefix}/site-settings/custom-pages/{id}"
def themes_theme_name(self, theme_name):
return f"{self.prefix}/themes/{theme_name}"
def themes_id(self, id):
return f"{self.prefix}/themes/{id}"
def backups_file_name_download(self, file_name):
return f"{self.prefix}/backups/{file_name}/download"
@ -84,14 +110,14 @@ class AppRoutes:
def backups_file_name_delete(self, file_name):
return f"{self.prefix}/backups/{file_name}/delete"
def migrations_type_file_name_import(self, type, file_name):
return f"{self.prefix}/migrations/{type}/{file_name}/import"
def migrations_import_type_file_name_import(self, import_type, file_name):
return f"{self.prefix}/migrations/{import_type}/{file_name}/import"
def migrations_type_file_name_delete(self, type, file_name):
return f"{self.prefix}/migrations/{type}/{file_name}/delete"
def migrations_import_type_file_name_delete(self, import_type, file_name):
return f"{self.prefix}/migrations/{import_type}/{file_name}/delete"
def migrations_type_upload(self, type):
return f"{self.prefix}/migrations/{type}/upload"
def migrations_import_type_upload(self, import_type):
return f"{self.prefix}/migrations/{import_type}/upload"
def debug_log_num(self, num):
return f"{self.prefix}/debug/log/{num}"

View file

@ -6,6 +6,8 @@ services:
dockerfile: Dockerfile
container_name: mealie
restart: always
depends_on:
- "postgres"
ports:
- 9090:80
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**
@ -9,7 +9,13 @@
!!! error "Breaking Changes"
#### 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
- Fixed #332 - Language settings are saved for one browser
@ -21,18 +27,31 @@
### Highlights
- 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!
- Bulk assign categories and tags by keyword search
- Title case all Categories or Tags with 1 click
- Create/Rename/Delete Operations for Tags/Categories
- Remove Unused Categories or Tags with 1 click
- Bulk assign categories and tags by keyword search
- Title case all Categories or Tags with 1 click
- Create/Rename/Delete Operations for Tags/Categories
- Remove Unused Categories or Tags with 1 click
- Recipe Cards now have a menu button for quick actions!
- Edit
- Delete
- Download (As Json)
- Copy Link
- Rating can be updated without entering the editor - Closes #25
- Edit
- Delete
- Download (As Json)
- Copy Link
- 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
- 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
### 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.
- Redesigned search bar
- 'Dinner this week' shows a warning when no meal is planned yet
@ -47,11 +76,11 @@
- More localization
- Start date for Week is now selectable
- Languages are now managed through Crowdin
- The main App bar went through a major overhaul
- Sidebar can now be toggled everywhere.
- New and improved mobile friendly bottom bar
- Improved styling for search bar in desktop
- Improved search layout on mobile
- Application Bar was Rewritten
- Sidebar can now be toggled everywhere.
- New and improved mobile friendly bottom bar
- Improved styling for search bar in desktop
- Improved search layout on mobile
- Profile image now shown on all sidebars
### Behind the Scenes
@ -61,4 +90,4 @@
- Refactor UI components to fit Vue best practices (WIP)
- The API returns more consistent status codes
- The API returns error code instead of error text when appropriate
- ⚠️ May cause side-effects if you were directly consuming the API
- ⚠️ May cause side-effects if you were directly consuming the API

View file

@ -1,5 +1,19 @@
# 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
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/";
import axios from "axios";
import { store } from "../store";
import utils from "@/utils";
import { utils } from "@/utils";
axios.defaults.headers.common["Authorization"] = `Bearer ${store.getters.getToken}`;

View file

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

View file

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

View file

@ -14,9 +14,9 @@ const recipeURLs = {
recipe: slug => prefix + slug,
update: slug => prefix + slug,
delete: slug => prefix + slug,
createAsset: slug => `${prefix}${slug}/assets`,
recipeImage: slug => `${prefix}${slug}/image`,
updateImage: slug => `${prefix}${slug}/image`,
createAsset: slug => `${prefix}${slug}/asset`,
};
export const recipeAPI = {
@ -84,7 +84,7 @@ export const recipeAPI = {
fd.append("extension", fileObject.name.split(".").pop());
fd.append("name", name);
fd.append("icon", icon);
let response = apiReq.post(recipeURLs.createAsset(recipeSlug), fd);
const response = apiReq.post(recipeURLs.createAsset(recipeSlug), fd);
return response;
},
@ -135,14 +135,18 @@ export const recipeAPI = {
},
recipeImage(recipeSlug) {
return `/api/recipes/image/${recipeSlug}/original.webp`;
return `/api/media/recipes/${recipeSlug}/images/original.webp`;
},
recipeSmallImage(recipeSlug) {
return `/api/recipes/image/${recipeSlug}/min-original.webp`;
return `/api/media/recipes/${recipeSlug}/images/min-original.webp`;
},
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 = {
allThemes: `${baseURL}themes`,
specificTheme: themeName => `${prefix}/${themeName}`,
specificTheme: id => `${prefix}/${id}`,
createTheme: `${prefix}/create`,
updateTheme: themeName => `${prefix}/${themeName}`,
deleteTheme: themeName => `${prefix}/${themeName}`,
updateTheme: id => `${prefix}/${id}`,
deleteTheme: id => `${prefix}/${id}`,
};
export const themeAPI = {
@ -32,22 +32,18 @@ export const themeAPI = {
);
},
update(themeName, colors) {
const body = {
name: themeName,
colors: colors,
};
update(data) {
return apiReq.put(
settingsURLs.updateTheme(themeName),
body,
settingsURLs.updateTheme(data.id),
data,
() => i18n.t("settings.theme.error-updating-theme"),
() => i18n.t("settings.theme.theme-updated")
);
},
delete(themeName) {
delete(id) {
return apiReq.delete(
settingsURLs.deleteTheme(themeName),
settingsURLs.deleteTheme(id),
null,
() => i18n.t("settings.theme.error-deleting-theme"),
() => i18n.t("settings.theme.theme-deleted")

View file

@ -16,17 +16,10 @@ const usersURLs = {
userID: id => `${userPrefix}/${id}`,
password: id => `${userPrefix}/${id}/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 = {
async login(formData) {
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")
);
},
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() {
return this.selected.length > 0 && this.solo;
if (this.selected) {
return this.selected.length > 0 && this.solo;
}
return false;
},
},
methods: {

View file

@ -3,7 +3,7 @@
<div class="text-center">
<h3>{{ buttonText }}</h3>
</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>
<v-menu v-model="menu" top nudge-bottom="105" nudge-left="16" :close-on-content-click="false">
<template v-slot:activator="{ on }">
@ -17,15 +17,7 @@
</v-menu>
</template>
</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>
</template>

View file

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

View file

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

View file

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

View file

@ -8,7 +8,7 @@
<v-list-item-title class=" mb-1">{{ name }} </v-list-item-title>
<v-list-item-subtitle> {{ description }} </v-list-item-subtitle>
<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
color="secondary"
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-content>
<v-list-item-action>
<v-btn
v-if="!edit"
color="primary"
icon
:href="`/api/recipes/${slug}/asset?file_name=${item.fileName}`"
target="_blank"
top
>
<v-btn v-if="!edit" color="primary" icon :href="assetURL(item.fileName)" target="_blank" top>
<v-icon> mdi-download</v-icon>
</v-btn>
<v-btn v-else color="error" icon @click="deleteAsset(i)" top>
<v-icon>mdi-delete</v-icon>
</v-btn>
<div v-else>
<v-btn color="error" icon @click="deleteAsset(i)" top>
<v-icon>mdi-delete</v-icon>
</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>
</v-list>
@ -107,7 +105,15 @@ export default {
],
};
},
computed: {
baseURL() {
return window.location.origin;
},
},
methods: {
assetURL(assetName) {
return api.recipes.recipeAssetPath(this.slug, assetName);
},
setFileObject(obj) {
this.fileObject = obj;
},
@ -124,6 +130,14 @@ export default {
deleteAsset(index) {
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>

View file

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

View file

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

View file

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

View file

@ -25,7 +25,7 @@
<v-card-actions>
<Rating :value="rating" :name="name" :slug="slug" :small="true" />
<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" />
</v-card-actions>
</v-card>

View file

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

View file

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

View file

@ -1,29 +1,13 @@
<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>
<strong> {{ time.name }} </strong>
</div>
<div>{{ time.value }}</div>
</v-card-text>
</v-card>
</v-card>
<div>
<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>
</template>
<script>

View file

@ -11,7 +11,7 @@
:to="`/recipes/${urlParam}/${getSlug(category)}`"
:key="category"
>
{{ category }}
{{ truncateText(category) }}
</v-chip>
</div>
</template>
@ -19,6 +19,9 @@
<script>
export default {
props: {
truncate: {
default: false,
},
items: {
default: [],
},
@ -34,6 +37,7 @@ export default {
small: {
default: false,
},
maxWidth: {},
},
computed: {
allCategories() {
@ -58,6 +62,14 @@ export default {
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>

View file

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

View file

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

View file

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

View file

@ -1,39 +1,61 @@
<template>
<div class="mt-n5" v-if="recipes">
<v-card flat class="transparent" height="60px">
<v-card-text>
<v-row v-if="title != null">
<v-col>
<v-btn-toggle group>
<v-btn text>
{{ title.toUpperCase() }}
</v-btn>
</v-btn-toggle>
</v-col>
<v-spacer></v-spacer>
<v-col align="end">
<v-menu offset-y v-if="sortable">
<template v-slot:activator="{ on, attrs }">
<v-btn-toggle group>
<v-btn text v-bind="attrs" v-on="on">
{{ $t("general.sort") }}
</v-btn>
</v-btn-toggle>
</template>
<v-list>
<v-list-item @click="$emit('sort-recent')">
<v-list-item-title>{{ $t("general.recent") }}</v-list-item-title>
</v-list-item>
<v-list-item @click="$emit('sort')">
<v-list-item-title>{{ $t("general.sort-alphabetically") }}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
</v-col>
</v-row>
</v-card-text>
</v-card>
<div v-if="recipes">
<div v-if="recipes">
<v-app-bar color="transparent" flat class="mt-n1 rounded" v-if="!disableToolbar">
<v-icon large left v-if="title">
{{ titleIcon }}
</v-icon>
<v-toolbar-title class="headline"> {{ title }} </v-toolbar-title>
<v-spacer></v-spacer>
<v-btn text @click="navigateRandom">
<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 }">
<v-btn text v-bind="attrs" v-on="on" :loading="sortLoading">
<v-icon left>
mdi-sort
</v-icon>
{{ $t("general.sort") }}
</v-btn>
</template>
<v-list>
<v-list-item @click="sortRecipes(EVENTS.az)">
<v-icon left>
mdi-order-alphabetical-ascending
</v-icon>
<v-list-item-title>{{ $t("general.sort-alphabetically") }}</v-list-item-title>
</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-menu>
</v-app-bar>
<div v-if="recipes" class="mt-2">
<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">
<RecipeCard
@ -85,15 +107,21 @@
<script>
import RecipeCard from "../Recipe/RecipeCard";
import MobileRecipeCard from "@/components/Recipe/MobileRecipeCard";
import { utils } from "@/utils";
const SORT_EVENT = "sort";
export default {
components: {
RecipeCard,
MobileRecipeCard,
},
props: {
sortable: {
disableToolbar: {
default: false,
},
titleIcon: {
default: "mdi-tag-multiple-outline",
},
title: {
default: null,
},
@ -110,8 +138,16 @@ export default {
},
data() {
return {
sortLoading: false,
cardLimit: 30,
loading: false,
EVENTS: {
az: "az",
rating: "rating",
created: "created",
updated: "updated",
shuffle: "shuffle",
},
};
},
watch: {
@ -150,6 +186,37 @@ export default {
await new Promise(r => setTimeout(r, 1000));
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>

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>
<v-dialog v-model="dialog" :width="modalWidth + 'px'" :content-class="top ? 'top-dialog' : undefined">
<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>
{{ titleIcon }}
</v-icon>
<v-toolbar-title class="headline"> {{ title }} </v-toolbar-title>
<v-spacer></v-spacer>
</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>
<v-card-actions>
<slot name="card-actions">
@ -18,8 +18,12 @@
{{ $t("general.cancel") }}
</v-btn>
<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">
{{ $t("general.submit") }}
{{ submitText }}
</v-btn>
</slot>
</v-card-actions>
@ -31,6 +35,7 @@
</template>
<script>
import i18n from "@/i18n";
export default {
props: {
color: {
@ -51,16 +56,34 @@ export default {
top: {
default: false,
},
submitText: {
default: () => i18n.t("general.create"),
},
},
data() {
return {
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: {
submitEvent() {
this.$emit("submit");
this.close();
this.submitted = true;
},
open() {
this.dialog = true;
@ -68,6 +91,10 @@ export default {
close() {
this.dialog = false;
},
deleteEvent() {
this.$emit("delete");
this.submitted = true;
},
},
};
</script>

View file

@ -15,7 +15,7 @@
</v-toolbar-items>
</v-toolbar>
<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-card-text>
@ -48,7 +48,7 @@
</template>
<script>
import ImportOptions from "./ImportOptions";
import ImportOptions from "@/components/FormHelpers/ImportOptions";
import TheDownloadBtn from "@/components/UI/Buttons/TheDownloadBtn.vue";
import { backupURLs } from "@/api/backup";
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>
<v-navigation-drawer v-model="showSidebar" width="180px" clipped app>
<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">
<img :src="userProfileImage" v-if="!hideImage" @error="hideImage = true" />
<div v-else>
@ -133,20 +133,15 @@ export default {
to: "/admin/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() {
return [
{
icon: "mdi-view-dashboard",
to: "/admin/dashboard",
title: this.$t("general.dashboard"),
},
{
icon: "mdi-cog",
to: "/admin/settings",
@ -162,11 +157,6 @@ export default {
to: "/admin/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",
to: "/admin/migrations",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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