+
+
{{ backup.name }}
- {{ readableTime(backup.date) }}
+ {{ readableTime(backup.date) }}
@@ -68,10 +69,9 @@ export default {
this.$emit("loading");
let response = await api.backups.import(data.name, data);
- let failed = response.data.failed;
- let succesful = response.data.successful;
+ let importData = response.data;
- this.$emit("finished", succesful, failed);
+ this.$emit("finished", importData);
},
deleteBackup(data) {
this.$emit("loading");
diff --git a/frontend/src/components/Settings/Backup/ImportDialog.vue b/frontend/src/components/Settings/Backup/ImportDialog.vue
index db2bed5c3d6a..0749a5aabce7 100644
--- a/frontend/src/components/Settings/Backup/ImportDialog.vue
+++ b/frontend/src/components/Settings/Backup/ImportDialog.vue
@@ -1,7 +1,23 @@
-
+
+
+
+ mdi-close
+
+
+
+
+
+ {{ $t("general.import") }}
+
+
+
{{ name }}
{{ date }}
@@ -72,7 +88,12 @@
{{ $t("general.delete") }}
-
+
{{ $t("general.import") }}
diff --git a/frontend/src/components/Settings/Backup/ImportSummaryDialog/DataTable.vue b/frontend/src/components/Settings/Backup/ImportSummaryDialog/DataTable.vue
new file mode 100644
index 000000000000..6046155726b8
--- /dev/null
+++ b/frontend/src/components/Settings/Backup/ImportSummaryDialog/DataTable.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+ {{ item.status ? "Imported" : "Failed" }}
+
+
+
+
+
+
+ {{ item.exception }}
+
+ |
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/Settings/Backup/ImportSummaryDialog/index.vue b/frontend/src/components/Settings/Backup/ImportSummaryDialog/index.vue
new file mode 100644
index 000000000000..718a2dfd2f1a
--- /dev/null
+++ b/frontend/src/components/Settings/Backup/ImportSummaryDialog/index.vue
@@ -0,0 +1,152 @@
+
+
+
+
+ Import Summary
+
+
+
+
+
+
Recipes
+
+
+ Success: {{ recipeNumbers.success }}
+
+
+ Failed: {{ recipeNumbers.failure }}
+
+
+
+
+
+
+
Themes
+
+
+ Success: {{ themeNumbers.success }}
+
+
+ Failed: {{ themeNumbers.failure }}
+
+
+
+
+
+
+
Settings
+
+
+ Success: {{ settingsNumbers.success }}
+
+
+ Failed: {{ settingsNumbers.failure }}
+
+
+
+
+
+
+ Recipes
+ Themes
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/Settings/Backup/NewBackupCard.vue b/frontend/src/components/Settings/Backup/NewBackupCard.vue
index f87d4dca1048..0abbd91251b5 100644
--- a/frontend/src/components/Settings/Backup/NewBackupCard.vue
+++ b/frontend/src/components/Settings/Backup/NewBackupCard.vue
@@ -8,7 +8,7 @@
v-model="tag"
>
-
+
diff --git a/frontend/src/components/Settings/Backup/index.vue b/frontend/src/components/Settings/Backup/index.vue
index d019a0b659b3..56d2998f67f6 100644
--- a/frontend/src/components/Settings/Backup/index.vue
+++ b/frontend/src/components/Settings/Backup/index.vue
@@ -7,7 +7,7 @@
-
+
@@ -41,6 +41,7 @@
:failed-header="$t('settings.backup.failed-imports')"
:failed="failedImports"
/>
+
@@ -48,6 +49,7 @@
diff --git a/frontend/src/components/Settings/Webhook/TimePickerDialog.vue b/frontend/src/components/Settings/MealPlanner/TimePickerDialog.vue
similarity index 100%
rename from frontend/src/components/Settings/Webhook/TimePickerDialog.vue
rename to frontend/src/components/Settings/MealPlanner/TimePickerDialog.vue
diff --git a/frontend/src/components/Settings/Webhook/index.vue b/frontend/src/components/Settings/MealPlanner/index.vue
similarity index 65%
rename from frontend/src/components/Settings/Webhook/index.vue
rename to frontend/src/components/Settings/MealPlanner/index.vue
index 261c6a794900..8ea8ab61ab22 100644
--- a/frontend/src/components/Settings/Webhook/index.vue
+++ b/frontend/src/components/Settings/MealPlanner/index.vue
@@ -1,9 +1,49 @@
- {{ $t("settings.webhooks.meal-planner-webhooks") }}
+ {{ $t("meal-plan.meal-planner") }}
+
+ {{ $t("recipe.categories") }}
+
+
+
+
+
+
+ {{ data.item.name }}
+
+
+
+
+
+
+
+
+
+ {{ $t("settings.webhooks.meal-planner-webhooks") }}
+
{{
$t(
@@ -68,11 +108,20 @@ export default {
webhooks: [],
enabled: false,
time: "",
+ planCategories: [],
};
},
mounted() {
this.getSiteSettings();
},
+ computed: {
+ categories() {
+ return this.$store.getters.getCategories;
+ },
+ isFlat() {
+ return this.planCategories ? true : false;
+ },
+ },
methods: {
saveTime(value) {
this.time = value;
@@ -83,6 +132,7 @@ export default {
this.name = settings.name;
this.time = settings.webhooks.webhookTime;
this.enabled = settings.webhooks.enabled;
+ this.planCategories = settings.planCategories;
},
addWebhook() {
this.webhooks.push(" ");
@@ -93,6 +143,7 @@ export default {
saveWebhooks() {
const body = {
name: this.name,
+ planCategories: this.planCategories,
webhooks: {
webhookURLs: this.webhooks,
webhookTime: this.time,
@@ -104,6 +155,9 @@ export default {
testWebhooks() {
api.settings.testWebhooks();
},
+ removeCategory(index) {
+ this.planCategories.splice(index, 1);
+ },
},
};
diff --git a/frontend/src/components/Settings/Migration/MigrationCard.vue b/frontend/src/components/Settings/Migration/MigrationCard.vue
index cef1020db888..53ccc2227f73 100644
--- a/frontend/src/components/Settings/Migration/MigrationCard.vue
+++ b/frontend/src/components/Settings/Migration/MigrationCard.vue
@@ -21,14 +21,16 @@
>
-
- mdi-import
+
+ mdi-import
-
-
+
+
{{ migration.name }}
- {{ readableTime(migration.date) }}
+
+ {{ readableTime(migration.date) }}
+
diff --git a/frontend/src/components/Settings/Migration/index.vue b/frontend/src/components/Settings/Migration/index.vue
index e669c057bbd2..78684d2dfee7 100644
--- a/frontend/src/components/Settings/Migration/index.vue
+++ b/frontend/src/components/Settings/Migration/index.vue
@@ -17,7 +17,8 @@
{{ buttonText }}
-
+
-
+
+
+
+
+
+ {{ color }}
+
+
+
+
@@ -36,7 +57,7 @@ export default {
return {
dialog: false,
swatches: false,
- color: "#1976D2",
+ color: this.value || "#1976D2",
mask: "!#XXXXXXXX",
menu: false,
};
diff --git a/frontend/src/components/Settings/Theme/index.vue b/frontend/src/components/Settings/Theme/index.vue
index 101a08dd5608..e113071af8b8 100644
--- a/frontend/src/components/Settings/Theme/index.vue
+++ b/frontend/src/components/Settings/Theme/index.vue
@@ -14,7 +14,7 @@
}}
-
+
- {{ $t("settings.theme.default-to-system") }}
+ mdi-desktop-tower-monitor
+
+ {{ $t("settings.theme.default-to-system") }}
+
- {{ $t("settings.theme.light") }}
+
+ mdi-white-balance-sunny
+
+ {{ $t("settings.theme.light") }}
+
+
- {{ $t("settings.theme.dark") }}
+
+ mdi-weather-night
+
+ {{ $t("settings.theme.dark") }}
+
+
-
+
-
+
@@ -64,18 +68,20 @@ export default {
methods: {
async createRecipe() {
- this.processing = true;
- let response = await api.recipes.createByURL(this.recipeURL);
- if (response.status !== 201) {
- this.error = true;
- this.processing = false;
- return;
- }
+ if (this.$refs.urlForm.validate()) {
+ this.processing = true;
+ let response = await api.recipes.createByURL(this.recipeURL);
+ if (response.status !== 201) {
+ this.error = true;
+ this.processing = false;
+ return;
+ }
- this.addRecipe = false;
- this.processing = false;
- this.recipeURL = "";
- this.$router.push(`/recipe/${response.data}`);
+ this.addRecipe = false;
+ this.processing = false;
+ this.recipeURL = "";
+ this.$router.push(`/recipe/${response.data}`);
+ }
},
navCreate() {
@@ -89,6 +95,10 @@ export default {
this.recipeURL = "";
this.processing = false;
},
+ isValidWebUrl(url) {
+ let regEx = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/gm;
+ return regEx.test(url) ? true : "Must be a Valid URL";
+ },
},
};
diff --git a/frontend/src/components/UI/CategorySidebar.vue b/frontend/src/components/UI/CategorySidebar.vue
index 5c4b39f6cda4..c589cd33d081 100644
--- a/frontend/src/components/UI/CategorySidebar.vue
+++ b/frontend/src/components/UI/CategorySidebar.vue
@@ -1,20 +1,43 @@
-
-
-
-
- {{ nav.icon }}
-
- {{ nav.title | titleCase }}
-
-
-
+
+
+ mdi-tag
+
+
+
+
+
+ {{ nav.icon }}
+
+ {{ nav.title | titleCase }}
+
+
+
+
diff --git a/frontend/src/components/UI/RecipeCard.vue b/frontend/src/components/UI/RecipeCard.vue
index 5bf3ffb6a548..13aca1f38386 100644
--- a/frontend/src/components/UI/RecipeCard.vue
+++ b/frontend/src/components/UI/RecipeCard.vue
@@ -6,8 +6,24 @@
:to="route ? `/recipe/${slug}` : ''"
@click="$emit('click')"
>
-
- {{ name | truncate(30) }}
+
+
+
+
+ {{ description | truncate(300) }}
+
+
+
+
+
+
+
@@ -23,16 +39,7 @@
>
-
-
-
- {{
- $t("recipe.description")
- }}
-
- {{ description }}
-
-
+
@@ -61,4 +68,21 @@ export default {
\ No newline at end of file
diff --git a/frontend/src/components/UI/SearchBar.vue b/frontend/src/components/UI/SearchBar.vue
index 0ddc4e8f72e7..95e8adc5f4c5 100644
--- a/frontend/src/components/UI/SearchBar.vue
+++ b/frontend/src/components/UI/SearchBar.vue
@@ -57,6 +57,7 @@ export default {
return {
searchSlug: "",
search: " ",
+ data: [],
result: [],
autoResults: [],
isDark: false,
@@ -67,27 +68,30 @@ export default {
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 1,
- keys: ["name", "slug"],
+ keys: ["name", "slug", "description"],
},
};
},
mounted() {
this.isDark = this.$store.getters.getIsDark;
+ this.data = this.$store.getters.getRecentRecipes;
},
computed: {
- data() {
- return this.$store.getters.getRecentRecipes;
- },
fuse() {
return new Fuse(this.data, this.options);
},
},
watch: {
search() {
- if (this.search.trim() === "") this.result = this.list;
- else this.result = this.fuse.search(this.search.trim());
-
+ try {
+ this.result = this.fuse.search(this.search.trim());
+ } catch {
+ this.result = this.data
+ .map(x => ({ item: x }))
+ .sort((a, b) => (a.name > b.name ? 1 : -1));
+ }
this.$emit("results", this.result);
+
if (this.showResults === true) {
this.autoResults = this.result;
}
diff --git a/frontend/src/components/UI/SearchDialog.vue b/frontend/src/components/UI/SearchDialog.vue
index 8874736bf7c3..cd245d69ecc8 100644
--- a/frontend/src/components/UI/SearchDialog.vue
+++ b/frontend/src/components/UI/SearchDialog.vue
@@ -1,6 +1,6 @@
-
+
@@ -22,7 +22,7 @@
:md="6"
:lg="4"
:xl="3"
- v-for="item in searchResults.slice(0, 10)"
+ v-for="item in searchResults.slice(0, 24)"
:key="item.item.name"
>
-
+
- {{ title }}
+
+
+ mdi-close
+
+ {{ title }}
+
+
+
+
+ {{ title }}
+
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
new file mode 100644
index 000000000000..0d727fae6efc
--- /dev/null
+++ b/frontend/src/locales/de.json
@@ -0,0 +1,158 @@
+{
+ "404": {
+ "page-not-found": "404 Seite nicht gefunden",
+ "take-me-home": "Zurück"
+ },
+ "new-recipe": {
+ "from-url": "Von URL",
+ "recipe-url": "Rezept URL",
+ "error-message": "Ein Fehler ist beim import der URL aufgetreten. Überprüfe das Log sowie debug/last_recipe.json um zu sehen was schief gelaufen ist.",
+ "bulk-add": "Massenimport",
+ "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Füge deine Rezeptdaten ein. Jede Zeile wird als Eintrag in einer Liste dargestellt"
+ },
+ "general": {
+ "upload": "Hochladen",
+ "submit": "Einfügen",
+ "name": "Name",
+ "settings": "Einstellungen",
+ "close": "Schließen",
+ "save": "Speichern",
+ "image-file": "Bilddatei",
+ "update": "Aktualisieren",
+ "edit": "Bearbeiten",
+ "delete": "Löschen",
+ "select": "Auswählen",
+ "random": "Zufall",
+ "new": "Neu",
+ "create": "Erstellen",
+ "cancel": "Abbrechen",
+ "ok": "OK",
+ "enabled": "Aktiviert",
+ "download": "Herunterladen",
+ "import": "Importieren",
+ "options": "Optionen",
+ "templates": "Vorlagen",
+ "recipes": "Rezepte",
+ "themes": "Themen",
+ "confirm": "Besstätigen"
+ },
+ "login": {
+ "stay-logged-in": "Eingeloggt bleiben?",
+ "email": "Email",
+ "password": "Passwort",
+ "sign-in": "Einloggen",
+ "sign-up": "Registrieren"
+ },
+ "meal-plan": {
+ "dinner-this-week": "Essen diese Woche",
+ "dinner-today": "Heutiges Essen",
+ "planner": "Planer",
+ "edit-meal-plan": "Essensplan bearbeiten",
+ "meal-plans": "Essenspläne",
+ "create-a-new-meal-plan": "Neuen Essensplan erstellen",
+ "start-date": "Start-Datum",
+ "end-date": "End-Datum"
+ },
+ "recipe": {
+ "description": "Beschreibung",
+ "ingredients": "Zutaten",
+ "categories": "Kategorien",
+ "tags": "Markierungen",
+ "instructions": "Anweisungen",
+ "step-index": "Schritt: {step}",
+ "recipe-name": "Rezeptname",
+ "servings": "Portionen",
+ "ingredient": "Zutat",
+ "notes": "Notizen",
+ "note": "Notiz",
+ "original-url": "Original URL",
+ "view-recipe": "Rezept anschauen",
+ "title": "Titel",
+ "total-time": "Gesamtzeit",
+ "prep-time": "Vorbereitungszeit",
+ "perform-time": "Kochzeit",
+ "api-extras": "API Extras",
+ "object-key": "Objektschlüssel",
+ "object-value": "Objektwert",
+ "new-key-name": "Neuer Schlüsselname",
+ "add-key": "Schlüssel hinzufügen",
+ "key-name-required": "Schlüsselname benötigt",
+ "no-white-space-allowed": "Keine Leerschritte erlaubt",
+ "delete-recipe": "Rezept löschen",
+ "delete-confirmation": "Bist du sicher das du dieses Rezept löschen möchtest?"
+ },
+ "search": {
+ "search-mealie": "Suche Mealie"
+ },
+ "settings": {
+ "general-settings": "Einstellungen",
+ "local-api": "Lokale API",
+ "language": "Sprache",
+ "add-a-new-theme": "Neues Thema hinzufügen",
+ "set-new-time": "Neue Zeit einstellen",
+ "current": "Version:",
+ "latest": "Neuste",
+ "explore-the-docs": "Stöbern",
+ "contribute": "Beitragen",
+ "backup-and-exports": "Sicherungen",
+ "backup-info": "Sicherungen werden im standard JSON Format in das Dateisystem exportiert mitsamt sämtlicher Bilder. In deinem Sicherungsorder findest du eine ZIP Datei welche sämtliche JSON's deiner Rezepte und die Bilder aus der Datenbank enthält. Solltest du eine Markdown Datei auswählen werden diese ebenfalls im ZIP gespeichert. Um eine Sicherung zurückzuspielen muss die entsprechende ZIP Datei im Sicherungsorder liegen. Automatische Sicherungen finden jeden Tag um 3 Uhr früh statt.",
+ "available-backups": "Verfügbare Sicherungen",
+ "theme": {
+ "theme-name": "Themenname",
+ "theme-settings": "Themeneinstellungen",
+ "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": "Wähle ein Thema aus der Dropdown-Liste oder erstelle ein neues. Beachte das das Standard Thema auf alle Benutzer angewandt wird die keine Einstellung für ein Thema getroffen haben.",
+ "dark-mode": "Dunkler Modus",
+ "theme-is-required": "Thema wird benötigt",
+ "primary": "primär",
+ "secondary": "sekundär",
+ "accent": "betonen",
+ "success": "Erfolg",
+ "info": "Information",
+ "warning": "Warnung",
+ "error": "Fehler",
+ "default-to-system": "Standardeinstellung",
+ "light": "Hell",
+ "dark": "Dunkel",
+ "theme": "Thema",
+ "saved-color-theme": "Buntes Thema gespeichert",
+ "delete-theme": "Thema löschen",
+ "are-you-sure-you-want-to-delete-this-theme": "Bist du sicher das du dieses Thema löschen möchtest?",
+ "choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Entscheide wie Mealie für dich aussehen soll. Wähle Systemthema oder ob es Hell oder Dunkel dargestellt werden soll",
+ "theme-name-is-required": "Theme Name is required."
+ },
+ "webhooks": {
+ "meal-planner-webhooks": "Meal Planner 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": "Die unten stehenden URL's erhalten webhooks die die Rezeptdaten enthalten für den Menüplan am geplanten Tag. Derzeit werden die webhooks ausgeführt um",
+ "test-webhooks": "Teste Webhooks",
+ "webhook-url": "Webhook URL"
+ },
+ "new-version-available": "Eine neue Version von Mealie steht zur verfügung, Schau ins Repository ",
+ "backup": {
+ "import-recipes": "Rezepte importieren",
+ "import-themes": "Themen importieren",
+ "import-settings": "Einstellungen importieren",
+ "create-heading": "Sicherung erstellen",
+ "backup-tag": "Sicherungsmarkierung",
+ "full-backup": "Komplettsicherungen",
+ "partial-backup": "Teilsicherungen",
+ "backup-restore-report": "Sicherungs/Widerherstellungsbericht",
+ "successfully-imported": "Erfolgreich importiert",
+ "failed-imports": "Import fehlgeschlagen"
+ }
+ },
+ "migration": {
+ "recipe-migration": "Rezepte übertragen",
+ "failed-imports": "Fehlgeschlagene Importe",
+ "migration-report": "Übertragungsbericht",
+ "successful-imports": "Erfolgreiche Importe",
+ "no-migration-data-available": "Keine Übertragungsdaten verfügbar",
+ "nextcloud": {
+ "title": "Nextcloud Cookbook",
+ "description": "Übertrage Daten aus einer Nextcloud Cookbook Instanz"
+ },
+ "chowdown": {
+ "title": "Chowdown",
+ "description": "Übertrage Daten aus Chowdown"
+ }
+ }
+}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index 89543f0a82ea..324e26329477 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -44,7 +44,9 @@
"sign-up": "Sign up"
},
"meal-plan": {
+ "shopping-list": "Shopping List",
"dinner-this-week": "Dinner This Week",
+ "meal-planner": "Meal Planner",
"dinner-today": "Dinner Today",
"planner": "Planner",
"edit-meal-plan": "Edit Meal Plan",
diff --git a/frontend/src/locales/pl.json b/frontend/src/locales/pl.json
new file mode 100644
index 000000000000..d6387b0dab14
--- /dev/null
+++ b/frontend/src/locales/pl.json
@@ -0,0 +1,158 @@
+{
+ "404": {
+ "page-not-found": "404 Strony nie odnaleziono",
+ "take-me-home": "Powrót na stronę główną"
+ },
+ "new-recipe": {
+ "from-url": "Z odnośnika",
+ "recipe-url": "Odnośnik przepisu",
+ "error-message": "Wygląda na to, że wystąpił błąd. Sprawdź log i debug/last_recipe.json aby zasięgnąć po więcej informacji.",
+ "bulk-add": "Dodanie zbiorcze",
+ "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Przeklej zawartość przepisu. Każda indywidualna linia traktowana będzie jako pozycja na liście"
+ },
+ "general": {
+ "upload": "Wrzuć",
+ "submit": "Zatwierdź",
+ "name": "Nazwa",
+ "settings": "Ustawienia",
+ "close": "Zamknij",
+ "save": "Zapisz",
+ "image-file": "Plik obrazu",
+ "update": "Uaktualnij",
+ "edit": "Edytuj",
+ "delete": "Usuń",
+ "select": "Zaznacz",
+ "random": "Losowa",
+ "new": "Nowa",
+ "create": "Utwórz",
+ "cancel": "Anuluj",
+ "ok": "OK",
+ "enabled": "Włączone",
+ "download": "Pobierz",
+ "import": "Importuj",
+ "options": "Opcje",
+ "templates": "Szablony",
+ "recipes": "Przepisy",
+ "themes": "Motywy",
+ "confirm": "Potwierdź"
+ },
+ "login": {
+ "stay-logged-in": "Pozostań zalogowany",
+ "email": "Email",
+ "password": "Hasło",
+ "sign-in": "Zaloguj się",
+ "sign-up": "Zarejestruj się"
+ },
+ "meal-plan": {
+ "dinner-this-week": "Obiad w tym tygodniu",
+ "dinner-today": "Obiad dziś",
+ "planner": "Planer",
+ "edit-meal-plan": "Edytuj plan posiłku",
+ "meal-plans": "Plany posiłku",
+ "create-a-new-meal-plan": "Utwórz nowy plan posiłku",
+ "start-date": "Data rozpoczęcia",
+ "end-date": "Data zakończenia"
+ },
+ "recipe": {
+ "description": "Opis",
+ "ingredients": "Składniki",
+ "categories": "Kategorie",
+ "tags": "Etykiety",
+ "instructions": "Instrukcje",
+ "step-index": "Krok: {step}",
+ "recipe-name": "Nazwa przepisu",
+ "servings": "Porcje",
+ "ingredient": "Składnik",
+ "notes": "Notatki",
+ "note": "Notatka",
+ "original-url": "Oryginalny odnośnik",
+ "view-recipe": "Wyświetl przepis",
+ "title": "Tytuł",
+ "total-time": "Czas całkowity",
+ "prep-time": "Czas przyrządzania",
+ "perform-time": "Czas gotowania",
+ "api-extras": "Dodatki API",
+ "object-key": "Klucz obiektu",
+ "object-value": "Wartość obiektu",
+ "new-key-name": "Nazwa nowego klucza",
+ "add-key": "Dodaj klucz",
+ "key-name-required": "Nazwa klucza jest wymagana",
+ "no-white-space-allowed": "Znaki niedrukowalne są niedozwolone",
+ "delete-recipe": "Usuń przepis",
+ "delete-confirmation": "Czy jesteś pewien, że chcesz usunąć ten przepis?"
+ },
+ "search": {
+ "search-mealie": "Przeszukaj Mealie"
+ },
+ "settings": {
+ "general-settings": "Ustawienia główne",
+ "local-api": "Lokalne API",
+ "language": "Język",
+ "add-a-new-theme": "Dodaj nowy motyw",
+ "set-new-time": "Ustaw nowy czas",
+ "current": "Wersja:",
+ "latest": "Najnowsza",
+ "explore-the-docs": "Zobacz dokumentację",
+ "contribute": "Wspomóż",
+ "backup-and-exports": "Kopie zapasowe",
+ "backup-info": "Kopie zapasowe zapisywane są w standardowym formacie JSON wraz ze zdjęciami w systemie plików. W katalogu kopii zapasowej znajdziesz plik z rozszerzeniem .zip zawierający wszystkie przepisy i zdjęcia z bazy danych. Jeśli oznaczone zostały pliki markdown, one także znajdą się w pliku .zip. Aby zaimportować kopię, musi ona znajdować się w folderze kopii zapasowych. Kopie automatyczne tworzone są codziennie o godzinie 03:00.",
+ "available-backups": "Dostępne kopie zapsowe",
+ "theme": {
+ "theme-name": "Nazwa motywu",
+ "theme-settings": "Ustawienia motywu",
+ "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": "Wybierz motyw z rozwijanej listy bądź stwórz nowy. Domyślny motyw zostanie użyty dla wszystkich użytkowników którzy nie wybrali własnej preferencji.",
+ "dark-mode": "Ciemny motyw",
+ "theme-is-required": "Motyw jest wymagany",
+ "primary": "Pierwszorzędny",
+ "secondary": "Drugorzędny",
+ "accent": "Akcent",
+ "success": "Powodzenie",
+ "info": "Informacja",
+ "warning": "Ostrzeżenie",
+ "error": "Błąd",
+ "default-to-system": "Domyślny dla systemu",
+ "light": "Jasny",
+ "dark": "Ciemny",
+ "theme": "Motyw",
+ "saved-color-theme": "Zapisany kolor motywu",
+ "delete-theme": "Usuń motyw",
+ "are-you-sure-you-want-to-delete-this-theme": "Czy jesteś pewien, że chcesz usunąć ten motyw?",
+ "choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Wybierz jak Mealie ma dla Ciebie wyglądać. Dostępne opcje to podążanie za odcieniem systemowym, bądź motyw jasny lub ciemny.",
+ "theme-name-is-required": "Nazwa motywu jest wymagana."
+ },
+ "webhooks": {
+ "meal-planner-webhooks": "Webhooki planera posiłków",
+ "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Odnośniki poniżej otrzymają webhook zawierający dane o przepisie dla danego dnia. Aktualnie webhooki zostanę wykonane o",
+ "test-webhooks": "Testuj webhooki",
+ "webhook-url": "Odnośnik webhooka"
+ },
+ "new-version-available": "Dostępna jest nowa wersja Mealie, sprawdź repozytorium ",
+ "backup": {
+ "import-recipes": "Wgraj przepisy",
+ "import-themes": "Wgraj motywy",
+ "import-settings": "Wgraj ustawienia",
+ "create-heading": "Utwórz kopię zapasową",
+ "backup-tag": "Etykieta kopii zapasowej",
+ "full-backup": "Pełna kopia zapasowa",
+ "partial-backup": "Częściowa kopia zapasowa",
+ "backup-restore-report": "Raport przywrócenia kopii zapasowej",
+ "successfully-imported": "Import zakończony suckesem",
+ "failed-imports": "Importy nieudane"
+ }
+ },
+ "migration": {
+ "recipe-migration": "Przenoszenie przepisów",
+ "failed-imports": "Importy udane",
+ "migration-report": "Raport przenosin",
+ "successful-imports": "Importy nieudane",
+ "no-migration-data-available": "Brak danych do przeniesienia",
+ "nextcloud": {
+ "title": "Nextcloud Cookbook",
+ "description": "Przenieś dane z Nextcloud Cookbook"
+ },
+ "chowdown": {
+ "title": "Chowdown",
+ "description": "Przenieś dane z Chowdown"
+ }
+ }
+}
diff --git a/frontend/src/pages/Debug.vue b/frontend/src/pages/Debug.vue
new file mode 100644
index 000000000000..14711b2f7c45
--- /dev/null
+++ b/frontend/src/pages/Debug.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/pages/MealPlanPage.vue b/frontend/src/pages/MealPlanPage.vue
index 61fa643d08eb..90d583d2a185 100644
--- a/frontend/src/pages/MealPlanPage.vue
+++ b/frontend/src/pages/MealPlanPage.vue
@@ -6,6 +6,7 @@
@updated="planUpdated"
/>
+
@@ -49,6 +50,14 @@
+
+ {{ $t("meal-plan.shopping-list") }}
+
({
plannedMeals: [],
@@ -122,6 +133,9 @@ export default {
api.mealPlans.delete(id);
this.requestMeals();
},
+ openShoppingList(id) {
+ this.$refs.shoppingList.openDialog(id);
+ },
},
};
diff --git a/frontend/src/pages/SettingsPage.vue b/frontend/src/pages/SettingsPage.vue
index f49012e8c9f7..98e9db721d98 100644
--- a/frontend/src/pages/SettingsPage.vue
+++ b/frontend/src/pages/SettingsPage.vue
@@ -16,7 +16,7 @@
-
+
{{ $t("settings.current") }}
@@ -41,7 +41,7 @@