Compare commits

..

31 Commits
1.2.4 ... 1.2.5

Author SHA1 Message Date
vabene1111
378938812c update recipe scrapers 2022-05-11 20:42:28 +02:00
vabene1111
60b494abeb workflow name 2022-05-11 20:30:17 +02:00
vabene1111
34be1dc1d7 removed notification from raspi build 2022-05-11 20:14:53 +02:00
vabene1111
d89a4620f0 meal plan remove old add to shopping 2022-05-11 19:59:04 +02:00
vabene1111
dea83b5720 fixed duplication of values in recipe editor 2022-05-11 19:31:44 +02:00
vabene1111
d9ebe3e0fb fixed original text rendering in recipe edito view 2022-05-11 19:25:48 +02:00
vabene1111
135dde247f fixed static path generation 2022-05-11 19:17:40 +02:00
vabene1111
eb7a667202 fixed cookmate importer 2022-05-11 19:10:56 +02:00
Kaibu
b3cc9967f5 Merge branch 'develop' of https://github.com/TandoorRecipes/recipes into develop 2022-05-11 17:10:18 +02:00
Kaibu
7276cea3d5 multiple ux fixes 2022-05-11 17:10:12 +02:00
vabene1111
c0c996622e made shopping new entry translatable 2022-05-11 17:06:34 +02:00
vabene1111
5556555bca fixed paprika servings import 2022-05-11 17:05:47 +02:00
vabene1111
55a84494c9 fixed issue with plan to eat importer 2022-05-11 16:53:20 +02:00
vabene1111
74d778dcb8 compiled messages 2022-05-11 16:45:34 +02:00
vabene1111
156d68f1b8 added link to shopping recipes 2022-05-11 16:42:52 +02:00
vabene1111
cb59a6340d Merge pull request #1788 from gloriousDan/fix-import
Fix import with recipe-scrapers
2022-05-11 16:37:41 +02:00
vabene1111
5eb013cc2f Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2022-05-11 16:22:18 +02:00
vabene1111
dafb26b500 updated raspi docs 2022-05-11 16:22:13 +02:00
vabene1111
d9416a42dc Merge pull request #1786 from gloriousDan/dockerfile-armv7
Build pillow for armv7/ raspi
2022-05-11 16:17:45 +02:00
Jesse
ad88eff9e3 Translated using Weblate (Dutch)
Currently translated at 100.0% (528 of 528 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2022-05-10 15:32:17 +00:00
zeon
4d4f623adf Translated using Weblate (Bulgarian)
Currently translated at 100.0% (412 of 412 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/bg/
2022-05-10 15:32:16 +00:00
Mathias Rasmussen
ac9c9cd4e3 Translated using Weblate (Danish)
Currently translated at 100.0% (528 of 528 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/da/
2022-05-10 15:32:15 +00:00
Jesse
580eeef6b7 Translated using Weblate (Dutch)
Currently translated at 100.0% (412 of 412 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2022-05-10 15:32:13 +00:00
zeon
f25f5a26cf Translated using Weblate (Bulgarian)
Currently translated at 100.0% (528 of 528 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/bg/
2022-05-10 15:32:11 +00:00
Mathias Rasmussen
972d43c2a2 Translated using Weblate (Danish)
Currently translated at 100.0% (412 of 412 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2022-05-10 15:32:09 +00:00
Daniel Schulz
2a7475c435 Call scrape_me first when scraping from url 2022-05-10 00:08:37 +02:00
Daniel Schulz
71b41efe6c Build pillow for armv7/ raspi 2022-05-09 13:24:59 +02:00
zeon
33a7fee1cc Added translation using Weblate (Bulgarian) 2022-05-08 21:25:53 +00:00
zeon
fa7fb644ea Added translation using Weblate (Bulgarian) 2022-05-08 20:44:02 +00:00
Mathias Rasmussen
13b996171a Translated using Weblate (Danish)
Currently translated at 1.9% (8 of 412 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2022-05-07 16:49:26 +00:00
Kim Dannemand
77bb3870bf Translated using Weblate (Danish)
Currently translated at 1.9% (8 of 412 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2022-05-07 16:49:26 +00:00
43 changed files with 4883 additions and 1048 deletions

View File

@@ -1,4 +1,4 @@
name: publish beta image docker
name: publish beta raspi image docker
on:
push:
branches:

View File

@@ -45,10 +45,3 @@ jobs:
tag: ${{ steps.get_version.outputs.VERSION }}-raspi
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}'

View File

@@ -2,7 +2,7 @@
FROM python:3.9-alpine3.15
#Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography openldap
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography openldap gcompat
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
@@ -15,19 +15,16 @@ RUN mkdir /opt/recipes
WORKDIR /opt/recipes
COPY requirements.txt ./
RUN \
if [ `apk --print-arch` = "armv7" ]; then \
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
fi
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev && \
RUN apk add --no-cache --virtual .build-deps gcc musl-dev zlib-dev jpeg-dev libwebp-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
venv/bin/pip install wheel==0.37.1 && \
venv/bin/pip install setuptools_rust==1.1.2 && \
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
venv/bin/pip install -r requirements.txt --no-cache-dir --no-binary=Pillow && \
apk --purge del .build-deps
#Copy project and execute it.

View File

@@ -9,6 +9,8 @@ from recipe_scrapers._utils import get_host_name, normalize_string
from cookbook.helper import recipe_url_import as helper
from cookbook.helper.scrapers.scrapers import text_scraper
from recipe_scrapers import scrape_me
from recipe_scrapers._exceptions import NoSchemaFoundInWildMode
def get_recipe_from_source(text, url, request):
@@ -63,34 +65,41 @@ def get_recipe_from_source(text, url, request):
html_data = []
images = []
text = unquote(text)
scrape = None
try:
parse_list.append(remove_graph(json.loads(text)))
if not url and 'url' in parse_list[0]:
url = parse_list[0]['url']
scrape = text_scraper("<script type='application/ld+json'>" + text + "</script>", url=url)
if url:
try:
scrape = scrape_me(url_path=url, wild_mode=True)
except(NoSchemaFoundInWildMode):
pass
if not scrape:
try:
parse_list.append(remove_graph(json.loads(text)))
if not url and 'url' in parse_list[0]:
url = parse_list[0]['url']
scrape = text_scraper("<script type='application/ld+json'>" + text + "</script>", url=url)
except JSONDecodeError:
soup = BeautifulSoup(text, "html.parser")
html_data = get_from_html(soup)
images += get_images_from_source(soup, url)
for el in soup.find_all('script', type='application/ld+json'):
el = remove_graph(el)
if not url and 'url' in el:
url = el['url']
if type(el) == list:
for le in el:
parse_list.append(le)
elif type(el) == dict:
parse_list.append(el)
for el in soup.find_all(type='application/json'):
el = remove_graph(el)
if type(el) == list:
for le in el:
parse_list.append(le)
elif type(el) == dict:
parse_list.append(el)
scrape = text_scraper(text, url=url)
except JSONDecodeError:
soup = BeautifulSoup(text, "html.parser")
html_data = get_from_html(soup)
images += get_images_from_source(soup, url)
for el in soup.find_all('script', type='application/ld+json'):
el = remove_graph(el)
if not url and 'url' in el:
url = el['url']
if type(el) == list:
for le in el:
parse_list.append(le)
elif type(el) == dict:
parse_list.append(el)
for el in soup.find_all(type='application/json'):
el = remove_graph(el)
if type(el) == list:
for le in el:
parse_list.append(le)
elif type(el) == dict:
parse_list.append(el)
scrape = text_scraper(text, url=url)
recipe_json = helper.get_from_scraper(scrape, request)

View File

@@ -114,7 +114,14 @@ def get_from_scraper(scrape, request):
except Exception:
pass
if source_url := scrape.url:
try:
source_url = scrape.canonical_url()
except Exception:
try:
source_url = scrape.url
except Exception:
pass
if source_url:
recipe_json['source_url'] = source_url
try:
keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0])
@@ -129,9 +136,11 @@ def get_from_scraper(scrape, request):
ingredient_parser = IngredientParser(request, True)
recipe_json['steps'] = []
for i in parse_instructions(scrape.instructions()):
recipe_json['steps'].append({'instruction': i, 'ingredients': [], })
try:
for i in parse_instructions(scrape.instructions()):
recipe_json['steps'].append({'instruction': i, 'ingredients': [], })
except Exception:
pass
if len(recipe_json['steps']) == 0:
recipe_json['steps'].append({'instruction': '', 'ingredients': [], })

View File

@@ -1,6 +1,6 @@
from bs4 import BeautifulSoup
from json import JSONDecodeError
from recipe_scrapers import SCRAPERS, get_host_name
from recipe_scrapers import SCRAPERS
from recipe_scrapers._factory import SchemaScraperFactory
from recipe_scrapers._schemaorg import SchemaOrg
@@ -15,13 +15,7 @@ SCRAPERS.update(CUSTOM_SCRAPERS)
def text_scraper(text, url=None):
domain = None
if url:
domain = get_host_name(url)
if domain in SCRAPERS:
scraper_class = SCRAPERS[domain]
else:
scraper_class = SchemaScraperFactory.SchemaScraper
scraper_class = SchemaScraperFactory.SchemaScraper
class TextScraper(scraper_class):
def __init__(

View File

@@ -28,17 +28,17 @@ class Cookmate(Integration):
name=recipe_xml.find('title').text.strip(),
created_by=self.request.user, internal=True, space=self.request.space)
if recipe_xml.find('preptime') is not None:
if recipe_xml.find('preptime') is not None and recipe_xml.find('preptime').text is not None:
recipe.working_time = parse_time(recipe_xml.find('preptime').text.strip())
if recipe_xml.find('cooktime') is not None:
if recipe_xml.find('cooktime') is not None and recipe_xml.find('cooktime').text is not None:
recipe.waiting_time = parse_time(recipe_xml.find('cooktime').text.strip())
if recipe_xml.find('quantity') is not None:
if recipe_xml.find('quantity') is not None and recipe_xml.find('quantity').text is not None:
recipe.servings = parse_servings(recipe_xml.find('quantity').text.strip())
recipe.servings_text = parse_servings_text(recipe_xml.find('quantity').text.strip())
if recipe_xml.find('url') is not None:
if recipe_xml.find('url') is not None and recipe_xml.find('url').text is not None:
recipe.source_url = recipe_xml.find('url').text.strip()
if recipe_xml.find('description') is not None: # description is a list of <li>'s with text

View File

@@ -27,7 +27,7 @@ class Paprika(Integration):
recipe.description = '' if len(recipe_json['description'].strip()) > 500 else recipe_json['description'].strip()
try:
if 'servings' in recipe_json['servings']:
if 'servings' in recipe_json:
recipe.servings = parse_servings(recipe_json['servings'])
recipe.servings_text = parse_servings_text(recipe_json['servings'])

View File

@@ -78,7 +78,11 @@ class Plantoeat(Integration):
current_recipe = ''
for fl in file.readlines():
line = fl.decode("windows-1250")
try:
line = fl.decode("utf-8")
except UnicodeDecodeError:
line = fl.decode("windows-1250")
if line.startswith('--------------'):
if current_recipe != '':
recipe_list.append(current_recipe)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -13,10 +13,10 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-29 18:42+0200\n"
"PO-Revision-Date: 2022-04-05 10:31+0000\n"
"PO-Revision-Date: 2022-05-10 15:32+0000\n"
"Last-Translator: Jesse <jesse.kamps@pm.me>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/nl/>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -84,7 +84,7 @@ msgstr "Opmerkingen"
#: .\cookbook\forms.py:69
msgid "Left-handed mode"
msgstr ""
msgstr "Linkshandigen modus"
#: .\cookbook\forms.py:73
msgid ""
@@ -161,7 +161,7 @@ msgstr "Sluit ingrediënten die op voorraad zijn uit."
#: .\cookbook\forms.py:93
msgid "Will optimize the UI for use with your left hand."
msgstr ""
msgstr "Optimaliseert de gebruikersinterface voor gebruik met je linkerhand."
#: .\cookbook\forms.py:110
msgid ""
@@ -547,7 +547,7 @@ msgstr "Sjablooncode kon niet verwerkt worden."
#: .\cookbook\integration\copymethat.py:42
#: .\cookbook\integration\melarecipes.py:37
msgid "Favorite"
msgstr ""
msgstr "Favoriet"
#: .\cookbook\integration\copymethat.py:71
#: .\cookbook\integration\recettetek.py:53
@@ -722,10 +722,8 @@ msgid "Recipe"
msgstr "Recept"
#: .\cookbook\models.py:1163
#, fuzzy
#| msgid "Foods"
msgid "Food"
msgstr "Ingrediënten"
msgstr "Ingrediënt"
#: .\cookbook\models.py:1164 .\cookbook\templates\base.html:138
msgid "Keyword"
@@ -1138,10 +1136,8 @@ msgstr "Geschiedenis"
#: .\cookbook\templates\base.html:252
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
#, fuzzy
#| msgid "Ingredients"
msgid "Ingredient Editor"
msgstr "Ingrediënten"
msgstr "Ingrediënteneditor"
#: .\cookbook\templates\base.html:264
#: .\cookbook\templates\export_response.html:7
@@ -1198,11 +1194,11 @@ msgstr "Uitloggen"
#: .\cookbook\templates\base.html:342
msgid "You are using the free version of Tandor"
msgstr ""
msgstr "Je gebruikt de gratis versie van Tandoor"
#: .\cookbook\templates\base.html:342
msgid "Upgrade Now"
msgstr ""
msgstr "Upgrade nu"
#: .\cookbook\templates\batch\edit.html:6
msgid "Batch edit Category"
@@ -1731,7 +1727,7 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:27
#: .\cookbook\templates\socialaccount\authentication_error.html:27
msgid "Back"
msgstr ""
msgstr "Terug"
#: .\cookbook\templates\recipe_view.html:26
msgid "by"
@@ -2180,17 +2176,15 @@ msgstr "Maak Superuser acount"
#: .\cookbook\templates\socialaccount\authentication_error.html:7
#: .\cookbook\templates\socialaccount\authentication_error.html:23
#, fuzzy
#| msgid "Social Login"
msgid "Social Network Login Failure"
msgstr "Socials login"
msgstr "Inloggen op sociaal netwerk mislukt"
#: .\cookbook\templates\socialaccount\authentication_error.html:25
#, fuzzy
#| msgid "An error occurred attempting to move "
msgid ""
"An error occurred while attempting to login via your social network account."
msgstr "Er is een error opgetreden bij het verplaatsen "
msgstr ""
"Er is een fout opgetreden tijdens het inloggen via je sociale netwerk "
"account."
#: .\cookbook\templates\socialaccount\connections.html:4
#: .\cookbook\templates\socialaccount\connections.html:15
@@ -2542,33 +2536,39 @@ msgstr ""
"op volledige tekst ondersteund."
#: .\cookbook\views\api.py:671
#, fuzzy
#| msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
"ID van etiket dat een recept moet hebben. Herhaal parameter voor meerdere."
"ID van etiket dat een recept moet hebben. Herhaal parameter voor meerdere. "
"Gelijkwaardig aan keywords_or"
#: .\cookbook\views\api.py:674
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Etiket ID, herhaal voor meerdere. Geeft recepten met elk geselecteerd etiket "
"weer"
#: .\cookbook\views\api.py:677
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Geeft recepten met alle geselecteerde "
"etiketten weer."
#: .\cookbook\views\api.py:680
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Sluit recepten met één van de etiketten "
"uit."
#: .\cookbook\views\api.py:683
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Sluit recepten met alle etiketten uit."
#: .\cookbook\views\api.py:685
msgid "ID of food a recipe should have. For multiple repeat parameter."
@@ -2579,18 +2579,25 @@ msgstr ""
#: .\cookbook\views\api.py:688
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Geeft recepten met elk ingrediënt weer"
#: .\cookbook\views\api.py:690
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Geef recepten met alle ingrediënten "
"weer."
#: .\cookbook\views\api.py:692
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. sluit recepten met één van de "
"ingrediënten uit."
#: .\cookbook\views\api.py:694
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Sluit recepten met alle ingrediënten "
"uit."
#: .\cookbook\views\api.py:695
msgid "ID of unit a recipe should have."
@@ -2600,7 +2607,7 @@ msgstr "ID van eenheid dat een recept moet hebben."
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
msgstr "Een waardering van een recept gaat van 0 tot 5."
#: .\cookbook\views\api.py:698
msgid "ID of book a recipe should be in. For multiple repeat parameter."
@@ -2609,19 +2616,20 @@ msgstr ""
#: .\cookbook\views\api.py:700
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
msgstr "Boek ID, herhaal voor meerdere. Geeft recepten uit alle boeken weer"
#: .\cookbook\views\api.py:702
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
msgstr "Boek IDs, herhaal voor meerdere. Geeft recepten weer uit alle boeken."
#: .\cookbook\views\api.py:704
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Boek IDs, herhaal voor meerdere. Sluit recepten uit elk van de boeken uit."
#: .\cookbook\views\api.py:706
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
msgstr "Boek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
#: .\cookbook\views\api.py:708
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
@@ -2642,37 +2650,46 @@ msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
"Filter recepten X maal of meer bereid. Negatieve waarden geven minder dan X "
"keer bereide recepten weer"
#: .\cookbook\views\api.py:716
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
"Filter recepten op laatst bereid op of na JJJJ-MM-DD. Voorafgaand - filters "
"op of voor datum."
#: .\cookbook\views\api.py:718
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
"Filter recepten aangemaakt op of na JJJJ-MM-DD. Voorafgaand - filters op of "
"voor datum."
#: .\cookbook\views\api.py:720
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
"Filter recepten op geüpdatet op of na JJJJ-MM-DD. Voorafgaand - filters op "
"of voor datum."
#: .\cookbook\views\api.py:722
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
"Filter recepten op laatst bekeken op of na JJJJ-MM-DD. Voorafgaand - filters "
"op of voor datum."
#: .\cookbook\views\api.py:724
#, fuzzy
#| msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Wanneer alleen interne recepten gevonden moeten worden. [waar/<b>onwaar</b>]"
"Filter recepten die bereid kunnen worden met ingrediënten die op voorraad "
"zijn. [waar/<b>onwaar</b>]"
#: .\cookbook\views\api.py:880
msgid ""
@@ -2718,7 +2735,7 @@ msgstr "Verbinding geweigerd."
#: .\cookbook\views\api.py:1200
msgid "Bad URL Schema."
msgstr ""
msgstr "Verkeerd URL schema."
#: .\cookbook\views\api.py:1206
msgid "No usable data could be found."
@@ -2812,10 +2829,8 @@ msgid "Shopping Categories"
msgstr "Boodschappencategorieën"
#: .\cookbook\views\lists.py:187
#, fuzzy
#| msgid "Filter"
msgid "Custom Filters"
msgstr "Filtreren"
msgstr "Aangepaste filters"
#: .\cookbook\views\lists.py:224
msgid "Steps"

View File

@@ -77,7 +77,7 @@
{% if not request.user.is_authenticated or request.user.userpreference.theme == request.user.userpreference.TANDOOR %}
<a class="navbar-brand p-0 me-2 justify-content-center" href="{% base_path request 'base' %}"
aria-label="Tandoor">
<img class="brand-icon" src="{% static 'assets/brand_logo.svg' %}" alt="Logo">
<img class="brand-icon" src="{% static 'assets/brand_logo.png' %}" alt="Logo">
</a>
{% endif %}
{% endif %}

View File

@@ -15,6 +15,7 @@ from cookbook.helper.mdx_attributes import MarkdownFormatExtension
from cookbook.helper.mdx_urlize import UrlizeExtension
from cookbook.models import Space, get_model_name
from recipes import settings
from recipes.settings import STATIC_URL
register = template.Library()
@@ -157,7 +158,7 @@ def base_path(request, path_type):
elif path_type == 'script':
return request.META.get('HTTP_X_SCRIPT_NAME', '')
elif path_type == 'static_base':
return static('vue/manifest.json').replace('vue/manifest.json', '')
return STATIC_URL
@register.simple_tag

View File

@@ -343,6 +343,11 @@ ProxyPassReverse / http://localhost:8080/ # replace port
!!!info
Always wait at least 2-3 minutes after the very first start, since migrations will take some time!
!!!warning
If you want to use Tandoor on a Raspberry Pi running a 32-bit operating system you will need to use the following
docker image tags: `latest-raspi`, `beta-raspi` and the versioned `<x.y.z>-raspi`
We strongly recommend using the new 64-bit Raspian image as the 32-bit version is not tested.
If you're having issues with installing Tandoor on your Raspberry Pi or similar device,
follow these instructions:

View File

@@ -366,8 +366,10 @@ USE_TZ = True
LANGUAGES = [
('hy', _('Armenian ')),
('bg', _('Bulgarian')),
('ca', _('Catalan')),
('cs', _('Czech')),
('da', _('Danish')),
('nl', _('Dutch')),
('en', _('English')),
('fr', _('French')),

View File

@@ -29,7 +29,7 @@ Jinja2==3.1.1
django-webpack-loader==1.4.1
django-js-reverse==0.9.1
django-allauth==0.50.0
recipe-scrapers==13.32.0
recipe-scrapers==13.32.1
django-scopes==1.2.0
pytest==7.1.1
pytest-django==4.5.2

View File

@@ -22,7 +22,7 @@
}}!
</b-badge>
<b-badge variant="primary" v-else class="float-right">
{{ $t('Import_running') }}
{{ $t('import_running') }}
<b-spinner small class="d-inline-block"></b-spinner>
</b-badge>
</h4>

View File

@@ -54,14 +54,20 @@
<div class="col-12 col-md-3 calender-options">
<h5>{{ $t("Planner_Settings") }}</h5>
<b-form>
<b-form-group id="UomInput" :label="$t('Period')" :description="$t('Plan_Period_To_Show')" label-for="UomInput">
<b-form-select id="UomInput" v-model="settings.displayPeriodUom" :options="options.displayPeriodUom"></b-form-select>
<b-form-group id="UomInput" :label="$t('Period')" :description="$t('Plan_Period_To_Show')"
label-for="UomInput">
<b-form-select id="UomInput" v-model="settings.displayPeriodUom"
:options="options.displayPeriodUom"></b-form-select>
</b-form-group>
<b-form-group id="PeriodInput" :label="$t('Periods')" :description="$t('Plan_Show_How_Many_Periods')" label-for="PeriodInput">
<b-form-select id="PeriodInput" v-model="settings.displayPeriodCount" :options="options.displayPeriodCount"></b-form-select>
<b-form-group id="PeriodInput" :label="$t('Periods')"
:description="$t('Plan_Show_How_Many_Periods')" label-for="PeriodInput">
<b-form-select id="PeriodInput" v-model="settings.displayPeriodCount"
:options="options.displayPeriodCount"></b-form-select>
</b-form-group>
<b-form-group id="DaysInput" :label="$t('Starting_Day')" :description="$t('Starting_Day')" label-for="DaysInput">
<b-form-select id="DaysInput" v-model="settings.startingDayOfWeek" :options="dayNames"></b-form-select>
<b-form-group id="DaysInput" :label="$t('Starting_Day')" :description="$t('Starting_Day')"
label-for="DaysInput">
<b-form-select id="DaysInput" v-model="settings.startingDayOfWeek"
:options="dayNames"></b-form-select>
</b-form-group>
<b-form-group id="WeekNumInput" :label="$t('Week_Numbers')">
<b-form-checkbox v-model="settings.displayWeekNumbers" name="week_num">
@@ -73,19 +79,25 @@
<div class="col-12 col-md-9 col-lg-6">
<h5>{{ $t("Meal_Types") }}</h5>
<div>
<draggable :list="meal_types" group="meal_types" :empty-insert-threshold="10" @sort="sortMealTypes()" ghost-class="ghost">
<b-card no-body class="mt-1 list-group-item p-2" style="cursor: move" v-for="(meal_type, index) in meal_types" v-hover :key="meal_type.id">
<draggable :list="meal_types" group="meal_types" :empty-insert-threshold="10"
@sort="sortMealTypes()" ghost-class="ghost">
<b-card no-body class="mt-1 list-group-item p-2" style="cursor: move"
v-for="(meal_type, index) in meal_types" v-hover :key="meal_type.id">
<b-card-header class="p-2 border-0">
<div class="row">
<div class="col-2">
<button type="button" class="btn btn-lg shadow-none"><i class="fas fa-arrows-alt-v"></i></button>
<button type="button" class="btn btn-lg shadow-none"><i
class="fas fa-arrows-alt-v"></i></button>
</div>
<div class="col-10">
<h5 class="mt-1 mb-1">
{{ meal_type.icon }} {{ meal_type.name
{{ meal_type.icon }} {{
meal_type.name
}}<span class="float-right text-primary" style="cursor: pointer"
><i class="fa" v-bind:class="{ 'fa-pen': !meal_type.editing, 'fa-save': meal_type.editing }" @click="editOrSaveMealType(index)" aria-hidden="true"></i
></span>
><i class="fa"
v-bind:class="{ 'fa-pen': !meal_type.editing, 'fa-save': meal_type.editing }"
@click="editOrSaveMealType(index)" aria-hidden="true"></i
></span>
</h5>
</div>
</div>
@@ -93,19 +105,27 @@
<b-card-body class="p-4" v-if="meal_type.editing">
<div class="form-group">
<label>{{ $t("Name") }}</label>
<input class="form-control" :placeholder="$t('Name')" v-model="meal_type.name" />
<input class="form-control" :placeholder="$t('Name')"
v-model="meal_type.name"/>
</div>
<div class="form-group">
<emoji-input :field="'icon'" :label="$t('Icon')" :value="meal_type.icon"></emoji-input>
<emoji-input :field="'icon'" :label="$t('Icon')"
:value="meal_type.icon"></emoji-input>
</div>
<div class="form-group">
<label>{{ $t("Color") }}</label>
<input class="form-control" type="color" name="Name" :value="meal_type.color" @change="meal_type.color = $event.target.value" />
<input class="form-control" type="color" name="Name"
:value="meal_type.color"
@change="meal_type.color = $event.target.value"/>
</div>
<b-form-checkbox id="checkbox-1" v-model="meal_type.default" name="default_checkbox" class="mb-2">
<b-form-checkbox id="checkbox-1" v-model="meal_type.default"
name="default_checkbox" class="mb-2">
{{ $t("Default") }}
</b-form-checkbox>
<button class="btn btn-danger" @click="deleteMealType(index)">{{ $t("Delete") }}</button>
<button class="btn btn-danger" @click="deleteMealType(index)">{{
$t("Delete")
}}
</button>
<button class="btn btn-primary float-right" @click="editOrSaveMealType(index)">
{{ $t("Save") }}
</button>
@@ -129,7 +149,9 @@
openEntryEdit(contextData.originalItem.entry)
"
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-pen"></i> {{ $t("Edit") }}</a>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-pen"></i> {{
$t("Edit")
}}</a>
</ContextMenuItem>
<ContextMenuItem
v-if="contextData && contextData.originalItem && contextData.originalItem.entry.recipe != null"
@@ -138,7 +160,8 @@
openRecipe(contextData.originalItem.entry.recipe)
"
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-pizza-slice"></i> {{ $t("Recipe") }}</a>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-pizza-slice"></i>
{{ $t("Recipe") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
@@ -146,7 +169,8 @@
moveEntryLeft(contextData)
"
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-left"></i> {{ $t("Move") }}</a>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-left"></i>
{{ $t("Move") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
@@ -154,7 +178,8 @@
moveEntryRight(contextData)
"
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-right"></i> {{ $t("Move") }}</a>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-right"></i>
{{ $t("Move") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
@@ -164,21 +189,14 @@
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-copy"></i> {{ $t("Clone") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
addToShopping(contextData)
"
>
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-shopping-cart"></i> {{ $t("Add_to_Shopping") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
deleteEntry(contextData)
"
>
<a class="dropdown-item p-2 text-danger" href="javascript:void(0)"><i class="fas fa-trash"></i> {{ $t("Delete") }}</a>
<a class="dropdown-item p-2 text-danger" href="javascript:void(0)"><i class="fas fa-trash"></i>
{{ $t("Delete") }}</a>
</ContextMenuItem>
</template>
</ContextMenu>
@@ -190,68 +208,43 @@
@delete-entry="deleteEntry"
@reload-meal-types="refreshMealTypes"
></meal-plan-edit-modal>
<template>
<div>
<b-sidebar id="sidebar-shopping" :title="$t('Shopping_list')" backdrop right shadow="sm">
<div class="row p-1 no-gutters">
<div class="col-12 mt-1" v-if="shopping_list.length === 0">
<p class="p-3">{{ $t("Shopping_List_Empty") }}</p>
</div>
<div class="col-12 mt-1" v-for="entry in shopping_list" v-bind:key="entry.id">
<b-card :header="`${entry.meal_type.icon} ${entry.recipe_name}`" no-body>
<template #footer>
<small class="text-muted">{{ `${$t("Servings")}: ${entry.servings}` }}</small>
</template>
</b-card>
</div>
<div class="col-12 mt-1" v-if="shopping_list.length > 0">
<b-button-group>
<b-button variant="success" @click="saveShoppingList"
><i class="fas fa-external-link-alt"></i>
{{ $t("Open") }}
</b-button>
<b-button variant="danger" @click="shopping_list = []"
><i class="fa fa-trash"></i>
{{ $t("Clear") }}
</b-button>
</b-button-group>
</div>
</div>
</b-sidebar>
</div>
</template>
<transition name="slide-fade">
<div class="row fixed-bottom p-2 b-1 border-top text-center" style="background: rgba(255, 255, 255, 0.6)" v-if="current_tab === 0">
<div class="row fixed-bottom p-2 b-1 border-top text-center" style="background: rgba(255, 255, 255, 0.6)"
v-if="current_tab === 0">
<div class="col-md-3 col-6">
<button class="btn btn-block btn-success shadow-none" @click="createEntryClick(new Date())"><i class="fas fa-calendar-plus"></i> {{ $t("Create") }}</button>
</div>
<div class="col-md-3 col-6">
<button class="btn btn-block btn-primary shadow-none" v-b-toggle.sidebar-shopping><i class="fas fa-shopping-cart"></i> {{ $t("Shopping_list") }}</button>
<button class="btn btn-block btn-success shadow-none" @click="createEntryClick(new Date())"><i
class="fas fa-calendar-plus"></i> {{ $t("Create") }}
</button>
</div>
<div class="col-md-3 col-6">
<a class="btn btn-block btn-primary shadow-none" :href="iCalUrl"
><i class="fas fa-download"></i>
><i class="fas fa-download"></i>
{{ $t("Export_To_ICal") }}
</a>
</div>
<div class="col-md-3 col-6">
<button class="btn btn-block btn-primary shadow-none disabled" v-b-tooltip.focus.top :title="$t('Coming_Soon')">
<button class="btn btn-block btn-primary shadow-none disabled" v-b-tooltip.focus.top
:title="$t('Coming_Soon')">
{{ $t("Auto_Planner") }}
</button>
</div>
<div class="col-12 d-flex justify-content-center mt-2 d-block d-md-none">
<b-button-toolbar key-nav aria-label="Toolbar with button groups">
<b-button-group class="mx-1">
<b-button v-html="'<<'" @click="setShowDate($refs.header.headerProps.previousPeriod)"></b-button>
<b-button v-html="'<'" @click="setStartingDay(-1)"></b-button>
<b-button v-html="'<<'" class="p-2 pr-3 pl-3"
@click="setShowDate($refs.header.headerProps.previousPeriod)"></b-button>
<b-button v-html="'<'" @click="setStartingDay(-1)" class="p-2 pr-3 pl-3"></b-button>
</b-button-group>
<b-button-group class="mx-1">
<b-button @click="setShowDate($refs.header.headerProps.currentPeriod)"><i class="fas fa-home"></i></b-button>
<b-button @click="setShowDate($refs.header.headerProps.currentPeriod)"><i
class="fas fa-home"></i></b-button>
<b-form-datepicker button-only button-variant="secondary"></b-form-datepicker>
</b-button-group>
<b-button-group class="mx-1">
<b-button v-html="'>'" @click="setStartingDay(1)"></b-button>
<b-button v-html="'>>'" @click="setShowDate($refs.header.headerProps.nextPeriod)"></b-button>
<b-button v-html="'>'" @click="setStartingDay(1)" class="p-2 pr-3 pl-3"></b-button>
<b-button v-html="'>>'" class="p-2 pr-3 pl-3"
@click="setShowDate($refs.header.headerProps.nextPeriod)"></b-button>
</b-button-group>
</b-button-toolbar>
</div>
@@ -262,7 +255,7 @@
<script>
import Vue from "vue"
import { BootstrapVue } from "bootstrap-vue"
import {BootstrapVue} from "bootstrap-vue"
import "bootstrap-vue/dist/bootstrap-vue.css"
import ContextMenu from "@/components/ContextMenu/ContextMenu"
@@ -276,11 +269,11 @@ import moment from "moment"
import draggable from "vuedraggable"
import VueCookies from "vue-cookies"
import { ApiMixin, StandardToasts, ResolveUrlMixin } from "@/utils/utils"
import { CalendarView, CalendarMathMixin } from "vue-simple-calendar/src/components/bundle"
import { ApiApiFactory } from "@/utils/openapi/api"
import {ApiMixin, StandardToasts, ResolveUrlMixin} from "@/utils/utils"
import {CalendarView, CalendarMathMixin} from "vue-simple-calendar/src/components/bundle"
import {ApiApiFactory} from "@/utils/openapi/api"
const { makeToast } = require("@/utils/utils")
const {makeToast} = require("@/utils/utils")
Vue.prototype.moment = moment
Vue.use(BootstrapVue)
@@ -318,12 +311,12 @@ export default {
current_context_menu_item: null,
options: {
displayPeriodUom: [
{ text: this.$t("Week"), value: "week" },
{text: this.$t("Week"), value: "week"},
{
text: this.$t("Month"),
value: "month",
},
{ text: this.$t("Year"), value: "year" },
{text: this.$t("Year"), value: "year"},
],
displayPeriodCount: [1, 2, 3],
entryEditing: {
@@ -367,7 +360,7 @@ export default {
dayNames: function () {
let options = []
this.getFormattedWeekdayNames(this.userLocale, "long", 0).forEach((day, index) => {
options.push({ text: day, value: index })
options.push({text: day, value: index})
})
return options
},
@@ -412,27 +405,6 @@ export default {
openRecipe: function (recipe) {
window.open(this.resolveDjangoUrl("view_recipe", recipe.id))
},
addToShopping(entry) {
if (entry.originalItem.entry.recipe !== null) {
this.shopping_list.push(entry.originalItem.entry)
makeToast(this.$t("Success"), this.$t("Added_To_Shopping_List"), "success")
} else {
makeToast(this.$t("Failure"), this.$t("Cannot_Add_Notes_To_Shopping"), "danger")
}
},
saveShoppingList() {
let url = window.SHOPPING_URL
let first = true
for (let se of this.shopping_list) {
if (first) {
url += `?r=[${se.recipe.id},${se.servings}]`
first = false
} else {
url += `&r=[${se.recipe.id},${se.servings}]`
}
}
window.open(url)
},
setStartingDay(days) {
if (this.settings.startingDayOfWeek + days < 0) {
this.settings.startingDayOfWeek = 6
@@ -446,12 +418,12 @@ export default {
let apiClient = new ApiApiFactory()
apiClient
.createMealType({ name: this.$t("Meal_Type") })
.createMealType({name: this.$t("Meal_Type")})
.then((e) => {
this.periodChangedCallback(this.current_period)
})
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
this.refreshMealTypes()
@@ -474,7 +446,7 @@ export default {
}
})
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
})
},
@@ -488,10 +460,10 @@ export default {
.updateMealType(this.meal_types[index].id, this.meal_types[index])
.then((e) => {
this.periodChangedCallback(this.current_period)
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_UPDATE)
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
})
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
} else {
this.$set(this.meal_types[index], "editing", true)
@@ -504,10 +476,10 @@ export default {
.destroyMealType(this.meal_types[index].id)
.then((e) => {
this.periodChangedCallback(this.current_period)
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_DELETE)
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_DELETE)
})
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_DELETE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_DELETE, err)
})
},
updateEmoji: function (field, value) {
@@ -583,7 +555,7 @@ export default {
list.splice(index, 1)
})
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
}
})
@@ -635,7 +607,7 @@ export default {
let apiClient = new ApiApiFactory()
apiClient.updateMealPlan(entry.id, entry).catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
},
createEntry(entry) {
@@ -646,7 +618,7 @@ export default {
apiClient
.createMealPlan(entry)
.catch((err) => {
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_UPDATE, err)
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
.then((entry_result) => {
this.plan_entries.push(entry_result.data)
@@ -694,7 +666,7 @@ export default {
}
.calender-row {
height: calc(100% - 240px);
height: calc(100vh - 240px);
}
.calender-parent {

View File

@@ -370,7 +370,7 @@
<div v-for="(ingredient, index) in step.ingredients"
:key="ingredient.id">
<hr class="d-md-none"/>
<div class="text-center">
<div class="text-center" v-if="ingredient.original_text !== null">
<small class="text-muted"><i class="fas fa-globe"></i>
{{ ingredient.original_text }}</small>
</div>
@@ -943,6 +943,7 @@ export default {
order: 0,
is_header: false,
no_amount: false,
original_text: null,
})
this.sortIngredients(step)
this.$nextTick(() => document.getElementById(`amount_${this.recipe.steps.indexOf(step)}_${step.ingredients.length - 1}`).select())
@@ -1029,11 +1030,11 @@ export default {
.listUnits(query, 1, this.options_limit)
.then((response) => {
this.units = response.data.results
let unique_units = this.units.map(u => u.name)
if (this.recipe !== undefined) {
for (let s of this.recipe.steps) {
for (let i of s.ingredients) {
if (i.unit !== null && i.unit.id === undefined) {
if (i.unit !== null && i.unit.id === undefined && !unique_units.includes(i.unit.name) ) {
this.units.push(i.unit)
}
}
@@ -1053,11 +1054,11 @@ export default {
.listFoods(query, undefined, undefined, 1, this.options_limit)
.then((response) => {
this.foods = response.data.results
let unique_foods = this.foods.map(f => f.name)
if (this.recipe !== undefined) {
for (let s of this.recipe.steps) {
for (let i of s.ingredients) {
if (i.food !== null && i.food.id === undefined) {
if (i.food !== null && i.food.id === undefined && !unique_foods.includes(i.food.name)) {
this.foods.push(i.food)
}
}

View File

@@ -234,7 +234,7 @@
</thead>
<tr v-for="r in Recipes" :key="r.list_recipe">
<td>{{ r.recipe_mealplan.name }}</td>
<td>{{ r.recipe_mealplan.recipe_name }}</td>
<td><a :href="resolveDjangoUrl('view_recipe', r.recipe_mealplan.recipe)">{{ r.recipe_mealplan.recipe_name }}</a></td>
<td class="block-inline">
<b-form-input min="1" type="number" :debounce="300"
:value="r.recipe_mealplan.servings"
@@ -648,7 +648,7 @@
<div class="col-6">
<a class="btn btn-block btn-success shadow-none" @click="entrymode = !entrymode; "
><i class="fas fa-cart-plus"></i>
{{ $t("New Entry") }}
{{ $t("New_Entry") }}
</a>
</div>
<div class="col-6">
@@ -781,7 +781,7 @@ import GenericMultiselect from "@/components/GenericMultiselect"
import LookupInput from "@/components/Modals/LookupInput"
import ShoppingModal from "@/components/Modals/ShoppingModal"
import {ApiMixin, getUserPreference, StandardToasts, makeToast} from "@/utils/utils"
import {ApiMixin, getUserPreference, StandardToasts, makeToast, ResolveUrlMixin} from "@/utils/utils"
import {ApiApiFactory} from "@/utils/openapi/api"
Vue.use(BootstrapVue)
@@ -790,7 +790,7 @@ let SETTINGS_COOKIE_NAME = "shopping_settings"
export default {
name: "ShoppingListView",
mixins: [ApiMixin],
mixins: [ApiMixin,ResolveUrlMixin],
components: {
ContextMenu,
ContextMenuItem,
@@ -1756,7 +1756,7 @@ export default {
flex-grow: 1;
overflow-y: scroll;
overflow-x: hidden;
height: calc(100% - 170px);
height: calc(100vh - 170px);
}
#id_base_container {
@@ -1764,6 +1764,10 @@ export default {
padding-left: 5px;
}
input {
font-size: 16px !important;
}
@media (max-width: 991.9px) {
#shoppinglist {
max-width: none;

414
vue/src/locales/bg.json Normal file
View File

@@ -0,0 +1,414 @@
{
"warning_feature_beta": "Тази функция в момента е в състояние на БЕТА (тестване). Моля, очаквайте грешки и евентуално нарушаващи промени в бъдеще (евентуално загуба на данни, свързани с функции), когато използвате тази функция.",
"err_fetching_resource": "Възникна грешка при извличането на ресурс!",
"err_creating_resource": "Възникна грешка при създаването на ресурс!",
"err_updating_resource": "Възникна грешка при актуализирането на ресурс!",
"err_deleting_resource": "Възникна грешка при изтриването на ресурс!",
"err_deleting_protected_resource": "Обектът, който се опитвате да изтриете, все още се използва и не може да бъде изтрит.",
"err_moving_resource": "Възникна грешка при преместването на ресурс!",
"err_merging_resource": "Възникна грешка при обединяването на ресурс!",
"success_fetching_resource": "Ресурсът бе извлечен успешно!",
"success_creating_resource": "Успешно създаден ресурс!",
"success_updating_resource": "Успешно актуализиран ресурс!",
"success_deleting_resource": "Успешно изтрит ресурс!",
"success_moving_resource": "Успешно преместен ресурс!",
"success_merging_resource": "Успешно обединен ресурс!",
"file_upload_disabled": "Качването на файлове не е активирано за вашето пространство.",
"step_time_minutes": "Време за стъпка в минути",
"confirm_delete": "Наистина ли искате да изтриете този {object}?",
"import_running": "Импортирането се изпълнява, моля, изчакайте!",
"all_fields_optional": "Всички полета са незадължителни и могат да бъдат оставени празни.",
"convert_internal": "Превърнете във вътрешна рецепта",
"show_only_internal": "Показване само на вътрешни рецепти",
"show_split_screen": "Разделен изглед",
"Log_Recipe_Cooking": "Дневник на Рецепта за готвене",
"External_Recipe_Image": "Външно изображение на рецептата",
"Add_to_Shopping": "Добавяне към пазаруване",
"Add_to_Plan": "Добавяне към плана",
"Step_start_time": "Стъпка Начално време",
"Sort_by_new": "Сортиране по ново",
"Table_of_Contents": "Съдържание",
"Recipes_per_page": "Рецепти на страница",
"Show_as_header": "Показване като заглавка",
"Hide_as_header": "Скриване като заглавка",
"Add_nutrition_recipe": "Добавете хранителни стойности към рецептата",
"Remove_nutrition_recipe": "Изтрийте хранителните стойности от рецептата",
"Copy_template_reference": "Копирайте препратка към шаблона",
"Save_and_View": "Запазете и прегледайте",
"Manage_Books": "Управление на Книги",
"Meal_Plan": "План на хранене",
"Select_Book": "Изберете Книга",
"Select_File": "Избери файл",
"Recipe_Image": "Изображение на рецептата",
"Import_finished": "Импортирането приключи",
"View_Recipes": "Вижте рецепти",
"Log_Cooking": "Дневник на Готвене",
"New_Recipe": "Нова рецепта",
"Url_Import": "Импортиране на URL адрес",
"Reset_Search": "Нулиране на търсенето",
"Recently_Viewed": "Наскоро разгледани",
"Load_More": "Зареди още",
"New_Keyword": "Нова ключова дума",
"Delete_Keyword": "Изтриване на ключова дума",
"Edit_Keyword": "Редактиране на ключова дума",
"Edit_Recipe": "Редактиране на рецепта",
"Move_Keyword": "Преместване на ключова дума",
"Merge_Keyword": "Обединяване на ключова дума",
"Hide_Keywords": "Скриване на ключова дума",
"Hide_Recipes": "Скриване на рецепти",
"Move_Up": "Премести нагоре",
"Move_Down": "Премести надолу",
"Step_Name": "Стъпка Име",
"Step_Type": "Стъпка Тип",
"Make_Header": "Направете заглавие",
"Make_Ingredient": "Направете съставка",
"Enable_Amount": "Активиране на сумата",
"Disable_Amount": "Деактивиране на сумата",
"Ingredient Editor": "Редактор на съставки",
"Add_Step": "Добавяне Стъпка",
"Keywords": "Ключови думи",
"Books": "Книги",
"Proteins": "Протеини (белтъчини)",
"Fats": "Мазнини",
"Carbohydrates": "Въглехидрати",
"Calories": "Калории",
"Energy": "Енергия",
"Nutrition": "Хранителни стойности",
"Date": "Дата",
"Share": "Споделяне",
"Automation": "Автоматизация",
"Parameter": "Параметър",
"Export": "Експортиране",
"Copy": "Копиране",
"Rating": "Рейтинг",
"Close": "Затвори",
"Cancel": "Откажи",
"Link": "Връзка",
"Add": "Добави",
"New": "Нов",
"Note": "Бележка",
"Success": "Успешно",
"Failure": "Неуспешно",
"Protected": "Защитен",
"Ingredients": "Съставки",
"Supermarket": "Супермаркет",
"Categories": "Категории",
"Category": "Категория",
"Selected": "Избрано",
"min": "мин",
"Servings": "Порции",
"Waiting": "Очакване",
"Preparation": "Подготовка",
"External": "Външен",
"Size": "Размер",
"Files": "Файлове",
"File": "Файл",
"Edit": "Редактиране",
"Image": "Изображение",
"Delete": "Изтрий",
"Open": "Отвори",
"Ok": "Отвори",
"Save": "Запази",
"Step": "Стъпка",
"Search": "Търсене",
"Import": "Импортиране",
"Print": "Печат",
"Settings": "Настройки",
"or": "или",
"and": "и",
"Information": "Информация",
"Download": "Изтегляне",
"Create": "Създаване",
"Search Settings": "Настройки търсене",
"View": "Изглед",
"Recipes": "Рецепти",
"Move": "Премести",
"Merge": "Обединяване",
"Parent": "Родител",
"delete_confirmation": "Сигурни ли сте, че искате да изтриете {source}?",
"move_confirmation": "Преместване на <i>{child}</i> към родител <i>{parent}</i>",
"merge_confirmation": "Заменете <i>{source}</i> с <i>{target}</i>",
"create_rule": "и създават автоматизация",
"move_selection": "Изберете родител {type}, към който да преместите {source}.",
"merge_selection": "Заменете всички срещания на {source} с избрания {type}.",
"Root": "Корен",
"Ignore_Shopping": "Игнорирайте пазаруването",
"Shopping_Category": "Категория за пазаруване",
"Shopping_Categories": "Категории за пазаруване",
"Edit_Food": "Редактиране на храна",
"Move_Food": "Преместете храната",
"New_Food": "Нова храна",
"Hide_Food": "Скриване на храна",
"Food_Alias": "Псевдоним на храната",
"Unit_Alias": "Псевдоним на единица",
"Keyword_Alias": "Псевдоним на ключова дума",
"Delete_Food": "Изтриване на храна",
"No_ID": "Идентификатора не е намерен, не може да се изтрие.",
"Meal_Plan_Days": "Бъдещи планове за хранене",
"merge_title": "Обединяване на {type}",
"move_title": "Преместване {type}",
"Food": "Храна",
"Recipe_Book": "Книга с рецепти",
"del_confirmation_tree": "Сигурни ли сте, че искате да изтриете {source} и всички негови последователи?",
"delete_title": "Изтриване на {type}",
"create_title": "Нов {type}",
"edit_title": "Редактиране на {type}",
"Name": "Име",
"Type": "Тип",
"Description": "Описание",
"Recipe": "Рецепта",
"tree_root": "Корен на дървото",
"Icon": "Икона",
"Unit": "Единица",
"No_Results": "Няма резултати",
"New_Unit": "Нова единица",
"Create_New_Shopping Category": "Създайте нова категория за пазаруване",
"Create_New_Food": "Добавете нова храна",
"Create_New_Keyword": "Добавяне на нова ключова дума",
"Create_New_Unit": "Добавяне на нова единица",
"Create_New_Meal_Type": "Добавете нов тип хранене",
"and_up": "и нагоре",
"and_down": "и надолу",
"Instructions": "Инструкции",
"Unrated": "Без оценка",
"Automate": "Автоматизация",
"Empty": "Празно",
"Key_Ctrl": "Контрол",
"Key_Shift": "Превключване",
"Time": "Време",
"Text": "Текст",
"Shopping_list": "Списък за пазаруване",
"Added_by": "Добавено от",
"Added_on": "Добавено",
"AddToShopping": "Добавяне към списъка за пазаруване",
"IngredientInShopping": "Тази съставка е във вашия списък за пазаруване.",
"NotInShopping": "{food} не е в списъка ви за пазаруване.",
"OnHand": "В момента под ръка",
"FoodOnHand": "Имате {храна} под ръка.",
"FoodNotOnHand": "Нямате {храна} под ръка.",
"Undefined": "Недефиниран",
"Create_Meal_Plan_Entry": "Създайте запис за план за хранене",
"Edit_Meal_Plan_Entry": "Редактиране на записа в плана за хранене",
"Title": "Заглавие",
"Week": "Седмица",
"Month": "Месец",
"Year": "Година",
"Planner": "Планировчик",
"Planner_Settings": "Настройки на планировчика",
"Period": "Период",
"Plan_Period_To_Show": "Покажете седмици, месеци или години",
"Periods": "Периоди",
"Plan_Show_How_Many_Periods": "Колко периода да се показват",
"Starting_Day": "Начален ден от седмицата",
"Meal_Types": "Видове хранене",
"Meal_Type": "Вид хранене",
"Clone": "Клониране",
"Drag_Here_To_Delete": "Плъзнете тук, за да изтриете",
"Meal_Type_Required": "Изисква се вид хранене",
"Title_or_Recipe_Required": "Изисква се избор на заглавие или рецепта",
"Color": "Цвят",
"New_Meal_Type": "Нов вид хранене",
"AddFoodToShopping": "Добавете {food} към списъка си за пазаруване",
"RemoveFoodFromShopping": "Премахнете {food} от списъка си за пазаруване",
"DeleteShoppingConfirm": "Сигурни ли сте, че искате да премахнете цялата {food} от списъка за пазаруване?",
"IgnoredFood": "{food} е настроен да игнорира пазаруването.",
"Add_Servings_to_Shopping": "Добавете {servings} порции към Пазаруване",
"Week_Numbers": "Номера на седмиците",
"Show_Week_Numbers": "Показване на номерата на седмиците?",
"Export_As_ICal": "Експортирайте текущия период във формат iCal",
"Export_To_ICal": "Експортиране на .ics",
"Cannot_Add_Notes_To_Shopping": "Бележки не могат да се добавят към списъка за пазаруване",
"Added_To_Shopping_List": "Добавено към списъка за пазаруване",
"Shopping_List_Empty": "Вашият списък за пазаруване в момента е празен, можете да добавяте артикули чрез контекстното меню на запис на план за хранене (щракнете с десния бутон върху картата или щракнете с левия бутон върху иконата на менюто)",
"Next_Period": "Следващ период",
"Previous_Period": "Предишен период",
"Current_Period": "Текущ период",
"Next_Day": "Следващия ден",
"Previous_Day": "Предишен ден",
"Inherit": "Наследете",
"InheritFields": "Наследяване на стойности на полета",
"FoodInherit": "Хранителни наследствени полета",
"ShowUncategorizedFood": "Покажи неопределено",
"GroupBy": "Групирай по",
"SupermarketCategoriesOnly": "Само категории супермаркети",
"MoveCategory": "Премести към: ",
"CountMore": "...+{count} още",
"IgnoreThis": "Никога не добавяйте автоматично {food} към пазаруване",
"DelayFor": "Закъснение за {hours} часа",
"Warning": "Внимание",
"NoCategory": "Няма избрана категория.",
"InheritWarning": "{food} е настроен да наследява, промените може да не продължат.",
"ShowDelayed": "Показване на забавени артикули",
"Completed": "Завършено",
"OfflineAlert": "Вие сте офлайн, списъкът за пазаруване може да не се синхронизира.",
"shopping_share": "Споделете списък за пазаруване",
"shopping_auto_sync": "Автоматично синхронизиране",
"one_url_per_line": "Един URL на ред",
"mealplan_autoadd_shopping": "Автоматично добавяне на план за хранене",
"mealplan_autoexclude_onhand": "Изключете храната под ръка",
"mealplan_autoinclude_related": "Добавете свързани рецепти",
"default_delay": "Часове на забавяне по подразбиране",
"shopping_share_desc": "Потребителите ще видят всички артикули, които добавите към списъка си за пазаруване. Те трябва да ви добавят, за да видят елементите в техния списък.",
"shopping_auto_sync_desc": "Задаването на 0 ще деактивира автоматичното синхронизиране. Когато разглеждате списък за пазаруване, списъкът се актуализира на всеки зададени секунди, за да синхронизира промените, които някой друг може да е направил. Полезно при пазаруване с множество хора, но ще използва мобилни данни.",
"mealplan_autoadd_shopping_desc": "Автоматично добавяне на съставки за план за хранене към списъка за пазаруване.",
"mealplan_autoexclude_onhand_desc": "Когато добавяте план за хранене към списъка за пазаруване (ръчно или автоматично), изключете съставките, които в момента са под ръка.",
"mealplan_autoinclude_related_desc": "Когато добавяте план за хранене към списъка за пазаруване (ръчно или автоматично), включете всички свързани рецепти.",
"default_delay_desc": "Брой часове по подразбиране за забавяне на записа в списъка за пазаруване.",
"filter_to_supermarket": "Филтрирайте до супермаркет",
"Coming_Soon": "Очаквайте скоро",
"Auto_Planner": "Автоматичен плановик",
"New_Cookbook": "Нова готварска книга",
"Hide_Keyword": "Скриване на ключови думи",
"Clear": "Изчистване",
"err_move_self": "Не може елемента да се премести към себе си",
"nothing": "Няма нищо за правене",
"err_merge_self": "Не може да се слее елемент със себе си",
"show_sql": "Покажи SQL",
"filter_to_supermarket_desc": "По подразбиране филтрирайте списъка за пазаруване, за да включва само категории за избран супермаркет.",
"CategoryName": "Име на категория",
"SupermarketName": "Име на супермаркет",
"CategoryInstruction": "Плъзнете категориите, за да промените категориите за поръчки, които се появяват в списъка за пазаруване.",
"shopping_recent_days_desc": "Дни на последните записи в списъка за пазаруване за показване.",
"shopping_recent_days": "Последни дни",
"download_pdf": "Изтегли PDF",
"download_csv": "Изтегли CSV",
"csv_delim_help": "Ограничител за използване за CSV експортиране.",
"csv_delim_label": "CSV разделител",
"SuccessClipboard": "Списъкът за пазаруване е копиран в клипборда",
"copy_to_clipboard": "Копиране в клипборда",
"csv_prefix_help": "Префикс за добавяне при копиране на списък в клипборда.",
"csv_prefix_label": "Префикс за списък",
"copy_markdown_table": "Копирайте като Markdown Таблица",
"in_shopping": "В списъка за пазаруване",
"DelayUntil": "Забавяне до",
"Pin": "Закачи",
"mark_complete": "Маркирането завършено",
"QuickEntry": "Бързо влизане",
"shopping_add_onhand_desc": "Маркирайте храната „На ръка“, когато сте отметнати от списъка за пазаруване.",
"shopping_add_onhand": "Автоматично под ръка",
"related_recipes": "Свързани рецепти",
"today_recipes": "Днешните рецепти",
"sql_debug": "Отстраняване на грешки в SQL",
"remember_search": "Запомнете търсенето",
"remember_hours": "Часове за запомняне",
"tree_select": "Използвайте Избор на дърво",
"OnHand_help": "Храната е в инвентара и няма да бъде добавена автоматично към списък за пазаруване. Състоянието на ръка се споделя с пазаруващите потребители.",
"ignore_shopping_help": "Никога не добавяйте храна към списъка за пазаруване (например вода)",
"shopping_category_help": "Супермаркетите могат да бъдат поръчани и филтрирани по категория за пазаруване според оформлението на пътеките.",
"food_recipe_help": "Свързването на рецепта тук ще включва свързаната рецепта във всяка друга рецепта, която използва тази храна",
"Foods": "Храни",
"enable_expert": "Активирайте експертния режим",
"expert_mode": "Експертен режим",
"simple_mode": "Опростен режим",
"advanced": "Разширено",
"fields": "Полета",
"show_keywords": "Показване на ключови думи",
"show_foods": "Покажи храни",
"show_books": "Покажи книги",
"show_rating": "Покажи рейтинг",
"show_units": "Показване на единици",
"show_filters": "Показване на филтри",
"not": "не",
"save_filter": "Запазване на филтъра",
"filter_name": "Име на филтъра",
"left_handed": "Режим за лява ръка",
"left_handed_help": "Ще оптимизира потребителския интерфейс за използване с лявата ви ръка.",
"Custom Filter": "Персонализиран филтър",
"shared_with": "Споделено с",
"sort_by": "Сортиране по",
"asc": "Възходящ",
"desc": "Низходящо",
"date_viewed": "Последно разгледан",
"last_cooked": "Последно приготвени",
"times_cooked": "Пъти сготвено",
"date_created": "дата на създаване",
"show_sortby": "Покажи Сортиране по",
"search_rank": "Ранг на търсене",
"make_now": "Направете сега",
"recipe_filter": "Филтър за рецепти",
"book_filter_help": "Включете рецепти от филтъра за рецепти в допълнение към ръчно зададените.",
"review_shopping": "Прегледайте записите за пазаруване, преди да запазите",
"view_recipe": "Вижте рецепта",
"copy_to_new": "Копиране в нова рецепта",
"recipe_name": "Име на рецептата",
"paste_ingredients_placeholder": "Поставете списъка със съставки тук...",
"paste_ingredients": "Постави съставки",
"ingredient_list": "Списък на съставките",
"explain": "Обяснение",
"filter": "Филтрирайте",
"Website": "уебсайт",
"App": "Приложение",
"Bookmarklet": "Книжен пазар",
"click_image_import": "Щракнете върху изображението, което искате да импортирате за тази рецепта",
"no_more_images_found": "Няма намерени допълнителни изображения на уебсайта.",
"import_duplicates": "За да се предотврати дублирането, рецептите със същото име като съществуващите се игнорират. Поставете отметка в това квадратче, за да импортирате всичко.",
"paste_json": "Поставете тук json или html източник, за да заредите рецептата.",
"Click_To_Edit": "Кликнете, за да редактирате",
"search_no_recipes": "Не можах да намеря никакви рецепти!",
"search_import_help_text": "Импортирайте рецепта от външен уебсайт или приложение.",
"search_create_help_text": "Създайте нова рецепта директно в Tandoor.",
"warning_duplicate_filter": "Предупреждение: Поради технически ограничения наличието на множество филтри от една и съща комбинация (и/или/не) може да доведе до неочаквани резултати.",
"reset_children": "Нулиране на наследяването от последователя",
"reset_children_help": "Презаписване на всички последователи със стойности от наследени полета. Наследените полета на последователите ще бъдат зададени на наследяване на полета, освен ако последователите наследяват полета не е зададено.",
"substitute_help": "Заместителите се вземат предвид при търсене на рецепти, които могат да бъдат направени с подръчни съставки.",
"substitute_siblings_help": "Всички храни, които споделят родител на тази храна, се считат за заместители.",
"substitute_children_help": "Всички храни, които са последователи на тази храна, се считат за заместители.",
"substitute_siblings": "Заместители на сродни",
"substitute_children": "Заместители на последователи",
"SubstituteOnHand": "Имате заместител под ръка.",
"ChildInheritFields": "Последователи наследяват полета",
"ChildInheritFields_help": "Последователите ще наследят тези полета по подразбиране.",
"InheritFields_help": "Стойностите на тези полета ще бъдат наследени от родител (Изключение: празни категории за пазаруване не се наследяват)",
"last_viewed": "Последно разгледан",
"created_on": "Създадено на",
"updatedon": "Актуализирано на",
"Imported_From": "Внесено от",
"advanced_search_settings": "Разширени настройки за търсене",
"nothing_planned_today": "Нямате нищо планирано за днес!",
"no_pinned_recipes": "Нямате закачени рецепти!",
"Planned": "Планирано",
"Pinned": "Закачено",
"Imported": "Импортирано",
"Quick actions": "Бързи действия",
"Ratings": "Рейтинги",
"Internal": "Вътрешен",
"Units": "Единици",
"Random Recipes": "Случайни рецепти",
"parameter_count": "Параметър {count}",
"select_keyword": "Изберете Ключова дума",
"add_keyword": "Добавяне на ключова дума",
"select_file": "Избери файл",
"select_recipe": "Изберете рецепта",
"select_unit": "Изберете Единица",
"select_food": "Изберете Храна",
"remove_selection": "Премахнете избора",
"empty_list": "Списъкът е празен.",
"Select": "Изберете",
"Supermarkets": "Супермаркети",
"User": "потребител",
"Keyword": "Ключова дума",
"Advanced": "Разширено",
"Page": "Страница",
"Single": "Единичен",
"Multiple": "Многократни",
"Reset": "Нулиране",
"Options": "Настроики",
"Create Food": "Създайте храна",
"create_food_desc": "Създайте храна и я свържете с тази рецепта.",
"additional_options": "Допълнителни настройки",
"Importer_Help": "Повече информация и помощ за този вносител:",
"Documentation": "Документация",
"Select_App_To_Import": "Моля, изберете приложение, от което да импортирате",
"Import_Supported": "Поддържа се импортиране",
"Export_Supported": "Поддържа се експорт",
"Import_Not_Yet_Supported": "Импортирането все още не се поддържа",
"Export_Not_Yet_Supported": "Експортирането все още не се поддържа",
"Import_Result_Info": "Импортирани са {imported} от {total} рецепти",
"Recipes_In_Import": "Рецепти във вашия файл за импортиране",
"Toggle": "Превключете",
"Import_Error": "Възникна грешка по време на импортирането ви. Моля, разгънете подробностите в долната част на страницата, за да ги видите.",
"Warning_Delete_Supermarket_Category": "Изтриването на категория супермаркет ще изтрие и всички връзки с храни. Сигурен ли си?",
"New_Supermarket": "Създайте нов супермаркет",
"New_Supermarket_Category": "Създаване на нова категория супермаркет",
"Are_You_Sure": "Сигурен ли си?"
}

View File

@@ -1,414 +1,414 @@
{
"warning_feature_beta": "",
"err_fetching_resource": "",
"err_creating_resource": "",
"err_updating_resource": "",
"err_deleting_resource": "",
"err_deleting_protected_resource": "",
"err_moving_resource": "",
"err_merging_resource": "",
"success_fetching_resource": "",
"success_creating_resource": "",
"success_updating_resource": "",
"success_deleting_resource": "",
"success_moving_resource": "",
"success_merging_resource": "",
"file_upload_disabled": "",
"step_time_minutes": "",
"confirm_delete": "",
"import_running": "",
"all_fields_optional": "",
"convert_internal": "",
"show_only_internal": "",
"show_split_screen": "",
"Log_Recipe_Cooking": "",
"External_Recipe_Image": "",
"Add_to_Shopping": "",
"Add_to_Plan": "",
"Step_start_time": "",
"Sort_by_new": "",
"Table_of_Contents": "",
"Recipes_per_page": "",
"Show_as_header": "",
"Hide_as_header": "",
"Add_nutrition_recipe": "",
"Remove_nutrition_recipe": "",
"Copy_template_reference": "",
"Save_and_View": "",
"Manage_Books": "",
"Meal_Plan": "",
"Select_Book": "",
"Select_File": "",
"Recipe_Image": "",
"Import_finished": "",
"View_Recipes": "",
"Log_Cooking": "",
"New_Recipe": "",
"Url_Import": "",
"Reset_Search": "",
"Recently_Viewed": "",
"Load_More": "",
"New_Keyword": "",
"Delete_Keyword": "",
"Edit_Keyword": "",
"Edit_Recipe": "",
"Move_Keyword": "",
"Merge_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Move_Up": "",
"Move_Down": "",
"Step_Name": "",
"Step_Type": "",
"Make_Header": "",
"Make_Ingredient": "",
"Enable_Amount": "",
"Disable_Amount": "",
"Ingredient Editor": "",
"Add_Step": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"Share": "",
"Automation": "",
"Parameter": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Cancel": "",
"Link": "",
"Add": "",
"New": "",
"Note": "",
"Success": "",
"Failure": "",
"Protected": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Move": "",
"Merge": "",
"Parent": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"edit_title": "",
"Name": "",
"Type": "",
"Description": "",
"Recipe": "",
"tree_root": "",
"Icon": "",
"Unit": "",
"No_Results": "",
"New_Unit": "",
"Create_New_Shopping Category": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Unit": "",
"Create_New_Meal_Type": "",
"and_up": "",
"and_down": "",
"Instructions": "",
"Unrated": "",
"Automate": "",
"Empty": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Time": "",
"Text": "",
"Shopping_list": "",
"Added_by": "",
"Added_on": "",
"AddToShopping": "",
"IngredientInShopping": "",
"NotInShopping": "",
"OnHand": "",
"FoodOnHand": "",
"FoodNotOnHand": "",
"Undefined": "",
"Create_Meal_Plan_Entry": "",
"Edit_Meal_Plan_Entry": "",
"Title": "",
"Week": "",
"Month": "",
"Year": "",
"Planner": "",
"Planner_Settings": "",
"Period": "",
"Plan_Period_To_Show": "",
"Periods": "",
"Plan_Show_How_Many_Periods": "",
"Starting_Day": "",
"Meal_Types": "",
"Meal_Type": "",
"Clone": "",
"Drag_Here_To_Delete": "",
"Meal_Type_Required": "",
"Title_or_Recipe_Required": "",
"Color": "",
"New_Meal_Type": "",
"AddFoodToShopping": "",
"RemoveFoodFromShopping": "",
"DeleteShoppingConfirm": "",
"IgnoredFood": "",
"Add_Servings_to_Shopping": "",
"Week_Numbers": "",
"Show_Week_Numbers": "",
"Export_As_ICal": "",
"Export_To_ICal": "",
"Cannot_Add_Notes_To_Shopping": "",
"Added_To_Shopping_List": "",
"Shopping_List_Empty": "",
"Next_Period": "",
"Previous_Period": "",
"Current_Period": "",
"Next_Day": "",
"Previous_Day": "",
"Inherit": "",
"InheritFields": "",
"FoodInherit": "",
"ShowUncategorizedFood": "",
"GroupBy": "",
"SupermarketCategoriesOnly": "",
"MoveCategory": "",
"CountMore": "",
"IgnoreThis": "",
"DelayFor": "",
"Warning": "",
"NoCategory": "",
"InheritWarning": "",
"ShowDelayed": "",
"Completed": "",
"OfflineAlert": "",
"shopping_share": "",
"shopping_auto_sync": "",
"one_url_per_line": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoinclude_related": "",
"default_delay": "",
"shopping_share_desc": "",
"shopping_auto_sync_desc": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related_desc": "",
"default_delay_desc": "",
"filter_to_supermarket": "",
"Coming_Soon": "",
"Auto_Planner": "",
"New_Cookbook": "",
"Hide_Keyword": "",
"Clear": "",
"err_move_self": "",
"nothing": "",
"err_merge_self": "",
"show_sql": "",
"filter_to_supermarket_desc": "",
"CategoryName": "",
"SupermarketName": "",
"CategoryInstruction": "",
"shopping_recent_days_desc": "",
"shopping_recent_days": "",
"download_pdf": "",
"download_csv": "",
"csv_delim_help": "",
"csv_delim_label": "",
"SuccessClipboard": "",
"copy_to_clipboard": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"copy_markdown_table": "",
"in_shopping": "",
"DelayUntil": "",
"Pin": "",
"mark_complete": "",
"QuickEntry": "",
"shopping_add_onhand_desc": "",
"shopping_add_onhand": "",
"related_recipes": "",
"today_recipes": "",
"sql_debug": "",
"remember_search": "",
"remember_hours": "",
"tree_select": "",
"OnHand_help": "",
"ignore_shopping_help": "",
"shopping_category_help": "",
"food_recipe_help": "",
"Foods": "",
"enable_expert": "",
"expert_mode": "",
"simple_mode": "",
"advanced": "",
"fields": "",
"show_keywords": "",
"show_foods": "",
"show_books": "",
"show_rating": "",
"show_units": "",
"show_filters": "",
"not": "",
"save_filter": "",
"filter_name": "",
"left_handed": "",
"left_handed_help": "",
"Custom Filter": "",
"shared_with": "",
"sort_by": "",
"asc": "",
"desc": "",
"date_viewed": "",
"last_cooked": "",
"times_cooked": "",
"date_created": "",
"show_sortby": "",
"search_rank": "",
"make_now": "",
"recipe_filter": "",
"book_filter_help": "",
"review_shopping": "",
"view_recipe": "",
"copy_to_new": "",
"recipe_name": "",
"paste_ingredients_placeholder": "",
"paste_ingredients": "",
"ingredient_list": "",
"explain": "",
"filter": "",
"Website": "",
"App": "",
"Bookmarklet": "",
"click_image_import": "",
"no_more_images_found": "",
"import_duplicates": "",
"paste_json": "",
"Click_To_Edit": "",
"search_no_recipes": "",
"search_import_help_text": "",
"search_create_help_text": "",
"warning_duplicate_filter": "",
"reset_children": "",
"reset_children_help": "",
"substitute_help": "",
"substitute_siblings_help": "",
"substitute_children_help": "",
"substitute_siblings": "",
"substitute_children": "",
"SubstituteOnHand": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"InheritFields_help": "",
"last_viewed": "",
"created_on": "",
"updatedon": "",
"Imported_From": "",
"advanced_search_settings": "",
"nothing_planned_today": "",
"no_pinned_recipes": "",
"Planned": "",
"Pinned": "",
"Imported": "",
"Quick actions": "",
"Ratings": "",
"Internal": "",
"Units": "",
"Random Recipes": "",
"parameter_count": "",
"select_keyword": "",
"add_keyword": "",
"select_file": "",
"select_recipe": "",
"select_unit": "",
"select_food": "",
"remove_selection": "",
"empty_list": "",
"Select": "",
"Supermarkets": "",
"User": "",
"Keyword": "",
"Advanced": "",
"Page": "",
"Single": "",
"Multiple": "",
"Reset": "",
"Options": "",
"Create Food": "",
"create_food_desc": "",
"additional_options": "",
"Importer_Help": "",
"Documentation": "",
"Select_App_To_Import": "",
"Import_Supported": "",
"Export_Supported": "",
"Import_Not_Yet_Supported": "",
"Export_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Recipes_In_Import": "",
"Toggle": "",
"Import_Error": "",
"Warning_Delete_Supermarket_Category": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"Are_You_Sure": ""
"warning_feature_beta": "Denne funktion er i øjeblikket i BETA (test) stadie. Forvent fejl og fremtidige ændringer (hvor data kan mistes) ved brug af denne funktion.",
"err_fetching_resource": "Der opstod en fejl under indlæsning af denne ressource!",
"err_creating_resource": "Der opstod en fejl under oprettelsen af denne ressource!",
"err_updating_resource": "Der opstod en fejl under opdateringen af denne ressource!",
"err_deleting_resource": "Der opstod en fejl under sletningen af denne ressource!",
"err_deleting_protected_resource": "Objektet du prøver at slette er stadig i brug, og kan ikke slettes.",
"err_moving_resource": "Der opstod en fejl under flytningen af denne ressource!",
"err_merging_resource": "Der opstod en fejl under sammenfletningen af denne ressource!",
"success_fetching_resource": "Ressourcen blev hentet!",
"success_creating_resource": "Ressourcen blev oprettet!",
"success_updating_resource": "Ressourcen blev opdateret!",
"success_deleting_resource": "Ressourcen blev slettet!",
"success_moving_resource": "Ressourcen blev flyttet!",
"success_merging_resource": "Ressourcen blev sammenflettet!",
"file_upload_disabled": "Upload af filer er ikke slået til i dit rum.",
"step_time_minutes": "Trin varighed (minutter)",
"confirm_delete": "Er du sikker på at du slette dette {object}?",
"import_running": "Importering er i gang, vent venligst!",
"all_fields_optional": "Alle felter er valgfri og kan være tomme.",
"convert_internal": "Konverter til intern opskrift",
"show_only_internal": "Vis kun interne opskrifter",
"show_split_screen": "Opdel skærmen",
"Log_Recipe_Cooking": "Noter tilberedning af opskrift",
"External_Recipe_Image": "Eksternt billede af opskrift",
"Add_to_Shopping": "Tilføj til indkøbsliste",
"Add_to_Plan": "Tilføj til madplan",
"Step_start_time": "Trin starttid",
"Sort_by_new": "Sorter efter nylige",
"Table_of_Contents": "Indholdsfortegnelse",
"Recipes_per_page": "Opskrifter pr. side",
"Show_as_header": "Vis som rubrik",
"Hide_as_header": "Skjul som rubrik",
"Add_nutrition_recipe": "Tilføj næringsindhold til opskrift",
"Remove_nutrition_recipe": "Fjern næringsindhold fra opskrift",
"Copy_template_reference": "Kopier skabelonsreference",
"Save_and_View": "Gem & Vis",
"Manage_Books": "Administrer bøger",
"Meal_Plan": "Madplan",
"Select_Book": "Vælg bog",
"Select_File": "Vælg fil",
"Recipe_Image": "Opskriftsbillede",
"Import_finished": "Importering fuldført",
"View_Recipes": "Vis opskrifter",
"Log_Cooking": "Noter tilberedning",
"New_Recipe": "Ny opskrift",
"Url_Import": "Importer fra link",
"Reset_Search": "Nulstil søgning",
"Recently_Viewed": "Vist for nylig",
"Load_More": "Indlæs mere",
"New_Keyword": "Nyt nøgleord",
"Delete_Keyword": "Slet nøgleord",
"Edit_Keyword": "Rediger nøgleord",
"Edit_Recipe": "Rediger opskrift",
"Move_Keyword": "Flyt nøgleord",
"Merge_Keyword": "Sammenflet nøgleord",
"Hide_Keywords": "Skjul nøgleord",
"Hide_Recipes": "Skjul opskrifter",
"Move_Up": "Flyt up",
"Move_Down": "Flyt ned",
"Step_Name": "Trin navn",
"Step_Type": "Trin type",
"Make_Header": "Opret rubrik",
"Make_Ingredient": "Opret ingredient",
"Enable_Amount": "Aktiver antal",
"Disable_Amount": "Deaktiver antal",
"Ingredient Editor": "Ingrediens redigeringsværktøj",
"Add_Step": "Tilføj trin",
"Keywords": "Nøgleord",
"Books": "Bøger",
"Proteins": "Proteiner",
"Fats": "Fedtstoffer",
"Carbohydrates": "Kulhydrater",
"Calories": "Kalorier",
"Energy": "Energi",
"Nutrition": "Næring",
"Date": "Dato",
"Share": "Del",
"Automation": "Automatisering",
"Parameter": "Parameter",
"Export": "Eksporter",
"Copy": "Kopier",
"Rating": "Bedømmelse",
"Close": "Luk",
"Cancel": "Annuller",
"Link": "Link",
"Add": "Tilføj",
"New": "Ny",
"Note": "Note",
"Success": "Succes",
"Failure": "Mislykkedes",
"Protected": "Beskyttet",
"Ingredients": "Ingredienser",
"Supermarket": "Supermarked",
"Categories": "Kategorier",
"Category": "Kategori",
"Selected": "Valgt",
"min": "min",
"Servings": "Serveringer",
"Waiting": "Venter",
"Preparation": "Forberedelse",
"External": "Ekstern",
"Size": "Størrelse",
"Files": "Filer",
"File": "Fil",
"Edit": "Rediger",
"Image": "Billede",
"Delete": "Slet",
"Open": "Åben",
"Ok": "Åben",
"Save": "Gem",
"Step": "Trin",
"Search": "Søg",
"Import": "Importer",
"Print": "Udskriv",
"Settings": "Indstillinger",
"or": "eller",
"and": "og",
"Information": "Information",
"Download": "Download",
"Create": "Opret",
"Search Settings": "Søgningsindstillinger",
"View": "Vis",
"Recipes": "Opskrifter",
"Move": "Flyt",
"Merge": "Sammenflet",
"Parent": "Forælder",
"delete_confirmation": "Er du sikker på at du vil slette {source}?",
"move_confirmation": "Flyt <i>{child}</i> til forælder <i>parent</i>",
"merge_confirmation": "Erstat <i>{source}</i> med <i>{target}</i>",
"create_rule": "og opret automation",
"move_selection": "Vælg en forælder {type} som {source} skal flyttes til.",
"merge_selection": "Erstat alle forekomster af {source} med det valgte {target}.",
"Root": "Rod",
"Ignore_Shopping": "Ignorer indkøb",
"Shopping_Category": "Indkøbskategori",
"Shopping_Categories": "Indkøbskategorier",
"Edit_Food": "Rediger mad",
"Move_Food": "Flyt mad",
"New_Food": "Ny mad",
"Hide_Food": "Skjul mad",
"Food_Alias": "Alternativt navn til mad",
"Unit_Alias": "Alternativt navn til enhed",
"Keyword_Alias": "Alternativt navn til nøgleord",
"Delete_Food": "Slet mad",
"No_ID": "ID findes ikke, kan ikke slette.",
"Meal_Plan_Days": "Fremtidige madplaner",
"merge_title": "Sammenflet {type}",
"move_title": "Flyt {type}",
"Food": "Mad",
"Recipe_Book": "Opskriftsbog",
"del_confirmation_tree": "Er du sikker på at du vil slette {source} og alle dets børn?",
"delete_title": "Slet {type}",
"create_title": "Ny {type}",
"edit_title": "Rediger {type}",
"Name": "Navn",
"Type": "Type",
"Description": "Beskrivelse",
"Recipe": "Opskrift",
"tree_root": "Roden af træet",
"Icon": "Ikon",
"Unit": "Enhed",
"No_Results": "Ingen resultater",
"New_Unit": "Ny enhed",
"Create_New_Shopping Category": "Opret ny indkøbskategori",
"Create_New_Food": "Tilføj ny mad",
"Create_New_Keyword": "Tilføj nyt nøgleord",
"Create_New_Unit": "Tilføj ny enhed",
"Create_New_Meal_Type": "Tilføj ny måltidstype",
"and_up": "& Op",
"and_down": "& Ned",
"Instructions": "Instruktioner",
"Unrated": "Ikke bedømt",
"Automate": "Automatiser",
"Empty": "Tom",
"Key_Ctrl": "Ctrl",
"Key_Shift": "Shift",
"Time": "Tid",
"Text": "Tekst",
"Shopping_list": "Indkøbsliste",
"Added_by": "Tilføjet af",
"Added_on": "Tilføjet d.",
"AddToShopping": "Tilføj til indkøbsliste",
"IngredientInShopping": "Denne ingrediens er i din indkøbsliste.",
"NotInShopping": "{food} er ikke i din indkøbsliste.",
"OnHand": "Til rådighed",
"FoodOnHand": "Du har {food} til rådighed.",
"FoodNotOnHand": "Du har ikke {food} til rådighed.",
"Undefined": "Ikke defineret",
"Create_Meal_Plan_Entry": "Indsæt punkt i madplan",
"Edit_Meal_Plan_Entry": "Rediger punkt i madplan",
"Title": "Titel",
"Week": "Uge",
"Month": "Måned",
"Year": "År",
"Planner": "Planlægger",
"Planner_Settings": "Planlægger indstillinger",
"Period": "Periode",
"Plan_Period_To_Show": "Vis uger, måneder eller år",
"Periods": "Perioder",
"Plan_Show_How_Many_Periods": "Hvor mange perioder skal vises",
"Starting_Day": "Første dag på ugen",
"Meal_Types": "Måltidstyper",
"Meal_Type": "Måltidstype",
"Clone": "Klon",
"Drag_Here_To_Delete": "Træk herhen for at slette",
"Meal_Type_Required": "Måltidstype påkrævet",
"Title_or_Recipe_Required": "Titel eller valg af opskrift påkrævet",
"Color": "Farve",
"New_Meal_Type": "Ny måltidstype",
"AddFoodToShopping": "Tilføj {food} til indkøbsliste",
"RemoveFoodFromShopping": "Fjern {food} fra indkøbsliste",
"DeleteShoppingConfirm": "Er du sikker på at du vil fjerne {food} fra indkøbsliste?",
"IgnoredFood": "{food} er sat til at ignorere indkøb.",
"Add_Servings_to_Shopping": "Tilføj {servings} serveringer til indkøb",
"Week_Numbers": "Ugenumre",
"Show_Week_Numbers": "Vis ugenumre?",
"Export_As_ICal": "Eksporter nuværende periode til iCal format",
"Export_To_ICal": "Eksporter .ics",
"Cannot_Add_Notes_To_Shopping": "Noter kan ikke tilføjes til indkøbslisten",
"Added_To_Shopping_List": "Tilføjet til indkøbslisten",
"Shopping_List_Empty": "Din indkøbsliste er i øjeblikket tom, du kan tilføje varer via menuen for et madplanspunkt (højreklik på punktet eller venstreklik på menu ikonet)",
"Next_Period": "Næste periode",
"Previous_Period": "Forgående periode",
"Current_Period": "Nuværende periode",
"Next_Day": "Næste dag",
"Previous_Day": "Forgående dag",
"Inherit": "Nedarve",
"InheritFields": "Nedarve feltværdier",
"FoodInherit": "Nedarvelige mad felter",
"ShowUncategorizedFood": "Vis ikke definerede",
"GroupBy": "Grupper efter",
"SupermarketCategoriesOnly": "Kun Supermarked kategorier",
"MoveCategory": "Flyt til: ",
"CountMore": "...+{count} flere",
"IgnoreThis": "Aldrig tilføj {food} automatisk til indkøb",
"DelayFor": "Udskyd i {hours} hours",
"Warning": "Advarsel",
"NoCategory": "Ingen kategori valgt.",
"InheritWarning": "{food} er sat til at nedarve, ændringer bliver måske ikke gemt.",
"ShowDelayed": "Vis udskudte elementer",
"Completed": "Afsluttet",
"OfflineAlert": "Du er offline, indkøbslisten er måske ikke synkroniseret.",
"shopping_share": "Del indkøbsliste",
"shopping_auto_sync": "Synkroniser automatisk",
"one_url_per_line": "Et link pr. linje",
"mealplan_autoadd_shopping": "Tilføj madplan automatisk",
"mealplan_autoexclude_onhand": "Ekskluder tilgængeligt mad",
"mealplan_autoinclude_related": "Tilføj relaterede opskrifter",
"default_delay": "Standard udsættelse i timer",
"shopping_share_desc": "Brugere vil se alle varer du tilføjer til din indkøbsliste. De skal tilføje dig for at se varer på deres liste.",
"shopping_auto_sync_desc": "Hvis den sættes til 0, bliver automatisk synkronisering slået fra. Når en indkøbsliste vises bliver den opdateret efter den indstillede periode i sekunder, for at synkronisere eventuelle ændringer andre har foretaget. Brugbar når man køber ind sammen med andre, men det bruger mobildata.",
"mealplan_autoadd_shopping_desc": "Tilføj madplansingredienser til indkøbsliste automatisk.",
"mealplan_autoexclude_onhand_desc": "Når en madplan tilføjes til indkøbslisten (manuelt eller automatisk), ekskluder tilgængelige ingredienser.",
"mealplan_autoinclude_related_desc": "Når en madplan tilføjes til indkøbslisten (manuelt eller automatisk), inkluder alle relaterede opskrifter.",
"default_delay_desc": "Standard antal timer et punkt på indkøbslisten skal udskydes.",
"filter_to_supermarket": "Filtrer til supermarked",
"Coming_Soon": "Kommer snart",
"Auto_Planner": "Autoplanlægger",
"New_Cookbook": "Ny opskriftsbog",
"Hide_Keyword": "Skjul nøgleord",
"Clear": "Ryd",
"err_move_self": "Kan ikke flytte element til sig selv",
"nothing": "Intet at gøre",
"err_merge_self": "Kan ikke sammenflette element med sig selv",
"show_sql": "Vis SQL",
"filter_to_supermarket_desc": "Filtrer som standard indkøbslisten til kun at inkludere kategorier fra valgte supermarkeder.",
"CategoryName": "Kategorinavn",
"SupermarketName": "Navn på supermarked",
"CategoryInstruction": "Træk rundt på kategorier, for at ændre på rækkefølgen de opstår i på indkøbslisten.",
"shopping_recent_days_desc": "Antal dage seneste varer fra indkøbslister skal vises.",
"shopping_recent_days": "Seneste dage",
"download_pdf": "Download PDF",
"download_csv": "Download CSV",
"csv_delim_help": "Tegn der skal afgrænse elementer i CSV eksporteringer.",
"csv_delim_label": "CSV afgrænsningstegn",
"SuccessClipboard": "Indkøbsliste kopieret til udklipsholder",
"copy_to_clipboard": "Kopier til udklipsholder",
"csv_prefix_help": "Præfiks som skal tilføjes når der kopieres til udklipsholder.",
"csv_prefix_label": "Liste præfiks",
"copy_markdown_table": "Kopier som Markdown tabel",
"in_shopping": "I indkøbsliste",
"DelayUntil": "Udskyd indtil",
"Pin": "Fastgør",
"mark_complete": "Marker som færdig",
"QuickEntry": "Hurtigt indlæg",
"shopping_add_onhand_desc": "Marker mad som 'Tilgængeligt' når det bliver krydset af på indkøbslisten.",
"shopping_add_onhand": "Automatisk tilgængelig markering",
"related_recipes": "Relaterede opskrifter",
"today_recipes": "Opskrifter til i dag",
"sql_debug": "SQL fejlsøgning",
"remember_search": "Husk søgning",
"remember_hours": "Timer at gemme i",
"tree_select": "Benyt træ vælger",
"OnHand_help": "Varen er \"på lager\" og vil ikke automatisk blive tilføjet til indkøbslister. Lagerstatus deles med indkøbsbrugere.",
"ignore_shopping_help": "Aldrig tilføj vare til indkøbslisten (f.eks. vand)",
"shopping_category_help": "Supermarkeder kan blive filtrerede efter indkøbskategori så det passer med indretningen i butikken.",
"food_recipe_help": "Hvis du sammenkæder en opskrift her vil den sammenkædede opskrift blive inkluderet i alle andre opskrifter der bruger denne mad",
"Foods": "Mad",
"enable_expert": "Slå avanceret tilstand til",
"expert_mode": "Avanceret tilstand",
"simple_mode": "Simpel tilstand",
"advanced": "Avanceret",
"fields": "Felter",
"show_keywords": "Vis nøgleord",
"show_foods": "Vis mad",
"show_books": "Vis bøger",
"show_rating": "Vis bedømmelse",
"show_units": "Vis enheder",
"show_filters": "Vis filtre",
"not": "ikke",
"save_filter": "Gem filter",
"filter_name": "Filtrer navn",
"left_handed": "Venstrehåndstilstand",
"left_handed_help": "Optimerer brugerfladen til benyttelse med din venstre hånd.",
"Custom Filter": "Tilpasset filter",
"shared_with": "Delt med",
"sort_by": "Sorter efter",
"asc": "Stigende",
"desc": "Faldende",
"date_viewed": "Sidst Åbnet",
"last_cooked": "Sidst Tilberedt",
"times_cooked": "Antal gange tilberedt",
"date_created": "Oprettelsesdato",
"show_sortby": "Soter efter",
"search_rank": "Søg efter rang",
"make_now": "Lav nu",
"recipe_filter": "Opskriftsfilter",
"book_filter_help": "Inkluder opskrifter fra opskriftsfilter udover de manuelt udvalgte.",
"review_shopping": "Tjek indkøbsvarer inden der gemmes",
"view_recipe": "Vis opskrift",
"copy_to_new": "Kopier til ny opskrift",
"recipe_name": "Navn på opskrift",
"paste_ingredients_placeholder": "Indsæt ingrediensliste her...",
"paste_ingredients": "Indsæt ingredienser",
"ingredient_list": "Ingrediensliste",
"explain": "Forklar",
"filter": "Filter",
"Website": "Hjemmeside",
"App": "App",
"Bookmarklet": "Bogmærke",
"click_image_import": "Klik på billedet du vil importere til denne opskrift",
"no_more_images_found": "Ingen yderligere billeder fundet på hjemmeside.",
"import_duplicates": "For at undgå dubletter bliver opskrifter med det samme navn som eksisterende opskrifter ignoreret. Ving den boks af for at tilføje alt.",
"paste_json": "Indsæt JSON eller HTML kildekode her for at indlæse opskrift.",
"Click_To_Edit": "Klik for at rediger",
"search_no_recipes": "Kunne ikke finde nogen opskrifter!",
"search_import_help_text": "Importer en opskrift fra en ekstern hjemmeside eller applikation.",
"search_create_help_text": "Opret en ny opskrift direkte i Tandoor.",
"warning_duplicate_filter": "Advarsel: På grund af tekniske begrænsninger, kan det give uforventede resultater at have flere filtre med den samme kombination af (og/eller/not).",
"reset_children": "Nulstil barnets nedarvning",
"reset_children_help": "Overskriv alle børn med værdier fra nedarvede felter. Nedarvede felter af børn vil blive sat til at nedarve med mindre de allerede er sat til at nedarve.",
"substitute_help": "Erstatninger bliver taget i betragtning når der søges efter opskrifter der kan laves med tilgængelige ingredienser.",
"substitute_siblings_help": "Alt mad der deler en forælder med denne mad bliver betragtet som erstatninger.",
"substitute_children_help": "Alt mad der er et barn af denne mad bliver betragtet som erstatninger.",
"substitute_siblings": "Erstattende søskende",
"substitute_children": "Erstattende børn",
"SubstituteOnHand": "Du har erstatninger tilgængeligt.",
"ChildInheritFields": "Barn nedarvningsfelter",
"ChildInheritFields_help": "Børn nedarvede disse felter som standard.",
"InheritFields_help": "Værdierne af disse felter vil blive nedarvet fra forælder (Undtagelse: tomme indkøbskategorier bliver ikke nedarvet)",
"last_viewed": "Sidst åbnet",
"created_on": "Oprettet d.",
"updatedon": "Opdateret d.",
"Imported_From": "Importeret fra",
"advanced_search_settings": "Avancerede søgeindstillinger",
"nothing_planned_today": "Du har ikke noget planlagt for i dag!",
"no_pinned_recipes": "Du har ingen fastgjorte opskrifter!",
"Planned": "Planlagt",
"Pinned": "Fastgjort",
"Imported": "Importeret",
"Quick actions": "Hurtige handlinger",
"Ratings": "Bedømmelser",
"Internal": "Interne",
"Units": "Enheder",
"Random Recipes": "Tilfældige opskrifter",
"parameter_count": "Parameter {count}",
"select_keyword": "Vælg nøgleord",
"add_keyword": "Tilføj nøgleord",
"select_file": "Vælg fil",
"select_recipe": "Vælg opskrift",
"select_unit": "Vælg enhed",
"select_food": "Vælg mad",
"remove_selection": "Fjern markering",
"empty_list": "Listen er tom.",
"Select": "Vælg",
"Supermarkets": "Supermarkeder",
"User": "Bruger",
"Keyword": "Nøgleord",
"Advanced": "Avanceret",
"Page": "Side",
"Single": "Enkel",
"Multiple": "Flere",
"Reset": "Nulstil",
"Options": "Indstillinger",
"Create Food": "Opret mad",
"create_food_desc": "Opret mad og sammenkæd den med denne opskrift.",
"additional_options": "Yderligere indstillinger",
"Importer_Help": "Mere information og hjælp til denne importer:",
"Documentation": "Dokumentation",
"Select_App_To_Import": "Vælg venligst en App at importere fra",
"Import_Supported": "Import understøttet",
"Export_Supported": "Eksport understøttet",
"Import_Not_Yet_Supported": "Import endnu ikke understøttet",
"Export_Not_Yet_Supported": "Eksport endnu ikke understøttet",
"Import_Result_Info": "{imported} af {total} opskrifter blev importeret",
"Recipes_In_Import": "Opskrifter i din importerede fil",
"Toggle": "Skift",
"Import_Error": "Der opstod en fejl under din importering. Udvid detaljerne i bunden af siden for at se fejlen.",
"Warning_Delete_Supermarket_Category": "At slette en supermarkedskategori vil også slette alle relationer til mad. Er du sikker?",
"New_Supermarket": "Opret nyt supermarked",
"New_Supermarket_Category": "Opret ny supermarkedskategori",
"Are_You_Sure": "Er du sikker?"
}

View File

@@ -202,6 +202,7 @@
"Starting_Day": "Starting day of the week",
"Meal_Types": "Meal types",
"Meal_Type": "Meal type",
"New_Entry": "New Entry",
"Clone": "Clone",
"Drag_Here_To_Delete": "Drag here to delete",
"Meal_Type_Required": "Meal type is required",

View File

@@ -379,5 +379,40 @@
"Reset": "Herstel",
"remember_search": "Onthoud zoekopdracht",
"tree_select": "Gebruik boomselectie",
"sql_debug": "SQL Debug"
"sql_debug": "SQL Debug",
"Bookmarklet": "Bladwijzer",
"no_more_images_found": "Geen extra afbeeldingen gevonden op website.",
"import_duplicates": "Om dubbelingen te voorkomen worden recepten met dezelfde naam als bestaande genegeerd. Vink dit vakje aan om alles te importeren.",
"paste_json": "Plak json of html bron hier om recept te laden.",
"Click_To_Edit": "Klik om te bewerken",
"Imported": "Geïmporteerd",
"Multiple": "Meerdere",
"Single": "Enkele",
"Options": "Opties",
"Importer_Help": "Meer informatie en hulp over de importtool:",
"Documentation": "Documentatie",
"Select_App_To_Import": "Selecteer een app om van te importeren",
"Import_Supported": "Import ondersteund",
"Export_Supported": "Export ondersteund",
"Import_Not_Yet_Supported": "Import nog niet ondersteund",
"Export_Not_Yet_Supported": "Export nog niet ondersteund",
"Import_Result_Info": "{imported} van {total} recepten zijn geïmporteerd",
"Recipes_In_Import": "Recepten in je importbestand",
"Toggle": "Schakelaar",
"New_Supermarket": "Maak nieuwe supermarkt",
"New_Supermarket_Category": "Maak nieuwe supermarktcategorie",
"Are_You_Sure": "Weet je het zeker?",
"Ingredient Editor": "Ingrediënten editor",
"App": "App",
"click_image_import": "Klik op de afbeelding die je wil importeren voor dit recept",
"err_deleting_protected_resource": "Het object dat je probeert te verwijderen is in gebruik en kan daardoor niet verwijderd worden.",
"one_url_per_line": "Een URL per regel",
"Protected": "Beschermd",
"Website": "Website",
"Imported_From": "Geïmporteerd van",
"Import_Error": "Er is een fout opgetreden tijdens je import. Breid de details aan de onderzijde van de pagina uit om ze te bekijken.",
"Warning_Delete_Supermarket_Category": "Een supermarktcategorie verwijderen verwijdert ook alle relaties naar ingrediënten. Weet je het zeker?",
"create_food_desc": "Maak een ingrediënt en link aan dit recept.",
"additional_options": "Extra opties",
"Create Food": "Maak Ingrediënt"
}