Compare commits

..

6 Commits

Author SHA1 Message Date
Hayden
903a9d8861 Release/v.0.5.1 (#546)
* fix links

* actually fix #238

* Feature/mkdocs version bump (#240)

* fix links (#239)

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix #238

* bump mkdocs version

* light/dark toggle

* light/dark mode css

* API_DOCS defaults to True

* disable build on push for master

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/recipe viewer (#244)

* fix dialog placement

* markdown support in ingredients

* fix line render issue

* fix tag rendering bug

* change ingredients to text area

* no slug error

* add tag pages

* remove console.logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* changelog v0.4.1

* bug/backup-download (#245)

* fix blocked download

* + download blocked

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/meal planner (#246)

* fixes duplicate recipes in meal-plan #221

* add quick week option

* scope css

* add mealplanner info

Co-authored-by: hay-kot <hay-kot@pm.me>

* Nextcloud Import Bugs - #248 (#250)

* parses datetime properly + clean category - #248

* add default credentials to docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add bulk import examples to docs. (#252)

* Add bulk import examples to docs.

* Update api-usage.md

* Add Python example for bulk import.

* Change IP address in API example.

* Refactor/app settings (#251)

* fix env setup bugs

* remove unused import

* fix layout issues

* changelog

Co-authored-by: hay-kot <hay-kot@pm.me>

* env setup fixes

* Feature/about api (#253)

* fix settings

* app info cleanup

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/image minify (#256)

* fix settings

* app info cleanup

* bottom-bar experiment

* remove dup key

* type hints

* add dependency

* updated image with query parameters

* read image options

* add image minification

* add image minification step

* alt image routes

* add image minification

* set mobile bar to top

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/additional endpoints (#257)

* new recipe summary route

* add categories to cards

* add pillow

* show tags instead of categories

* additional debug info

* add todays meal image url

* about page

* fix reactive tag

* changelog + docs

* bump version

Co-authored-by: hay-kot <hay-kot@pm.me>

* add pillow dependencies (#258)

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/search page (#259)

* add pillow dependencies

* advanced search page

* advanced search apge

* remove extra dependencies

* add pre-run script

Co-authored-by: hay-kot <hay-kot@pm.me>

* no image assignment

* advanced search

* fix docker dev build

* Do not force theme settings on login form (#260)

* Fix docker dev db persistence (#264)

* Fix docker dev db persistence

* Make run.sh the only startup script for prod + dev

Credits to @hay-kot for run.sh script logic

* Restore dev backend initialization in non-docker setup

* Make run.sh POSIX-friendly

* Allow dev backend to auto-reload in Docker

* Frontend Refactor + Bug Fixes

* merge category and tag selector

* unifiy category selector

* add hint

* spacing

* fix nextcloud migration

* simplify email validator #261

* formatting

* cleanup

* auto-gen

* format

* update run script

* unified category/tag selector

* rename component

* Add advanced search link

* remove old code

* convert keywords to tags

* add proper behavior on rename

* proper image name association on rename

* fix test cleanup

* changelog

* set docker comppand

* minify on migration

Co-authored-by: hay-kot <hay-kot@pm.me>

* bug-fixes/category-tag-creator (#266)

* fix category labels

* set loader for migration

* v0.4.1

Co-authored-by: hay-kot <hay-kot@pm.me>

* Hot Fix (#269)

* fix category labels

* set loader for migration

* v0.4.1

* reorganize API docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Fix some pytests (#265)

* Fix encoding issue in cleaner unit test

* Add VS Code task to run pytests

* Fix FileExistsError when running Windows

* Add Portuguese Translation (#232)

* Add Portuguese Translation

* add portuguese translation option

* formatting

* add missing }

* specify absolute path

* Feature/migration-rewrite (#278)

* start

* migration rewrite

* update name

* convert chowdown to new methods

* refactor/remove duplicate code

* refactor to unify logger + log to file

* remove toolbox

* Display report on UI

Co-authored-by: hay-kot <hay-kot@pm.me>

* refactor/image-minification (#285)

* refactor image minification calls

* remove nusiance logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/debug-info (#286)

* rename 'ENV' to 'PRODUCTION' and default to true

* set env PRODUCTION

* refactor file download process

* add last_recipe.json and log downloads

* changelog + version bump

* set env on workflows

* bump version

Co-authored-by: hay-kot <hay-kot@pm.me>

* Basic nutrition editor (#288)

* Basic nutrition editor

* fix no image on scrape

* nutrition display

* add recipe images

* update by url

* new upload options

Co-authored-by: hay-kot <hay-kot@pm.me>

* Sanitize recipe backup filenames (#287)

Fixes #275

* fix page creation fixes #290

* Display categories in sidebar if no pages set (#292)

Fixes  #291

* Enrich page title with context (#296)

- Static pages have their own titles
- The name of the recipe is displayed when viewing it

* fix: translates phrase for locale de (#298)

Co-authored-by: Jonas  Schubert <jonas.schubert.1990@web.de>

* Fix ingredient checkbox click (#305)

Fixes #304
v-list-item already flips the checkbox

* Localize custom pages and search page (#299)

* Localize custom pages and search page

* Fix FR translation for step

* fixes #306

* fixes #297

* Update changelog

* generate docs

* fix broken upload button on migrations

* docs update

* bump version

* fix discord link

* add TOKEN_TIME and DEFAULT_EMAIL

* docs

* fixes #312

* fixes #314

* fixes #315

* fix language hydration

* v0.4.3 docs

* Crowdin integration (#319)

* Fix portuguese localization files

* Use 4-letter code for locales ID

* Update Crowdin configuration file

* Make vuetify locales match with new VueI18n standard

* Fix old locale ID default setting

* Hide project hierarchy from Crowdin

* add dateTimeFormats to Crowdin

* New Crowdin updates (#322) - Initial Merge

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Traditional)

* New Crowdin updates (#323)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Romanian)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (English)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (German)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French) (#324)

* update lock

* ENV -> PRODUCTION

* New Crowdin updates (#327)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* Make first day of week in calendar view customizable (#263)

* Make first day of the week customizable

New settings section 'Locale settings'
New setting 'First day of week'
New date picker reusable UI that uses the new setting
Meal planner now uses this new date picker

* Clean up unused code in settings page

* Fix First day of week mapping

* Replace missing v-date-picker with custom card DatePicker

* Mention first day of the week feature in change log

* Fix date picker not properly localized (#330)

* Fix language in date picker

Vuetify allows custom-named locales,
but the date-picker really only works with BCP 47 language tag

* Save lang at proper time + Update Vuetify lang on the fly

* Add tip to fix rpi host running docker container (#335)

Per issue #249, tip gives guidance for running Mealie in a docker linux/arm/v7 container.

* New Crowdin updates (#328)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* es-ES.json (#334)

* es-ES.json

Spanish translation

* Update es-ES.json

* feature/editor-improvements (#289)

* pin editor buttons on scroll

* scaler scratch

* fix langauge assignment 1st pass

* set lang on navigate

* refactor/breakup router

* unify style for language selectro

* refactor/code-cleanup

* refactor/page specific components to page folder

* Fix time card layout issue

* fix timecard display

* update mobile cards / fix overflow errors

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#340)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* Document new translation process with Crowdin (#342)

* Localize more dates and texts (#341)

* Localize more dates and texts

* Adapt source language to 4-letter code for VS code

* Make page titles more reactive to language change

* Translate missing text + fix missed refactoring

* Fix missed page titles refactoring

* Translate nutrition view

* Translate Image upload vue

* Fix default text being defined twice in upload btn

* Get Recipes Route Rewrite (#339)

* deprecate old route

* auto-gen

* recipe card infinite scroll

* fix datatable

* set hard-limit option

* add loader

* set scroll on navigation

* add auto-import

* fix slow initial load

* remove console.logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Fix ingredients not refreshed upon recipe change (#343)

* New Crowdin updates (#344)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Italian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Japanese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Italian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (English)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#345)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (German)

* Fix infinite loop in meal planner randomizer (#346)

Infinite loop would happen if there were more days than recipes

* More localization (#348)

* Translate about page

* Sort messages by keys

* Remove unused strings

* Localize date in meal planner

* Fix quick week not starting on Monday for UTC+x

* New Crowdin updates (#349)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New Crowdin updates (#351)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* App Bar Rewrite (#347)

* Dummy Commit

* consolidate sidebar and app bar

* fix image error

* consolidate sidebar

* new icon for user menu

* fixes #329

* fix double click on mobile

* swap to computed properties

* fix open/close bug

* rewrite search for mobile

* fix ingredient checkbox

* cleanup console.logs

* set default lang + bump version

* draft changelog

* reword

* update env variables

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#355)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (French)

* feature/category-tag-crud (#354)

* update tag route

* search.and

* offset for mobile

* relative imports

* get settings

* new page

* category/tag CRUD

* bulk assign frontend

* Bulk assign

* debounce search

* remove dev data

* recipe store refactor

* fix mobile view

* fix failing tests

* commit test data

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#359)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* toolbox reference

* New Crowdin updates (#361)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (German)

* Remove dead code (#362)

* Remove BackupCard.vue

Unused - moved to NewBackupCard.vue

* Remove unused method

* New Crowdin updates (#363)

* New translations en-US.json (French)

* New translations en-US.json (Polish)

* feature/new-recipe-features (#360)

* unify button styles

* fix drag on mobile

* recipe instructions section

* add carbs

* refactor component location

* asset start

* consolidate view/edit components

* asset api

* base dialog event

* Remove 'content'

* remove console.log

* add slug prop

* remove console.log

* recipe assets first pass

* add recipeSettings model

* fix hide/show when no tags/categories

* fix typo

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#365)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* refactor/recipe-to-snake-case (#364)

* formatting

* snake case all recipes entries

* set foreign key to int

* run scheduler at startup and not import

* set SQLite file path before imports

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix missed commits

* More localization (#358)

* Translate missing items on About page

* Localize import summary dialog

* Make site menu translation reactive

* Localize import options

* Include semi colon in string

* Move API texts to frontend + better status codes

* Provide feedback to user when no meal is planned

* Fix API tests after latest rework

* Add warning for API changes in changelog

* Refactor API texts handling

* Refactor API texts handling #2

* Better API feedback

* Rearrange strings hierarchy

* Add messages upon recipe updated

* Fix 'recipe effected' typo

* Remove snackbar usage in backend

* Translate toolbox

* Provide feedback for tags CRUD

* Fix messed up merge

* Translate sign-up form

* Better feedback for sign-up CRUD

* Refactor log-in API texts handling

* No error message when user is not authenticated

* Remove unimportant console log

* New Crowdin updates (#366)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* Hide user ID + Reset password when creating a user (#367)

* refactor/docker-updates (#369)

* convert all images to webp

* consolidate docker files

* serve images wiith caddy

* consolidate docker files

* new slim-buster image

* set image url

* add image path

* remove print

* set image path correctly

* cleanup

* caddy proxy path

* docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#368)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* add python3-dev

* add all cryptography deps 🤞

* remove 32bit arm support

* Refactor/recipe routes (#370)

* format with black

* black format

* flake8

* remove bar exceptions

* remove test for depreciated route

* recipe settings editr

* add sqlite

Co-authored-by: hay-kot <hay-kot@pm.me>

* Api refactoring fixes (#372)

* Fix JS error when logging in with bad credentials

* Remove duplicate error message if bad credentials

Error is already nicely displayed in LoginForm

* More localization (#373)

* Translate missing string

* Display language in original language + English

* Translate assets

* Translate recipe settings

* New Crowdin updates (#374)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (German)

* Shopping list fixes (#376)

* Refactor recipe to snake case

* Initialize raw ingredients

Fixes #356

* New Crowdin updates (#377)

* New translations en-US.json (German)

* New translations en-US.json (Italian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (French)

* New translations en-US.json (Japanese)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Arabic)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Dutch) (#378)

* New translations en-US.json (French) (#379)

* New Crowdin updates (#380)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* Remove former profile image upon new upload (#381)

* Remove former profile image upon new upload

* Fix test

* feature/additional-db (#371)

* add support for setting db_url

* fix tests

* add db_username/password env variables

* init db if super user doesn't exist

* fix tests

* fix tests

* set SQLite default DB_URL

* don't run tests on draft PRs

* add lint/black tests

* add test-all

* spell check settings

* black/flake8

* check format fail

* new badges

* rename workflow

* fix formatting

* remove white-space

* test connection arguments for pg

* format

* add new values to template

* format

* remove old script

* monkeypatch test db

* working docker-compose for postgres

* update docs

* test pg workflow

* format

* add driver

* install w/ poetry

* setup container

* change image

* set database to localhost

* update tests

* set url

* fix url path

* disable cache

* database init

* bust cache

* get by name

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/recipe-patch-improvements (#382)

* automated docs update

* recipe rating component

* recipe partial updates - closes #25

* use Vue.delete to update store

* format

* arrow functions

* fix tests

* format

* initial context menu

* localize

* add confirmation dialog

* context menu

* fix bare exception

* update line length

* format all file with prettier

* update changelog

* download as json

* update python dependencies

* update javascript dependencies

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#383)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#385)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* feature/finish-recipe-assets (#384)

* add features to readme

* Copy markdown reference

* prop as whole recipe

* parameter as url instead of query

* add card styling to editor

* move images to /recipes/{slug}/images

* add image to breaking changes

* fix delete and import errors

* fix debug/about response

* logger updates

* dashboard ui

* add server side events

* unorganized routes

* default slot

* add backup viewer to dashboard

* format

* add dialog to backup imports

* initial event support

* delete assets when removed

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#386)

* New translations en-US.json (Romanian)

* New translations en-US.json (Italian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* dashboard notes

* fix image display

* New Crowdin updates (#387)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* Refactor/backend routers (#388)

* update router

* update caddy file

* setup depends in docker-fole

* make changes for serving on subpath

* set dev config

* fix router signups

* consolidate links

* backup-functionality to dashboard

* new user card

* consolidate theme into profile

* fix theme tests

* fix pg tests

* fix pg tests

* remove unused import

* mobile margin

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/new-feature-cleanup (#389)

* add json editor to theme editor

* add toolbars tools to recipe sections

* fix recipe yield

* add updated_date to recipe schema

* update time cards

* fix mobile buttons

* fix asset URL

* fix PG errors CRUD

* remove -d from docker-pro

* fix theme tests

* remvoe old typing

* abstract count function

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#390)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* feature/profile-cards (#391)

* unify format

* pass variables

* remove namespace

* rename

* group-card init

* shuffle + icons

* remove console.logs

* token CRUD

* update changelog

* add profile link

* consolidate mealplan to profile dashboard

* update docs

* add query parameter to search page

* update test routes

* update python depts

* basic token tests

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#392)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* More localization (#393)

* Translate sidebar

* Do not force 12-hour format worldwide

Vue-i18n knows which locales prefer 12-hour format over 24-hour format

* Translate new tiles in profile page

* Translate new tiles in dashboard

* backend-events + code-cleanup (#395)

* additional server events

* sort 'recent recipes' by updated

* remove duplicate code

* fixes #396

* set color

* consolidate tag/category pages

* set colors

* list unorganized recipes

* cleanup old code

* remove flash message, switch to global snackbar

* cancel to close

* cleanup

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#394)

* New translations en-US.json (Romanian)

* New translations en-US.json (Italian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* Feature/event notifications (#399)

* additional server events

* sort 'recent recipes' by updated

* remove duplicate code

* fixes #396

* set color

* consolidate tag/category pages

* set colors

* list unorganized recipes

* cleanup old code

* remove flash message, switch to global snackbar

* cancel to close

* cleanup

* notifications first pass

* test notification

* complete notification feature

* use background tasks

* add url param

* update documentation

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#398)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* Bug/misc bug fixes (#400)

* potentiall fix #329

* typo

* auto purge events

* image error

* update import dialog

* fix scheduler interval time

* adjust icon position

* check for property

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#401)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New Crowdin updates (#402)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* More localization (#403)

* Translate toolbox tab headers

* Use plural form in recipe organizer header

* Feature/copy icon (#406)

* add copy tooltip

* transparent scrollbar

* add version to header

* localize

Co-authored-by: hay-kot <hay-kot@pm.me>

* set proper demo link

* New Crowdin updates (#404)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* add print-view component (#407)

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#408)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* notification import/export (#413)

Co-authored-by: hay-kot <hay-kot@pm.me>

* fallback to icon when no image (#414)

Co-authored-by: hay-kot <hay-kot@pm.me>

* image bug fix

* Add some padding to search panel (#416)

* New Crowdin updates (#410)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Spanish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* feature/mealplanner-rewrite (#417)

* multiple recipes per day

* fix update

* meal-planner rewrite

* disable meal-tests

* spacing

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/style unification (#420)

* set global icons

* fixes #419

* button style docs

* category/tag page updates

* dynamic router imports

Co-authored-by: hay-kot <hay-kot@pm.me>

* bug/bug-fixes (#424)

* fix image write/caching

* Caddyfile Caching header

* more aggressive caching

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add web manifest (#422)

This provides a more app-like experience for mobile users that use the
"add to homescreen" functionality of their web browsers.

* TheButton global component (#425)

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#423)

* New translations en-US.json (German)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Chinese Simplified)

* bug/mobile-fixes (#426)

* search dialog rewrite

* lazy-load shopping list

* fit search bar

* event table

* set urls for static content

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/mobile-layout (#431)

* lazy load cards

* shopping list recipe search bug

* admin layout fluid

* site loader

* username support

* mobile tabs

* set username at signup

* update user tests

* patch bug on shopping list

* public mealplan links

* support link (I'm a monster)

* icon only on mobile

* padding

Co-authored-by: hay-kot <hay-kot@pm.me>

* Changing docs with reverse proxy (#436)

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* New Crowdin updates (#432)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* Support PWA (#437)

* add PWA

* cleanup

* add offline cache

* Localize new strings (#445)

* New translations en-US.json (French) (#444)

* New Crowdin updates (#447)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* feature/favorite-recipes (#443)

* add favorites options

* bump dependencies

* add badges to all cards

* typo

* remove console.log

* fix site-loader viewport

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/recipe-comments (#448)

* fix favorite color issue

* db and models for comments

* rename files

* initial UI for comments

* fix format

* import / export

* fixes #428

* format

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix column type

* Bug/general fixes (#450)

* Fix asset link

* remove unused var

* fix no meal-plan returned

* cleanup redundant code

* Fix dates off in UI

* quick set dark/light mode

* user image fixes

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix pwa not working behind an authenticated proxy (#452)

* New Crowdin updates (#449)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* Add Dashboard documentation (#466)

Add toolbox documentation in organizing-recipes.md
Update Images for site settings
Update site-settings.md

* New Crowdin updates (#455)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* Fixed backup, updated backup docu (#430)

* Fixed backup, updated docu

* reformatted

* Bug Fixes (#467)

* fixes #463

* fixes #465

* fixes #461

* fixes #458 key error

* Fixes #459

* Fixes comments shown when printing

* fix meal-image not return on API call

* return better status

* reorganize docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add Web Share api to ContextMenu.vue (#462)

* Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback

* Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback

* Add translation

* New translations en-US.json (Spanish) (#468)

* docs/update outline (#471)

* docs update

* reorganize

* plausible analytics

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add Dutch language (#473)

* Add Dutch language

* Sort language list alphabetically

Except English which stays on top

* Feature/improve error message on scrape (#476)

* add better feedback on failed scrape

* fix json download link

* add better recipe parser

* dump deps

* fix force open on mobile

* formatting

* rewrite scraper to use new library

* fix failing tests

* bookmarklet support

* bookmarklet instructions

* recipes changelog

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix clean_string error (#481)

* add soft fail user dependency (#479)

* add soft fail user dependency

* filter private recipes on get_recipe_summary

* code clean-up

* restrict single recipe

* cleanup dependencies

* add auto_error oauth2 scheme

* update make file

* update make file

* fix early return

* bump python deps

* restrict category/tags

* format deps

Co-authored-by: hay-kot <hay-kot@pm.me>

* Rewrite Recipe Editor Buttons Bar (#482)

* rewrite editor button row

* add context menu items to recipe page

Co-authored-by: hay-kot <hay-kot@pm.me>

* fixes #485 (#494)

Co-authored-by: hay-kot <hay-kot@pm.me>

* use psycopg2 instead of psycopg2-binary on prod (#483)

* New Crowdin updates (#470)

* New translations en-US.json (German)

* New translations en-US.json (Czech)

* New translations en-US.json (French)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Russian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Italian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Japanese)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* Documentation (#474)

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* Docs/v0.5.0 second pass (#496)

* update docs

* use auto-gen routes

* dumb deps

* remove whitespace

* github action to build dev docs container

* no cache

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix build context

* fix context

* change registry

* new flow

* context

* context

* spelling

* add tooltip to fab (#497)

* New Crowdin updates (#498)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* fix unauthorized recipe (#499)

* fix docs links (#500)

* add translate on toggle theme mode (#501)

* Images and demo custom pages (#502)

* Add Database Layer for Recipe Scaling (#506)

* move badge

* fix add individual ingredient

* fix redirect issue

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#503)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* fix docs (#505)

* fix docs

* undo makefile alignment

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* Add Spanish language (#510)

* New translations en-US.json (Spanish)

* Add Spanish language

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* New Crowdin updates (#508)

* New translations en-US.json (Spanish)

* New translations en-US.json (Swedish)

* Improve Test Coverage (#511)

* add recipe scaling notes

* test theme rename

* fix coverage call to use poetry

* remove print

* remove async

* consolidate test case data

* fix mealplan tests

* remove redundant else

Co-authored-by: hay-kot <hay-kot@pm.me>

* Bug/fix infinite loop (#512)

* fix infinite loop with safe get method

* fix ingredients

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/add cofirmation dialogs (#513)

* add category/tag confirmation dialog

* add page delete confirmation

Co-authored-by: hay-kot <hay-kot@pm.me>

* remove old dependencies

* move strip suffix

* build no cache

* Frontend Fixes + Adjust Caddyfile (#518)

* token error handling

* Add additional settings to recipes

* fixes #515

* remove index.html

Co-authored-by: hay-kot <hay-kot@pm.me>

* add prefix

* disable service worker

* reenable sw

* remove service work from webpack

* undo disable sw

* code splitting

* Make string 'Refresh' and 'New update available' translatable (#524)

* Make string 'Refresh' and 'New update available' translatable

* Fix change password string

* More localization (#525)

* More localization

* Localize search dialog

* Fix "about" page title

* Fix Users API Token API path  (#526)

* Fix Users API Token API path

* Change CRLF to LF

* Fix route generation when route contains /api

* New Crowdin updates (#514)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#528)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Spanish)

* dev-feature/analyze-bundle (#529)

* add bundle analyzer

* use svg icons - closes #522

* fix recent recipes icon

Co-authored-by: hay-kot <hay-kot@pm.me>

* Docs/finale changelog (#530)

* bump version

* add data loss warning

* request correct image

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#531)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* Reset disabled steps when switching recipe (#537)

* Typos and switched dicemultiple for sort (#540)

* Always display ingredients in edit mode (#543)

* Always display ingredients in edit mode

Fixes #538

* Remove unused code

Was wrongfully commited

* Bug fixes/v0.5.1 (#545)

* dump deps

* add job for new groups on interval

* change sort icon

* fix cart icon

* bump version

* changelog

* early return if no comments

* remove comment

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#544)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* update production builds

Co-authored-by: hay-kot <hay-kot@pm.me>
Co-authored-by: Nat <nathanynath@yahoo.fr>
Co-authored-by: sephrat <34862846+sephrat@users.noreply.github.com>
Co-authored-by: Pedro Mata Rodrigues <pmmatarodrigues@gmail.com>
Co-authored-by: JonasSchubert <jonas.schubert.projects@web.de>
Co-authored-by: Jonas  Schubert <jonas.schubert.1990@web.de>
Co-authored-by: Chris Klann <cklann1@users.noreply.github.com>
Co-authored-by: CMBoii <66680498+CMBoii@users.noreply.github.com>
Co-authored-by: Florian Gareis <TheZoker@users.noreply.github.com>
Co-authored-by: Carey Metcalfe <carey@cmetcalfe.ca>
Co-authored-by: zierbeek <58994651+zierbeek@users.noreply.github.com>
Co-authored-by: wengtad <wengtad93@gmail.com>
Co-authored-by: Kevin Grossmann <mail@kevingrossmann.de>
2021-06-17 09:03:23 -08:00
Hayden
e2b9f02f55 Update dockerbuild.release.yml 2021-06-16 22:27:25 -08:00
Hayden
82da1e51db Update dockerbuild.prod.yml 2021-06-16 22:27:09 -08:00
Hayden
0addb3fe6b v0.5.0 (#532)
* fix links

* actually fix #238

* Feature/mkdocs version bump (#240)

* fix links (#239)

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix #238

* bump mkdocs version

* light/dark toggle

* light/dark mode css

* API_DOCS defaults to True

* disable build on push for master

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/recipe viewer (#244)

* fix dialog placement

* markdown support in ingredients

* fix line render issue

* fix tag rendering bug

* change ingredients to text area

* no slug error

* add tag pages

* remove console.logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* changelog v0.4.1

* bug/backup-download (#245)

* fix blocked download

* + download blocked

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/meal planner (#246)

* fixes duplicate recipes in meal-plan #221

* add quick week option

* scope css

* add mealplanner info

Co-authored-by: hay-kot <hay-kot@pm.me>

* Nextcloud Import Bugs - #248 (#250)

* parses datetime properly + clean category - #248

* add default credentials to docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add bulk import examples to docs. (#252)

* Add bulk import examples to docs.

* Update api-usage.md

* Add Python example for bulk import.

* Change IP address in API example.

* Refactor/app settings (#251)

* fix env setup bugs

* remove unused import

* fix layout issues

* changelog

Co-authored-by: hay-kot <hay-kot@pm.me>

* env setup fixes

* Feature/about api (#253)

* fix settings

* app info cleanup

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/image minify (#256)

* fix settings

* app info cleanup

* bottom-bar experiment

* remove dup key

* type hints

* add dependency

* updated image with query parameters

* read image options

* add image minification

* add image minification step

* alt image routes

* add image minification

* set mobile bar to top

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/additional endpoints (#257)

* new recipe summary route

* add categories to cards

* add pillow

* show tags instead of categories

* additional debug info

* add todays meal image url

* about page

* fix reactive tag

* changelog + docs

* bump version

Co-authored-by: hay-kot <hay-kot@pm.me>

* add pillow dependencies (#258)

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/search page (#259)

* add pillow dependencies

* advanced search page

* advanced search apge

* remove extra dependencies

* add pre-run script

Co-authored-by: hay-kot <hay-kot@pm.me>

* no image assignment

* advanced search

* fix docker dev build

* Do not force theme settings on login form (#260)

* Fix docker dev db persistence (#264)

* Fix docker dev db persistence

* Make run.sh the only startup script for prod + dev

Credits to @hay-kot for run.sh script logic

* Restore dev backend initialization in non-docker setup

* Make run.sh POSIX-friendly

* Allow dev backend to auto-reload in Docker

* Frontend Refactor + Bug Fixes

* merge category and tag selector

* unifiy category selector

* add hint

* spacing

* fix nextcloud migration

* simplify email validator #261

* formatting

* cleanup

* auto-gen

* format

* update run script

* unified category/tag selector

* rename component

* Add advanced search link

* remove old code

* convert keywords to tags

* add proper behavior on rename

* proper image name association on rename

* fix test cleanup

* changelog

* set docker comppand

* minify on migration

Co-authored-by: hay-kot <hay-kot@pm.me>

* bug-fixes/category-tag-creator (#266)

* fix category labels

* set loader for migration

* v0.4.1

Co-authored-by: hay-kot <hay-kot@pm.me>

* Hot Fix (#269)

* fix category labels

* set loader for migration

* v0.4.1

* reorganize API docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Fix some pytests (#265)

* Fix encoding issue in cleaner unit test

* Add VS Code task to run pytests

* Fix FileExistsError when running Windows

* Add Portuguese Translation (#232)

* Add Portuguese Translation

* add portuguese translation option

* formatting

* add missing }

* specify absolute path

* Feature/migration-rewrite (#278)

* start

* migration rewrite

* update name

* convert chowdown to new methods

* refactor/remove duplicate code

* refactor to unify logger + log to file

* remove toolbox

* Display report on UI

Co-authored-by: hay-kot <hay-kot@pm.me>

* refactor/image-minification (#285)

* refactor image minification calls

* remove nusiance logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/debug-info (#286)

* rename 'ENV' to 'PRODUCTION' and default to true

* set env PRODUCTION

* refactor file download process

* add last_recipe.json and log downloads

* changelog + version bump

* set env on workflows

* bump version

Co-authored-by: hay-kot <hay-kot@pm.me>

* Basic nutrition editor (#288)

* Basic nutrition editor

* fix no image on scrape

* nutrition display

* add recipe images

* update by url

* new upload options

Co-authored-by: hay-kot <hay-kot@pm.me>

* Sanitize recipe backup filenames (#287)

Fixes #275

* fix page creation fixes #290

* Display categories in sidebar if no pages set (#292)

Fixes  #291

* Enrich page title with context (#296)

- Static pages have their own titles
- The name of the recipe is displayed when viewing it

* fix: translates phrase for locale de (#298)

Co-authored-by: Jonas  Schubert <jonas.schubert.1990@web.de>

* Fix ingredient checkbox click (#305)

Fixes #304
v-list-item already flips the checkbox

* Localize custom pages and search page (#299)

* Localize custom pages and search page

* Fix FR translation for step

* fixes #306

* fixes #297

* Update changelog

* generate docs

* fix broken upload button on migrations

* docs update

* bump version

* fix discord link

* add TOKEN_TIME and DEFAULT_EMAIL

* docs

* fixes #312

* fixes #314

* fixes #315

* fix language hydration

* v0.4.3 docs

* Crowdin integration (#319)

* Fix portuguese localization files

* Use 4-letter code for locales ID

* Update Crowdin configuration file

* Make vuetify locales match with new VueI18n standard

* Fix old locale ID default setting

* Hide project hierarchy from Crowdin

* add dateTimeFormats to Crowdin

* New Crowdin updates (#322) - Initial Merge

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Traditional)

* New Crowdin updates (#323)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Danish)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Romanian)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (English)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (German)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French) (#324)

* update lock

* ENV -> PRODUCTION

* New Crowdin updates (#327)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Simplified)

* Make first day of week in calendar view customizable (#263)

* Make first day of the week customizable

New settings section 'Locale settings'
New setting 'First day of week'
New date picker reusable UI that uses the new setting
Meal planner now uses this new date picker

* Clean up unused code in settings page

* Fix First day of week mapping

* Replace missing v-date-picker with custom card DatePicker

* Mention first day of the week feature in change log

* Fix date picker not properly localized (#330)

* Fix language in date picker

Vuetify allows custom-named locales,
but the date-picker really only works with BCP 47 language tag

* Save lang at proper time + Update Vuetify lang on the fly

* Add tip to fix rpi host running docker container (#335)

Per issue #249, tip gives guidance for running Mealie in a docker linux/arm/v7 container.

* New Crowdin updates (#328)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* es-ES.json (#334)

* es-ES.json

Spanish translation

* Update es-ES.json

* feature/editor-improvements (#289)

* pin editor buttons on scroll

* scaler scratch

* fix langauge assignment 1st pass

* set lang on navigate

* refactor/breakup router

* unify style for language selectro

* refactor/code-cleanup

* refactor/page specific components to page folder

* Fix time card layout issue

* fix timecard display

* update mobile cards / fix overflow errors

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#340)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* Document new translation process with Crowdin (#342)

* Localize more dates and texts (#341)

* Localize more dates and texts

* Adapt source language to 4-letter code for VS code

* Make page titles more reactive to language change

* Translate missing text + fix missed refactoring

* Fix missed page titles refactoring

* Translate nutrition view

* Translate Image upload vue

* Fix default text being defined twice in upload btn

* Get Recipes Route Rewrite (#339)

* deprecate old route

* auto-gen

* recipe card infinite scroll

* fix datatable

* set hard-limit option

* add loader

* set scroll on navigation

* add auto-import

* fix slow initial load

* remove console.logs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Fix ingredients not refreshed upon recipe change (#343)

* New Crowdin updates (#344)

* New translations en-US.json (Romanian)

* New translations en-US.json (French)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Italian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Japanese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Italian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (English)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#345)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (German)

* Fix infinite loop in meal planner randomizer (#346)

Infinite loop would happen if there were more days than recipes

* More localization (#348)

* Translate about page

* Sort messages by keys

* Remove unused strings

* Localize date in meal planner

* Fix quick week not starting on Monday for UTC+x

* New Crowdin updates (#349)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New Crowdin updates (#351)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* App Bar Rewrite (#347)

* Dummy Commit

* consolidate sidebar and app bar

* fix image error

* consolidate sidebar

* new icon for user menu

* fixes #329

* fix double click on mobile

* swap to computed properties

* fix open/close bug

* rewrite search for mobile

* fix ingredient checkbox

* cleanup console.logs

* set default lang + bump version

* draft changelog

* reword

* update env variables

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#355)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (French)

* feature/category-tag-crud (#354)

* update tag route

* search.and

* offset for mobile

* relative imports

* get settings

* new page

* category/tag CRUD

* bulk assign frontend

* Bulk assign

* debounce search

* remove dev data

* recipe store refactor

* fix mobile view

* fix failing tests

* commit test data

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#359)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* toolbox reference

* New Crowdin updates (#361)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* New translations en-US.json (German)

* Remove dead code (#362)

* Remove BackupCard.vue

Unused - moved to NewBackupCard.vue

* Remove unused method

* New Crowdin updates (#363)

* New translations en-US.json (French)

* New translations en-US.json (Polish)

* feature/new-recipe-features (#360)

* unify button styles

* fix drag on mobile

* recipe instructions section

* add carbs

* refactor component location

* asset start

* consolidate view/edit components

* asset api

* base dialog event

* Remove 'content'

* remove console.log

* add slug prop

* remove console.log

* recipe assets first pass

* add recipeSettings model

* fix hide/show when no tags/categories

* fix typo

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#365)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* refactor/recipe-to-snake-case (#364)

* formatting

* snake case all recipes entries

* set foreign key to int

* run scheduler at startup and not import

* set SQLite file path before imports

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix missed commits

* More localization (#358)

* Translate missing items on About page

* Localize import summary dialog

* Make site menu translation reactive

* Localize import options

* Include semi colon in string

* Move API texts to frontend + better status codes

* Provide feedback to user when no meal is planned

* Fix API tests after latest rework

* Add warning for API changes in changelog

* Refactor API texts handling

* Refactor API texts handling #2

* Better API feedback

* Rearrange strings hierarchy

* Add messages upon recipe updated

* Fix 'recipe effected' typo

* Remove snackbar usage in backend

* Translate toolbox

* Provide feedback for tags CRUD

* Fix messed up merge

* Translate sign-up form

* Better feedback for sign-up CRUD

* Refactor log-in API texts handling

* No error message when user is not authenticated

* Remove unimportant console log

* New Crowdin updates (#366)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* Hide user ID + Reset password when creating a user (#367)

* refactor/docker-updates (#369)

* convert all images to webp

* consolidate docker files

* serve images wiith caddy

* consolidate docker files

* new slim-buster image

* set image url

* add image path

* remove print

* set image path correctly

* cleanup

* caddy proxy path

* docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#368)

* New translations en-US.json (German)

* New translations en-US.json (Korean)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* add python3-dev

* add all cryptography deps 🤞

* remove 32bit arm support

* Refactor/recipe routes (#370)

* format with black

* black format

* flake8

* remove bar exceptions

* remove test for depreciated route

* recipe settings editr

* add sqlite

Co-authored-by: hay-kot <hay-kot@pm.me>

* Api refactoring fixes (#372)

* Fix JS error when logging in with bad credentials

* Remove duplicate error message if bad credentials

Error is already nicely displayed in LoginForm

* More localization (#373)

* Translate missing string

* Display language in original language + English

* Translate assets

* Translate recipe settings

* New Crowdin updates (#374)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (German)

* Shopping list fixes (#376)

* Refactor recipe to snake case

* Initialize raw ingredients

Fixes #356

* New Crowdin updates (#377)

* New translations en-US.json (German)

* New translations en-US.json (Italian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (French)

* New translations en-US.json (Japanese)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Arabic)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Dutch) (#378)

* New translations en-US.json (French) (#379)

* New Crowdin updates (#380)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* Remove former profile image upon new upload (#381)

* Remove former profile image upon new upload

* Fix test

* feature/additional-db (#371)

* add support for setting db_url

* fix tests

* add db_username/password env variables

* init db if super user doesn't exist

* fix tests

* fix tests

* set SQLite default DB_URL

* don't run tests on draft PRs

* add lint/black tests

* add test-all

* spell check settings

* black/flake8

* check format fail

* new badges

* rename workflow

* fix formatting

* remove white-space

* test connection arguments for pg

* format

* add new values to template

* format

* remove old script

* monkeypatch test db

* working docker-compose for postgres

* update docs

* test pg workflow

* format

* add driver

* install w/ poetry

* setup container

* change image

* set database to localhost

* update tests

* set url

* fix url path

* disable cache

* database init

* bust cache

* get by name

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/recipe-patch-improvements (#382)

* automated docs update

* recipe rating component

* recipe partial updates - closes #25

* use Vue.delete to update store

* format

* arrow functions

* fix tests

* format

* initial context menu

* localize

* add confirmation dialog

* context menu

* fix bare exception

* update line length

* format all file with prettier

* update changelog

* download as json

* update python dependencies

* update javascript dependencies

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#383)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#385)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* feature/finish-recipe-assets (#384)

* add features to readme

* Copy markdown reference

* prop as whole recipe

* parameter as url instead of query

* add card styling to editor

* move images to /recipes/{slug}/images

* add image to breaking changes

* fix delete and import errors

* fix debug/about response

* logger updates

* dashboard ui

* add server side events

* unorganized routes

* default slot

* add backup viewer to dashboard

* format

* add dialog to backup imports

* initial event support

* delete assets when removed

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#386)

* New translations en-US.json (Romanian)

* New translations en-US.json (Italian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* dashboard notes

* fix image display

* New Crowdin updates (#387)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* New translations en-US.json (Italian)

* Refactor/backend routers (#388)

* update router

* update caddy file

* setup depends in docker-fole

* make changes for serving on subpath

* set dev config

* fix router signups

* consolidate links

* backup-functionality to dashboard

* new user card

* consolidate theme into profile

* fix theme tests

* fix pg tests

* fix pg tests

* remove unused import

* mobile margin

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/new-feature-cleanup (#389)

* add json editor to theme editor

* add toolbars tools to recipe sections

* fix recipe yield

* add updated_date to recipe schema

* update time cards

* fix mobile buttons

* fix asset URL

* fix PG errors CRUD

* remove -d from docker-pro

* fix theme tests

* remvoe old typing

* abstract count function

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#390)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (French)

* feature/profile-cards (#391)

* unify format

* pass variables

* remove namespace

* rename

* group-card init

* shuffle + icons

* remove console.logs

* token CRUD

* update changelog

* add profile link

* consolidate mealplan to profile dashboard

* update docs

* add query parameter to search page

* update test routes

* update python depts

* basic token tests

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#392)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* More localization (#393)

* Translate sidebar

* Do not force 12-hour format worldwide

Vue-i18n knows which locales prefer 12-hour format over 24-hour format

* Translate new tiles in profile page

* Translate new tiles in dashboard

* backend-events + code-cleanup (#395)

* additional server events

* sort 'recent recipes' by updated

* remove duplicate code

* fixes #396

* set color

* consolidate tag/category pages

* set colors

* list unorganized recipes

* cleanup old code

* remove flash message, switch to global snackbar

* cancel to close

* cleanup

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#394)

* New translations en-US.json (Romanian)

* New translations en-US.json (Italian)

* New translations en-US.json (Romanian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (French)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Italian)

* New translations en-US.json (Spanish)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Arabic)

* New translations en-US.json (Catalan)

* New translations en-US.json (Czech)

* New translations en-US.json (Danish)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Greek)

* New translations en-US.json (Finnish)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Korean)

* New translations en-US.json (Dutch)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Polish)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Russian)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Swedish)

* New translations en-US.json (Turkish)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* Feature/event notifications (#399)

* additional server events

* sort 'recent recipes' by updated

* remove duplicate code

* fixes #396

* set color

* consolidate tag/category pages

* set colors

* list unorganized recipes

* cleanup old code

* remove flash message, switch to global snackbar

* cancel to close

* cleanup

* notifications first pass

* test notification

* complete notification feature

* use background tasks

* add url param

* update documentation

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#398)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* Bug/misc bug fixes (#400)

* potentiall fix #329

* typo

* auto purge events

* image error

* update import dialog

* fix scheduler interval time

* adjust icon position

* check for property

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#401)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New Crowdin updates (#402)

* New translations en-US.json (French)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* More localization (#403)

* Translate toolbox tab headers

* Use plural form in recipe organizer header

* Feature/copy icon (#406)

* add copy tooltip

* transparent scrollbar

* add version to header

* localize

Co-authored-by: hay-kot <hay-kot@pm.me>

* set proper demo link

* New Crowdin updates (#404)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* add print-view component (#407)

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#408)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* notification import/export (#413)

Co-authored-by: hay-kot <hay-kot@pm.me>

* fallback to icon when no image (#414)

Co-authored-by: hay-kot <hay-kot@pm.me>

* image bug fix

* Add some padding to search panel (#416)

* New Crowdin updates (#410)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Spanish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* feature/mealplanner-rewrite (#417)

* multiple recipes per day

* fix update

* meal-planner rewrite

* disable meal-tests

* spacing

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/style unification (#420)

* set global icons

* fixes #419

* button style docs

* category/tag page updates

* dynamic router imports

Co-authored-by: hay-kot <hay-kot@pm.me>

* bug/bug-fixes (#424)

* fix image write/caching

* Caddyfile Caching header

* more aggressive caching

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add web manifest (#422)

This provides a more app-like experience for mobile users that use the
"add to homescreen" functionality of their web browsers.

* TheButton global component (#425)

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#423)

* New translations en-US.json (German)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Spanish)

* New translations en-US.json (Chinese Simplified)

* bug/mobile-fixes (#426)

* search dialog rewrite

* lazy-load shopping list

* fit search bar

* event table

* set urls for static content

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/mobile-layout (#431)

* lazy load cards

* shopping list recipe search bug

* admin layout fluid

* site loader

* username support

* mobile tabs

* set username at signup

* update user tests

* patch bug on shopping list

* public mealplan links

* support link (I'm a monster)

* icon only on mobile

* padding

Co-authored-by: hay-kot <hay-kot@pm.me>

* Changing docs with reverse proxy (#436)

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* New Crowdin updates (#432)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* Support PWA (#437)

* add PWA

* cleanup

* add offline cache

* Localize new strings (#445)

* New translations en-US.json (French) (#444)

* New Crowdin updates (#447)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* feature/favorite-recipes (#443)

* add favorites options

* bump dependencies

* add badges to all cards

* typo

* remove console.log

* fix site-loader viewport

Co-authored-by: hay-kot <hay-kot@pm.me>

* feature/recipe-comments (#448)

* fix favorite color issue

* db and models for comments

* rename files

* initial UI for comments

* fix format

* import / export

* fixes #428

* format

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix column type

* Bug/general fixes (#450)

* Fix asset link

* remove unused var

* fix no meal-plan returned

* cleanup redundant code

* Fix dates off in UI

* quick set dark/light mode

* user image fixes

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix pwa not working behind an authenticated proxy (#452)

* New Crowdin updates (#449)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (Spanish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Catalan)

* Add Dashboard documentation (#466)

Add toolbox documentation in organizing-recipes.md
Update Images for site settings
Update site-settings.md

* New Crowdin updates (#455)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* Fixed backup, updated backup docu (#430)

* Fixed backup, updated docu

* reformatted

* Bug Fixes (#467)

* fixes #463

* fixes #465

* fixes #461

* fixes #458 key error

* Fixes #459

* Fixes comments shown when printing

* fix meal-image not return on API call

* return better status

* reorganize docs

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add Web Share api to ContextMenu.vue (#462)

* Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback

* Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback

* Add translation

* New translations en-US.json (Spanish) (#468)

* docs/update outline (#471)

* docs update

* reorganize

* plausible analytics

Co-authored-by: hay-kot <hay-kot@pm.me>

* Add Dutch language (#473)

* Add Dutch language

* Sort language list alphabetically

Except English which stays on top

* Feature/improve error message on scrape (#476)

* add better feedback on failed scrape

* fix json download link

* add better recipe parser

* dump deps

* fix force open on mobile

* formatting

* rewrite scraper to use new library

* fix failing tests

* bookmarklet support

* bookmarklet instructions

* recipes changelog

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix clean_string error (#481)

* add soft fail user dependency (#479)

* add soft fail user dependency

* filter private recipes on get_recipe_summary

* code clean-up

* restrict single recipe

* cleanup dependencies

* add auto_error oauth2 scheme

* update make file

* update make file

* fix early return

* bump python deps

* restrict category/tags

* format deps

Co-authored-by: hay-kot <hay-kot@pm.me>

* Rewrite Recipe Editor Buttons Bar (#482)

* rewrite editor button row

* add context menu items to recipe page

Co-authored-by: hay-kot <hay-kot@pm.me>

* fixes #485 (#494)

Co-authored-by: hay-kot <hay-kot@pm.me>

* use psycopg2 instead of psycopg2-binary on prod (#483)

* New Crowdin updates (#470)

* New translations en-US.json (German)

* New translations en-US.json (Czech)

* New translations en-US.json (French)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Russian)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Italian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Japanese)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (German)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Dutch)

* New translations en-US.json (Polish)

* New translations en-US.json (Polish)

* Documentation (#474)

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* Docs/v0.5.0 second pass (#496)

* update docs

* use auto-gen routes

* dumb deps

* remove whitespace

* github action to build dev docs container

* no cache

Co-authored-by: hay-kot <hay-kot@pm.me>

* fix build context

* fix context

* change registry

* new flow

* context

* context

* spelling

* add tooltip to fab (#497)

* New Crowdin updates (#498)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* fix unauthorized recipe (#499)

* fix docs links (#500)

* add translate on toggle theme mode (#501)

* Images and demo custom pages (#502)

* Add Database Layer for Recipe Scaling (#506)

* move badge

* fix add individual ingredient

* fix redirect issue

Co-authored-by: hay-kot <hay-kot@pm.me>

* New Crowdin updates (#503)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* fix docs (#505)

* fix docs

* undo makefile alignment

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* Add Spanish language (#510)

* New translations en-US.json (Spanish)

* Add Spanish language

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>

* New Crowdin updates (#508)

* New translations en-US.json (Spanish)

* New translations en-US.json (Swedish)

* Improve Test Coverage (#511)

* add recipe scaling notes

* test theme rename

* fix coverage call to use poetry

* remove print

* remove async

* consolidate test case data

* fix mealplan tests

* remove redundant else

Co-authored-by: hay-kot <hay-kot@pm.me>

* Bug/fix infinite loop (#512)

* fix infinite loop with safe get method

* fix ingredients

Co-authored-by: hay-kot <hay-kot@pm.me>

* Feature/add cofirmation dialogs (#513)

* add category/tag confirmation dialog

* add page delete confirmation

Co-authored-by: hay-kot <hay-kot@pm.me>

* remove old dependencies

* move strip suffix

* build no cache

* Frontend Fixes + Adjust Caddyfile (#518)

* token error handling

* Add additional settings to recipes

* fixes #515

* remove index.html

Co-authored-by: hay-kot <hay-kot@pm.me>

* add prefix

* disable service worker

* reenable sw

* remove service work from webpack

* undo disable sw

* code splitting

* Make string 'Refresh' and 'New update available' translatable (#524)

* Make string 'Refresh' and 'New update available' translatable

* Fix change password string

* More localization (#525)

* More localization

* Localize search dialog

* Fix "about" page title

* Fix Users API Token API path  (#526)

* Fix Users API Token API path

* Change CRLF to LF

* Fix route generation when route contains /api

* New Crowdin updates (#514)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (German)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Spanish)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New translations en-US.json (Swedish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Dutch)

* New translations en-US.json (Spanish)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (German)

* New translations en-US.json (Japanese)

* New translations en-US.json (Vietnamese)

* New translations en-US.json (Chinese Traditional)

* New translations en-US.json (Ukrainian)

* New translations en-US.json (Turkish)

* New translations en-US.json (Swedish)

* New translations en-US.json (Serbian (Cyrillic))

* New translations en-US.json (Russian)

* New translations en-US.json (Portuguese)

* New translations en-US.json (Polish)

* New translations en-US.json (Norwegian)

* New translations en-US.json (Dutch)

* New translations en-US.json (Korean)

* New translations en-US.json (Italian)

* New translations en-US.json (French)

* New translations en-US.json (Hungarian)

* New translations en-US.json (Hebrew)

* New translations en-US.json (Finnish)

* New translations en-US.json (Greek)

* New translations en-US.json (Danish)

* New translations en-US.json (Czech)

* New translations en-US.json (Catalan)

* New translations en-US.json (Arabic)

* New translations en-US.json (Afrikaans)

* New translations en-US.json (Spanish)

* New translations en-US.json (Romanian)

* New translations en-US.json (Chinese Simplified)

* New translations en-US.json (Portuguese, Brazilian)

* New Crowdin updates (#528)

* New translations en-US.json (French)

* New translations en-US.json (Dutch)

* New translations en-US.json (Swedish)

* New translations en-US.json (Spanish)

* dev-feature/analyze-bundle (#529)

* add bundle analyzer

* use svg icons - closes #522

* fix recent recipes icon

Co-authored-by: hay-kot <hay-kot@pm.me>

* Docs/finale changelog (#530)

* bump version

* add data loss warning

* request correct image

Co-authored-by: hay-kot <hay-kot@pm.me>

Co-authored-by: hay-kot <hay-kot@pm.me>
Co-authored-by: Nat <nathanynath@yahoo.fr>
Co-authored-by: sephrat <34862846+sephrat@users.noreply.github.com>
Co-authored-by: Pedro Mata Rodrigues <pmmatarodrigues@gmail.com>
Co-authored-by: JonasSchubert <jonas.schubert.projects@web.de>
Co-authored-by: Jonas  Schubert <jonas.schubert.1990@web.de>
Co-authored-by: Chris Klann <cklann1@users.noreply.github.com>
Co-authored-by: CMBoii <66680498+CMBoii@users.noreply.github.com>
Co-authored-by: Florian Gareis <TheZoker@users.noreply.github.com>
Co-authored-by: Carey Metcalfe <carey@cmetcalfe.ca>
Co-authored-by: zierbeek <58994651+zierbeek@users.noreply.github.com>
Co-authored-by: wengtad <wengtad93@gmail.com>
Co-authored-by: Kevin Grossmann <mail@kevingrossmann.de>
2021-06-16 21:35:06 -08:00
tklingenberg8472
72e614b6e5 handle recipeInstructions that are given as json objects / name-value pairs (#509) 2021-06-13 10:36:38 -08:00
Wayward One
8abcf0ca4d Issue #337 - Update docs for user env (#338) 2021-04-21 20:08:14 -08:00
226 changed files with 5718 additions and 27259 deletions

View File

@@ -1,27 +1,3 @@
.git
.github
.dockerignore
.gitignore
.idea
.vscode
__pycache__/
*.py[cod]
*$py.class
*.so
htmlcov/
.coverage
.coverage.*
.pytest_cache/
.venv
venv
.DS_Store
.AppleDouble
.LSOverride
._*
*/node_modules
*/dist
*/data/db

View File

@@ -1,52 +0,0 @@
---
name: Bug Report
description: "submit a bug report for the current release"
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: Please confirm and check all the following options.
options:
- label: This is not a feature request
required: true
- label: I added a very descriptive title to this issue.
required: true
- label: I used the GitHub search to find a similar issue and didn't find it.
required: true
- label: I searched the Mealie documentation, with the integrated search.
required: true
- label: I already read the docs and didn't find an answer.
required: true
- type: textarea
id: description
attributes:
label: What is the issue you are experiencing?
placeholder: A clear and concise description of what the bug is.
validations:
required: true
- type: dropdown
id: os
attributes:
label: Deployment
description: What Deployment system are you using?
multiple: true
options:
- Docker (Linux)
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
validations:
required: true
- type: textarea
id: os-details
attributes:
label: Deployment Details
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
- type: input
id: mealie-version
attributes:
label: Mealie Version
validations:
required: true

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug Report
about: Create a bug report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
**Steps To Reproduce**
Please be specific!
1. Go to '...'
2. Click on '....'
3. etc.
**Sample Code**
<!-- If applicable, please include Sample code to reproduce the issue. -->
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Actual Behavior**
<!-- A clear and concise description of what actually happens. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**Device Information (please complete the following information):**
- OS: [e.g., WSL2 on Win10, Mac]
- Deployment: [e.g., Docker-version, docker-compose, Python application]
- Browser: [e.g., chrome, safari]
- Version: [e.g., 0.2.0-dev]
**Additional context**
<!-- Add any other context about the problem here. If applicable, please include why you think the bug is occurring and/or troubleshooting you have already performed. -->

View File

@@ -1,47 +0,0 @@
---
name: v1.0.0b Bug Report
description: "submit a bug report for the v1 beta"
title: "[v1.0.0b] - YOUR TITLE"
body:
- type: checkboxes
id: checks
attributes:
label: First Check
description: Please confirm and check all the following options.
options:
- label: This is not a feature request
required: true
- label: I added a very descriptive title to this issue.
required: true
- label: I used the GitHub search to find a similar issue and didn't find it.
required: true
- label: I searched the Mealie documentation, with the integrated search.
required: true
- label: I already read the docs and didn't find an answer.
required: true
- type: textarea
id: description
attributes:
label: What is the issue you are experiencing?
placeholder: A clear and concise description of what the bug is.
validations:
required: true
- type: dropdown
id: os
attributes:
label: Deployment
description: What Deployment system are you using?
multiple: true
options:
- Docker (Linux)
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
validations:
required: true
- type: textarea
id: os-details
attributes:
label: Deployment Details
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands

View File

@@ -1,38 +0,0 @@
---
name: v1.0.0b Task
description: "CONTRIBUTORS ONLY: Submit a Task that needs to be completed"
title: "[v1.0.0b] [Task] - TASK DESCRIPTION"
labels:
- task
- v1
body:
- type: markdown
attributes:
value: |
Thanks for your interest in Mealie! 🚀
This is a place for Mealie contributors to find tasks that need to get done around the repository. Tasks are different than issues as they are generally related to providing a new feature or improve an existing feature. They are _generally_ not related to an issue.
**DO NOT** create a task unless
- You are a contributors who has prior approval via discord/discussions
- You have otherwise been given approval to post the tasks
Otherwise, your post will be closed/deleted.
**Interested in Taking This?**
If you're interested in completing this tasks and it hasn't already been taken, comment below and to let others know you're working on it. As you work through the task, I ask that you submit a draft pull request as soon as possible, and tag this issue so we can all collaborate as best as possible.
- type: textarea
id: problem
attributes:
label: What is the problem this task addresses?
placeholder: A clear and concise description of what the problem this task will address.
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed/Possible Solution(s)?
placeholder: Provide as much context around the idea as possible with potential files and roadblocks that may come up
validations:
required: true

17
.github/stale.yaml vendored
View File

@@ -1,17 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View File

@@ -1,7 +1,8 @@
name: Publish docs via GitHub Pages
on:
release:
types: [published]
push:
branches:
- master
jobs:
build:
@@ -9,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v2
uses: actions/checkout@v1
- name: Deploy docs
uses: mhausenblas/mkdocs-deploy-gh-pages@master

View File

@@ -39,7 +39,7 @@ jobs:
# ----- install & configure poetry -----
#----------------------------------------------
- name: Install Poetry
uses: snok/install-poetry@v1
uses: snok/install-poetry@v1.1.1
with:
virtualenvs-create: true
virtualenvs-in-project: true
@@ -57,7 +57,6 @@ jobs:
#----------------------------------------------
- name: Install dependencies
run: |
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
poetry install
poetry add "psycopg2-binary==2.8.6"
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'

8
.gitignore vendored
View File

@@ -55,7 +55,6 @@ eggs/
lib/
lib64/
parts/
!frontend/src/components/Recipe/Parts/
sdist/
var/
wheels/
@@ -149,9 +148,4 @@ dev/data/backups/dev_sample_data*.zip
!dev/data/backups/test*.zip
dev/data/recipes/*
dev/scripts/output/app_routes.py
dev/scripts/output/javascriptAPI/*
mealie/services/scraper/ingredient_nlp/model.crfmodel
.gitignore
frontend/.nuxt/**
frontend/static/sw.js
dev/code-generation/generated/*
dev/scripts/output/javascriptAPI/*

View File

@@ -15,6 +15,5 @@
"i18n-ally.keystyle": "nested",
"cSpell.words": ["compression", "hkotel", "performant", "postgres", "webp"],
"search.mode": "reuseEditor",
"python.linting.flake8Enabled": true,
"conventionalCommits.scopes": ["frontend"]
"python.linting.flake8Enabled": true
}

View File

@@ -1,34 +1,35 @@
{
auto_https off
admin off
admin off
}
:80 {
@proxied path /api/* /docs /openapi.json
@proxied path /api/* /docs /openapi.json
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
}
encode gzip zstd
# Handles Recipe Images / Assets
handle_path /api/media/recipes/* {
header @static Cache-Control max-age=31536000
root * /app/data/recipes/
file_server
}
encode gzip zstd
handle @proxied {
uri strip_suffix /
reverse_proxy http://127.0.0.1:9000
}
# Handles Recipe Images / Assets
handle_path /api/media/recipes/* {
header @static Cache-Control max-age=31536000
root * /app/data/recipes/
file_server
}
handle @proxied {
uri strip_suffix /
reverse_proxy http://127.0.0.1:9000
}
handle {
header @static Cache-Control max-age=31536000
root * /app/dist
try_files {path}.html {path} /
file_server
}
}
handle {
header @static Cache-Control max-age=31536000
root * /app/dist
try_files {path}.html {path} /
file_server
}
}

View File

@@ -1,142 +1,59 @@
###############################################
# Frontend Builder Image
###############################################
FROM node:lts-alpine as frontend-build
# build
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY ./frontend/package*.json ./
RUN npm install
COPY ./frontend/ .
RUN npm run build
###############################################
# Base Image
###############################################
FROM python:3.9-slim as python-base
ENV MEALIE_HOME="/app"
FROM python:3.9-slim-buster
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=off \
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100 \
POETRY_HOME="/opt/poetry" \
POETRY_VIRTUALENVS_IN_PROJECT=true \
POETRY_NO_INTERACTION=1 \
PYSETUP_PATH="/opt/pysetup" \
VENV_PATH="/opt/pysetup/.venv"
ENV PRODUCTION true
ENV POETRY_VERSION 1.1.6
# prepend poetry and venv to path
ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"
# create user account
RUN useradd -u 911 -U -d $MEALIE_HOME -s /bin/bash abc \
&& usermod -G users abc \
&& mkdir $MEALIE_HOME
###############################################
# Builder Image
###############################################
FROM python-base as builder-base
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc g++ \
curl \
build-essential \
gnupg gnupg2 gnupg1 \
apt-transport-https \
debian-archive-keyring \
debian-keyring \
libpq-dev \
libwebp-dev \
# LDAP Dependencies
libsasl2-dev libldap2-dev libssl-dev \
gnupg gnupg2 gnupg1 \
debian-keyring \
debian-archive-keyring \
apt-transport-https \
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list \
&& apt-get update \
&& apt-get install --no-install-recommends -y \
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \
&& apt-get update && apt-get install -y --no-install-recommends \
caddy \
&& pip install -U --no-cache-dir pip
&& apt autoremove \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1
# install poetry - respects $POETRY_VERSION & $POETRY_HOME
ENV POETRY_VERSION=1.1.6
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
# copy project requirement files here to ensure they will be cached.
WORKDIR $PYSETUP_PATH
COPY ./poetry.lock ./pyproject.toml ./
RUN pip install --no-cache-dir "poetry==$POETRY_VERSION"
# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally
RUN poetry install -E pgsql --no-dev
# project dependencies
WORKDIR /app
COPY pyproject.toml poetry.lock /app/
RUN poetry config virtualenvs.create false
RUN poetry install -E pgsql --no-dev --no-interaction --no-ansi
###############################################
# Development Image
###############################################
FROM python-base as development
ENV PRODUCTION=false
# copying poetry and venv into image
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
# copy backend
COPY ./mealie $MEALIE_HOME/mealie
COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/
COPY ./mealie /app/mealie
RUN poetry config virtualenvs.create false \
&& poetry install -E pgsql --no-dev
#! Future
# COPY ./alembic ./alembic.ini $MEALIE_HOME/
# COPY ./alembic /app
# COPY alembic.ini /app
COPY ./Caddyfile /app
COPY ./dev/data/templates /app/data/templates
# venv already has runtime deps installed we get a quicker install
WORKDIR $MEALIE_HOME
RUN . $VENV_PATH/bin/activate && poetry install
WORKDIR /
# frontend build
COPY --from=build-stage /app/dist /app/dist
RUN chmod +x $MEALIE_HOME/mealie/run.sh
ENTRYPOINT $MEALIE_HOME/mealie/run.sh "reload"
VOLUME [ "/app/data/" ]
###############################################
# Production Image
###############################################
FROM python-base as production
ENV PRODUCTION=true
EXPOSE 80
# curl for used by healthcheck
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
curl \
&& apt-get autoremove \
&& rm -rf /var/lib/apt/lists/*
# copying poetry and venv into image
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
# copying caddy into image
COPY --from=builder-base /usr/bin/caddy /usr/bin/caddy
# copy backend
COPY ./mealie $MEALIE_HOME/mealie
COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/
COPY ./gunicorn_conf.py $MEALIE_HOME
#! Future
# COPY ./alembic ./alembic.ini $MEALIE_HOME/
# venv already has runtime deps installed we get a quicker install
WORKDIR $MEALIE_HOME
RUN . $VENV_PATH/bin/activate && poetry install -E pgsql --no-dev
WORKDIR /
# copy frontend
COPY --from=frontend-build /app/dist $MEALIE_HOME/dist
COPY ./dev/data/templates $MEALIE_HOME/data/templates
COPY ./Caddyfile $MEALIE_HOME
VOLUME [ "$MEALIE_HOME/data/" ]
ENV APP_PORT=80
EXPOSE ${APP_PORT}
HEALTHCHECK CMD curl -fs http://localhost:${APP_PORT} || exit 1
RUN chmod +x $MEALIE_HOME/mealie/run.sh
ENTRYPOINT $MEALIE_HOME/mealie/run.sh
CMD /app/mealie/run.sh

33
Dockerfile.dev Normal file
View File

@@ -0,0 +1,33 @@
FROM python:3.9-slim-buster
ENV PRODUCTION false
ENV POETRY_VERSION 1.1.6
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc g++ \
curl \
gnupg gnupg2 gnupg1 \
apt-transport-https \
debian-archive-keyring \
debian-keyring \
libwebp-dev \
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \
&& apt-get update && apt-get install -y --no-install-recommends \
&& apt autoremove \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1
RUN pip install --no-cache-dir "poetry==$POETRY_VERSION"
WORKDIR /app/
# Copy poetry.lock* in case it doesn't exist in the repo
COPY ./pyproject.toml /app/
COPY ./mealie /app/mealie
RUN poetry config virtualenvs.create false \
&& poetry install
RUN chmod +x /app/mealie/run.sh
CMD ["/app/mealie/run.sh", "reload"]

View File

@@ -6,9 +6,9 @@
[![Docker Pulls][docker-pull]][docker-pull]
[![CodeFactor](https://www.codefactor.io/repository/github/hay-kot/mealie/badge)](https://www.codefactor.io/repository/github/hay-kot/mealie)
[![Docker Build Production](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml)
[![Project Tests Production](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
[![Project Tests Production](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml)
[![Docker Build Dev](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml)
[![Project Tests Dev](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
[![Project Tests Dev](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml)
<!-- PROJECT LOGO -->
<br />

View File

@@ -1,32 +0,0 @@
import json
import requests
from pydantic import BaseModel
class GithubIssue(BaseModel):
url: str
number: int
title: str
def get_issues_by_label(label="fixed-pending-release") -> list[GithubIssue]:
issues_url = f"https://api.github.com/repos/hay-kot/mealie/issues?labels={label}"
response = requests.get(issues_url)
issues = json.loads(response.text)
return [GithubIssue(**issue) for issue in issues]
def format_markdown_list(issues: list[GithubIssue]) -> str:
return "\n".join(f"- [{issue.number}]({issue.url}) - {issue.title}" for issue in issues)
def main() -> None:
issues = get_issues_by_label()
print(format_markdown_list(issues))
if __name__ == "__main__":
main()

View File

@@ -8,7 +8,6 @@ class AppRoutes:
self.about_events = "/api/about/events"
self.about_events_notifications = "/api/about/events/notifications"
self.about_events_notifications_test = "/api/about/events/notifications/test"
self.about_recipes_defaults = "/api/about/recipes/defaults"
self.auth_refresh = "/api/auth/refresh"
self.auth_token = "/api/auth/token"
self.auth_token_long = "/api/auth/token/long"
@@ -32,7 +31,6 @@ class AppRoutes:
self.migrations = "/api/migrations"
self.recipes_category = "/api/recipes/category"
self.recipes_create = "/api/recipes/create"
self.recipes_create_from_zip = "/api/recipes/create-from-zip"
self.recipes_create_url = "/api/recipes/create-url"
self.recipes_summary = "/api/recipes/summary"
self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
@@ -110,9 +108,6 @@ class AppRoutes:
def recipes_recipe_slug_image(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/image"
def recipes_recipe_slug_zip(self, recipe_slug):
return f"{self.prefix}/recipes/{recipe_slug}/zip"
def recipes_slug_comments(self, slug):
return f"{self.prefix}/recipes/{slug}/comments"

View File

@@ -1,4 +1,4 @@
# Use changeme@email.com/MyPassword as user/password credentials
# Use root/example as user/password credentials
version: "3.1"
services:
# Vue Frontend
@@ -23,8 +23,7 @@ services:
image: mealie-api:dev
build:
context: ./
target: development
dockerfile: Dockerfile
dockerfile: Dockerfile.dev
restart: always
ports:
- 9921:9000

View File

@@ -3,7 +3,6 @@ services:
mealie:
build:
context: ./
target: production
dockerfile: Dockerfile
container_name: mealie
restart: always
@@ -18,9 +17,6 @@ services:
POSTGRES_SERVER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
# WORKERS_PER_CORE: 0.5
# MAX_WORKERS: 8
# WEB_CONCURRENCY: 2
postgres:
container_name: postgres
image: postgres

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -1,11 +0,0 @@
/* Add target="_blank" to external links */
/* Source: https://html.com/attributes/a-target/#:~:text=browser */
function externalLinks() {
for (var c = document.getElementsByTagName("a"), a = 0; a < c.length; a++) {
var b = c[a];
b.getAttribute("href") &&
b.hostname !== location.hostname &&
(b.target = "_blank");
}
}
externalLinks();

View File

@@ -33,12 +33,6 @@ a.md-button.md-button:hover {
color: #ffffff;
}
/* Add icon after external links */
/* Ignore auto-generated material theme links */
a[target="_blank"]:not([class*="md-"]):after {
content: " " url("../svg/open-in-new.svg");
}
/* Site width etc.*/
.md-grid {
max-width: 64rem !important;

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24">
<path fill="rgb(229,131,37)" d="M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z" />
</svg>

Before

Width:  |  Height:  |  Size: 259 B

View File

@@ -18,7 +18,7 @@
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.
#### Arm/v7 Support
Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403) Github page that are facing a similar issue. You may still be able to build the docker image you-self.
Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403){:target="_blank"} Github page that are facing a similar issue. You may still be able to build the docker image you-self.
!!! warning "Potential Data Loss"
With this release comes a major rework of how files are stored on disk and where things belong. Migration of files should be done automatically. We have tested extensively with many different backups and user bases and have found that no one experienced data-loss. HOWEVER, with all the major changes that have occurred, it is vital that to prevent any data-loss you must create a backup and store that backup outside of your mealie instance. If you do not do this, you may lose your data.
@@ -44,7 +44,7 @@
### Highlights
- Recipe Parser
- Recipes can now be imported with a bookmarklet!
- Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers)
- Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers){:target="_blank"}
- UI Debugging now available at `/recipes/debugger`
- Better error messages on failure
- ⚠️ last_recipe.json is now depreciated

View File

@@ -1,4 +1,4 @@
# v0.5.1
# vx.x.x COOL TITLE GOES HERE
**App Version: v0.5.1**

View File

@@ -1,65 +0,0 @@
# v0.5.2 - DRAFT
**App Version: v0.5.2**
**Database Version: v0.5.0**
## Bug Fixes
- Fixed #617 - Section behavior when adding a step
- Fixed #615 - Recipe Settings are not available when creating new recipe
- Fixed #625 - API of today's image returns strange characters
- Fixed [#590](https://github.com/hay-kot/mealie/issues/590) - Duplicate Events when using Gunicorn Workers
## Features and Improvements
### General
- Recipe Instructions now collapse when checked
- Default recipe settings can be set through ENV variables
- Recipe Ingredient lists can now container ingredient sections.
- You can now download and upload individual recipes
### Localization
Huge thanks to [@sephrat](https://github.com/sephrat) for all his work on the project. He's very consistent in his contributions to the project and nearly every release has had some of his code in it! Here's some highlights from this release
- Lazy Load Translations (Huge Performance Increase!)
- Tons of localization additions all around the site.
- All of the work that goes into managing and making Crowdin a great feature the application
#### Here a list of contributors on Crowding who make Mealie possible in different locals
| Name | Languages | Translated (Words) | Target Words |
| ---------------------------- | ------------------ | :----------------: | :----------: |
| retmas-gh | Polish | 550 | 625 |
| startos | Italian | 310 | 322 |
| CMBoii | Spanish | 256 | 291 |
| sephrat | French | 255 | 296 |
| Daniel Tildeman (tildeman) | Swedish | 233 | 228 |
| Rourke | Dutch | 216 | 214 |
| Andreas Waschinski (Wascha) | German | 207 | 202 |
| wengtad | Chinese Simplified | 176 | 343 |
| Matthias Borremans (MrBorri) | Dutch | 96 | 89 |
| Adam Syndoman (pypckompsite) | Polish | 68 | 65 |
| JonasSchubert | German | 22 | 23 |
| ThrawnJL | Danish | 7 | 7 |
| NicholasBrody | Dutch | 7 | 7 |
| Giel Janssens (gieljnssns) | Dutch | 4 | 4 |
| kentora | Danish | 3 | 2 |
### Docker
#### Huge thanks to [@wengtad](https://github.com/wengtad) for all his work on improving the deployment with docker.
- Optimize Docker Dev Size (Frontend: from ~1.52GB to ~429MB | API: from ~657MB to ~380MB)
- Optimize Docker Prod Size (from ~542MB to ~373MB)
- Add Gunicorn
- Add Gunicorn and Webworkers to Dockerfile #550
- Add Docs for Gunicorn
- Add PUID/PGID to Docker. Fixes Initialization scripts fail to run when not executing as root user inside container #350,
- Not able to run correctly in docker if user permissions are specified #429
- Merge Dockerfile.dev into Dockerfile (dev shared same base together with prod)
- Add Docs for PUID/PGID
- Add Docker healthcheck (for this is not necessary, I could remove if you want)

View File

@@ -1,31 +0,0 @@
# v0.5.3 - Bug Fixes
**App Version: v0.5.3**
**Database Version: v0.5.0**
## Breaking Changes
!!! error "Breaking Changes"
#### None
## Bug Fixes
- [755](https://api.github.com/repos/hay-kot/mealie/issues/755) - Mealie Categories Not Displaying Until After Settings Opened
- [748](https://api.github.com/repos/hay-kot/mealie/issues/748) - categories - Internal Server Error
- [689](https://api.github.com/repos/hay-kot/mealie/issues/689) - Importing a recipe with time information
- [671](https://api.github.com/repos/hay-kot/mealie/issues/671) - Localization not loading on upgrade to v0.5.2
- [655](https://api.github.com/repos/hay-kot/mealie/issues/655) - Clicking on "tags" on a mobile phone doesn't work (Wrong link, "Internal server error")
- [654](https://api.github.com/repos/hay-kot/mealie/issues/654) - Ram Usage
- Fixed Missing minus in shopping list UI [688](https://github.com/hay-kot/mealie/pull/688)
## Features and Improvements
### General
- Recipe Images are no clickable [678](https://github.com/hay-kot/mealie/pull/678)
- Additional Translations
- Improved Recipe Parser thanks to [@cadamswaite](https://github.com/hay-kot/mealie/pulls?q=is%3Apr+author%3Acadamswaite)
- URL Scraper will now choose the best image from the list provided by the site
- Fixed the debugger to provide more meaningful data
- Fix issues parsing time formats
- Added support for parsing scraped nutrition details

View File

@@ -1,28 +0,0 @@
# v0.5.4 - Bug Fixes
**App Version: v0.5.4**
**Database Version: v0.5.0**
## Breaking Changes
!!! error "Breaking Changes"
None
## What's Changed
* Add support for new languages by @sephrat in https://github.com/hay-kot/mealie/pull/781
* Allow arrow keys to function when SearchDialog is not open by @asymworks in https://github.com/hay-kot/mealie/pull/777
* Use firefox user agent when making requests by @cadamswaite in https://github.com/hay-kot/mealie/pull/780
* Improve the SWAG Community Guide by @BryceStevenWilley in https://github.com/hay-kot/mealie/pull/793
* New Crowdin updates by @hay-kot in https://github.com/hay-kot/mealie/pull/818
* Add LDAP authentication support (v2, onto dev) by @dvdkon in https://github.com/hay-kot/mealie/pull/803
* Auto backup is now disabled by default. Enable it by setting the AUTO_BACKUP_ENABLED env variable to true.
## New Contributors
* @asymworks made their first contribution in https://github.com/hay-kot/mealie/pull/777
* @dvdkon made their first contribution in https://github.com/hay-kot/mealie/pull/803
**Full Changelog**: https://github.com/hay-kot/mealie/compare/v0.5.3...v0.5.4

View File

@@ -1,12 +1,12 @@
# Contributing to Mealie
[Please Join the Discord](https://discord.gg/QuStdQGSGK). We are building a community of developers working on the project.
[Please Join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}. We are building a community of developers working on the project.
## We Develop with Github
We use github to host code, to track issues and feature requests, as well as accept pull requests.
## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests:
## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html){:target="_blank"}, So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html){:target="_blank"}). We actively welcome your pull requests:
1. Fork the repo and create your branch from `dev`.
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
@@ -17,10 +17,10 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu
7. If you make changes to the dev branch reflect those changes in the active changelog to keep track of changes. Don't forget to add your name/handle/identifier!
## Any contributions you make will be under the MIT Software License
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern.
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/){:target="_blank"} that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new); it's that easy!
## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues){:target="_blank"}
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new){:target="_blank"}; it's that easy!
## Write bug reports with detail, background, and sample code
**Great Bug Reports** tend to have:
@@ -28,7 +28,7 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue]
- A quick summary and/or background
- Steps to reproduce
- Be specific!
- Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
- Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626){:target="_blank"} includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
- What you expected would happen
- What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
@@ -40,4 +40,4 @@ People *love* thorough bug reports. I'm not even kidding.
By contributing, you agree that your contributions will be licensed under its MIT License.
## References
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md){:target="_blank"}

View File

@@ -48,4 +48,4 @@ code-gen 🤖 Run Code-Gen Scripts
Before you commit any changes on the backend/python side you'll want to run `make format` to format all the code with black. `make lint` to check with flake8, and `make test` to run pytests. You can also use `make test-all` to run both `lint` and `test`.
Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK)
Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK){:target="_blank"}

View File

@@ -9,7 +9,7 @@ We love your input! We want to make contributing to this project as easy and tra
- Becoming a maintainer
- Help translate to a new language or improve current translations
[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK)!
[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK){:target="_blank"}!
Additionally, you can buy me a coffee and support the project. When I get financial support it helps me know that there's real interest in the project and that it's worth the time to keep developing.

View File

@@ -1,11 +1,11 @@
# Contributing with Translations
Translations can be a great way **for non-coders** to contribute to project.
We use **[Crowdin](https://crowdin.com/project/mealie)** to allow several contributors to work on translating Mealie.
We use **[Crowdin](https://crowdin.com/project/mealie){:target="_blank"}** to allow several contributors to work on translating Mealie.
You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
Translations are regularly pulled from Crowdin and included in each new release.
Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/) if you want to know more about how to use this tool.
Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/){:target="_blank"} if you want to know more about how to use this tool.
## My language is missing in Mealie
Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub.
@@ -13,9 +13,9 @@ Once your language is translated on Crowdin, we need to manually add it in Meali
## I can't find a particular text in Crowdin
There can be several reasons:
- The text you're looking for is outdated: someone has already changed it or it will be removed/changed in the next release.
- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK) or raise an issue on GitHub.
- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK){:target="_blank"} or raise an issue on GitHub.
## Technical information
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages).
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages){:target="_blank"}.
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code.
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally){:target="_blank"} is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code.

View File

@@ -3,7 +3,7 @@
All recipe data can be imported and exported as necessary from the UI. Under the admin page you'll find the section for using Backups and Exports.
!!! danger
As this is still a **BETA** it is recommended that you backup your data often and store in more than one place. Adhere to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup). Prior to upgrading you **should** perform a backup to limit any data loss.
As this is still a **BETA** It is recommended that you backup your data often and store in more than one place. Ad-hear to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup){:target="_blank"}. Prior to upgrading you **should** perform a backup to limit any data loss.
!!! tip "Mealie data that is saved on backups"
- [x] Recipe Data
@@ -15,7 +15,7 @@ All recipe data can be imported and exported as necessary from the UI. Under the
To create an export simply add the tag and the markdown template and click "Create" and your backup will be created on the server. The backup is a standard zipfile containing all the images, json files, and rendered jinaj2 templates for each recipe. To view the available variables, open a recipe in the json editor.
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system.
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system
## Demo
@@ -60,7 +60,7 @@ wget http://localhost:9000/api/utils/download?token={fileToken}
## Jinja2 Templating
On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json. Look at this example for rendering a markdown recipe using the jinja2 syntax.
On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json.Look at this example for rendering a markdown recipe using the jinja2 syntax.
### Input
```jinja2
@@ -128,4 +128,4 @@ Categories: []
Original URL: https://www.bonappetit.com/recipe/five-spice-popcorn-chicken#intcid=_bon-appetit-recipe-bottom-recirc_3cad5ce9-734a-46f8-b503-78c33d2e7279_similar2-3
```
If you decide you don't like mealie: This is a good way to export into a format that can be imported into another.
If you decide you don't like mealie. This is a good way to export into a format that can be imported into another.

View File

@@ -1,13 +1,13 @@
# Building Pages
!!! warning
The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229)
The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229){:target="_blank"}
Custom pages can be created to organize multiple categories into a single page. Links to your custom pages are displayed on the home page sidebar and accessible by all users, however only Administrators can create or update pages.
![custom page](../../assets/img/custom-page.webp)
To create a new page navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order.
To create a new page. Navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order.
![create custom page](../../assets/gifs/create-custom-page-demo.gif)
!!! tip
To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data.
To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data.

View File

@@ -8,7 +8,7 @@ To migrate recipes from a Chowdown
3. Select import on the newly available migration.
## Nextcloud Recipes
Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported.
Nextcloud recipes can be imported from a zip file the contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported.
```
nextcloud_recipes.zip

View File

@@ -1,5 +1,5 @@
# Site Settings
Your sites settings panel can only be accessed by administrators. This is where you can customize your site for all users.
Your sites settings panel can only be accessed by administrators. This where you can customize your site for all users.
## Home Page Settings
| Option | Description |
@@ -13,3 +13,7 @@ Your sites settings panel can only be accessed by administrators. This is where
![Site Settings Image](../../assets/img/site-settings.webp)

View File

@@ -1,4 +1,4 @@
# User Management
# User Managemenet
As of version v0.4.0 users have limited functionality, but they will offer more permissions and structure as time goes on. To understand the different systems, see each section below. Note, that by default all users will be assigned the default group. If you're only managing one household you won't need to do anything to set up a new group.
@@ -47,7 +47,7 @@ As of version v0.4.0 users have limited functionality, but they will offer more
On the first startup you'll need to login to Mealie using the default username and password `changeme@email.com` and `MyPassword` or the default set through the env variable. On first login you'll be required to reset your password. After resetting your password you should also change your email address as appropriate. This will be used for logins on all future requests.
!!! tip
Your default password environment variable will be the default password for all new users that are created. This is stored in plain text and should not be used **anywhere** else.
Your default password environmental variable will be the default password for all new users that are created. This is stored in plain text and should not be used **any where** else.
## Creating and Editing Users
@@ -80,7 +80,7 @@ You can easily create and manage groups via the frontend in the admin panel unde
![Group Management Panel](../../assets/img/group-manager.png)
!!! tip
User Groups can only be deleted if no users are a part of the group. If you want to delete a group, you must assign the users to another group before removing.
User Groups can only be deleted if no users are apart of the group. If you want to delete a group, you must assign the users to another group before removing.
## Password Reset
If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup window click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environment variables.
If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup windows click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environmental variables

View File

@@ -2,10 +2,10 @@
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
In a lot of ways, Home Assistant is why this project exists! Since it Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
### Get Todays Meal in Lovelace
Starting in v0.4.1 you are now able to use the uri `/api/meal-plans/today/image?group_name=Home` to directly access the image to todays meal. This makes it incredibly easy to include the image into your Home Assistant Dashboard using the picture entity.
Starting in v0.4.1 you are now able to use the uri `/api/meal-plans/today/image?group_name=Home` to directly access the image to todays meal. This makes it incredible easy to include the image into your Home Assistant Dashboard using the picture entity.
Here's an example where `sensor.mealie_todays_meal` is pulling in the meal-plan name and I'm using the url to get the image.
@@ -29,19 +29,6 @@ style:
}
```
The sensor that gets the name of the meal can be achieved using the following REST sensor in Home Assistant
```yaml
sensor:
- platform: rest
resource: 'http://localhost:9000/api/meal-plans/today'
method: GET
name: Mealie todays meal
headers:
Authorization: Bearer MySuperSecretBearerCode
value_template: "{{ value_json.name }}"
```
The Bearer token can be created from the User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation)
!!! tip
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod) from HACS.
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod){:target="_blank"} from HACS.

View File

@@ -1,22 +1,40 @@
# Using iOS Shortcuts with Mealie
![Image from apple site](https://help.apple.com/assets/5E8CEA35094622DF10489984/5E8CEA42094622DF1048998D/en_US/ed1f9c157cdefc13e0161e0f70015455.png)
!!! info
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103) for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices. Recent updates to Mealie has made this original shortcut break. Reddit user [BooNooBooNooB](https://www.reddit.com/user/BooNooBooNooB/) has helped to create a new working version.
![](../../assets/img/iphone-image.png){: align=right style="height:400px;width:400px"}
User [brasilikum](https://github.com/brasilikum){:target="_blank"} opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103){:target="_blank"} for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices.
Don't know what an iOS shortcut is? Neither did I! Experienced iOS users may already be familiar with this utility but for the uninitiated, here is the official Apple explanation:
> A shortcut is a quick way to get one or more tasks done with your apps. The Shortcuts app lets you create your own shortcuts with multiple steps. For example, build a “Surf Time” shortcut that grabs the surf report, gives an ETA to the beach, and launches your surf music playlist.
>
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/9d8827cabde44b379e673a60f27fe4bb) but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device.
You need to replace `username` and `password` with the login information for your mealie instance.
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/6ae356d5fc644cfa8983a3c90f242fbb){:target="_blank"} but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device. In brasilikum's shortcut, you need to make changes for it to work. Recent updates to the project have changed some of the syntax and folder structure since its original creation.
![screenshot](../../assets/img/ios-shortcut-username.jpg)
Then, you need to put in your mealie domain. The API port of `:9000` is not needed when putting your domain in the text field.
![screenshot](../../assets/img/ios-shortcut-image.jpg){: align=right style="height:500;width:400px"}
![screenshot](../../assets/img/ios-shortcut-host.jpg)
You should now be able to share a website to the shortcut and have mealie grab all the necessary information!
!!! tip
You may need to change the url depending on which version you're using. Recipe is now plural and there is no trailing "/" at the end of the string.
```
api/recipe/create-url/
```
to
```
api/recipes/create-url
```
Having made those changes, you should now be able to share a website to the shortcut and have mealie grab all the necessary information!

View File

@@ -4,96 +4,89 @@
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free TLS server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"}
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
## Step 1: Get a domain
The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org).
If you already own a domain, you'll need to create an `A` record that points to the machine that SWAG is running on. See
the [SWAG documentation](https://docs.linuxserver.io/general/swag#create-container-via-http-validation) for more details.
The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org){:target="_blank"}.
## Step 2: Set-up SWAG
Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag).
This is an example of how to set it up using DuckDNS and docker-compose.
Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"}.
This is an example of how to set it up using duckdns and docker-compose.
!!! example "docker-compose.yml"
```yaml
version: "2.1"
services:
swag:
image: ghcr.io/linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
# valid TZs at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- TZ=Europe/Brussels
- URL=<mydomain.duckdns>
- SUBDOMAINS=wildcard
- VALIDATION=duckdns
- CERTPROVIDER= #optional
- DNSPLUGIN= #optional
- DUCKDNSTOKEN=<duckdnstoken>
- EMAIL=<e-mail> #optional
- ONLY_SUBDOMAINS=false #optional
- EXTRA_DOMAINS=<extradomains> #optional
- STAGING=false #optional
volumes:
- /etc/config/swag:/config
ports:
- 443:443
# required if VALIDATION=http above, if you aren't using DuckDNS
- 80:80
restart: unless-stopped
swag:
image: ghcr.io/linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Brussels
- URL=<mydomain.duckdns>
- SUBDOMAINS=wildcard
- VALIDATION=duckdns
- CERTPROVIDER= #optional
- DNSPLUGIN= #optional
- DUCKDNSTOKEN=<duckdnstoken>
- EMAIL=<e-mail> #optional
- ONLY_SUBDOMAINS=false #optional
- EXTRA_DOMAINS=<extradomains> #optional
- STAGING=false #optional
volumes:
- /etc/config/swag:/config
ports:
- 443:443
restart: unless-stopped
```
Don't forget to change the `mydomain.duckns` into your personal domain and the `duckdnstoken` into your token and remove the brackets.
You can also include the contents of the [mealie docker-compose](mealie/documentation/getting-started/install/#docker-compose-with-sqlite) in the SWAG
docker-compose, without the `ports` section under mealie. This allows SWAG and mealie to communicate on the same docker network, without
making mealie visible to other applications on your machine.
Don't forget to change the <code>mydomain.duckns</code> into your personal domain and the <code>duckdnstoken</code> into your token and remove the brackets.
## Step 3: Change the config files
Navigate to the config folder of SWAG and head to `proxy-confs`. If you used the example above, you should navigate to: `/etc/config/swag/nginx/proxy-confs/`.
There are a lot of preconfigured files to use for different apps such as radarr, sonarr, overseerr, ...
Navigate to the config folder of SWAG and head to <code>proxy-confs</code>. If you used the example above, you should navigate to: <code>/etc/config/swag/nginx/proxy-confs/</code>.
There are a lot of preconfigured files to use for different apps such as radarr,sonarr,overseerr,...
To use the bundled configuration file, simply rename `mealie.subdomain.conf.sample` in the proxy-confs folder to `mealie.subdomain.conf`.
Alternatively, you can create a new file `mealie.subdomain.conf` in proxy-confs with the following configuration:
To use the bundled configuration file, simply rename <code>mealie.subdomain.conf.sample</code> in the proxy-confs folder to <code>mealie.subdomain.conf</code>.
Alternatively, you can create a new file <code>mealie.subdomain.conf</code> in proxy-confs with the following configuration:
!!! example "mealie.subdomain.conf"
```nginx
server {
```yaml
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mealie.*;
server_name mealie.*;
include /config/nginx/ssl.conf;
include /config/nginx/ssl.conf;
client_max_body_size 0;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app mealie;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app mealie;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
## Step 4: Port-forward port 443
Since SWAG allows you to set up a secure connection, you will need to open port 443 on your router for encrypted traffic. This is way more secure than port 80 for http. For more information about using TLS on port 443, see [SWAG's documentation](https://docs.linuxserver.io/general/swag#cert-provider-lets-encrypt-vs-zerossl) on cert providers and port forwarding.
Since SWAG allows you to set up a secure connection, you will need to open port 443 on your router for encrypted traffic. This is way more secure than port 80 for http.
## Step 5: Restart SWAG
When you change anything in the config of Nginx, you will need to restart the container using `docker restart swag`.
If everything went well, you can now access mealie on the subdomain you configured: `mealie.mydomain.duckdns.org`
When you change anything in the config of Nginx, you will need to restart the container using <code>docker restart swag</code>.
If everything went well, you can now access mealie on the subdomain you configured: mealie.mydomain.duckdns.org

View File

@@ -8,7 +8,7 @@ Mealie supports long-live api tokens in the user frontend. See [user settings pa
## Key Components
### Exploring Your Local API
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs)
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs){:target="_blank"}
### Recipe Extras
Recipes extras are a key feature of the Mealie API. They allow you to create custom json key/value pairs within a recipe to reference from 3rd part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.

View File

@@ -1,17 +1,17 @@
# Installation
To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
[Get Docker](https://docs.docker.com/get-docker/)
[Get Docker](https://docs.docker.com/get-docker/){:target="_blank"}
[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie)
[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie){:target="_blank"}
- linux/amd64
- linux/arm64
- linux/amd64
- linux/arm64
## Quick Start - Docker CLI
Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up and running you can navigate to http://your.ip.address:9925 and you'll should see mealie up and running!
Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up an running you can navigate to http://your.ip.addres:9925 and you'll should see mealie up and running!
```shell
docker run \
@@ -22,14 +22,12 @@ docker run \
```
!!! tip "Default Credentials"
**Username:** changeme@email.com
**Username:** changeme@email.com
**Password:** MyPassword
## Docker Compose with SQLite
Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container.
Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container.
```yaml
version: "3.1"
@@ -41,29 +39,14 @@ services:
ports:
- 9925:80
environment:
PUID: 1000
PGID: 1000
TZ: America/Anchorage
# Default Recipe Settings
RECIPE_PUBLIC: 'true'
RECIPE_SHOW_NUTRITION: 'true'
RECIPE_SHOW_ASSETS: 'true'
RECIPE_LANDSCAPE_VIEW: 'true'
RECIPE_DISABLE_COMMENTS: 'false'
RECIPE_DISABLE_AMOUNT: 'false'
# Gunicorn
# WEB_CONCURRENCY: 2
# WORKERS_PER_CORE: 0.5
# MAX_WORKERS: 8
volumes:
- ./mealie/data/:/app/data
```
## Docker Compose with Postgres _(BETA)_
Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups.
## Docker Compose with Postgres *(BETA)*
Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups.
```yaml
version: "3.1"
@@ -74,35 +57,13 @@ services:
restart: always
ports:
- 9090:80
depends_on:
- postgres
environment:
PUID: 1000
PGID: 1000
TZ: America/Anchorage
# Database Settings
DB_ENGINE: postgres # Optional: 'sqlite', 'postgres'
POSTGRES_USER: mealie
POSTGRES_PASSWORD: mealie
POSTGRES_SERVER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
# Default Recipe Settings
RECIPE_PUBLIC: 'true'
RECIPE_SHOW_NUTRITION: 'true'
RECIPE_SHOW_ASSETS: 'true'
RECIPE_LANDSCAPE_VIEW: 'true'
RECIPE_DISABLE_COMMENTS: 'false'
RECIPE_DISABLE_AMOUNT: 'false'
# Gunicorn
# WEB_CONCURRENCY: 2
# WORKERS_PER_CORE: 0.5
# MAX_WORKERS: 8
volumes:
- ./mealie/data/:/app/data
postgres:
container_name: postgres
image: postgres
@@ -114,98 +75,79 @@ services:
## Env Variables
| Variables | Default | Description |
| ----------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| PUID | 911 | UserID permissions between host OS and container |
| PGID | 911 | GroupID permissions between host OS and container |
| DEFAULT_GROUP | Home | The default group for users |
| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser |
| BASE_URL | http://localhost:8080 | Used for Notifications |
| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' |
| POSTGRES_USER | mealie | Postgres database user |
| POSTGRES_PASSWORD | mealie | Postgres database password |
| POSTGRES_SERVER | postgres | Postgres database server address |
| POSTGRES_PORT | 5432 | Postgres database port |
| POSTGRES_DB | mealie | Postgres database name |
| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid |
| LDAP_AUTH_ENABLED | False | Authenticate via an external LDAP server in addidion to built-in Mealie auth |
| LDAP_SERVER_URL | None | LDAP server URL (e.g. ldap://ldap.example.com) |
| LDAP_BIND_TEMPLATE | None | Templated DN for users, `{}` will be replaced with the username (e.g. `cn={},dc=example,dc=com`) |
| LDAP_ADMIN_FILTER | None | Optional LDAP filter, which tells Mealie the LDAP user is an admin (e.g. `(memberOf=cn=admins,dc=example,dc=com)`) |
| RECIPE_PUBLIC | True | Default Recipe Settings - Make Recipe Public |
| RECIPE_SHOW_NUTRITION | True | Default Recipe Settings - Show Recipe Nutrition |
| RECIPE_SHOW_ASSETS | True | Default Recipe Settings - Show Recipe Assets |
| RECIPE_LANDSCAPE_VIEW | True | Default Recipe Settings - Set Landscape View |
| RECIPE_DISABLE_COMMENTS | False | Default Recipe Settings - Disable Comments |
| RECIPE_DISABLE_AMOUNT | False | Default Recipe Settings - Disable Amount |
| AUTO_BACKUP_ENABLED | False | Disable/Enable Mealie's Auto Backup Function |
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
| API_DOCS | True | Turns on/off access to the API documentation locally. |
| TZ | UTC | Must be set to get correct date/time on the server |
| WORKERS_PER_CORE | 1 | Set the number of workers to the number of CPU cores multiplied by this value (Value \* CPUs). More info [here][workers_per_core] |
| MAX_WORKERS | | Set the maximum number of workers to use. Default is not set meaning unlimited. More info [here][max_workers] |
| WEB_CONCURRENCY | 2 | Override the automatic definition of number of workers. More info [here][web_concurrency] |
| Variables | Default | Description |
| ----------------- | --------------------- | ----------------------------------------------------------------------------------- |
| DEFAULT_GROUP | Home | The default group for users |
| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser |
| BASE_URL | http://localhost:8080 | Used for Notifications |
| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' |
| POSTGRES_USER | mealie | Postgres database user |
| POSTGRES_PASSWORD | mealie | Postgres database password |
| POSTGRES_SERVER | postgres | Postgres database server address |
| POSTGRES_PORT | 5432 | Postgres database port |
| POSTGRES_DB | mealie | Postgres database name |
| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid |
| API_PORT | 9000 | The port exposed by backend API. **do not change this if you're running in docker** |
| API_DOCS | True | Turns on/off access to the API documentation locally. |
| TZ | UTC | Must be set to get correct date/time on the server |
## Raspberry Pi 4
!!! tip "Fatal Python error: init_interp_main: can't initialize time"
Some users experience an problem with running the linux/arm/v7 container on Raspberry Pi 4. This is not a problem with the Mealie container, but with a bug in the hosts Docker installation.
Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388), summarized here:
Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388){:target="_blank"}, summarized here:
```shell
wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb
sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb
```
## Advanced
## Advanced
!!! warning "Not Required"
The items below are completely optional and are not required to manage or install your Mealie instance.
The items below are completely optional and are not required to manage or install your Mealie instance.
### Custom Caddy File
The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`.
The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`.
```
{
auto_https off
auto_https off
admin off
}
:80 {
@proxied path /api/* /docs /openapi.json
root * /app/dist
encode gzip
uri strip_suffix /
handle_path /api/recipes/image/* {
root * /app/data/img/
file_server
}
handle @proxied {
reverse_proxy http://127.0.0.1:9000
reverse_proxy http://127.0.0.1:9000
}
handle {
try_files {path}.html {path} /
file_server
file_server
}
}
```
## Deployed without Docker
!!! error "Unsupported Deployment"
If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK){:target="_blank"} is a better place to find support.
If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK) is a better place to find support.
Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started.
Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started.
There are three parts to the Mealie application
@@ -214,19 +156,14 @@ There are three parts to the Mealie application
- Proxy Server
### Frontend/ Static Files
The frontend static files are generated with `npm run build`. This is done during the build process with docker. If you choose to deploy this as a system application you must do this process yourself. In the project directory run `cd frontend` to change directories into the frontend directory and run `npm install` and then `npm run build`. This will generate the static files in a `dist` folder in the frontend directory.
### Backend API
The backend API is build with Python, FastAPI, and SQLite and requires Python 3.9, and Poetry. Once the requirements are installed, in the project directory you can run the command `poetry install` to create a python virtual environment and install the python dependencies.
Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000`
Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000`
### Proxy Server
You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests.
You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests.
[workers_per_core]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#workers_per_core
[max_workers]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#max_workers
[web_concurrency]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#web_concurrency

View File

@@ -2,13 +2,13 @@
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
[Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
[Remember to join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}!
!!! note
In some of the demo gifs the styling may be different than the finale application. demos were done during development prior to finale styling.
!!! warning
This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this!
This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this,
## Key Features
@@ -26,7 +26,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
- Flexible API
- Custom key/value pairs for recipes
- Webhook support
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"} and [Swagger](https://petstore.swagger.io/){:target="_blank"}
- Raw JSON Recipe Editor
- Migration from other platforms
- Chowdown
@@ -36,7 +36,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
## FAQ
### Why An API?
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/){:target="_blank"} that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
### Why a Database?
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in controls of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
@@ -48,10 +48,10 @@ As to why we need a database?
## Built With
* [Vue.js](https://vuejs.org/)
* [Vuetify](https://vuetifyjs.com/en/)
* [FastAPI](https://fastapi.tiangolo.com/)
* [Docker](https://www.docker.com/)
* [Vue.js](https://vuejs.org/){:target="_blank"}
* [Vuetify](https://vuetifyjs.com/en/){:target="_blank"}
* [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"}
* [Docker](https://www.docker.com/){:target="_blank"}
<!-- ROADMAP -->
## Road Map
@@ -62,9 +62,9 @@ As to why we need a database?
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started.
Contributions are what make the open source community such an amazing place to be learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started.
If you are not a coder, you can still contribute financially. Financial contributions help me prioritize working on this project over others and help me to know that there is a real demand for project development.
If you are not a coder, you can still contribute financially. financial contributions help me prioritize working on this project over others and helps me know that there is a real demand for project development.
<a href="https://www.buymeacoffee.com/haykot" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-green.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>

View File

@@ -1,7 +1,7 @@
# Updating Mealie
!!! warning "Read The Release Notes"
You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing so would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data.
You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing such would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data.
### Before Upgrading
- Read The Release Notes
@@ -14,7 +14,7 @@
[See Backups and Restore Section](../admin/backups-and-exports.md) for details on backing up your data
## Docker
For all setups using Docker the updating process looks something like this
For all setups using Docker the updating process look something like this
- Stop the container using docker-compose down
- Pull the latest image using docker-compose pull

View File

@@ -9,7 +9,7 @@ Below are some general guidelines that were considered when creating the organiz
>
> 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)
> User: [sephrat](https://github.com/sephrat){:target="_blank"}
## Structure

View File

@@ -1,7 +1,7 @@
# Recipes
## URL Import
Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scraper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers). You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie.
Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scrapper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers){:target="_blank"}. You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie.
!!! tip
You can find a list of some of the supported sites in the recipe-scrapers repo. If you're site isn't supported, you can work with the recipe-scrapers team to implement it and we can down-stream those changes into Mealie.
@@ -12,7 +12,7 @@ Adding a recipe can be as easy as clicking in the bottom-right corner, copying t
You can use bookmarklets to generate a bookmark that will take your current location, and open a new tab that will try to import that URL into Mealie.
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`.
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/){:target="_blank"} and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`.
```js
var url = document.URL ;
@@ -54,7 +54,7 @@ Mealie also supports bulk import of recipe instructions and ingredients. Select
![](../../assets/gifs/bulk-add-demo.gif)
## Schema
Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe) as a general guide with some additional properties specific to Mealie.
Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe){:target="_blank"} as a general guide with some additional properties specific to Mealie.
### Example
```json

View File

@@ -2,15 +2,15 @@
## Apprise
Using the [Apprise](https://github.com/caronc/apprise/) library Mealie is able to provide notification services for nearly every popular service. Some of our favorites are...
Using the [Apprise](https://github.com/caronc/apprise/){:target="_blank"} library Mealie is able to provided notification services for nearly every popular service. Some of our favorites are...
- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify)
- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord)
- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant)
- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix)
- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover)
- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify){:target="_blank"}
- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord){:target="_blank"}
- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant){:target="_blank"}
- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix){:target="_blank"}
- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover){:target="_blank"}
But there are many more to choose from! Take a look at their wiki for information on how to create their URL formats that you can use to create a notification integration in Mealie.
But there are some many to choose from! Take a look at their wiki for information on how to create their URL formats and that you can use to create a notification integration in Mealie.
## Subscribe Events
@@ -45,7 +45,7 @@ In most cases the events will also provide details on which user performed the a
New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-notifications`. Select the "+ Notification" button and you'll be provided with a dialog. Complete the form using the URL for the service you'd like to connect to. Before saving be sure to use the test feature.
!!! tip
The feedback provided from the test feature indicates only if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message.
The feedback provided from the test feature is only an indicated of if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message.
![Add Notification Image](../../assets/img/add-notification.webp)
@@ -56,4 +56,4 @@ New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-
![Discord](../../assets/img/discord-notification-example.webp)
#### Gotify
![Gotify](../../assets/img/gotify-notification-example.webp)
![Gotify](../../assets/img/gotify-notification-example.webp)

View File

@@ -2,7 +2,7 @@
## Working with Planner
In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description.
In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description
You can also randomly generate meal plans with the dice-button at the bottom.

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
# Development Road Map
## Feature Requests
See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122)
See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122){:target="_blank"}
## Progress
See the [Github Projects](https://github.com/hay-kot/mealie/projects) to see what is currently being worked on
See the [Github Projects](https://github.com/hay-kot/mealie/projects){:target="_blank"} to see what is currently being worked on

View File

@@ -45,8 +45,6 @@ markdown_extensions:
extra_css:
- assets/stylesheets/custom.css
extra_javascript:
- assets/js/extra.js
repo_url: https://github.com/hay-kot/mealie
repo_name: hay-kot/mealie
@@ -94,8 +92,6 @@ nav:
- Style Guide: "contributors/developers-guide/style-guide.md"
- Development Road Map: "roadmap.md"
- Change Log:
- v0.5.3 - Bug Fixes: "changelog/v0.5.3.md"
- v0.5.2 Misc Updates: "changelog/v0.5.2.md"
- v0.5.1 Bug Fixes: "changelog/v0.5.1.md"
- v0.5.0 General Upgrades: "changelog/v0.5.0.md"
- v0.4.3 Hot Fix: "changelog/v0.4.3.md"

View File

@@ -1,4 +1,4 @@
FROM node:lts-alpine
FROM node:latest
# # install simple http server for serving static content
# RUN npm install -g http-server
@@ -13,7 +13,7 @@ COPY package*.json ./
RUN npm install
# copy project files and folders to the current working directory (i.e. 'app' folder)
# COPY . .
COPY . .
# build app for production with minification
# RUN npm run build

18369
frontend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@
"core-js": "^3.14.0",
"fuse.js": "^6.4.6",
"register-service-worker": "^1.7.1",
"typeface-roboto": "^1.1.13",
"v-jsoneditor": "^1.4.4",
"vue": "^2.6.14",
"vue-i18n": "^8.24.1",
@@ -24,7 +25,6 @@
"vuex-persistedstate": "^4.0.0-beta.3"
},
"devDependencies": {
"typeface-roboto": "^1.1.13",
"@intlify/vue-i18n-loader": "^1.1.0",
"@mdi/font": "^5.9.55",
"@mdi/js": "^5.9.55",
@@ -32,12 +32,9 @@
"@vue/cli-plugin-eslint": "^4.5.13",
"@vue/cli-plugin-pwa": "~4.5.0",
"@vue/cli-service": "^4.5.13",
"@vue/preload-webpack-plugin": "^2.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"html-webpack-plugin": "^5.3.1",
"preload-webpack-plugin": "^2.3.0",
"sass": "^1.34.1",
"sass-loader": "^8.0.2",
"vue-cli-plugin-i18n": "~1.0.1",
@@ -72,4 +69,4 @@
"last 2 versions",
"not dead"
]
}
}

View File

@@ -8,6 +8,8 @@
<meta name="description" content="Mealie is a self hosted recipe manager and meal planner.">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title> Mealie </title>
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"> -->
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"> -->
</head>
<body>

View File

@@ -78,13 +78,5 @@
"start_url": ".",
"display": "standalone",
"background_color": "#FFFFFF",
"theme_color": "#E58325",
"share_target": {
"action": "/",
"method": "GET",
"params": {
"title": "title",
"text": "recipe_import_url"
}
}
}
"theme_color": "#E58325"
}

View File

@@ -5,7 +5,7 @@
<v-main>
<v-banner v-if="demo" sticky>
<div class="text-center">
<b> This is a Demo of the v0.5.4 (BETA) </b> | Username: changeme@email.com | Password: demo
<b> This is a Demo of the v0.5.0 (BETA) </b> | Username: changeme@email.com | Password: demo
</div>
</v-banner>
<GlobalSnackbar />
@@ -48,32 +48,19 @@ export default {
},
},
async created() {
// Initial API Requests
async mounted() {
this.$store.dispatch("initTheme");
this.$store.dispatch("requestRecentRecipes");
this.$store.dispatch("refreshToken");
this.$store.dispatch("requestUserData");
this.$store.dispatch("requestCurrentGroup");
this.$store.dispatch("requestTags");
this.$store.dispatch("requestUserData");
this.$store.dispatch("requestCategories");
this.$store.dispatch("requestAppInfo");
this.$store.dispatch("requestSiteSettings");
// Listen for swUpdated event and display refresh snackbar as required.
document.addEventListener("swUpdated", this.showRefreshUI, { once: true });
// Refresh all open app tabs when a new service worker is installed.
if (navigator.serviceWorker) {
navigator.serviceWorker.addEventListener("controllerchange", () => {
if (this.refreshing) return;
this.refreshing = true;
window.location.reload();
});
}
},
mounted() {
this.$store.dispatch("requestTags");
this.darkModeSystemCheck();
this.darkModeAddEventListener();
this.$store.dispatch("requestAppInfo");
this.$store.dispatch("requestCustomPages");
this.$store.dispatch("requestSiteSettings");
},
data() {
@@ -86,6 +73,19 @@ export default {
};
},
created() {
// Listen for swUpdated event and display refresh snackbar as required.
document.addEventListener("swUpdated", this.showRefreshUI, { once: true });
// Refresh all open app tabs when a new service worker is installed.
if (navigator.serviceWorker) {
navigator.serviceWorker.addEventListener("controllerchange", () => {
if (this.refreshing) return;
this.refreshing = true;
window.location.reload();
});
}
},
methods: {
// For Later!
@@ -136,4 +136,3 @@ export default {
scrollbar-color: transparent transparent;
}
</style>

View File

@@ -4,7 +4,6 @@ export const API_ROUTES = {
aboutEvents: `${prefix}/about/events`,
aboutEventsNotifications: `${prefix}/about/events/notifications`,
aboutEventsNotificationsTest: `${prefix}/about/events/notifications/test`,
aboutRecipesDefaults: `${prefix}/about/recipes/defaults`,
authRefresh: `${prefix}/auth/refresh`,
authToken: `${prefix}/auth/token`,
authTokenLong: `${prefix}/auth/token/long`,
@@ -28,7 +27,6 @@ export const API_ROUTES = {
migrations: `${prefix}/migrations`,
recipesCategory: `${prefix}/recipes/category`,
recipesCreate: `${prefix}/recipes/create`,
recipesCreateFromZip: `${prefix}/recipes/create-from-zip`,
recipesCreateUrl: `${prefix}/recipes/create-url`,
recipesSummary: `${prefix}/recipes/summary`,
recipesSummaryUncategorized: `${prefix}/recipes/summary/uncategorized`,
@@ -72,7 +70,6 @@ export const API_ROUTES = {
recipesRecipeSlug: recipe_slug => `${prefix}/recipes/${recipe_slug}`,
recipesRecipeSlugAssets: recipe_slug => `${prefix}/recipes/${recipe_slug}/assets`,
recipesRecipeSlugImage: recipe_slug => `${prefix}/recipes/${recipe_slug}/image`,
recipesRecipeSlugZip: recipe_slug => `${prefix}/recipes/${recipe_slug}/zip`,
recipesSlugComments: slug => `${prefix}/recipes/${slug}/comments`,
recipesSlugCommentsId: (slug, id) => `${prefix}/recipes/${slug}/comments/${id}`,
shoppingListsId: id => `${prefix}/shopping-lists/${id}`,

View File

@@ -13,7 +13,7 @@ export const metaAPI = {
},
async getLogText(num) {
const response = await apiReq.get(API_ROUTES.debugLogNum(num));
const response = await apiReq.get(API_ROUTES.debugLog(num));
return response.data;
},

View File

@@ -4,15 +4,6 @@ import { store } from "../store";
import i18n from "@/i18n.js";
export const recipeAPI = {
/**
* Returns the Default Recipe Settings for the Site
* @returns {AxoisResponse} Axois Response Object
*/
async getDefaultSettings() {
const response = await apiReq.get(API_ROUTES.aboutRecipesDefaults);
return response;
},
/**
* Create a Recipe by URL
* @param {string} recipeURL

View File

@@ -4,6 +4,8 @@ import i18n from "@/i18n.js";
export const utilsAPI = {
// import { api } from "@/api";
uploadFile(url, fileObject) {
console.log("API Called");
return apiReq.post(
url,
fileObject,

View File

@@ -1,7 +1,7 @@
<template>
<div>
<The404>
<h1 class="mx-auto">{{ $t('general.no-recipe-found') }}</h1>
<h1 class="mx-auto">No Recipe Found</h1>
</The404>
</div>
</template>

View File

@@ -2,7 +2,7 @@
<div>
<v-card-title>
<slot>
<h1 class="mx-auto">{{ $t('page.404-page-not-found') }}</h1>
<h1 class="mx-auto">{{ $t("404.page-not-found") }}</h1>
</slot>
</v-card-title>
<div class="d-flex justify-space-around">
@@ -29,15 +29,15 @@
<script>
export default {
computed: {
buttons() {
return[
{ icon: this.$globals.icons.home, to: "/", text: this.$t('general.home') },
{ icon: this.$globals.icons.primary, to: "/recipes/all", text: this.$t('page.all-recipes') },
{ icon: this.$globals.icons.search, to: "/search", text: this.$t('search.search') },
];
},
}
data() {
return {
buttons: [
{ icon: this.$globals.icons.home, to: "/", text: "Home" },
{ icon: this.$globals.icons.primary, to: "/recipes/all", text: "All Recipes" },
{ icon: this.$globals.icons.search, to: "/search", text: "Search" },
],
};
},
};
</script>

View File

@@ -72,13 +72,6 @@ export default {
selected: [],
};
},
async created() {
if (this.tagSelector) {
this.$store.dispatch("requestTags");
} else {
this.$store.dispatch("requestCategories");
}
},
mounted() {
this.$emit(MOUNTED_EVENT);
this.setInit(this.value);

View File

@@ -30,7 +30,7 @@ export default {
],
};
},
created() {
mounted() {
this.selectedItem = this.$store.getters.getActiveLang;
},
computed: {

View File

@@ -18,16 +18,14 @@
<v-hover v-slot="{ hover }" :open-delay="50">
<v-card :class="{ 'on-hover': hover }" :elevation="hover ? 12 : 2">
<CardImage large :slug="planDay.meals[0].slug" icon-size="200" @click="openSearch(index, modes.primary)">
<div>
<v-fade-transition>
<v-btn v-if="hover" small color="info" class="ma-1" @click.stop="addCustomItem(index, modes.primary)">
<v-icon left>
{{ $globals.icons.edit }}
</v-icon>
{{ $t("reicpe.no-recipe") }}
</v-btn>
</v-fade-transition>
</div>
<v-fade-transition>
<v-btn v-if="hover" small color="info" class="ma-1" @click.stop="addCustomItem(index, modes.primary)">
<v-icon left>
{{ $globals.icons.edit }}
</v-icon>
{{ $t('reicpe.no-recipe') }}
</v-btn>
</v-fade-transition>
</CardImage>
<v-card-title class="my-n3 mb-n6">
@@ -42,14 +40,14 @@
<v-icon left>
{{ $globals.icons.edit }}
</v-icon>
{{ $t("reicpe.no-recipe") }}
{{ $t('reicpe.no-recipe') }}
</v-btn>
</v-fade-transition>
<v-btn color="info" outlined small @click="openSearch(index, modes.sides)">
<v-icon small class="mr-1">
{{ $globals.icons.create }}
</v-icon>
{{ $t("meal-plan.side") }}
{{ $t('meal-plan.side') }}
</v-btn>
</v-card-actions>
</v-hover>

View File

@@ -122,7 +122,7 @@ export default {
}
},
},
async created() {
async mounted() {
await this.$store.dispatch("requestCurrentGroup");
await this.$store.dispatch("requestAllRecipes");
await this.buildMealStore();

View File

@@ -13,7 +13,7 @@
<v-icon color="primary" class="icon-position" :size="iconSize">
{{ $globals.icons.primary }}
</v-icon>
<slot> </slot>
<slot> </slot>
</div>
</template>
@@ -85,7 +85,6 @@ export default {
}
.icon-slot > div {
top: 0;
position: absolute;
z-index: 1;
}

View File

@@ -18,7 +18,6 @@
allow-overflow
close-delay="125"
open-on-hover
content-class="d-print-none"
>
<template v-slot:activator="{ on, attrs }">
<v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent>
@@ -26,7 +25,11 @@
</v-btn>
</template>
<v-list dense>
<v-list-item v-for="(item, index) in displayedMenu" :key="index" @click="menuAction(item.action)">
<v-list-item
v-for="(item, index) in loggedIn && cardMenu ? userMenu : defaultMenu"
:key="index"
@click="menuAction(item.action)"
>
<v-list-item-icon>
<v-icon v-text="item.icon" :color="item.color"></v-icon>
</v-list-item-icon>
@@ -50,10 +53,6 @@ export default {
type: Boolean,
default: true,
},
showPrint: {
type: Boolean,
default: false,
},
fab: {
type: Boolean,
default: false,
@@ -89,28 +88,20 @@ export default {
recipeURL() {
return `${this.baseURL}/recipe/${this.slug}`;
},
printerMenu() {
return {
title: this.$t("general.print"),
icon: this.$globals.icons.printer,
color: "accent",
action: "print",
};
},
defaultMenu() {
return [
{
title: this.$t("general.print"),
icon: this.$globals.icons.printer,
color: "accent",
action: "print",
},
{
title: this.$t("general.share"),
icon: this.$globals.icons.shareVariant,
color: "accent",
action: "share",
},
{
title: this.$t("general.download"),
icon: this.$globals.icons.download,
color: "accent",
action: "download",
},
];
},
userMenu() {
@@ -127,18 +118,9 @@ export default {
color: "accent",
action: "edit",
},
...this.defaultMenu,
];
},
displayedMenu() {
let menu = this.defaultMenu;
if (this.loggedIn && this.cardMenu) {
menu = [...this.userMenu, ...menu];
}
if (this.showPrint) {
menu = [this.printerMenu, ...menu];
}
return menu;
},
recipeText() {
return this.$t("recipe.share-recipe-message", [this.name]);
},
@@ -177,9 +159,6 @@ export default {
case "print":
this.$router.push(`/recipe/${this.slug}` + "?print=true");
break;
case "download":
window.open(`/api/recipes/${this.slug}/zip`);
break;
default:
break;
}

View File

@@ -1,17 +1,17 @@
<template>
<v-tooltip bottom nudge-right="50" :color="buttonStyle ? 'info' : 'secondary'">
<v-tooltip bottom nudge-right="50" :color="buttonStyle ? 'primary' : 'secondary'">
<template v-slot:activator="{ on, attrs }">
<v-btn
small
@click.prevent="toggleFavorite"
v-if="isFavorite || showAlways"
:color="buttonStyle ? 'info' : 'secondary'"
:color="buttonStyle ? 'primary' : 'secondary'"
:icon="!buttonStyle"
:fab="buttonStyle"
v-bind="attrs"
v-on="on"
>
<v-icon :small="!buttonStyle" :color="buttonStyle ? 'white' : 'secondary'">
<v-icon :small="!buttonStyle" color="secondary">
{{ isFavorite ? $globals.icons.heart : $globals.icons.heartOutline }}
</v-icon>
</v-btn>

View File

@@ -2,18 +2,13 @@
<div v-if="value.length > 0 || edit">
<v-card class="mt-2">
<v-card-title class="py-2">
{{ $t("asset.assets") }}
{{ $t("recipe.assets") }}
</v-card-title>
<v-divider class="mx-2"></v-divider>
<v-list :flat="!edit" v-if="value.length > 0">
<v-list-item v-for="(item, i) in value" :key="i">
<v-list-item-icon class="ma-auto">
<v-tooltip bottom>
<template v-slot:activator="{ on, attrs }">
<v-icon v-text="getIconDefinition(item.icon).icon" v-bind="attrs" v-on="on"></v-icon>
</template>
<span>{{ getIconDefinition(item.icon).title }}</span>
</v-tooltip>
<v-icon v-text="getIcon(item.icon)"></v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title class="pl-2" v-text="item.name"></v-list-item-title>
@@ -34,7 +29,7 @@
</v-card>
<div class="d-flex ml-auto mt-2">
<v-spacer></v-spacer>
<base-dialog @submit="addAsset" :title="$t('asset.new-asset')" :title-icon="getIconDefinition(newAsset.icon).icon">
<base-dialog @submit="addAsset" :title="$t('recipe.new-asset')" :title-icon="getIcon(newAsset.icon)">
<template v-slot:open="{ open }">
<v-btn color="secondary" dark @click="open" v-if="edit">
<v-icon>{{ $globals.icons.create }}</v-icon>
@@ -45,20 +40,18 @@
<div class="d-flex justify-space-between">
<v-select
dense
:prepend-icon="getIconDefinition(newAsset.icon).icon"
:prepend-icon="getIcon(newAsset.icon)"
v-model="newAsset.icon"
:items="iconOptions"
item-text="title"
item-value="name"
class="mr-2"
>
<template v-slot:item="{ item }">
<v-list-item-avatar>
<v-icon class="mr-auto">
{{ item.icon }}
{{ getIcon(item) }}
</v-icon>
</v-list-item-avatar>
{{ item.title }}
{{ item }}
</template>
</v-select>
<TheUploadBtn @uploaded="setFileObject" :post="false" file-name="file" :text-btn="false" />
@@ -98,45 +91,30 @@ export default {
name: "",
icon: "mdi-file",
},
iconOptions: ["mdi-file", "mdi-file-pdf-box", "mdi-file-image", "mdi-code-json", "mdi-silverware-fork-knife"],
};
},
computed: {
baseURL() {
return window.location.origin;
},
iconOptions() {
return [
{
name: "mdi-file",
title: this.$i18n.t('asset.file'),
icon: this.$globals.icons.file
},
{
name: "mdi-file-pdf-box",
title: this.$i18n.t('asset.pdf'),
icon: this.$globals.icons.filePDF
},
{
name: "mdi-file-image",
title: this.$i18n.t('asset.image'),
icon: this.$globals.icons.fileImage
},
{
name: "mdi-code-json",
title: this.$i18n.t('asset.code'),
icon: this.$globals.icons.codeJson
},
{
name: "mdi-silverware-fork-knife",
title: this.$i18n.t('asset.recipe'),
icon: this.$globals.icons.primary
},
];
},
},
methods: {
getIconDefinition(val) {
return this.iconOptions.find(({ name }) => name === val );
getIcon(val) {
switch (val) {
case "mdi-file":
return this.$globals.icons.file;
case "mdi-file-pdf-box":
return this.$globals.icons.filePDF;
case "mdi-file-image":
return this.$globals.icons.fileImage;
case "mdi-code-json":
return this.$globals.icons.codeJson;
case "mdi-silverware-fork-knife":
return this.$globals.icons.primary;
default:
return this.$globals.icons.file;
}
},
assetURL(assetName) {
return api.recipes.recipeAssetPath(this.slug, assetName);

View File

@@ -25,9 +25,9 @@
</v-card-title>
<v-card-text class="mt-n5">
<div>
<v-text-field :label="$t('general.url')" class="pt-5" clearable v-model="url" :messages="getMessages()">
<v-text-field :label="$t('general.url')" class="pt-5" clearable v-model="url">
<template v-slot:append-outer>
<v-btn class="ml-2" color="primary" @click="getImageFromURL" :loading="loading" :disabled="!slug">
<v-btn class="ml-2" color="primary" @click="getImageFromURL" :loading="loading" :disabled="slug">
{{ $t("general.get") }}
</v-btn>
</template>
@@ -66,9 +66,6 @@ export default {
}
this.loading = false;
},
getMessages() {
return this.slug ? [""] : [this.$i18n.t("recipe.save-recipe-before-use")];
},
},
};
</script>

View File

@@ -45,7 +45,7 @@ export default {
return {
public: this.$t("recipe.public-recipe"),
showNutrition: this.$t("recipe.show-nutrition-values"),
showAssets: this.$t("asset.show-assets"),
showAssets: this.$t("recipe.show-assets"),
landscapeView: this.$t("recipe.landscape-view-coming-soon"),
disableComments: this.$t("recipe.disable-comments"),
disableAmount: this.$t("recipe.disable-amount"),

View File

@@ -1,20 +1,11 @@
<template>
<div v-if="edit || (value && value.length > 0)">
<div v-if="edit || ( value && value.length > 0 )">
<h2 class="mb-4">{{ $t("recipe.ingredients") }}</h2>
<div v-if="edit">
<draggable :value="value" @input="updateIndex" @start="drag = true" @end="drag = false" handle=".handle">
<transition-group type="transition" :name="!drag ? 'flip-list' : null">
<div v-for="(ingredient, index) in value" :key="generateKey('ingredient', index)">
<v-row align="center">
<v-text-field
v-if="edit && showTitleEditor[index]"
class="mx-3 mt-3"
v-model="value[index].title"
dense
:label="$t('recipe.section-title')"
>
</v-text-field>
<v-textarea
class="mr-2"
:label="$t('recipe.ingredient')"
@@ -24,18 +15,6 @@
dense
rows="1"
>
<template slot="append">
<v-tooltip right nudge-right="10">
<template v-slot:activator="{ on, attrs }">
<v-btn icon small class="mt-n1" v-bind="attrs" v-on="on" @click="toggleShowTitle(index)">
<v-icon>{{ showTitleEditor[index] ? $globals.icons.minus : $globals.icons.createAlt }}</v-icon>
</v-btn>
</template>
<span>{{
showTitleEditor[index] ? $t("recipe.remove-section") : $t("recipe.insert-section")
}}</span>
</v-tooltip>
</template>
<template slot="append-outer">
<v-icon class="handle">{{ $globals.icons.arrowUpDown }}</v-icon>
</template>
@@ -56,16 +35,18 @@
</div>
</div>
<div v-else>
<div v-for="(ingredient, index) in value" :key="generateKey('ingredient', index)">
<h3 class="mt-2" v-if="showTitleEditor[index]">{{ ingredient.title }}</h3>
<v-divider v-if="showTitleEditor[index]"></v-divider>
<v-list-item dense @click="toggleChecked(index)">
<v-checkbox hide-details :value="checked[index]" class="pt-0 my-auto py-auto" color="secondary"> </v-checkbox>
<v-list-item-content>
<vue-markdown class="ma-0 pa-0 text-subtitle-1 dense-markdown" :source="ingredient.note"> </vue-markdown>
</v-list-item-content>
</v-list-item>
</div>
<v-list-item
dense
v-for="(ingredient, index) in value"
:key="generateKey('ingredient', index)"
@click="toggleChecked(index)"
>
<v-checkbox hide-details :value="checked[index]" class="pt-0 my-auto py-auto" color="secondary"> </v-checkbox>
<v-list-item-content>
<vue-markdown class="ma-0 pa-0 text-subtitle-1 dense-markdown" :source="ingredient.note"> </vue-markdown>
</v-list-item-content>
</v-list-item>
</div>
</div>
</template>
@@ -95,19 +76,10 @@ export default {
return {
drag: false,
checked: [],
showTitleEditor: [],
};
},
mounted() {
this.checked = this.value.map(() => false);
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
},
watch: {
value: {
handler() {
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
},
},
},
methods: {
addIngredient(ingredients = null) {
@@ -146,16 +118,6 @@ export default {
removeByIndex(list, index) {
list.splice(index, 1);
},
validateTitle(title) {
return !(title === null || title === "");
},
toggleShowTitle(index) {
const newVal = !this.showTitleEditor[index];
if (!newVal) {
this.value[index].title = "";
}
this.$set(this.showTitleEditor, index, newVal);
},
},
};
</script>

View File

@@ -2,97 +2,74 @@
<div>
<h2 class="mb-4">{{ $t("recipe.instructions") }}</h2>
<div>
<draggable
:disabled="!edit"
:value="value"
@input="updateIndex"
@start="drag = true"
@end="drag = false"
handle=".handle"
>
<div v-for="(step, index) in value" :key="index">
<v-app-bar v-if="showTitleEditor[index]" class="primary mx-1 mt-6" dark dense rounded>
<v-toolbar-title class="headline" v-if="!edit">
<v-app-bar-title v-text="step.title"> </v-app-bar-title>
</v-toolbar-title>
<v-text-field
v-if="edit"
class="headline pa-0 mt-5"
v-model="step.title"
dense
solo
flat
:placeholder="$t('recipe.section-title')"
background-color="primary"
>
</v-text-field>
</v-app-bar>
<v-hover v-slot="{ hover }">
<v-card
class="ma-1"
:class="[{ 'on-hover': hover }, isChecked(index)]"
:elevation="hover ? 12 : 2"
:ripple="!edit"
@click="toggleDisabled(index)"
>
<v-card-title :class="{ 'pb-0': !isChecked(index) }">
<v-btn
v-if="edit"
fab
x-small
color="white"
class="mr-2"
elevation="0"
@click="removeByIndex(value, index)"
>
<v-icon size="24" color="error">{{ $globals.icons.delete }}</v-icon>
</v-btn>
{{ $t("recipe.step-index", { step: index + 1 }) }}
<v-btn v-if="edit" text color="primary" class="ml-auto" @click="toggleShowTitle(index)">
{{ !showTitleEditor[index] ? $t("recipe.insert-section") : $t("recipe.remove-section") }}
</v-btn>
<v-icon v-if="edit" class="handle">{{ $globals.icons.arrowUpDown }}</v-icon>
<v-fade-transition>
<v-icon v-show="isChecked(index)" size="24" class="ml-auto" color="success">
{{ $globals.icons.checkboxMarkedCircle }}
</v-icon>
</v-fade-transition>
</v-card-title>
<v-card-text v-if="edit">
<v-textarea
auto-grow
dense
v-model="value[index]['text']"
:key="generateKey('instructions', index)"
rows="4"
>
</v-textarea>
</v-card-text>
<v-expand-transition>
<div class="m-0 p-0" v-show="!isChecked(index) && !edit">
<v-card-text>
<vue-markdown :source="step.text"> </vue-markdown>
</v-card-text>
</div>
</v-expand-transition>
</v-card>
</v-hover>
</div>
</draggable>
<div v-for="(step, index) in value" :key="index">
<v-app-bar v-if="showTitleEditor[index]" class="primary mx-1 mt-6" dark dense rounded>
<v-toolbar-title class="headline" v-if="!edit">
<v-app-bar-title v-text="step.title"> </v-app-bar-title>
</v-toolbar-title>
<v-text-field
v-if="edit"
class="headline pa-0 mt-5"
v-model="step.title"
dense
solo
flat
:placeholder="$t('recipe.section-title')"
background-color="primary"
>
</v-text-field>
</v-app-bar>
<v-hover v-slot="{ hover }">
<v-card
class="ma-1"
:class="[{ 'on-hover': hover }, isDisabled(index)]"
:elevation="hover ? 12 : 2"
:ripple="!edit"
@click="toggleDisabled(index)"
>
<v-card-title>
<v-btn
v-if="edit"
fab
x-small
color="white"
class="mr-2"
elevation="0"
@click="removeByIndex(value, index)"
>
<v-icon size="24" color="error">{{ $globals.icons.delete }}</v-icon>
</v-btn>
{{ $t("recipe.step-index", { step: index + 1 }) }}
<v-btn v-if="edit" text color="primary" class="ml-auto" @click="toggleShowTitle(index)">
{{ !showTitleEditor[index] ? $t('recipe.insert-section') : $t('recipe.remove-section') }}
</v-btn>
</v-card-title>
<v-card-text v-if="edit">
<v-textarea
auto-grow
dense
v-model="value[index]['text']"
:key="generateKey('instructions', index)"
rows="4"
>
</v-textarea>
</v-card-text>
<v-card-text v-else>
<vue-markdown :source="step.text"> </vue-markdown>
</v-card-text>
</v-card>
</v-hover>
</div>
</div>
</div>
</template>
<script>
import draggable from "vuedraggable";
import VueMarkdown from "@adapttive/vue-markdown";
import { utils } from "@/utils";
export default {
components: {
VueMarkdown,
draggable,
},
props: {
value: {
@@ -117,13 +94,12 @@ export default {
watch: {
value: {
handler() {
this.disabledSteps = [];
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
},
},
handler() {
this.disabledSteps = [];
}
}
},
methods: {
generateKey(item, index) {
return utils.generateUniqueKey(item, index);
@@ -145,7 +121,7 @@ export default {
this.disabledSteps.push(stepIndex);
}
},
isChecked(stepIndex) {
isDisabled(stepIndex) {
if (this.disabledSteps.includes(stepIndex) && !this.edit) {
return "disabled-card";
} else {
@@ -159,11 +135,8 @@ export default {
}
this.$set(this.showTitleEditor, index, newVal);
},
updateIndex(data) {
this.$emit("input", data);
},
},
};
</script>
<style scoped></style>

View File

@@ -55,7 +55,7 @@ export default {
return utils.generateUniqueKey(item, index);
},
addNote() {
this.value.push({ title: "", text: "" });
this.value.push({ text: "" });
},
removeByIndex(list, index) {
list.splice(index, 1);

View File

@@ -125,13 +125,12 @@ export default {
appendSteps(steps) {
this.value.recipeInstructions.push(
...steps.map(x => ({
title: "",
text: x,
}))
);
},
addStep() {
this.value.recipeInstructions.push({ title: "", text: "" });
this.value.recipeInstructions.push({ text: "" });
},
saveExtras(extras) {
this.value.extras = extras;

View File

@@ -18,26 +18,15 @@
/>
<v-spacer></v-spacer>
<div v-if="!value" class="custom-btn-group ma-1">
<FavoriteBadge class="mx-1" color="info" button-style v-if="loggedIn" :slug="slug" show-always />
<v-tooltip bottom color="info">
<template v-slot:activator="{ on, attrs }">
<v-btn
v-if="loggedIn"
fab
small
class="mx-1"
color="info"
v-bind="attrs"
v-on="on"
@click="$emit('input', true)"
>
<v-btn fab small class="mx-1" color="info" v-bind="attrs" v-on="on" @click="$emit('input', true)">
<v-icon> {{ $globals.icons.edit }} </v-icon>
</v-btn>
</template>
<span>{{ $t("general.edit") }}</span>
</v-tooltip>
<ContextMenu
show-print
:menu-top="false"
:slug="slug"
:name="name"
@@ -67,15 +56,13 @@
<script>
import ConfirmationDialog from "@/components/UI/Dialogs/ConfirmationDialog.vue";
import ContextMenu from "@/components/Recipe/ContextMenu.vue";
import FavoriteBadge from "@/components/Recipe/FavoriteBadge.vue";
const SAVE_EVENT = "save";
const DELETE_EVENT = "delete";
const CLOSE_EVENT = "close";
const JSON_EVENT = "json";
export default {
components: { ConfirmationDialog, ContextMenu, FavoriteBadge },
components: { ConfirmationDialog, ContextMenu },
props: {
slug: {
type: String,
@@ -87,10 +74,6 @@ export default {
type: Boolean,
default: false,
},
loggedIn: {
type: Boolean,
default: false,
},
},
data() {
return {
@@ -137,6 +120,7 @@ export default {
break;
case SAVE_EVENT:
this.$emit(SAVE_EVENT);
this.$emit("input", false);
break;
case JSON_EVENT:
this.$emit(JSON_EVENT);

View File

@@ -58,10 +58,8 @@ export default {
let formData = new FormData();
formData.append(this.fileName, this.file);
const response = await api.utils.uploadFile(this.url, formData);
if (response) {
this.$emit(UPLOAD_EVENT, response);
if (await api.utils.uploadFile(this.url, formData)) {
this.$emit(UPLOAD_EVENT);
}
this.isSelecting = false;
}

View File

@@ -16,7 +16,7 @@
<template v-slot:activator="{ on, attrs }">
<v-btn text :icon="$vuetify.breakpoint.xsOnly" v-bind="attrs" v-on="on" :loading="sortLoading">
<v-icon :left="!$vuetify.breakpoint.xsOnly">
{{ $globals.icons.sort }}
{{ $globals.icons.diceMultiple }}
</v-icon>
{{ $vuetify.breakpoint.xsOnly ? null : $t("general.sort") }}
</v-btn>

View File

@@ -82,7 +82,7 @@ export default {
} else return this.$t("settings.backup.partial-backup");
},
},
created() {
mounted() {
this.resetData();
this.getAvailableBackups();
},

View File

@@ -45,7 +45,7 @@
</template>
<script>
import i18n from "@/i18n.js";
import i18n from "@/i18n";
export default {
props: {
color: {
@@ -65,14 +65,12 @@ export default {
},
top: {
default: null,
type: Boolean,
},
submitText: {
default: () => i18n.t("general.create"),
},
keepOpen: {
default: false,
type: Boolean,
},
},
data() {
@@ -103,17 +101,16 @@ export default {
this.$emit("submit");
this.submitted = true;
},
deleteEvent() {
this.$emit("delete");
this.submitted = true;
},
open() {
console.log("Open Dialog");
this.dialog = true;
},
close() {
this.dialog = false;
},
deleteEvent() {
this.$emit("delete");
this.submitted = true;
},
},
};
</script>

View File

@@ -136,18 +136,16 @@ export default {
this.$emit(SELECTED_EVENT, recipe);
},
onUpDown(e) {
if (this.dialog) {
if (e.keyCode === 38) {
e.preventDefault();
this.selectedIndex--;
} else if (e.keyCode === 40) {
e.preventDefault();
this.selectedIndex++;
} else {
return;
}
this.selectRecipe();
if (e.keyCode === 38) {
e.preventDefault();
this.selectedIndex--;
} else if (e.keyCode === 40) {
e.preventDefault();
this.selectedIndex++;
} else {
return;
}
this.selectRecipe();
},
resetSelected() {
this.searchString = "";
@@ -171,4 +169,4 @@ export default {
</script>
<style >
</style>
</style>

View File

@@ -7,14 +7,14 @@
</v-icon>
<div v-if="large" class="text-small">
<slot>
{{ small ? "" : waitingText }}
{{ small ? "" : "Loading Recipes" }}
</slot>
</div>
</div>
</v-progress-circular>
<div v-if="!large" class="text-small">
<slot>
{{ small ? "" : waitingText }}
{{ small ? "" : "Loading Recipes" }}
</slot>
</div>
</div>
@@ -60,9 +60,6 @@ export default {
size: 125,
};
},
waitingText() {
return this.$t("general.loading-recipes");
}
},
};
</script>

View File

@@ -44,13 +44,13 @@
target="_blank"
rel="noreferrer nofollow"
>
{{ $t('new-recipe.google-ld-json-info') }}
Google ld+json Info
</a>
<a href="https://github.com/hay-kot/mealie/issues" target="_blank" rel="noreferrer nofollow">
{{ $t('new-recipe.github-issues') }}
GitHub Issues
</a>
<a href="https://schema.org/Recipe" target="_blank" rel="noreferrer nofollow">
{{ $t('new-recipe.recipe-markup-specification') }}
Recipe Markup Specification
</a>
</div>
<div class="d-flex justify-end">
@@ -61,7 +61,7 @@
@click="addRecipe = false"
>
<v-icon left> {{ $globals.icons.externalLink }} </v-icon>
{{ $t('new-recipe.view-scraped-data') }}
View Scraped Data
</v-btn>
</div>
</v-alert>
@@ -84,26 +84,6 @@
</v-form>
</v-card>
</v-dialog>
<BaseDialog
:title="$t('new-recipe.upload-a-recipe')"
:titleIcon="$globals.icons.zip"
:submit-text="$t('general.import')"
ref="uploadZipDialog"
@submit="uploadZip"
:loading="processing"
>
<v-card-text class="mt-1 pb-0">
{{ $t("new-recipe.upload-individual-zip-file") }}
<div class="headline mx-auto mb-0 pb-0 text-center">
{{ this.fileName }}
</div>
</v-card-text>
<v-card-actions>
<TheUploadBtn class="mx-auto" :text-btn="false" @uploaded="setFile" :post="false"> </TheUploadBtn>
</v-card-actions>
</BaseDialog>
<v-speed-dial v-model="fab" :open-on-hover="absolute" :fixed="absolute" :bottom="absolute" :right="absolute">
<template v-slot:activator>
<v-btn v-model="fab" :color="absolute ? 'accent' : 'white'" dark :icon="!absolute" :fab="absolute">
@@ -126,27 +106,13 @@
</template>
<span>{{ $t("general.new") }}</span>
</v-tooltip>
<v-tooltip left dark color="info">
<template v-slot:activator="{ on, attrs }">
<v-btn fab dark small color="info" v-bind="attrs" v-on="on" @click="openZipUploader">
<v-icon>{{ $globals.icons.zip }}</v-icon>
</v-btn>
</template>
<span>{{ $t("general.upload") }}</span>
</v-tooltip>
</v-speed-dial>
</div>
</template>
<script>
import { api } from "@/api";
import TheUploadBtn from "@/components/UI/Buttons/TheUploadBtn.vue";
import BaseDialog from "@/components/UI/Dialogs/BaseDialog.vue";
export default {
components: {
TheUploadBtn,
BaseDialog,
},
props: {
absolute: {
default: false,
@@ -158,20 +124,14 @@ export default {
fab: false,
addRecipe: false,
processing: false,
uploadData: {
fileName: "archive",
file: null,
},
};
},
mounted() {
this.$router.onReady(() => {
if (this.$route.query.recipe_import_url) {
this.addRecipe = true;
this.createRecipe();
}
});
if (this.$route.query.recipe_import_url) {
this.addRecipe = true;
this.createRecipe();
}
},
computed: {
@@ -183,34 +143,9 @@ export default {
return this.$route.query.recipe_import_url || "";
},
},
fileName() {
return this.uploadData.file?.name || "";
},
},
methods: {
resetVars() {
this.uploadData = {
fileName: "archive",
file: null,
};
},
setFile(file) {
this.uploadData.file = file;
console.log("Uploaded");
},
openZipUploader() {
this.resetVars();
this.$refs.uploadZipDialog.open();
},
async uploadZip() {
let formData = new FormData();
formData.append(this.uploadData.fileName, this.uploadData.file);
const response = await api.utils.uploadFile("/api/recipes/create-from-zip", formData);
this.$router.push(`/recipe/${response.data.slug}`);
},
async createRecipe() {
this.error = false;
if (this.$refs.urlForm === undefined || this.$refs.urlForm.validate()) {
@@ -226,6 +161,7 @@ export default {
}
}
},
reset() {
this.fab = false;
this.error = false;
@@ -235,7 +171,11 @@ export default {
},
isValidWebUrl(url) {
let regEx = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,256}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/gm;
return regEx.test(url) ? true : this.$t('new-recipe.must-be-a-valid-url');
return regEx.test(url) ? true : "Must be a Valid URL";
},
bookmark() {
return `javascript:(function()%7Bvar url %3D document.URL %3B%0Avar mealie %3D "http%3A%2F%2Flocalhost%3A8080%2F%23"%0Avar dest %3D mealie %2B "%2F%3Frecipe_import_url%3D" %2B url%0Awindow.open(dest%2C '_blank')%7D)()%3B`;
},
},
};

View File

@@ -78,21 +78,15 @@ export default {
hideImage: false,
};
},
created() {
mounted() {
this.getVersion();
this.showSidebar = !this.isMobile;
},
watch: {
user() {
this.hideImage = false;
},
isMain(val) {
if (val) {
this.$store.dispatch("requestCustomPages");
} else {
this.getVersion();
}
},
},
computed: {
@@ -107,27 +101,27 @@ export default {
{
icon: this.$globals.icons.home,
to: "/",
title: this.$t("sidebar.home-page"),
title: this.$t("page.home-page"),
},
{
icon: this.$globals.icons.search,
to: "/search",
title: this.$t("sidebar.search"),
title: this.$t("search.search"),
},
{
icon: this.$globals.icons.viewModule,
to: "/recipes/all",
title: this.$t("sidebar.all-recipes"),
title: this.$t("page.all-recipes"),
},
{
icon: this.$globals.icons.tags,
to: "/recipes/category",
title: this.$t("sidebar.categories"),
title: this.$t("recipe.categories"),
},
{
icon: this.$globals.icons.tags,
to: "/recipes/tag",
title: this.$t("sidebar.tags"),
title: this.$t("tag.tags"),
},
];
},
@@ -151,7 +145,7 @@ export default {
{
icon: this.$globals.icons.user,
to: "/admin/profile",
title: this.$t("sidebar.profile"),
title: this.$t("settings.profile"),
},
];
},
@@ -160,27 +154,27 @@ export default {
{
icon: this.$globals.icons.viewDashboard,
to: "/admin/dashboard",
title: this.$t("sidebar.dashboard"),
title: this.$t("general.dashboard"),
},
{
icon: this.$globals.icons.cog,
to: "/admin/settings",
title: this.$t("sidebar.site-settings"),
title: this.$t("settings.site-settings"),
},
{
icon: this.$globals.icons.tools,
to: "/admin/toolbox",
title: this.$t("sidebar.toolbox"),
title: this.$t("settings.toolbox.toolbox"),
},
{
icon: this.$globals.icons.group,
to: "/admin/manage-users",
title: this.$t("sidebar.manage-users"),
title: this.$t("user.manage-users"),
},
{
icon: this.$globals.icons.import,
to: "/admin/migrations",
title: this.$t("sidebar.migrations"),
title: this.$t("settings.migrations"),
},
];
},

View File

@@ -1,38 +1,33 @@
import Vue from "vue";
import VueI18n from "vue-i18n";
import Vuetify from "@/plugins/vuetify";
import axios from 'axios';
Vue.use(VueI18n);
const i18n = new VueI18n();
export default i18n;
const loadedLanguages = [];
function setI18nLanguage (lang) {
i18n.locale = lang;
Vuetify.framework.lang.current = lang;
axios.defaults.headers.common['Accept-Language'] = lang
document.querySelector('html').setAttribute('lang', lang)
return lang
function parseLocaleFiles(locales) {
const messages = {};
locales.keys().forEach(key => {
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
if (matched && matched.length > 1) {
const locale = matched[1];
messages[locale] = locales(key);
}
});
return messages;
}
export function loadLanguageAsync(lang) {
function loadLocaleMessages() {
const locales = require.context("./locales/messages", true, /[A-Za-z0-9-_,\s]+\.json$/i);
return parseLocaleFiles(locales);
}
if ( ! loadedLanguages.includes(lang)) {
const messages = import(`./locales/messages/${lang}.json`);
const dateTimeFormats = import(`./locales/dateTimeFormats/${lang}.json`);
return Promise.all([messages, dateTimeFormats]).then(
values => {
i18n.setLocaleMessage(lang, values[0].default)
i18n.setDateTimeFormat(lang, values[1].default)
loadedLanguages.push(lang)
return setI18nLanguage(lang)
}
)
}
return Promise.resolve(setI18nLanguage(lang))
}
function loadDateTimeFormats() {
const locales = require.context("./locales/dateTimeFormats", true, /[A-Za-z0-9-_,\s]+\.json$/i);
return parseLocaleFiles(locales);
}
export default new VueI18n({
locale: "en-US",
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "en-US",
messages: loadLocaleMessages(),
dateTimeFormats: loadDateTimeFormats(),
});

View File

@@ -1,21 +0,0 @@
{
"short": {
"month": "short",
"day": "numeric",
"weekday": "long"
},
"medium": {
"month": "long",
"day": "numeric",
"weekday": "long",
"year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric"
}
}

View File

@@ -1,21 +0,0 @@
{
"short": {
"month": "short",
"day": "numeric",
"weekday": "long"
},
"medium": {
"month": "long",
"day": "numeric",
"weekday": "long",
"year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric"
}
}

View File

@@ -1,21 +0,0 @@
{
"short": {
"month": "short",
"day": "numeric",
"weekday": "long"
},
"medium": {
"month": "long",
"day": "numeric",
"weekday": "long",
"year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric"
}
}

View File

@@ -1,4 +1,8 @@
{
"404": {
"page-not-found": "404 Page Not Found",
"take-me-home": "Take me Home"
},
"about": {
"about": "About",
"about-mealie": "About Mealie",
@@ -22,17 +26,8 @@
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
"show-assets": "Show Assets"
},
"category": {
"category": "Category",
"category-created": "Category created",
"category-creation-failed": "Category creation failed",
"category-deleted": "Category Deleted",
@@ -45,17 +40,17 @@
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
@@ -64,6 +59,7 @@
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
@@ -82,19 +78,18 @@
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
@@ -144,8 +139,8 @@
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
@@ -197,20 +192,13 @@
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"view-scraped-data": "View Scraped Data"
"url-form-hint": "Copy and paste a link from your favorite recipe website"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
@@ -219,12 +207,14 @@
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated"
"pages-updated": "Pages updated",
"recent": "Recent"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
@@ -246,9 +236,11 @@
"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",
@@ -268,17 +260,18 @@
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "View Recipe"
},
"reicpe": {
"no-recipe": "No Recipe"
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Unable to Delete 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",
@@ -344,8 +338,12 @@
"site-settings": "Site Settings",
"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",
@@ -354,13 +352,16 @@
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganized"
},
"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",
@@ -400,20 +402,8 @@
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"display-name": "Display Name",
"error-signing-up": "Error Signing Up",
"sign-up": "Sign Up",
"sign-up-link-created": "Sign up link created",
@@ -450,6 +440,7 @@
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",

View File

@@ -1,61 +1,56 @@
{
"404": {
"page-not-found": "404 Page Not Found",
"take-me-home": "Take me Home"
},
"about": {
"about": "حول",
"about-mealie": "حول Mealie",
"api-docs": "مستندات API",
"about": "About",
"about-mealie": "About Mealie",
"api-docs": "API Docs",
"api-port": "API Port",
"application-mode": "وضع التطبيق",
"database-type": "نوع قاعدة البيانات",
"database-url": "رابط قاعدة البيانات",
"default-group": "المجموعة الافتراضية",
"demo": "عرض تجريبي",
"demo-status": "حالة العرض تجريبي",
"development": "تطوير",
"docs": "المستندات",
"download-log": "تحميل السجل",
"application-mode": "Application Mode",
"database-type": "Database Type",
"database-url": "Database URL",
"default-group": "Default Group",
"demo": "Demo",
"demo-status": "Demo Status",
"development": "Development",
"docs": "Docs",
"download-log": "Download Log",
"download-recipe-json": "Last Scraped JSON",
"github": "Github",
"log-lines": "Log Lines",
"not-demo": "ليس عرض تجريبي",
"not-demo": "Not Demo",
"portfolio": "Portfolio",
"production": "الإنتاج",
"support": "الدعم",
"version": "الإصدار"
},
"asset": {
"assets": "الأصول",
"code": "الكود",
"file": "ملف",
"image": "صورة",
"new-asset": "أصول جديدة",
"pdf": "PDF",
"recipe": "وصفة",
"show-assets": "إظهار الأصول"
"production": "Production",
"support": "Support",
"version": "Version"
},
"category": {
"category-created": "تم انشاء الفئة",
"category-creation-failed": "فشل إنشاء الفئة",
"category-deleted": "تم حذف الفئة",
"category-deletion-failed": "فشل حذف الفئة",
"category": "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-updated": "تم تحديث الفئة",
"category-update-failed": "Category update failed",
"category-updated": "Category updated",
"uncategorized-count": "Uncategorized {count}"
},
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
@@ -64,6 +59,7 @@
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
@@ -82,19 +78,18 @@
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
@@ -144,8 +139,8 @@
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
@@ -197,20 +192,13 @@
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"view-scraped-data": "View Scraped Data"
"url-form-hint": "Copy and paste a link from your favorite recipe website"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
@@ -219,12 +207,14 @@
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated"
"pages-updated": "Pages updated",
"recent": "Recent"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
@@ -246,9 +236,11 @@
"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",
@@ -268,17 +260,18 @@
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "View Recipe"
},
"reicpe": {
"no-recipe": "No Recipe"
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Unable to Delete 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",
@@ -344,8 +338,12 @@
"site-settings": "Site Settings",
"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",
@@ -354,13 +352,16 @@
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganized"
},
"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",
@@ -400,20 +402,8 @@
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"display-name": "Display Name",
"error-signing-up": "Error Signing Up",
"sign-up": "Sign Up",
"sign-up-link-created": "Sign up link created",
@@ -450,6 +440,7 @@
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",

View File

@@ -1,489 +1,480 @@
{
"404": {
"page-not-found": "404 No s'ha trobat la pàgina",
"take-me-home": "Take me Home"
},
"about": {
"about": "Quant a",
"about": "About",
"about-mealie": "Quant a Mealie",
"api-docs": "Documentació de l'API",
"api-port": "Port de l'API",
"application-mode": "Mode",
"database-type": "Tipus de base de dades",
"database-url": "URL del servidor de base de dades",
"default-group": "Grup per defecte",
"application-mode": "Application Mode",
"database-type": "Database Type",
"database-url": "Database URL",
"default-group": "Default Group",
"demo": "Demo",
"demo-status": "Estat",
"development": "Desenvolupament",
"docs": "Documentació",
"download-log": "Descarregueu el registre",
"download-recipe-json": "Últim JSON recuperat",
"demo-status": "Demo Status",
"development": "Development",
"docs": "Docs",
"download-log": "Download Log",
"download-recipe-json": "Last Scraped JSON",
"github": "Github",
"log-lines": "Registre Línies",
"not-demo": "No Demo",
"portfolio": "Projectes",
"production": "Producció",
"support": "Suport",
"version": "Versió"
},
"asset": {
"assets": "Adjunts",
"code": "Codi font",
"file": "Arxiu",
"image": "Imatge",
"new-asset": "Afegiu un adjunt",
"pdf": "PDF",
"recipe": "Recepta",
"show-assets": "Mostra els adjunts"
"log-lines": "Log Lines",
"not-demo": "Not Demo",
"portfolio": "Portfolio",
"production": "Production",
"support": "Support",
"version": "Version"
},
"category": {
"category-created": "S'ha creat la categoria",
"category-creation-failed": "S'ha produït un error al crear la categoria",
"category-deleted": "S'ha suprimit la categoria",
"category-deletion-failed": "S'ha produït un error al eliminar la categoria",
"category-filter": "Filtre per categoria",
"category-update-failed": "S'ha produït un error a l'actualitzar la categoria",
"category-updated": "S'ha actualitzat la categoria",
"uncategorized-count": "{count} sense categoritzar"
"category": "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",
"uncategorized-count": "Uncategorized {count}"
},
"events": {
"apprise-url": "Apprise URL",
"database": "Base de Dades",
"delete-event": "Suprimiu l'esdeveniment",
"new-notification-form-description": "Mealie utilitza la llibreria Apprise per a generar notificacions. Ofereix moltes opcions de serveis de notificació. A la seua wiki, disposeu de guies d'ús i informació per a crear l'URL al vostre servei. Si està disponible, al seleccionar el tipus de notificació, pot incloure funcions adicionals.",
"new-version": "Hi ha una nova versió disponible!",
"notification": "Notificacions",
"refresh": "Recarrega",
"scheduled": "Programat",
"something-went-wrong": "Alguna cosa ha anat malament!",
"subscribed-events": "Esdeveniments subscrits",
"test-message-sent": "S'ha enviat el missatge"
"database": "Database",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"notification": "Notification",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"cancel": "Anuŀla",
"clear": "Neteja",
"close": "Tanca",
"confirm": "Confirma",
"confirm-delete-generic": "Esteu segur de voler suprimir-lo?",
"copied": "S'ha copiat",
"create": "Crea",
"created": "S'ha creat",
"custom": "Personalitzat",
"dashboard": "Tauler de control",
"delete": "Suprimeix",
"disabled": "Desactivat",
"download": "Baixal",
"edit": "Edita",
"enabled": "Activat",
"exception": "Excepció",
"failed-count": "Han fallat: {count}",
"failure-uploading-file": "No s'ha pogut pujar l'arxiu",
"favorites": "Preferides",
"field-required": "Camp obligatori",
"file-folder-not-found": "No s'ha trobat la carpeta o l'arxiu",
"file-uploaded": "S'ha pujat l'arxiu",
"filter": "Filtre",
"friday": "Divendres",
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
"confirm": "Confirm",
"confirm-delete-generic": "Are you sure you want to delete this?",
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
"disabled": "Disabled",
"download": "Download",
"edit": "Edit",
"enabled": "Enabled",
"exception": "Exception",
"failed-count": "Failed: {count}",
"failure-uploading-file": "Failure uploading file",
"favorites": "Favorites",
"field-required": "Field Required",
"file-folder-not-found": "File/folder not found",
"file-uploaded": "File uploaded",
"filter": "Filter",
"friday": "Friday",
"general": "General",
"get": "Obté",
"home": "Inici",
"image": "Imatge",
"image-upload-failed": "No s'ha pogut pujar la imatge",
"import": "Importa",
"get": "Get",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Paraula clau",
"link-copied": "S'ha copiat l'enllaç",
"loading-recipes": "Carregant les receptes",
"monday": "Dilluns",
"name": "Nom",
"new": "Nou",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No s'han trobat receptes",
"ok": "D'acord",
"options": "Opcions:",
"print": "Imprimiu",
"random": "Aleatori",
"rating": "Valoració",
"ok": "OK",
"options": "Options:",
"print": "Print",
"random": "Random",
"rating": "Rating",
"recent": "Recent",
"recipe": "Recepta",
"recipes": "Receptes",
"rename-object": "Canvia de nom {0}",
"reset": "Restableix",
"saturday": "Dissabte",
"save": "Desa",
"settings": "Configuració",
"share": "Compartiu",
"shuffle": "Barreja",
"sort": "Ordena",
"sort-alphabetically": "Alfabèticament",
"status": "Estat",
"submit": "Envia",
"success-count": "Amb èxit: {count}",
"sunday": "Diumenge",
"templates": "Plantilles:",
"test": "Prova",
"themes": "Temes",
"thursday": "Dijous",
"recipe": "Recipe",
"recipes": "Recipes",
"rename-object": "Rename {0}",
"reset": "Reset",
"saturday": "Saturday",
"save": "Save",
"settings": "Settings",
"share": "Share",
"shuffle": "Shuffle",
"sort": "Sort",
"sort-alphabetically": "Alphabetical",
"status": "Status",
"submit": "Submit",
"success-count": "Success: {count}",
"sunday": "Sunday",
"templates": "Templates:",
"test": "Test",
"themes": "Themes",
"thursday": "Thursday",
"token": "Token",
"tuesday": "Dimarts",
"type": "Tipus",
"update": "Actualitza",
"updated": "S'ha actualitzat",
"upload": "Puja",
"url": "Adreça",
"view": "Mostra",
"wednesday": "Dimecres",
"yes": ""
"tuesday": "Tuesday",
"type": "Type",
"update": "Update",
"updated": "Updated",
"upload": "Upload",
"url": "URL",
"view": "View",
"wednesday": "Wednesday",
"yes": "Yes"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
"cannot-delete-default-group": "No s'ha pogut suprimir el grup",
"cannot-delete-group-with-users": "No es pot suprimir un grup amb usuaris",
"confirm-group-deletion": "Confirma l'eliminació del grup",
"create-group": "Crea un grup",
"error-updating-group": "Sha produït un error a l'actualitzar el grup",
"group": "Grup",
"group-deleted": "S'ha suprimir el grup",
"group-deletion-failed": "S'ha produït un error al suprimir el grup",
"group-id-with-value": "Identificador del grup: {groupID}",
"group-name": "Nom del grup",
"group-not-found": "No s'ha trobat el grup",
"group-with-value": "Grup: {groupID}",
"groups": "Grups",
"manage-groups": "Gestiona els grups",
"user-group": "Grup",
"user-group-created": "S'ha creat el grup de l'usuari",
"user-group-creation-failed": "Ha fallat la creación del grup de l'usuari"
"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",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
"user-group-creation-failed": "User Group Creation Failed"
},
"meal-plan": {
"create-a-new-meal-plan": "Crea un nou menú",
"dinner-this-week": "Sopar d'esta setmana",
"dinner-today": "Sopar per a hui",
"dinner-tonight": "Sopar d'esta nit",
"edit-meal-plan": "Edita el menú",
"end-date": "Data de finalització",
"group": "Agrupa (en proves)",
"main": "Principal",
"meal-planner": "Planificador de menús",
"meal-plans": "Menús",
"mealplan-categories": "Categories dels menús",
"mealplan-created": "S'ha actualitzat el menú",
"mealplan-creation-failed": "S'ha produït un error al crear el menú",
"mealplan-deleted": "S'ha suprimir el menú",
"mealplan-deletion-failed": "S'ha produït un error al suprimir el menú",
"mealplan-settings": "Configuració del menú",
"mealplan-update-failed": "S'ha produït un error a l'actualitzar el menú",
"mealplan-updated": "S'ha actualitzat el menú",
"no-meal-plan-defined-yet": "No hi ha cap menú planificat",
"no-meal-planned-for-today": "No hi han cap menú per a hui",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Només s'utilitzaran aquestes categories per als menús",
"planner": "Planificador",
"quick-week": "Pla ràpid",
"side": "Guarnició",
"sides": "Guarnicions",
"start-date": "Data d'inici"
"create-a-new-meal-plan": "Create a New Meal Plan",
"dinner-this-week": "Dinner This Week",
"dinner-today": "Dinner Today",
"dinner-tonight": "DINNER TONIGHT",
"edit-meal-plan": "Edit Meal Plan",
"end-date": "End Date",
"group": "Group (Beta)",
"main": "Main",
"meal-planner": "Meal Planner",
"meal-plans": "Meal Plans",
"mealplan-categories": "MEALPLAN CATEGORIES",
"mealplan-created": "Mealplan created",
"mealplan-creation-failed": "Mealplan creation failed",
"mealplan-deleted": "Mealplan Deleted",
"mealplan-deletion-failed": "Mealplan deletion failed",
"mealplan-settings": "Mealplan Settings",
"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",
"side": "Side",
"sides": "Sides",
"start-date": "Start Date"
},
"migration": {
"chowdown": {
"description": "Migreu les dades de Chowdown",
"description": "Migrate data from Chowdown",
"title": "Chowdown"
},
"migration-data-removed": "S'han suprimit les dades migrades",
"migration-data-removed": "Migration data removed",
"nextcloud": {
"description": "Migreu les dades del Cookbook de Nextcloud",
"description": "Migrate data from a Nextcloud Cookbook instance",
"title": "Nextcloud Cookbook"
},
"no-migration-data-available": "No hi han dades disponibles",
"recipe-migration": "Migració de receptes"
"no-migration-data-available": "No Migration Data Available",
"recipe-migration": "Recipe Migration"
},
"new-recipe": {
"bulk-add": "Afegiu tot d'una",
"error-details": "Mealie només pot importar els llocs web amb Id+json o microdata. Els principals llocs de receptes suporten aquesta estructura de les dades. Si no pot importar-les però hi ha dades json al registre, per favor, obriu un problema (issue) a GitHub amb l'URL i les dades. A GitHub només obriu problemes en anglés.",
"error-title": "No hem pout trobar res",
"from-url": "Importa una recepta",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Ha de ser una URL vàlida",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Copieu en la recepta. Cada línia serà tractada com un element de la llista",
"recipe-markup-specification": "Especificació Markup de la recepta",
"recipe-url": "URL de la recepta",
"upload-a-recipe": "Puja una recepta",
"upload-individual-zip-file": "Puja només un arxiu zip, exportat d'altre Mealie.",
"url-form-hint": "Copia i enganxa l'enllaç del teu lloc web de receptes preferit",
"view-scraped-data": "Visualitza les dades recuperades"
"bulk-add": "Bulk Add",
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"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"
},
"page": {
"404-page-not-found": "Error 404 - No s'ha trobat la pàgina",
"all-recipes": "Totes les receptes",
"new-page-created": "S'ha creat una nova pàgina",
"page": "Pàgina",
"page-creation-failed": "S'ha produït un error al crear la pàgina",
"page-deleted": "S'ha suprimit la pàgina",
"page-deletion-failed": "S'ha produït un error al suprimir la pàgina",
"page-update-failed": "S'ha produït un error a l'actualitzar la pàgina",
"page-updated": "S'ha actualitzat la pàgina",
"pages-update-failed": "S'ha produït un error a l'actualitzar les pàgines",
"pages-updated": "S'han actualitzat les pàgines"
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"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"
},
"recipe": {
"add-key": "Afegeix clau",
"add-to-favorites": "Afegeix a preferides",
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohidrats",
"carbohydrate-content": "Carbohydrate",
"categories": "Categories",
"comment-action": "Comentari",
"comments": "Comentaris",
"delete-confirmation": "Estàs segur que vols suprimir-la?",
"delete-recipe": "Suprimeix la recepta",
"description": "Descripció",
"disable-amount": "Oculta les quantitats",
"disable-comments": "Oculta els comentaris",
"fat-content": "Greixos",
"fiber-content": "Fibra",
"comment-action": "Comment",
"comments": "Comments",
"delete-confirmation": "Are you sure you want to delete this recipe?",
"delete-recipe": "Delete Recipe",
"description": "Description",
"disable-amount": "Disable Ingredient Amounts",
"disable-comments": "Disable Comments",
"fat-content": "Fat",
"fiber-content": "Fiber",
"grams": "grams",
"ingredient": "Ingredient",
"ingredients": "Ingredients",
"insert-section": "Insereix una secció",
"instructions": "Instruccions",
"key-name-required": "Es requereix un nom de clau",
"landscape-view-coming-soon": "Vista apaïsada (aviat)",
"milligrams": "mil·ligrams",
"new-key-name": "Nou nom de la clau",
"no-white-space-allowed": "No es permeten espais en blanc",
"note": "Nota",
"nutrition": "Valors nutricionals",
"object-key": "Nom de la clau",
"object-value": "Valor",
"original-url": "Adreça URL original",
"perform-time": "Temps de cocció",
"prep-time": "Temps de preparació",
"protein-content": "Proteïnes",
"public-recipe": "Recepta pública",
"recipe-created": "S'ha creat la recepta",
"recipe-creation-failed": "S'ha produït un error al crear la recepta",
"recipe-deleted": "S'ha suprimit la recepta",
"recipe-image": "Imatge de la recepta",
"recipe-image-updated": "S'ha actualitzat la imatge de la recepta",
"recipe-name": "Nom de la recepta",
"recipe-settings": "Opcions de la recepta",
"recipe-update-failed": "S'ha produït un error a l'actualitzar la recepta",
"recipe-updated": "S'ha actualitzat la recepta",
"remove-from-favorites": "S'ha eliminat de les receptes preferides",
"remove-section": "Suprimeix la sel·lecció",
"save-recipe-before-use": "Desa la recepta abans d'utilitzar-la",
"section-title": "Secció",
"servings": "Porcions",
"share-recipe-message": "Vull compartir la meua recepta {0} amb tú.",
"show-nutrition-values": "Mostra els valors nutricionals",
"sodium-content": "Sodi",
"step-index": "Pas: {step}",
"sugar-content": "Sucres",
"title": "Títol",
"total-time": "Temps total",
"unable-to-delete-recipe": "No s'ha pogut suprimir la recepta"
"insert-section": "Insert Section",
"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",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
},
"reicpe": {
"no-recipe": "Cap recepta"
"no-recipe": "No Recipe"
},
"search": {
"advanced-search": "Cerca avançada",
"and": "i",
"exclude": "Exclou",
"include": "Inclou",
"max-results": "No mostreu més de",
"or": "O",
"results": "Resultats",
"search": "Cerca",
"search-mealie": "Cerca a Melie (prem /)",
"search-placeholder": "Cerca...",
"tag-filter": "Filtra per etiqueta"
"advanced-search": "Advanced Search",
"and": "and",
"exclude": "Exclude",
"include": "Include",
"max-results": "Max Results",
"or": "Or",
"results": "Results",
"search": "Search",
"search-mealie": "Search Mealie (press /)",
"search-placeholder": "Search...",
"tag-filter": "Tag Filter"
},
"settings": {
"add-a-new-theme": "Afegiu un nou tema",
"admin-settings": "Opcions de l'administrador",
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "S'ha creat una còpia de seguretat a {path}",
"backup-deleted": "Còpia de seguretat suprimida",
"backup-tag": "Etiqueta de la còpia de seguretat",
"create-heading": "Crea una còpia de seguretat",
"delete-backup": "Esborra la còpia de seguretat",
"error-creating-backup-see-log-file": "S'ha produït un error al crear la còpia de seguritat. Disposa de més informació a l'arxiu de registre",
"full-backup": "Còpia de seguretat completa",
"import-summary": "Resum de la importació",
"partial-backup": "Còpia de seguretat parcial",
"unable-to-delete-backup": "No s'ha pogut suprimir la còpia."
"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-and-exports": "Còpies de seguretat",
"change-password": "Canvia la contrasenya",
"current": "Versió:",
"custom-pages": "Pàgines personalitzades",
"edit-page": "Edita la Pàgina",
"events": "Esdeveniments",
"first-day-of-week": "Primer dia de la setmana",
"group-settings-updated": "S'ha actualitzat la configuració del grup",
"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",
"events": "Events",
"first-day-of-week": "First day of the week",
"group-settings-updated": "Group Settings Updated",
"homepage": {
"all-categories": "Totes les categories",
"card-per-section": "Receptes per secció",
"home-page": "Pàgina d'inici",
"home-page-sections": "Seccions de la pàgina d'inici",
"show-recent": "Mostra receptes recients"
"all-categories": "All Categories",
"card-per-section": "Card Per Section",
"home-page": "Home Page",
"home-page-sections": "Home Page Sections",
"show-recent": "Show Recent"
},
"language": "Idioma",
"latest": "Darrera",
"local-api": "API local",
"locale-settings": "Opcions d'idioma",
"migrations": "Migracions",
"new-page": "Pàgina nova",
"notify": "Notifica",
"organize": "Organitzador",
"page-name": "Nom de la pàgina",
"pages": "Pàgines",
"profile": "Perfil",
"remove-existing-entries-matching-imported-entries": "Elimina les entrades existents que coincideixen amb les importades",
"set-new-time": "Defineix l'hora",
"settings-update-failed": "S'ha produït un error a l'actualitzar la configuració",
"settings-updated": "S'ha actualitzat la configuració",
"site-settings": "Configuració del portal",
"language": "Language",
"latest": "Latest",
"local-api": "Local API",
"locale-settings": "Locale settings",
"migrations": "Migrations",
"new-page": "New Page",
"notify": "Notify",
"organize": "Organize",
"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",
"theme": {
"accent": "Èmfasi",
"dark": "Fosc",
"default-to-system": "Gestionat pel sistema",
"error": "S'ha produït un error",
"error-creating-theme-see-log-file": "S'ha produït un error creant el tema. Disposa de més informació a l'arxiu de registre.",
"error-deleting-theme": "S'ha produït un error suprimint el tema",
"error-updating-theme": "S'ha produït un error actualitzant el tema",
"info": "Informació",
"light": "Clar",
"primary": "Primari",
"secondary": "Secundari",
"success": "Correcte",
"switch-to-dark-mode": "Canvia al mode fosc",
"switch-to-light-mode": "Canvia al mode clar",
"theme-deleted": "S'ha suprimit el tema",
"theme-name": "Nom del tema",
"theme-name-is-required": "Es requereix nom per al tema.",
"theme-saved": "S'ha desat el tema",
"theme-updated": "S'ha actualitzat el tema",
"warning": "Advertència"
"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",
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
"token": {
"active-tokens": "TOKENS ACTIUS",
"api-token": "Token de l'API",
"api-tokens": "Tokens de l'API",
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Còpia aquest token per a utilitzar-lo en una aplicació externa. Aquest token, no es tornarà a mostrar.",
"create-an-api-token": "Crea un token d'API",
"token-name": "Nom del token"
"active-tokens": "ACTIVE TOKENS",
"api-token": "API Token",
"api-tokens": "API Tokens",
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
"create-an-api-token": "Create an API Token",
"token-name": "Token Name"
},
"toolbox": {
"assign-all": "Asigna tots",
"bulk-assign": "Assigna en grup",
"new-name": "Nou nom",
"no-unused-items": "No hi han elements sense utilitzar",
"recipes-affected": "Cap recepta afectada|Una recepta afectada|{count} receptes afectades",
"remove-unused": "Elimina els no utilitzats",
"title-case-all": "Totes en majúscules",
"toolbox": "Eines",
"unorganized": "Sense organitzar"
"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",
"unorganized": "Unorganized"
},
"webhooks": {
"test-webhooks": "Prova els 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": "Les URLs mostrades a continuació rebran webhooks amb les dades de la recepta per al menú del dia programat. Actaualment els webhooks s'executaran a les",
"webhook-url": "URL del webhook",
"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",
"webhooks-caps": "WEBHOOKS"
}
},
"shopping-list": {
"all-lists": "Totes les llistes",
"create-shopping-list": "Crea una llista de la compra",
"from-recipe": "Des de la recepta",
"list-name": "Nom de la llista",
"new-list": "Llista nova",
"quantity": "Quantitat: {0}",
"shopping-list": "Llista de la compra",
"shopping-lists": "Llistes de la compra"
},
"sidebar": {
"all-recipes": "Receptes",
"categories": "Categories",
"dashboard": "Consola",
"home-page": "Inici",
"manage-users": "Usuaris",
"migrations": "Migracions",
"profile": "Perfil",
"search": "Cerca",
"site-settings": "Configuració",
"tags": "Etiquetes",
"toolbox": "Eines"
"all-lists": "All Lists",
"create-shopping-list": "Create Shopping List",
"from-recipe": "From Recipe",
"list-name": "List Name",
"new-list": "New List",
"quantity": "Quantity: {0}",
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"signup": {
"error-signing-up": "S'ha produït un error al registrar-se",
"sign-up": "Registreu-vos",
"sign-up-link-created": "S'ha creat l'enllaç per a registrar-se",
"sign-up-link-creation-failed": "S'ha produït un error al crear l'enllaç per a registrar-se",
"sign-up-links": "Enllaços de registre",
"sign-up-token-deleted": "S'ha suprimit el token de registre",
"sign-up-token-deletion-failed": "S'ha produït un error a l'eliminar el token per a registrar-se",
"welcome-to-mealie": "Benvingut a Mealie! Per a poder ser usuari d'aquesta instància ha de tenir un enllaç d'invitació vàlid. Si no l'ha rebut, no podrà registrar-se. Per a rebre'l, contacte amb l'administrador."
"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."
},
"tag": {
"tag-created": "S'ha creat l'etiqueta",
"tag-creation-failed": "S'ha produït un error al crear l'etiqueta",
"tag-deleted": "S'ha suprimit l'etiqueta",
"tag-deletion-failed": "S'ha produït un error al suprimir l'etiqueta",
"tag-update-failed": "S'ha produït un error a l'actualitzar l'etiqueta",
"tag-updated": "S'ha actualitzat l'etiqueta",
"tags": "Etiquetes",
"untagged-count": "{count} sense etiquetar"
"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",
"tags": "Tags",
"untagged-count": "Untagged {count}"
},
"user": {
"admin": "Administrador/a",
"are-you-sure-you-want-to-delete-the-link": "Esteu segur de voler suprimir l'enllaç <b>{link}<b/>?",
"are-you-sure-you-want-to-delete-the-user": "Esteu segur de voler suprimir l'usuari <b>{activeName}<b/> ID: <b>{activeId}<b/>?",
"confirm-link-deletion": "Confirmeu l'eliminació de l'enllaç",
"confirm-password": "Confirmeu la contrasenya",
"confirm-user-deletion": "Confirmeu l'eliminació de l'usuari",
"could-not-validate-credentials": "No s'han pogut validar les credencials",
"create-link": "Crea lenllaç",
"create-user": "Crear l'usuari",
"current-password": "Contrasenya actual",
"e-mail-must-be-valid": "Ha de ser un correu electrònic vàlid",
"edit-user": "Edita l'usuari",
"email": "Correu electrònic",
"error-cannot-delete-super-user": "S'ha produït un error. El Super usuari no es pot suprimir!",
"existing-password-does-not-match": "La contrasenya actual no coincideix",
"full-name": "Nom sencer",
"link-id": "Id de l'enllaç",
"link-name": "Nom de l'enllaç",
"login": "Inicieu sessió",
"logout": "Tanca la sessió",
"manage-users": "Gestionar usuaris",
"new-password": "Nova contrasenya",
"new-user": "Nou Usuari",
"password": "Contrasenya",
"password-has-been-reset-to-the-default-password": "S'ha restablert la contrasenya al seu valor per defecte",
"password-must-match": "Les contrasenyes han de coincidir",
"password-reset-failed": "S'ha produït un error al restablir la contrasenya",
"password-updated": "S'ha actualitzat la contrasenya",
"reset-password": "Restableix la contrasenya",
"sign-in": "Inicia sessió",
"total-mealplans": "Menús totals",
"total-users": "Usuaris totals",
"upload-photo": "Pugeu la foto",
"use-8-characters-or-more-for-your-password": "La contrasenya ha de tindre mínim 8 caràcters",
"user": "Usuari",
"user-created": "S'ha creat l'usuari",
"user-creation-failed": "S'ha produït un error al crear l'usuari",
"user-deleted": "S'ha suprimit l'usuari",
"user-id": "ID d'usuari",
"user-id-with-value": "ID d'usuari: {id}",
"user-password": "Contrasenya",
"user-successfully-logged-in": "La sessió s'ha iniciat correctament",
"user-update-failed": "S'ha produït un error a l'actualitzar l'usuari",
"user-updated": "S'ha actualitzat l'usuari",
"username": "Nom d'usuari",
"users": "Usuaris",
"users-header": "USUARIS",
"webhook-time": "Hora del Webhook",
"webhooks-enabled": "Webhooks habilitats",
"you-are-not-allowed-to-create-a-user": "Vostè no està autoritzat per a crear un usuari",
"you-are-not-allowed-to-delete-this-user": "Vostè no està autoritzat per a suprimir l'usuari"
"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",
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",
"logout": "Logout",
"manage-users": "Manage Users",
"new-password": "New Password",
"new-user": "New User",
"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": "User",
"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",
"username": "Username",
"users": "Users",
"users-header": "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"
}
}

View File

@@ -1,4 +1,8 @@
{
"404": {
"page-not-found": "404 Page Not Found",
"take-me-home": "Take me Home"
},
"about": {
"about": "About",
"about-mealie": "About Mealie",
@@ -22,17 +26,8 @@
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
"show-assets": "Show Assets"
},
"category": {
"category": "Category",
"category-created": "Category created",
"category-creation-failed": "Category creation failed",
"category-deleted": "Category Deleted",
@@ -45,17 +40,17 @@
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
@@ -64,6 +59,7 @@
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
@@ -82,19 +78,18 @@
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
@@ -144,8 +139,8 @@
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
@@ -197,20 +192,13 @@
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"view-scraped-data": "View Scraped Data"
"url-form-hint": "Copy and paste a link from your favorite recipe website"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
@@ -219,12 +207,14 @@
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated"
"pages-updated": "Pages updated",
"recent": "Recent"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
@@ -246,9 +236,11 @@
"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",
@@ -268,17 +260,18 @@
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "View Recipe"
},
"reicpe": {
"no-recipe": "No Recipe"
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Unable to Delete 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",
@@ -344,8 +338,12 @@
"site-settings": "Site Settings",
"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",
@@ -354,13 +352,16 @@
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganized"
},
"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",
@@ -400,20 +402,8 @@
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"display-name": "Display Name",
"error-signing-up": "Error Signing Up",
"sign-up": "Sign Up",
"sign-up-link-created": "Sign up link created",
@@ -450,6 +440,7 @@
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",

View File

@@ -1,389 +1,391 @@
{
"404": {
"page-not-found": "404 side blev ikke fundet",
"take-me-home": "Tag mig hjem"
},
"about": {
"about": "Om",
"about-mealie": "Om Mealie",
"api-docs": "API dokumentation",
"api-port": "API port",
"application-mode": "Applikationstilstand",
"database-type": "Database-type",
"database-url": "Database-url",
"default-group": "Standardgruppe",
"about": "About",
"about-mealie": "About Mealie",
"api-docs": "API Docs",
"api-port": "API Port",
"application-mode": "Application Mode",
"database-type": "Database Type",
"database-url": "Database URL",
"default-group": "Default Group",
"demo": "Demo",
"demo-status": "Demo status",
"development": "Udvikling",
"docs": "Dokumenter",
"download-log": "Download log",
"download-recipe-json": "Sidst skrabet JSON",
"demo-status": "Demo Status",
"development": "Development",
"docs": "Docs",
"download-log": "Download Log",
"download-recipe-json": "Last Scraped JSON",
"github": "Github",
"log-lines": "Log linjer",
"not-demo": "Ikke demo",
"log-lines": "Log Lines",
"not-demo": "Not Demo",
"portfolio": "Portfolio",
"production": "Produktion",
"support": "Hjælp",
"production": "Production",
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Ekstramateriale",
"code": "Kode",
"file": "Fil",
"image": "Billede",
"new-asset": "Ny aktiv",
"pdf": "PDF",
"recipe": "Opskrift",
"show-assets": "Vis ekstramateriale"
},
"category": {
"category-created": "Kategori oprettet",
"category-creation-failed": "Oprettelse af kategorien fejlede",
"category-deleted": "Kategori slettet",
"category-deletion-failed": "Sletning af kategori fejlede",
"category-filter": "Kategorifilter",
"category-update-failed": "Kategoriopdatering fejlede",
"category-updated": "Kategori opdateret",
"uncategorized-count": "Ukategoriseret {count}"
"category": "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",
"uncategorized-count": "Uncategorized {count}"
},
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Slet event",
"new-notification-form-description": "Mealie bruger Apprise-biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
"new-version": "Ny opdatering er tilgængelig!",
"notification": "Notifikation",
"refresh": "Opdater",
"scheduled": "Planlagt",
"something-went-wrong": "Noget gik galt!",
"subscribed-events": "Abonnerede begivenheder",
"test-message-sent": "Testbesked sendt"
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"notification": "Notification",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Anvend",
"cancel": "Annuller",
"clear": "Ryd",
"clear": "Clear",
"close": "Luk",
"confirm": "Bekræft",
"confirm-delete-generic": "Er du sikker på, du vil slette dette?",
"copied": "Kopieret",
"confirm-delete-generic": "Are you sure you want to delete this?",
"copied": "Copied",
"create": "Opret",
"created": "Oprettet",
"custom": "Brugerdefineret",
"dashboard": "Instrumentbræt",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Slet",
"disabled": "Deaktiveret",
"disabled": "Disabled",
"download": "Hent",
"edit": "Rediger",
"enabled": "Aktiveret",
"exception": "Undtagelse",
"failed-count": "Fejlet: {count}",
"failure-uploading-file": "Fejl ved upload af fil",
"favorites": "Favoritter",
"exception": "Exception",
"failed-count": "Failed: {count}",
"failure-uploading-file": "Failure uploading file",
"favorites": "Favorites",
"field-required": "Felt påkrævet",
"file-folder-not-found": "Fil/mappe ikke fundet",
"file-uploaded": "Fil uploadet",
"file-folder-not-found": "File/folder not found",
"file-uploaded": "File uploaded",
"filter": "Filtrer",
"friday": "Fredag",
"general": "Generelt",
"get": "Hent",
"home": "Hjem",
"image": "Billede",
"image-upload-failed": "Upload af billede fejlede",
"general": "General",
"get": "Get",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Importere",
"json": "JSON",
"keyword": "Nøgleord",
"link-copied": "Link kopieret",
"loading-recipes": "Indlæser opskrifter",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"monday": "Mandag",
"more": "More",
"name": "Navn",
"new": "Ny",
"new": "New",
"no": "Nej",
"no-recipe-found": "Ingen opskrift fundet",
"ok": "Ok",
"options": "Valgmuligheder:",
"options": "Options:",
"print": "Print",
"random": "Tilfældig",
"rating": "Bedømmelse",
"rating": "Rating",
"recent": "Seneste",
"recipe": "Opskrift",
"recipe": "Recipe",
"recipes": "Opskrifter",
"rename-object": "Omdøb {0}",
"rename-object": "Rename {0}",
"reset": "Nulstil",
"saturday": "Lørdag",
"save": "Gem",
"settings": "Indstillinger",
"share": "Del",
"shuffle": "Bland",
"share": "Share",
"shuffle": "Shuffle",
"sort": "Sorter",
"sort-alphabetically": "Alfabetisk",
"sort-alphabetically": "Alphabetical",
"status": "Status",
"submit": "Indsend",
"success-count": "Succes: {count}",
"success-count": "Success: {count}",
"sunday": "Søndag",
"templates": "Skabeloner:",
"test": "Afprøv",
"templates": "Templates:",
"test": "Test",
"themes": "Temaer",
"thursday": "Torsdag",
"token": "Token",
"tuesday": "Tirsdag",
"type": "Type",
"update": "Opdater",
"updated": "Opdateret",
"updated": "Updated",
"upload": "Upload",
"url": "URL",
"view": "Se",
"view": "View",
"wednesday": "Onsdag",
"yes": "Ja"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
"cannot-delete-default-group": "Standardgruppen kan ikke blive slettet",
"cannot-delete-group-with-users": "En gruppe med brugere i kan ikke blive slettet",
"confirm-group-deletion": "Bekræft sletning af gruppe",
"create-group": "Opret gruppe",
"error-updating-group": "Fejl ved opdatering af gruppe",
"group": "Gruppe",
"group-deleted": "Gruppe slettet",
"group-deletion-failed": "Sletning af gruppe fejlede",
"group-id-with-value": "Gruppe-ID: {groupID}",
"group-name": "Gruppenavn",
"group-not-found": "Gruppen blev ikke fundet",
"group-with-value": "Gruppe: {groupID}",
"groups": "Grupper",
"manage-groups": "Administrer grupper",
"user-group": "Brugergruppe",
"user-group-created": "Brugergruppe oprettet",
"user-group-creation-failed": "Oprettelse af brugergruppe fejlede"
"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",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
"user-group-creation-failed": "User Group Creation Failed"
},
"meal-plan": {
"create-a-new-meal-plan": "Opret en ny madplan",
"create-a-new-meal-plan": "Opret en ny måltidsplan",
"dinner-this-week": "Madplan denne uge",
"dinner-today": "Madplan i dag",
"dinner-tonight": "AFTENSMAD I AFTEN",
"edit-meal-plan": "Rediger madplan",
"dinner-tonight": "DINNER TONIGHT",
"edit-meal-plan": "Rediger måltidsplan",
"end-date": "Slutdato",
"group": "Gruppér (Beta)",
"main": "Hovedret",
"meal-planner": "Madplanlægger",
"meal-plans": "Madplan",
"mealplan-categories": "MADPLANKATEGORIER",
"mealplan-created": "Madplan oprettet",
"mealplan-creation-failed": "Oprettelse af madplan fejlede",
"mealplan-deleted": "Madplan slettet",
"mealplan-deletion-failed": "Sletning af madplan fejlede",
"mealplan-settings": "Madplansindstillinger",
"mealplan-update-failed": "Opdatering af madplanen fejlede",
"mealplan-updated": "Madplanen blev opdateret",
"no-meal-plan-defined-yet": "Ingen madplan er defineret",
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun opskrifter med disse kategorier vil blive brugt i madplaner",
"planner": "Planlæg madplan",
"quick-week": "Hurtig uge",
"side": "Tilbehør",
"sides": "Tilbehør",
"group": "Group (Beta)",
"main": "Main",
"meal-planner": "Meal Planner",
"meal-plans": "Måltidsplaner",
"mealplan-categories": "MEALPLAN CATEGORIES",
"mealplan-created": "Mealplan created",
"mealplan-creation-failed": "Mealplan creation failed",
"mealplan-deleted": "Mealplan Deleted",
"mealplan-deletion-failed": "Mealplan deletion failed",
"mealplan-settings": "Mealplan Settings",
"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": "Planlægger",
"quick-week": "Quick Week",
"side": "Side",
"sides": "Sides",
"start-date": "Start dato"
},
"migration": {
"chowdown": {
"description": "Migrer data fra Chowdown",
"description": "Migrate data from Chowdown",
"title": "Chowdown"
},
"migration-data-removed": "Migrationsdata fjernet",
"migration-data-removed": "Migration data removed",
"nextcloud": {
"description": "Migrer data fra Nextcloud Cookbook",
"title": "Nextcould Cookbook"
"description": "Migrate data from a Nextcloud Cookbook instance",
"title": "Nextcloud Cookbook"
},
"no-migration-data-available": "Ingen migrationsdata er tilgængelig",
"no-migration-data-available": "No Migration Data Available",
"recipe-migration": "Migrering af opskrifter"
},
"new-recipe": {
"bulk-add": "Bulk Tilføj",
"error-details": "Kun hjemmesider med ID+JSON eller microdata kan blive importeret af Mealie. De fleste større opskriftshjemmesider bruger denne struktur. Opret et emne på GitHub, hvis en hjemmeside ikke kan blive importeret, men der er JSON-data i loggen.",
"error-title": "Det ser ud til, vi ikke kunne finde noget",
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Fra URL",
"github-issues": "GitHub problemer",
"google-ld-json-info": "Google ID+JSON information",
"must-be-a-valid-url": "Det skal være en korrekt URL",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Indsæt dine opskriftsdata. \nHver linje behandles som et element på en liste",
"recipe-markup-specification": "Opskriftsmarkupspecifikation",
"recipe-url": "URL på opskrift",
"upload-a-recipe": "Upload en opskrift",
"upload-individual-zip-file": "Opload en individuel .zip-fil, eksporteret fra en anden Mealie-instans.",
"url-form-hint": "Kopiér og indsæt et link fra din foretrukne opskrifts hjemmeside",
"view-scraped-data": "Vis skrabet data"
"url-form-hint": "Kopiér og indsæt et link fra din foretrukne opskrifts hjemmeside"
},
"page": {
"404-page-not-found": "404 Siden blev ikke fundet",
"all-recipes": "Alle Opskrifter",
"new-page-created": "Ny side blev oprettet",
"page": "Side",
"page-creation-failed": "Oprettelse af side fejlede",
"page-deleted": "Side slettet",
"page-deletion-failed": "Sletning af side fejlede",
"page-update-failed": "Opdatering af side fejlede",
"page-updated": "Side opdateret",
"pages-update-failed": "Opdatering af sider fejlede",
"pages-updated": "Sider opdateret"
"home-page": "Startside",
"new-page-created": "New page created",
"page": "Page",
"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": "Seneste"
},
"recipe": {
"add-key": "Tilføj nøgle",
"add-to-favorites": "Tilføj til favoritter",
"api-extras": "API-ekstramateriale",
"calories": "Kalorier",
"calories-suffix": "kalorier",
"carbohydrate-content": "Kulhydrat",
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
"categories": "Kategorier",
"comment-action": "Kommentar",
"comments": "Kommentarer",
"delete-confirmation": "Er du sikker på, du vil slette denne opskrift?",
"delete-recipe": "Slet opskrift",
"comment-action": "Comment",
"comments": "Comments",
"delete-confirmation": "Are you sure you want to delete this recipe?",
"delete-recipe": "Delete Recipe",
"description": "Beskrivelse",
"disable-amount": "Slå ingrediensmængder fra",
"disable-comments": "Slå kommentarer fra",
"fat-content": "Fedt",
"disable-amount": "Disable Ingredient Amounts",
"disable-comments": "Disable Comments",
"fat-content": "Fat",
"fiber-content": "Fiber",
"grams": "gram",
"grams": "grams",
"ingredient": "Ingrediens",
"ingredients": "Ingredienser",
"insert-section": "Indsæt sektion",
"insert-section": "Insert Section",
"instructions": "Instruktioner",
"key-name-required": "Nøglenavn påkrævet",
"landscape-view-coming-soon": "Liggende visning (Kommer snart)",
"milligrams": "milligram",
"new-key-name": "Nyt nøglenavn",
"no-white-space-allowed": "Mellemrum er ikke tilladt",
"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": "Bemærk",
"nutrition": "Ernæring",
"object-key": "Objektnøgle",
"object-value": "Objektværdi",
"notes": "Bemærkninger",
"nutrition": "Nutrition",
"object-key": "Object Key",
"object-value": "Object Value",
"original-url": "Oprindelig opskrift",
"perform-time": "Tilberedningstid",
"prep-time": "Forberedelsestid",
"perform-time": "Cook Time",
"prep-time": "Prep Time",
"protein-content": "Protein",
"public-recipe": "Offentlig opskrift",
"recipe-created": "Opskrift oprettet",
"recipe-creation-failed": "Oprettelse af opskrift fejlede",
"recipe-deleted": "Opskrift slettet",
"recipe-image": "Opskriftsbillede",
"recipe-image-updated": "Opskriftsbillede opdateret",
"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": "Opskriftens navn",
"recipe-settings": "Opskriftsindstillinger",
"recipe-update-failed": "Opdatering af opskrift fejlede",
"recipe-updated": "Opskrift opdateret",
"remove-from-favorites": "Fjern fra favoritter",
"remove-section": "Fjern sektion",
"save-recipe-before-use": "Gem opskrift før brug",
"section-title": "Sektionstitel",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"section-title": "Section Title",
"servings": "Portioner",
"share-recipe-message": "Jeg vil gerne dele min opskrift \"{0}\" med dig.",
"show-nutrition-values": "Vis ernæringstabel",
"sodium-content": "Natrium",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"show-assets": "Show Assets",
"show-nutrition-values": "Show Nutrition Values",
"sodium-content": "Sodium",
"step-index": "Trin: {step}",
"sugar-content": "Sukker",
"title": "Titel",
"total-time": "Total tid",
"unable-to-delete-recipe": "Kunne ikke slette opskrift"
"sugar-content": "Sugar",
"title": "Title",
"total-time": "Total Time",
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "Se opskrift"
},
"reicpe": {
"no-recipe": "Ingen opskrift"
"no-recipe": "No Recipe"
},
"search": {
"advanced-search": "Avanceret søgning",
"and": "og",
"exclude": "Ekskluder",
"include": "Inkluder",
"max-results": "Maksimalt antal resultater",
"or": "Eller",
"results": "Resultater",
"search": "Søg",
"search-mealie": "Søg Mealie (tryk /)",
"search-placeholder": "Søg...",
"tag-filter": "Tagfiler"
"advanced-search": "Advanced Search",
"and": "and",
"exclude": "Exclude",
"include": "Include",
"max-results": "Max Results",
"or": "Or",
"results": "Results",
"search": "Search",
"search-mealie": "Search Mealie (press /)",
"search-placeholder": "Search...",
"tag-filter": "Tag Filter"
},
"settings": {
"add-a-new-theme": "Tilføj et nyt tema",
"admin-settings": "Administratorindstillinger",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup oprettet ved {path}",
"backup-deleted": "Backup slettet",
"backup-tag": "Backupnavn",
"create-heading": "Opret en backup",
"delete-backup": "Slet backup",
"error-creating-backup-see-log-file": "Der opstod en fejl under oprettelse af backuppen. Se log-filen",
"full-backup": "Fuld backup",
"import-summary": "Importer resumé",
"partial-backup": "Delvis backup",
"unable-to-delete-backup": "Ude af stand til at slette 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-and-exports": "Backup og eksport",
"change-password": "Skift kodeord",
"backup-info": "Sikkerhedskopier eksporteres i standard JSON-format sammen med alle de billeder, der er gemt på filsystemet. \nI din sikkerhedskopimappe finder du en .zip-fil, der indeholder alle opskrifterne JSON og billeder fra databasen. \nDerudover, hvis du valgte en markdown-fil, gemmes disse også i .zip-filen. \nFor at importere en sikkerhedskopi skal den være placeret i din sikkerhedskopimappe. \nAutomatiske sikkerhedskopier udføres hver dag kl. 3:00.",
"change-password": "Change Password",
"current": "Version:",
"custom-pages": "Brugerdefinerede sider",
"edit-page": "Rediger side",
"events": "Begivenheder",
"first-day-of-week": "Første dag i ugen",
"group-settings-updated": "Gruppeindstillinger blev opdateret",
"custom-pages": "Custom Pages",
"edit-page": "Edit Page",
"events": "Events",
"first-day-of-week": "First day of the week",
"group-settings-updated": "Group Settings Updated",
"homepage": {
"all-categories": "Alle kategorier",
"card-per-section": "Kort per sektion",
"home-page": "Forside",
"home-page-sections": "Forsidesektioner",
"show-recent": "Vis seneste opskrifter"
"all-categories": "All Categories",
"card-per-section": "Card Per Section",
"home-page": "Home Page",
"home-page-sections": "Home Page Sections",
"show-recent": "Show Recent"
},
"language": "Sprog",
"language": "Language",
"latest": "Seneste:",
"local-api": "Lokal API",
"locale-settings": "Lokale indstillinger",
"migrations": "Migrationer",
"new-page": "Ny side",
"notify": "Notifikationer",
"organize": "Organiser",
"page-name": "Sidenavn",
"pages": "Sider",
"profile": "Profil",
"remove-existing-entries-matching-imported-entries": "Fjern eksisterende indtastninger, hvis de matcher de importerede",
"local-api": "Local API",
"locale-settings": "Locale settings",
"migrations": "Migrations",
"new-page": "New Page",
"notify": "Notify",
"organize": "Organize",
"page-name": "Page Name",
"pages": "Pages",
"profile": "Profile",
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
"set-new-time": "Indstil ny tid",
"settings-update-failed": "Ændring af indstillinger fejlede",
"settings-updated": "Indstillinger ændret",
"site-settings": "Sideindstillinger",
"settings-update-failed": "Settings update failed",
"settings-updated": "Settings updated",
"site-settings": "Site Settings",
"theme": {
"accent": "Accent",
"are-you-sure-you-want-to-delete-this-theme": "Er du sikker på, at du vil slette dette 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": "Vælg, hvordan Mealie ser ud for dig. \nIndstil dit tema til at følge dine systemindstillinger, eller vælg at bruge det lyse eller mørke tema.",
"dark": "Mørkt",
"default-to-system": "Systemstandard",
"dark-mode": "Mørk tilstand",
"default-to-system": "Default to system",
"delete-theme": "Slet tema",
"error": "Fejl",
"error-creating-theme-see-log-file": "En fejl opstod ved oprettelse af temaet. Se logfilen.",
"error-deleting-theme": "En fejl opstod ved sletning af temaet",
"error-updating-theme": "En fejl opstod ved opdatering af temaet",
"info": "Information",
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
"error-deleting-theme": "Error deleting theme",
"error-updating-theme": "Error updating theme",
"info": "Info",
"light": "Lyst",
"primary": "Primær",
"secondary": "Sekundær",
"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": "Vælg et tema i rullemenuen, eller opret et nyt tema. \nBemærk, at standardtemaet serveres til alle brugere, der ikke har angivet en temapræference.",
"success": "Succes",
"switch-to-dark-mode": "Skift til mørkt udseende",
"switch-to-light-mode": "Skift til lyst udseende",
"theme-deleted": "Tema slettet",
"theme-name": "Temanavn",
"theme-name-is-required": "Temanavnet er påkrævet.",
"theme-saved": "Tema gemt",
"theme-updated": "Tema opdateret",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"theme": "Tema",
"theme-deleted": "Theme deleted",
"theme-name": "Theme Name",
"theme-name-is-required": "Theme Name is required.",
"theme-saved": "Theme Saved",
"theme-settings": "Temaindstillinger",
"theme-updated": "Theme updated",
"warning": "Advarsel"
},
"token": {
"active-tokens": "Aktive tokens",
"active-tokens": "ACTIVE TOKENS",
"api-token": "API Token",
"api-tokens": "API Tokens",
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Kopier denne token ved brug i en anden applikation. Denne token kan ikke ses igen.",
"create-an-api-token": "Opret en API token",
"token-name": "Tokennavn"
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
"create-an-api-token": "Create an API Token",
"token-name": "Token Name"
},
"toolbox": {
"assign-all": "Tildel alle",
"bulk-assign": "Massetildeling",
"new-name": "Nyt navn",
"no-unused-items": "Ingen ubrugte punkter",
"recipes-affected": "Ingen opskrifter blev påvirket|En opskrift blev påvirket|{count} opskrifter blev påvirket",
"remove-unused": "Slet ubrugte",
"title-case-all": "Stort forbogstav på alle",
"toolbox": "Værktøjskasse",
"unorganized": "Uorganiseret"
"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",
"unorganized": "Unorganized"
},
"webhooks": {
"meal-planner-webhooks": "Måltidsplanlægning 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": "Webadresserne, der er anført nedenfor, modtager webhooks, der indeholder opskriftsdataene for måltidsplanen på den planlagte dag. \nWebhooks udføres i øjeblikket på <strong> {time} </strong>",
"webhook-url": "Webhook adresse",
@@ -391,99 +393,88 @@
}
},
"shopping-list": {
"all-lists": "Alle lister",
"create-shopping-list": "Lav indkøbsliste",
"from-recipe": "Fra opskrift",
"list-name": "Listenavn",
"new-list": "Ny liste",
"quantity": "Antal: {0}",
"shopping-list": "Indkøbsliste",
"shopping-lists": "Indkøbslister"
},
"sidebar": {
"all-recipes": "Alle opskr.",
"categories": "Kategorier",
"dashboard": "Instrumentbræt",
"home-page": "Forside",
"manage-users": "Adm. brugere",
"migrations": "Migrationer",
"profile": "Profil",
"search": "Søg",
"site-settings": "Sideindstil.",
"tags": "Tags",
"toolbox": "Værktøjskasse"
"all-lists": "All Lists",
"create-shopping-list": "Create Shopping List",
"from-recipe": "From Recipe",
"list-name": "List Name",
"new-list": "New List",
"quantity": "Quantity: {0}",
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"signup": {
"error-signing-up": "Fejl i forbindelse med oprettelse af bruger",
"sign-up": "Opret bruger",
"sign-up-link-created": "Brugeroprettelseslink oprettet",
"sign-up-link-creation-failed": "Oprettelsen af brugeroprettelseslink fejlede",
"sign-up-links": "Brugeroprettelseslinks",
"sign-up-token-deleted": "Brugeroprettelsestoken blev slettet",
"sign-up-token-deletion-failed": "Sletning af brugeroprettelsestoken fejlede",
"welcome-to-mealie": "Velkommen til Mealie. For at oprette en bruger på denne hjemmeside, kræves det at du har et validt invitationslink. Har du ikke fået en invitation, kan du ikke oprette en bruger. For at få et link, skal du kontakte sideadministratoren."
"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."
},
"tag": {
"tag-created": "Tag oprettet",
"tag-creation-failed": "Oprettelse af tag fejlede",
"tag-deleted": "Tag blev slettet",
"tag-deletion-failed": "Sletning af tag fejlede",
"tag-update-failed": "Opdatering af tag fejlede",
"tag-updated": "Tag blev opdateret",
"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",
"tags": "Tags",
"untagged-count": "Ikke-tagget: {count}"
"untagged-count": "Untagged {count}"
},
"user": {
"admin": "Administrator",
"are-you-sure-you-want-to-delete-the-link": "Er du sikker på, at du vil slette linket \"<b>{link}<b/>\"?",
"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": "Er du sikker på, at du vil slette brugeren <b>{activeName} med ID: {activeId}<b/>?",
"confirm-link-deletion": "Bekræft sletning af link",
"confirm-password": "Bekræft adgangskode",
"confirm-link-deletion": "Confirm Link Deletion",
"confirm-password": "Confirm Password",
"confirm-user-deletion": "Bekræft Sletning Af Bruger",
"could-not-validate-credentials": "Kunne verificere legitimationsoplysninger",
"create-link": "Link blev oprettet",
"could-not-validate-credentials": "Could Not Validate Credentials",
"create-link": "Create Link",
"create-user": "Opret bruger",
"current-password": "Nuværende kodeord",
"e-mail-must-be-valid": "E-mailen skal være valid",
"current-password": "Current Password",
"e-mail-must-be-valid": "E-mail must be valid",
"edit-user": "Rediger bruger",
"email": "E-mail",
"error-cannot-delete-super-user": "Fejl! Kan ikke slette super-brugeren",
"existing-password-does-not-match": "Nuværende adgangskode matcher ikke",
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
"existing-password-does-not-match": "Existing password does not match",
"full-name": "Fulde navn",
"incorrect-username-or-password": "Incorrect username or password",
"link-id": "Link ID",
"link-name": "Linknavn",
"login": "Log",
"link-name": "Link Name",
"login": "Login",
"logout": "Log ud",
"manage-users": "Administrer brugere",
"new-password": "Ny adgangskode",
"manage-users": "Manage Users",
"new-password": "New Password",
"new-user": "Ny bruger",
"password": "Adgangskode",
"password-has-been-reset-to-the-default-password": "Adgangskode er blevet nulstillet til systemstandarden",
"password-must-match": "Adgangskode skal matche",
"password-reset-failed": "Nulstilling af adgangskode fejlede",
"password-updated": "Adgangskoden blev opdateret",
"reset-password": "Nulstil adgangskoden",
"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": "Log ind",
"total-mealplans": "Antal Madplaner",
"total-users": "Antal brugere",
"upload-photo": "Upload billede",
"use-8-characters-or-more-for-your-password": "Adgangskode skal indeholde 8 tegn eller flere",
"user": "Bruger",
"user-created": "Brugeren blev oprettet",
"user-creation-failed": "Oprettelsen af brugeren fejlede",
"user-deleted": "Brugeren blev slettet",
"upload-photo": "Upload Photo",
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
"user": "User",
"user-created": "User created",
"user-creation-failed": "User creation failed",
"user-deleted": "User deleted",
"user-id": "Bruger ID",
"user-id-with-value": "Bruger ID: {id}",
"user-password": "Adgangskode",
"user-successfully-logged-in": "Brugeren blev succesfuld logget ind",
"user-update-failed": "Opdatering af bruger fejlede",
"user-updated": "Bruger opdateret",
"username": "Brugernavn",
"users": "Brugere",
"users-header": "BRUGERE",
"user-successfully-logged-in": "User Successfully Logged In",
"user-update-failed": "User update failed",
"user-updated": "User updated",
"username": "Username",
"users": "Users",
"users-header": "USERS",
"webhook-time": "Webhook Tid",
"webhooks-enabled": "Webhooks Aktiveret",
"you-are-not-allowed-to-create-a-user": "Du har ikke rettigheder til at oprette en ny bruger",
"you-are-not-allowed-to-delete-this-user": "Du har ikke rettigheder til at slette denne bruger"
"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"
}
}

View File

@@ -1,6 +1,10 @@
{
"404": {
"page-not-found": "404 Seite nicht gefunden",
"take-me-home": "Zurück"
},
"about": {
"about": "Über",
"about": "About",
"about-mealie": "Über Mealie",
"api-docs": "API Dokumentation",
"api-port": "API Port",
@@ -13,7 +17,7 @@
"development": "Entwicklung",
"docs": "Dokumentation",
"download-log": "Protokoll herunterladen",
"download-recipe-json": "Zuletzt geladenes JSON",
"download-recipe-json": "Last Scraped JSON",
"github": "GitHub",
"log-lines": "Protokoll",
"not-demo": "Keine Demo",
@@ -22,17 +26,8 @@
"support": "Unterstützen",
"version": "Version"
},
"asset": {
"assets": "Anhänge",
"code": "Quelltext",
"file": "Datei",
"image": "Bild",
"new-asset": "Neuer Anhang",
"pdf": "PDF",
"recipe": "Rezept",
"show-assets": "Anhänge anzeigen"
},
"category": {
"category": "Kategorie",
"category-created": "Kategorie angelegt",
"category-creation-failed": "Anlegen der Kategorie fehlgeschlagen",
"category-deleted": "Kategorie entfernt",
@@ -45,17 +40,17 @@
"events": {
"apprise-url": "Apprise URL",
"database": "Datenbank",
"delete-event": "Ereignis löschen",
"new-notification-form-description": "Mealie verwendet die Apprise-Bibliothek, um Benachrichtigungen zu erzeugen. Sie bietet viele Optionen für Dienste an, die für Benachrichtigungen genutzt werden können. Werfe einen Blick in ihr Wiki für eine umfassende Anleitung zum Erstellen der URL für Ihren Dienst. Falls verfügbar, kann die Auswahl des Benachrichtigungstyps zusätzliche Funktionen enthalten.",
"new-version": "Neue Version verfügbar!",
"notification": "Benachrichtigung",
"refresh": "Aktualisieren",
"scheduled": "Geplant",
"something-went-wrong": "Etwas ist schief gelaufen!",
"subscribed-events": "Abonnierte Ereignisse",
"test-message-sent": "Testnachricht gesendet"
"test-message-sent": "Testnachricht gesendet",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Anwenden",
"cancel": "Abbrechen",
"clear": "Zurücksetzen",
"close": "Schließen",
@@ -64,6 +59,7 @@
"copied": "Kopiert",
"create": "Erstellen",
"created": "Erstellt",
"current-parenthesis": "(Neueste)",
"custom": "Benutzerdefiniert",
"dashboard": "Dashboard",
"delete": "Löschen",
@@ -74,7 +70,7 @@
"exception": "Fehler",
"failed-count": "Fehlgeschlagen: {count}",
"failure-uploading-file": "Fehler beim Hochladen der Datei",
"favorites": "Favoriten",
"favorites": "Favorites",
"field-required": "Erforderliches Feld",
"file-folder-not-found": "Datei/Ordner nicht gefunden",
"file-uploaded": "Datei hochgeladen",
@@ -82,19 +78,18 @@
"friday": "Freitag",
"general": "Allgemein",
"get": "Holen",
"home": "Startseite",
"image": "Bild",
"image-upload-failed": "Das Bild konnte nicht hochgeladen werden",
"import": "Importieren",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link kopiert",
"loading-recipes": "Lade Rezepte",
"monday": "Montag",
"more": "More",
"name": "Name",
"new": "Neu",
"no": "Nein",
"no-recipe-found": "Kein Rezept gefunden",
"ok": "Okay",
"options": "Optionen:",
"print": "Drucken",
@@ -144,8 +139,8 @@
"group-id-with-value": "Gruppenkennung: {groupID}",
"group-name": "Name der Gruppe",
"group-not-found": "Gruppe nicht gefunden",
"group-with-value": "Gruppe: {groupID}",
"groups": "Gruppen",
"groups-can-only-be-set-by-administrators": "Gruppen können nur von Administratoren gesetzt werden",
"manage-groups": "Gruppen verwalten",
"user-group": "Benutzergruppe",
"user-group-created": "Benutzergruppe angelegt",
@@ -159,7 +154,7 @@
"edit-meal-plan": "Essensplan bearbeiten",
"end-date": "Enddatum",
"group": "Gruppe (Beta)",
"main": "Hauptgericht",
"main": "Main",
"meal-planner": "Essensplaner",
"meal-plans": "Essenspläne",
"mealplan-categories": "KATEGORIEN FÜR ESSENSPLÄNE",
@@ -175,8 +170,8 @@
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Nur Rezepte dieser Kategorien werden in Essensplänen verwendet",
"planner": "Planer",
"quick-week": "Schnelle Woche",
"side": "Beilage",
"sides": "Beilagen",
"side": "Side",
"sides": "Sides",
"start-date": "Startdatum"
},
"migration": {
@@ -194,23 +189,16 @@
},
"new-recipe": {
"bulk-add": "Massenimport",
"error-details": "Mealie kann Rezepte nur von Webseiten importieren, die Id+json oder Mikrodaten enthalten. Die meisten großen Rezeptwebseiten unterstützen diese Datenstruktur. Wenn das Rezept nicht importiert werden kann, aber JSON-Daten im Log vorhanden sind, melde es bitte mit der URL und diesen Daten auf GitHub.",
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Anscheinend konnten wir nichts finden",
"from-url": "Von URL",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Muss eine gültige URL sein",
"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",
"recipe-markup-specification": "Rezept Markup Spezifikation",
"recipe-url": "Rezept URL",
"upload-a-recipe": "Rezept hochladen",
"upload-individual-zip-file": "Lade eine individuelle .zip-Datei hoch, die von einer anderen Mealie-Instanz exportiert wird.",
"url-form-hint": "Kopiere einen Link von deiner Lieblingsrezept-Website und füge ihn ein",
"view-scraped-data": "Gesammelte Daten anzeigen"
"url-form-hint": "Kopiere einen Link von deiner Lieblingsrezept-Website und füge ihn ein"
},
"page": {
"404-page-not-found": "404 Seite nicht gefunden",
"all-recipes": "Alle Rezepte",
"home-page": "Startseite",
"new-page-created": "Neue Seite angelegt",
"page": "Seite",
"page-creation-failed": "Anlegen der Seite fehlgeschlagen",
@@ -219,36 +207,40 @@
"page-update-failed": "Aktualisieren der Seite fehlgeschlagen",
"page-updated": "Seite aktualisiert",
"pages-update-failed": "Aktualisieren der Seiten fehlgeschlagen",
"pages-updated": "Seiten aktualisiert"
"pages-updated": "Seiten aktualisiert",
"recent": "Neueste"
},
"recipe": {
"add-key": "Schlüssel hinzufügen",
"add-to-favorites": "Zu Favoriten hinzufügen",
"api-extras": "API Extras",
"assets": "Anlagen",
"calories": "Kalorien",
"calories-suffix": "Kalorien",
"carbohydrate-content": "Kohlenhydrate",
"categories": "Kategorien",
"comment-action": "Kommentieren",
"comments": "Kommentare",
"comment-action": "Comment",
"comments": "Comments",
"delete-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
"delete-recipe": "Rezept löschen",
"description": "Beschreibung",
"disable-amount": "Zutatenmenge deaktivieren",
"disable-comments": "Kommentare deaktivieren",
"disable-amount": "Disable Ingredient Amounts",
"disable-comments": "Disable Comments",
"fat-content": "Fett",
"fiber-content": "Ballaststoffe",
"grams": "g",
"ingredient": "Zutat",
"ingredients": "Zutaten",
"insert-section": "Abschnitt einfügen",
"insert-section": "Insert Section",
"instructions": "Anweisungen",
"key-name-required": "Schlüsselname benötigt",
"landscape-view-coming-soon": "Landschaftsansicht (demnächst verfügbar)",
"milligrams": "mg",
"new-asset": "Neuer Anhang",
"new-key-name": "Neuer Schlüsselname",
"no-white-space-allowed": "Kein Leerzeichen erlaubt",
"note": "Notiz",
"notes": "Notizen",
"nutrition": "Nährwerte",
"object-key": "Objektschlüssel",
"object-value": "Objektwert",
@@ -267,30 +259,31 @@
"recipe-update-failed": "Aktualisieren des Rezepts fehlgeschlagen",
"recipe-updated": "Rezept aktualisiert",
"remove-from-favorites": "Von Favoriten entfernen",
"remove-section": "Abschnitt entfernen",
"save-recipe-before-use": "Rezept vor Verwendung speichern",
"section-title": "Titel des Abschnitts",
"remove-section": "Remove Section",
"section-title": "Section Title",
"servings": "Portionen",
"share-recipe-message": "Ich möchte mein Rezept {0} mit dir teilen.",
"show-assets": "Anhänge anzeigen",
"show-nutrition-values": "Nährwerte anzeigen",
"sodium-content": "Natrium",
"step-index": "Schritt {step}:",
"sugar-content": "Zucker",
"title": "Titel",
"total-time": "Gesamtzeit",
"unable-to-delete-recipe": "Rezept kann nicht gelöscht werden"
"unable-to-delete-recipe": "Rezept kann nicht gelöscht werden",
"view-recipe": "Rezept anschauen"
},
"reicpe": {
"no-recipe": "Kein Rezept"
"no-recipe": "No Recipe"
},
"search": {
"advanced-search": "Erweiterte Suche",
"advanced-search": "Advanced Search",
"and": "und",
"exclude": "Ausschließen",
"include": "Einbeziehen",
"max-results": "Max. Ergebnisse",
"or": "Oder",
"results": "Ergebnisse",
"results": "Results",
"search": "Suchen",
"search-mealie": "Mealie durchsuchen (/ drücken)",
"search-placeholder": "Suchen...",
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Neues Thema hinzufügen",
"admin-settings": "Admin Einstellungen",
"available-backups": "Verfügbare Sicherungen",
"backup": {
"backup-created-at-response-export_path": "Sicherung erstellt unter {path}",
"backup-deleted": "Sicherung gelöscht",
"backup-tag": "Sicherungsbeschreibung",
"create-heading": "Sicherung erstellen",
"delete-backup": "Sicherung löschen",
"error-creating-backup-see-log-file": "Fehler beim Erstellen der Sicherung. Siehe Protokolldatei",
"full-backup": "Komplettsicherung",
"import-summary": "Zusammenfassung des Imports",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Sicherung kann nicht gelöscht werden."
},
"backup-and-exports": "Sicherungen",
"backup-info": "Sicherungen werden mitsamt aller Bilder im Standard-JSON-Format in das Dateisystem exportiert. In deinem Sicherungsordner 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 Sicherungsordner liegen. Automatische Sicherungen finden jeden Tag um 3 Uhr morgens statt.",
"change-password": "Passwort ändern",
"current": "Version:",
"custom-pages": "Benutzerdefinierte Seiten",
@@ -344,8 +338,12 @@
"site-settings": "Seiteneinstellungen",
"theme": {
"accent": "Akzent",
"are-you-sure-you-want-to-delete-this-theme": "Bist du dir sicher, dass 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 die Einstellung deines Systems oder bestimme ob es Hell oder Dunkel dargestellt werden soll.",
"dark": "Dunkel",
"dark-mode": "Dunkler Modus",
"default-to-system": "Standardeinstellung",
"delete-theme": "Thema löschen",
"error": "Fehler",
"error-creating-theme-see-log-file": "Fehler beim Erstellen des Themas. Siehe Protokolldatei.",
"error-deleting-theme": "Fehler beim Löschen des Themas",
@@ -354,13 +352,16 @@
"light": "Hell",
"primary": "Primär",
"secondary": "Sekundär",
"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, dass das Standard-Thema auf alle Benutzer angewandt wird die keine Einstellung für ein Thema getroffen haben.",
"success": "Erfolg",
"switch-to-dark-mode": "Zum dunklen Modus wechseln",
"switch-to-light-mode": "Zum hellen Modus wechseln",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"theme": "Thema",
"theme-deleted": "Thema gelöscht",
"theme-name": "Themenname",
"theme-name-is-required": "Themenname wird benötigt.",
"theme-saved": "Thema gespeichert",
"theme-settings": "Themeneinstellungen",
"theme-updated": "Thema aktualisiert",
"warning": "Warnung"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganisiert"
},
"webhooks": {
"meal-planner-webhooks": "Essensplaner Webhooks",
"test-webhooks": "Teste 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 welche die Rezeptdaten für den Menüplan am geplanten Tag enthalten. Derzeit werden die Webhooks ausgeführt um",
"webhook-url": "Webhook URL",
@@ -400,20 +402,8 @@
"shopping-list": "Einkaufsliste",
"shopping-lists": "Einkaufslisten"
},
"sidebar": {
"all-recipes": "Alle Rezepte",
"categories": "Kategorien",
"dashboard": "Übersicht",
"home-page": "Startseite",
"manage-users": "Benutzer",
"migrations": "Migrationen",
"profile": "Profil",
"search": "Suche",
"site-settings": "Einstellungen",
"tags": "Schlagworte",
"toolbox": "Werkzeuge"
},
"signup": {
"display-name": "Anzeigename",
"error-signing-up": "Fehler beim Registrieren",
"sign-up": "Registrieren",
"sign-up-link-created": "Einladungslink angelegt",
@@ -450,6 +440,7 @@
"error-cannot-delete-super-user": "Fehler! Super Benutzer kann nicht gelöscht werden",
"existing-password-does-not-match": "Bestehendes Passwort stimmt nicht überein",
"full-name": "Vollständiger Name",
"incorrect-username-or-password": "Ungültiger Benutzername oder Passwort",
"link-id": "Linkkennung",
"link-name": "Linkname",
"login": "Anmeldung",

View File

@@ -1,4 +1,8 @@
{
"404": {
"page-not-found": "404 Page Not Found",
"take-me-home": "Take me Home"
},
"about": {
"about": "About",
"about-mealie": "About Mealie",
@@ -22,17 +26,8 @@
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
"show-assets": "Show Assets"
},
"category": {
"category": "Category",
"category-created": "Category created",
"category-creation-failed": "Category creation failed",
"category-deleted": "Category Deleted",
@@ -45,17 +40,17 @@
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
@@ -64,6 +59,7 @@
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
@@ -82,19 +78,18 @@
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
@@ -144,8 +139,8 @@
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
@@ -197,20 +192,13 @@
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"view-scraped-data": "View Scraped Data"
"url-form-hint": "Copy and paste a link from your favorite recipe website"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
@@ -219,12 +207,14 @@
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated"
"pages-updated": "Pages updated",
"recent": "Recent"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
@@ -246,9 +236,11 @@
"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",
@@ -268,17 +260,18 @@
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "View Recipe"
},
"reicpe": {
"no-recipe": "No Recipe"
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Unable to Delete 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",
@@ -344,8 +338,12 @@
"site-settings": "Site Settings",
"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",
@@ -354,13 +352,16 @@
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganized"
},
"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",
@@ -400,20 +402,8 @@
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"display-name": "Display Name",
"error-signing-up": "Error Signing Up",
"sign-up": "Sign Up",
"sign-up-link-created": "Sign up link created",
@@ -450,6 +440,7 @@
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",

View File

@@ -1,489 +0,0 @@
{
"about": {
"about": "About",
"about-mealie": "About Mealie",
"api-docs": "API Docs",
"api-port": "API Port",
"application-mode": "Application Mode",
"database-type": "Database Type",
"database-url": "Database URL",
"default-group": "Default Group",
"demo": "Demo",
"demo-status": "Demo Status",
"development": "Development",
"docs": "Docs",
"download-log": "Download Log",
"download-recipe-json": "Last Scraped JSON",
"github": "Github",
"log-lines": "Log Lines",
"not-demo": "Not Demo",
"portfolio": "Portfolio",
"production": "Production",
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
"show-assets": "Show Assets"
},
"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",
"uncategorized-count": "Uncategorised {count}"
},
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
},
"general": {
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
"confirm": "Confirm",
"confirm-delete-generic": "Are you sure you want to delete this?",
"copied": "Copied",
"create": "Create",
"created": "Created",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
"disabled": "Disabled",
"download": "Download",
"edit": "Edit",
"enabled": "Enabled",
"exception": "Exception",
"failed-count": "Failed: {count}",
"failure-uploading-file": "Failure uploading file",
"favorites": "Favourites",
"field-required": "Field Required",
"file-folder-not-found": "File/folder not found",
"file-uploaded": "File uploaded",
"filter": "Filter",
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
"random": "Random",
"rating": "Rating",
"recent": "Recent",
"recipe": "Recipe",
"recipes": "Recipes",
"rename-object": "Rename {0}",
"reset": "Reset",
"saturday": "Saturday",
"save": "Save",
"settings": "Settings",
"share": "Share",
"shuffle": "Shuffle",
"sort": "Sort",
"sort-alphabetically": "Alphabetical",
"status": "Status",
"submit": "Submit",
"success-count": "Success: {count}",
"sunday": "Sunday",
"templates": "Templates:",
"test": "Test",
"themes": "Themes",
"thursday": "Thursday",
"token": "Token",
"tuesday": "Tuesday",
"type": "Type",
"update": "Update",
"updated": "Updated",
"upload": "Upload",
"url": "URL",
"view": "View",
"wednesday": "Wednesday",
"yes": "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",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
"user-group-creation-failed": "User Group Creation Failed"
},
"meal-plan": {
"create-a-new-meal-plan": "Create a New Meal Plan",
"dinner-this-week": "Dinner This Week",
"dinner-today": "Dinner Today",
"dinner-tonight": "DINNER TONIGHT",
"edit-meal-plan": "Edit Meal Plan",
"end-date": "End Date",
"group": "Group (Beta)",
"main": "Main",
"meal-planner": "Meal Planner",
"meal-plans": "Meal Plans",
"mealplan-categories": "MEALPLAN CATEGORIES",
"mealplan-created": "Mealplan created",
"mealplan-creation-failed": "Mealplan creation failed",
"mealplan-deleted": "Mealplan deleted",
"mealplan-deletion-failed": "Mealplan deletion failed",
"mealplan-settings": "Mealplan Settings",
"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",
"side": "Side",
"sides": "Sides",
"start-date": "Start Date"
},
"migration": {
"chowdown": {
"description": "Migrate data from Chowdown",
"title": "Chowdown"
},
"migration-data-removed": "Migration data removed",
"nextcloud": {
"description": "Migrate data from a Nextcloud Cookbook instance",
"title": "Nextcloud Cookbook"
},
"no-migration-data-available": "No Migration Data Available",
"recipe-migration": "Recipe Migration"
},
"new-recipe": {
"bulk-add": "Bulk Add",
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favourite recipe website",
"view-scraped-data": "View Scraped Data"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"new-page-created": "New page created",
"page": "Page",
"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"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favourites",
"api-extras": "API Extras",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
"categories": "Categories",
"comment-action": "Comment",
"comments": "Comments",
"delete-confirmation": "Are you sure you want to delete this recipe?",
"delete-recipe": "Delete Recipe",
"description": "Description",
"disable-amount": "Disable Ingredient Amounts",
"disable-comments": "Disable Comments",
"fat-content": "Fat",
"fiber-content": "Fibre",
"grams": "grams",
"ingredient": "Ingredient",
"ingredients": "Ingredients",
"insert-section": "Insert Section",
"instructions": "Instructions",
"key-name-required": "Key Name Required",
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
"milligrams": "milligrams",
"new-key-name": "New Key Name",
"no-white-space-allowed": "No White Space Allowed",
"note": "Note",
"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",
"remove-from-favorites": "Remove from Favourites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
},
"reicpe": {
"no-recipe": "No Recipe"
},
"search": {
"advanced-search": "Advanced Search",
"and": "and",
"exclude": "Exclude",
"include": "Include",
"max-results": "Max Results",
"or": "Or",
"results": "Results",
"search": "Search",
"search-mealie": "Search Mealie (press /)",
"search-placeholder": "Search...",
"tag-filter": "Tag Filter"
},
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete 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-and-exports": "Backups",
"change-password": "Change Password",
"current": "Version:",
"custom-pages": "Custom Pages",
"edit-page": "Edit Page",
"events": "Events",
"first-day-of-week": "First day of the week",
"group-settings-updated": "Group Settings Updated",
"homepage": {
"all-categories": "All Categories",
"card-per-section": "Card Per Section",
"home-page": "Home Page",
"home-page-sections": "Home Page Sections",
"show-recent": "Show Recent"
},
"language": "Language",
"latest": "Latest",
"local-api": "Local API",
"locale-settings": "Locale settings",
"migrations": "Migrations",
"new-page": "New Page",
"notify": "Notify",
"organize": "Organise",
"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",
"theme": {
"accent": "Accent",
"dark": "Dark",
"default-to-system": "Default to system",
"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",
"info": "Info",
"light": "Light",
"primary": "Primary",
"secondary": "Secondary",
"success": "Success",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"theme-deleted": "Theme deleted",
"theme-name": "Theme Name",
"theme-name-is-required": "Theme Name is required.",
"theme-saved": "Theme Saved",
"theme-updated": "Theme updated",
"warning": "Warning"
},
"token": {
"active-tokens": "ACTIVE TOKENS",
"api-token": "API Token",
"api-tokens": "API Tokens",
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
"create-an-api-token": "Create an API Token",
"token-name": "Token Name"
},
"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",
"unorganized": "Unorganised"
},
"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 its scheduled day. Currently Webhooks will execute at",
"webhook-url": "Webhook URL",
"webhooks-caps": "WEBHOOKS"
}
},
"shopping-list": {
"all-lists": "All Lists",
"create-shopping-list": "Create Shopping List",
"from-recipe": "From Recipe",
"list-name": "List Name",
"new-list": "New List",
"quantity": "Quantity: {0}",
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"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 received an invitation you are unable to sign-up. To receive a link, contact the sites administrator."
},
"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",
"tags": "Tags",
"untagged-count": "Untagged {count}"
},
"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": "Email must be valid",
"edit-user": "Edit User",
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",
"logout": "Logout",
"manage-users": "Manage Users",
"new-password": "New Password",
"new-user": "New User",
"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": "User",
"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",
"username": "Username",
"users": "Users",
"users-header": "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"
}
}

View File

@@ -1,4 +1,8 @@
{
"404": {
"page-not-found": "404 Page Not Found",
"take-me-home": "Take me Home"
},
"about": {
"about": "About",
"about-mealie": "About Mealie",
@@ -22,17 +26,8 @@
"support": "Support",
"version": "Version"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
"show-assets": "Show Assets"
},
"category": {
"category": "Category",
"category-created": "Category created",
"category-creation-failed": "Category creation failed",
"category-deleted": "Category Deleted",
@@ -45,17 +40,17 @@
"events": {
"apprise-url": "Apprise URL",
"database": "Database",
"delete-event": "Delete Event",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent"
"test-message-sent": "Test Message Sent",
"refresh": "Refresh",
"new-version": "New version available!"
},
"general": {
"apply": "Apply",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
@@ -64,6 +59,7 @@
"copied": "Copied",
"create": "Create",
"created": "Created",
"current-parenthesis": "(Current)",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
@@ -82,19 +78,18 @@
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"image": "Image",
"image-upload-failed": "Image upload failed",
"import": "Import",
"json": "JSON",
"keyword": "Keyword",
"link": "Link",
"link-copied": "Link Copied",
"loading-recipes": "Loading Recipes",
"monday": "Monday",
"more": "More",
"name": "Name",
"new": "New",
"no": "No",
"no-recipe-found": "No Recipe Found",
"ok": "OK",
"options": "Options:",
"print": "Print",
@@ -144,8 +139,8 @@
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
@@ -197,20 +192,13 @@
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
"error-title": "Looks Like We Couldn't Find Anything",
"from-url": "Import a Recipe",
"github-issues": "GitHub Issues",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Must be a Valid URL",
"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-markup-specification": "Recipe Markup Specification",
"recipe-url": "Recipe URL",
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"view-scraped-data": "View Scraped Data"
"url-form-hint": "Copy and paste a link from your favorite recipe website"
},
"page": {
"404-page-not-found": "404 Page not found",
"all-recipes": "All Recipes",
"home-page": "Home Page",
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
@@ -219,12 +207,14 @@
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated"
"pages-updated": "Pages updated",
"recent": "Recent"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"assets": "Assets",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
@@ -246,9 +236,11 @@
"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",
@@ -268,17 +260,18 @@
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"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"
"unable-to-delete-recipe": "Unable to Delete Recipe",
"view-recipe": "View Recipe"
},
"reicpe": {
"no-recipe": "No Recipe"
@@ -299,12 +292,12 @@
"settings": {
"add-a-new-theme": "Add a New Theme",
"admin-settings": "Admin Settings",
"available-backups": "Available Backups",
"backup": {
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
@@ -312,6 +305,7 @@
"unable-to-delete-backup": "Unable to Delete 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",
@@ -344,8 +338,12 @@
"site-settings": "Site Settings",
"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",
@@ -354,13 +352,16 @@
"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",
"switch-to-dark-mode": "Switch to dark mode",
"switch-to-light-mode": "Switch to light mode",
"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"
},
@@ -384,6 +385,7 @@
"unorganized": "Unorganized"
},
"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",
@@ -400,20 +402,8 @@
"shopping-list": "Shopping List",
"shopping-lists": "Shopping Lists"
},
"sidebar": {
"all-recipes": "All Recipes",
"categories": "Categories",
"dashboard": "Dashboard",
"home-page": "Home Page",
"manage-users": "Manage Users",
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"tags": "Tags",
"toolbox": "Toolbox"
},
"signup": {
"display-name": "Display Name",
"error-signing-up": "Error Signing Up",
"sign-up": "Sign Up",
"sign-up-link-created": "Sign up link created",
@@ -450,6 +440,7 @@
"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",
"link-id": "Link ID",
"link-name": "Link Name",
"login": "Login",

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