mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-27 12:09:10 -05:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c841ec686 | ||
|
|
f875942e79 | ||
|
|
4cf8b72e3f | ||
|
|
4dd3ba29b6 | ||
|
|
96bd66f9e6 | ||
|
|
70716bf99f | ||
|
|
16449cd078 | ||
|
|
5459e293d1 | ||
|
|
749713d698 | ||
|
|
4a5af48f33 | ||
|
|
5cf58a32dc | ||
|
|
a956888355 | ||
|
|
cb835b033c | ||
|
|
b9289e2685 | ||
|
|
c0bd0d49ae | ||
|
|
36fbbed1b0 | ||
|
|
34f70e4ba7 | ||
|
|
8bc361ee7c | ||
|
|
091fab154a | ||
|
|
c6e11f6ef2 | ||
|
|
16b5cd75b1 | ||
|
|
f040b491d4 | ||
|
|
8174da31e8 | ||
|
|
53518f4c47 | ||
|
|
693d829946 | ||
|
|
5ab11eb1bc | ||
|
|
332f518774 | ||
|
|
ed33114947 | ||
|
|
aeb38cd2e9 | ||
|
|
17cf5f48a1 | ||
|
|
c950e6dabb | ||
|
|
e27a64f52c | ||
|
|
f02b6f29db | ||
|
|
a3ba516587 | ||
|
|
a15f5895f5 | ||
|
|
c6e36b802c | ||
|
|
f91ca28638 | ||
|
|
cfcf354d59 | ||
|
|
6813077113 | ||
|
|
581ee762b6 | ||
|
|
08c1a8f2ab | ||
|
|
ba25e463ad | ||
|
|
f2211da9bb | ||
|
|
8d3419952c | ||
|
|
8010ee3dca | ||
|
|
0f3d82a5e6 | ||
|
|
5e67e735db | ||
|
|
f9f6ca05a4 | ||
|
|
d7379d8ab6 | ||
|
|
51f44e4926 | ||
|
|
447a16dcd5 | ||
|
|
f15922ceb5 | ||
|
|
a5cc218b56 | ||
|
|
640d7305c7 | ||
|
|
fdf98932e2 | ||
|
|
2993c7e688 | ||
|
|
d6db3fe65b | ||
|
|
9a795a7f60 | ||
|
|
9ecb087cd6 | ||
|
|
a522f9879f | ||
|
|
4ee32b3263 | ||
|
|
c339b4fef8 | ||
|
|
9ff981f34f | ||
|
|
559fee0ffe | ||
|
|
e15fec9845 | ||
|
|
2073158e1f | ||
|
|
7e2ee0300c | ||
|
|
79f6e27959 | ||
|
|
450923c0a4 | ||
|
|
7537c1a908 | ||
|
|
6cfd1a495e | ||
|
|
17d4619c31 | ||
|
|
2c05e7e282 | ||
|
|
928be086e4 | ||
|
|
e3c86e8685 |
4
.github/workflows/docker-publish-beta.yml
vendored
4
.github/workflows/docker-publish-beta.yml
vendored
@@ -35,8 +35,8 @@ jobs:
|
||||
publish: true
|
||||
imageName: vabene1111/recipes
|
||||
tag: beta
|
||||
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
|
||||
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||
dockerUser: ${{ secrets.DOCKER_USERNAME }}
|
||||
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||
# Send discord notification
|
||||
- name: Discord notification
|
||||
env:
|
||||
|
||||
5
.github/workflows/docker-publish-latest.yml
vendored
5
.github/workflows/docker-publish-latest.yml
vendored
@@ -39,6 +39,5 @@ jobs:
|
||||
publish: true
|
||||
imageName: vabene1111/recipes
|
||||
tag: latest
|
||||
platform: linux/amd64,linux/arm64
|
||||
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
|
||||
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||
dockerUser: ${{ secrets.DOCKER_USERNAME }}
|
||||
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
1
.github/workflows/docker-publish-release.yml
vendored
1
.github/workflows/docker-publish-release.yml
vendored
@@ -41,7 +41,6 @@ jobs:
|
||||
publish: true
|
||||
imageName: vabene1111/recipes
|
||||
tag: ${{ steps.get_version.outputs.VERSION }}
|
||||
platform: linux/amd64,linux/arm64
|
||||
dockerUser: ${{ secrets.DOCKER_USERNAME }}
|
||||
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
|
||||
# Send discord notification
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
FROM python:3.10-alpine3.15
|
||||
|
||||
#Install all dependencies.
|
||||
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography
|
||||
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography openldap
|
||||
|
||||
#Print all logs without buffering it.
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
@@ -15,13 +15,12 @@ WORKDIR /opt/recipes
|
||||
|
||||
COPY requirements.txt ./
|
||||
|
||||
RUN sed -i '/cryptography==/d' ./requirements.txt
|
||||
|
||||
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev libressl-dev python3-dev libffi-dev cargo openldap-dev && \
|
||||
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev libressl-dev libffi-dev cargo openssl-dev openldap-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 &&\
|
||||
apk --purge del .build-deps
|
||||
|
||||
|
||||
21
boot.sh
21
boot.sh
@@ -21,18 +21,23 @@ if [ -z "${SECRET_KEY}" ]; then
|
||||
display_warning "The environment variable 'SECRET_KEY' is not set but REQUIRED for running Tandoor!"
|
||||
fi
|
||||
|
||||
# POSTGRES_PASSWORD must be set in .env file
|
||||
if [ -z "${POSTGRES_PASSWORD}" ]; then
|
||||
display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!"
|
||||
fi
|
||||
|
||||
echo "Waiting for database to be ready..."
|
||||
|
||||
attempt=0
|
||||
max_attempts=20
|
||||
while pg_isready --host=${POSTGRES_HOST} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do
|
||||
sleep 5
|
||||
done
|
||||
|
||||
if [ "${DB_ENGINE}" != 'django.db.backends.sqlite3' ]; then
|
||||
|
||||
# POSTGRES_PASSWORD must be set in .env file
|
||||
if [ -z "${POSTGRES_PASSWORD}" ]; then
|
||||
display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!"
|
||||
fi
|
||||
|
||||
while pg_isready --host=${POSTGRES_HOST} --port=${POSTGRES_PORT} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do
|
||||
sleep 5
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $attempt -gt $max_attempts ]; then
|
||||
echo -e "\nDatabase not reachable. Maximum attempts exceeded."
|
||||
@@ -58,4 +63,4 @@ echo "Done"
|
||||
|
||||
chmod -R 755 /opt/recipes/mediafiles
|
||||
|
||||
exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi
|
||||
exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi
|
||||
|
||||
@@ -89,7 +89,10 @@ class RecipeSearch():
|
||||
|
||||
self._search_type = self._search_prefs.search or 'plain'
|
||||
if self._string:
|
||||
self._unaccent_include = self._search_prefs.unaccent.values_list('field', flat=True)
|
||||
if self._postgres:
|
||||
self._unaccent_include = self._search_prefs.unaccent.values_list('field', flat=True)
|
||||
else:
|
||||
self._unaccent_include = []
|
||||
self._icontains_include = [x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.icontains.values_list('field', flat=True)]
|
||||
self._istartswith_include = [x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.istartswith.values_list('field', flat=True)]
|
||||
self._trigram_include = None
|
||||
@@ -726,9 +729,8 @@ class RecipeFacet():
|
||||
return self.get_facets()
|
||||
|
||||
def _recipe_count_queryset(self, field, depth=1, steplen=4):
|
||||
return Recipe.objects.filter(**{f'{field}__path__startswith': OuterRef('path')}, id__in=self._recipe_list, space=self._request.space
|
||||
).values(child=Substr(f'{field}__path', 1, steplen*depth)
|
||||
).annotate(count=Count('pk', distinct=True)).values('count')
|
||||
return Recipe.objects.filter(**{f'{field}__path__startswith': OuterRef('path'), f'{field}__depth__gte': depth}, id__in=self._recipe_list, space=self._request.space
|
||||
).annotate(count=Coalesce(Func('pk', function='Count'), 0)).values('count')
|
||||
|
||||
def _keyword_queryset(self, queryset, keyword=None):
|
||||
depth = getattr(keyword, 'depth', 0) + 1
|
||||
|
||||
@@ -3,8 +3,8 @@ import re
|
||||
from html import unescape
|
||||
from unicodedata import decomposition
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
from django.utils.dateparse import parse_duration
|
||||
from django.utils.translation import gettext as _
|
||||
from isodate import parse_duration as iso_parse_duration
|
||||
from isodate.isoerror import ISO8601Error
|
||||
from recipe_scrapers._utils import get_minutes
|
||||
@@ -28,9 +28,14 @@ def get_from_scraper(scrape, request):
|
||||
recipe_json['name'] = ''
|
||||
|
||||
try:
|
||||
description = scrape.schema.data.get("description") or ''
|
||||
description = scrape.description() or None
|
||||
except Exception:
|
||||
description = ''
|
||||
description = None
|
||||
if not description:
|
||||
try:
|
||||
description = scrape.schema.data.get("description") or ''
|
||||
except Exception:
|
||||
description = ''
|
||||
|
||||
recipe_json['description'] = parse_description(description)
|
||||
|
||||
@@ -51,20 +56,26 @@ def get_from_scraper(scrape, request):
|
||||
recipe_json['servings'] = max(servings, 1)
|
||||
|
||||
try:
|
||||
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("prepTime")) or 0
|
||||
recipe_json['prepTime'] = get_minutes(scrape.prep_time()) or 0
|
||||
except Exception:
|
||||
recipe_json['prepTime'] = 0
|
||||
try:
|
||||
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("prepTime")) or 0
|
||||
except Exception:
|
||||
recipe_json['prepTime'] = 0
|
||||
try:
|
||||
recipe_json['cookTime'] = get_minutes(scrape.schema.data.get("cookTime")) or 0
|
||||
recipe_json['cookTime'] = get_minutes(scrape.cook_time()) or 0
|
||||
except Exception:
|
||||
recipe_json['cookTime'] = 0
|
||||
try:
|
||||
recipe_json['cookTime'] = get_minutes(scrape.schema.data.get("cookTime")) or 0
|
||||
except Exception:
|
||||
recipe_json['cookTime'] = 0
|
||||
|
||||
if recipe_json['cookTime'] + recipe_json['prepTime'] == 0:
|
||||
try:
|
||||
recipe_json['prepTime'] = get_minutes(scrape.total_time()) or 0
|
||||
except Exception:
|
||||
try:
|
||||
get_minutes(scrape.schema.data.get("totalTime")) or 0
|
||||
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("totalTime")) or 0
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@@ -85,15 +96,23 @@ def get_from_scraper(scrape, request):
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if scrape.schema.data.get('recipeCategory'):
|
||||
keywords += listify_keywords(scrape.schema.data.get("recipeCategory"))
|
||||
if scrape.category():
|
||||
keywords += listify_keywords(scrape.category())
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if scrape.schema.data.get('recipeCategory'):
|
||||
keywords += listify_keywords(scrape.schema.data.get("recipeCategory"))
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if scrape.schema.data.get('recipeCuisine'):
|
||||
keywords += listify_keywords(scrape.schema.data.get("recipeCuisine"))
|
||||
if scrape.cuisine():
|
||||
keywords += listify_keywords(scrape.cuisine())
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if scrape.schema.data.get('recipeCuisine'):
|
||||
keywords += listify_keywords(scrape.schema.data.get("recipeCuisine"))
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
recipe_json['keywords'] = parse_keywords(list(set(map(str.casefold, keywords))), request.space)
|
||||
except AttributeError:
|
||||
@@ -146,9 +165,9 @@ def get_from_scraper(scrape, request):
|
||||
except Exception:
|
||||
recipe_json['recipeInstructions'] = ""
|
||||
|
||||
if scrape.url:
|
||||
recipe_json['url'] = scrape.url
|
||||
recipe_json['recipeInstructions'] += "\n\n" + _("Imported from") + ": " + scrape.url
|
||||
if scrape.canonical_url():
|
||||
recipe_json['url'] = scrape.canonical_url()
|
||||
recipe_json['recipeInstructions'] += "\n\n" + _("Imported from") + ": " + scrape.canonical_url()
|
||||
return recipe_json
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
|
||||
instructions = step.instruction
|
||||
|
||||
tags = markdown_tags + [
|
||||
'pre', 'table', 'td', 'tr', 'th', 'tbody', 'style', 'thead'
|
||||
'pre', 'table', 'td', 'tr', 'th', 'tbody', 'style', 'thead', 'img'
|
||||
]
|
||||
parsed_md = md.markdown(
|
||||
instructions,
|
||||
@@ -48,7 +48,7 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
|
||||
UrlizeExtension(), MarkdownFormatExtension()
|
||||
]
|
||||
)
|
||||
markdown_attrs['*'] = markdown_attrs['*'] + ['class']
|
||||
markdown_attrs['*'] = markdown_attrs['*'] + ['class', 'width', 'height']
|
||||
|
||||
instructions = bleach.clean(parsed_md, tags, markdown_attrs)
|
||||
|
||||
|
||||
@@ -2991,7 +2991,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -15,10 +15,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
|
||||
"PO-Revision-Date: 2022-02-06 21:31+0000\n"
|
||||
"Last-Translator: David Laukamp <dlkmp@live.de>\n"
|
||||
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/de/>\n"
|
||||
"PO-Revision-Date: 2022-03-09 18:31+0000\n"
|
||||
"Last-Translator: karawedi <wedi.nick@gmail.com>\n"
|
||||
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/de/>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -293,16 +293,12 @@ msgstr ""
|
||||
"A. führen niedrigere Werte zum ignorieren von mehr Tippfehlern)."
|
||||
|
||||
#: .\cookbook\forms.py:445
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
|
||||
#| "for full desciption of choices."
|
||||
msgid ""
|
||||
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
|
||||
"full description of choices."
|
||||
msgstr ""
|
||||
"Suchmethode auswählen. Klicke <a href=\"/docs/search/\">hier</a> für eine "
|
||||
"Auflistung der Optionen."
|
||||
"vollständige Erklärung der Optionen."
|
||||
|
||||
#: .\cookbook\forms.py:446
|
||||
msgid ""
|
||||
@@ -538,10 +534,8 @@ msgid "One of queryset or hash_key must be provided"
|
||||
msgstr "Es muss die Abfrage oder der Hash_Key angeben werden"
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:148
|
||||
#, fuzzy
|
||||
#| msgid "You must supply a created_by"
|
||||
msgid "You must supply a servings size"
|
||||
msgstr "Die Angabe der Verfassers ist notwendig"
|
||||
msgstr "Sie müssen eine Portionsgröße angeben"
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:61
|
||||
#: .\cookbook\helper\template_helper.py:63
|
||||
@@ -735,11 +729,16 @@ msgid ""
|
||||
"List of ingredient IDs from the recipe to add, if not provided all "
|
||||
"ingredients will be added."
|
||||
msgstr ""
|
||||
"Liste der Zutaten-IDs aus dem Rezept, wenn keine Angabe erfolgt, werden alle "
|
||||
"Zutaten hinzugefügt."
|
||||
|
||||
#: .\cookbook\serializer.py:980
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
|
||||
msgstr ""
|
||||
"Wenn Sie eine \"list_recipe\"-ID, sowie 0 Portionen angeben, wird diese "
|
||||
"Einkaufsliste gelöscht."
|
||||
|
||||
#: .\cookbook\serializer.py:988
|
||||
msgid "Amount of food to add to the shopping list"
|
||||
@@ -751,8 +750,11 @@ msgid "ID of unit to use for the shopping list"
|
||||
msgstr "ID der Einheit, die für die Einkaufsliste verwendet werden soll"
|
||||
|
||||
#: .\cookbook\serializer.py:990
|
||||
#, fuzzy
|
||||
msgid "When set to true will delete all food from active shopping lists."
|
||||
msgstr ""
|
||||
"Wenn diese Option auf wahr gesetzt ist, werden alle Lebensmittel aus den "
|
||||
"aktiven Einkaufslisten gelöscht."
|
||||
|
||||
#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6
|
||||
#: .\cookbook\templates\generic\edit_template.html:14
|
||||
@@ -3107,7 +3109,7 @@ msgstr ""
|
||||
"paar Stunden."
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
"Email konnte an den Benutzer nicht gesendet werden. Bitte teile den Link "
|
||||
"manuell."
|
||||
|
||||
@@ -2724,7 +2724,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -3042,7 +3042,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -2435,7 +2435,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:225
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:127
|
||||
|
||||
@@ -3155,7 +3155,7 @@ msgstr ""
|
||||
"quelques heures."
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
"Impossible d’envoyer le mail à l’utilisateur, veuillez partager le lien "
|
||||
"manuellement."
|
||||
|
||||
@@ -6,21 +6,21 @@
|
||||
# Translators:
|
||||
# igazka <igazka100@gmail.com>, 2020
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
|
||||
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
|
||||
"Last-Translator: igazka <igazka100@gmail.com>, 2020\n"
|
||||
"Language-Team: Hungarian (Hungary) (https://www.transifex.com/django-recipes/"
|
||||
"teams/110507/hu_HU/)\n"
|
||||
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
|
||||
"PO-Revision-Date: 2022-03-06 19:35+0000\n"
|
||||
"Last-Translator: Adrian M <adriankoooo@gmail.com>\n"
|
||||
"Language-Team: Hungarian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/hu/>\n"
|
||||
"Language: hu_HU\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.10.1\n"
|
||||
|
||||
#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34
|
||||
#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28
|
||||
@@ -30,7 +30,7 @@ msgstr "Hozzávalók"
|
||||
|
||||
#: .\cookbook\forms.py:56
|
||||
msgid "Default unit"
|
||||
msgstr ""
|
||||
msgstr "Alapértelmezett mértékegység"
|
||||
|
||||
#: .\cookbook\forms.py:57
|
||||
msgid "Use fractions"
|
||||
@@ -271,7 +271,7 @@ msgstr ""
|
||||
#: .\cookbook\forms.py:445
|
||||
msgid ""
|
||||
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
|
||||
"full description of choices."
|
||||
"full desciption of choices."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:446
|
||||
@@ -327,7 +327,7 @@ msgid "Partial Match"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:464
|
||||
msgid "Starts With"
|
||||
msgid "Starts Wtih"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:465
|
||||
@@ -471,12 +471,16 @@ msgstr ""
|
||||
msgid "You cannot interact with this object as it is not owned by you!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\recipe_search.py:486
|
||||
#: .\cookbook\helper\recipe_search.py:473
|
||||
msgid "One of queryset or hash_key must be provided"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:148
|
||||
msgid "You must supply a servings size"
|
||||
#: .\cookbook\helper\shopping_helper.py:54
|
||||
msgid "You must supply a recipe or mealplan"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:58
|
||||
msgid "You must supply a created_by"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:61
|
||||
@@ -484,23 +488,23 @@ msgstr ""
|
||||
msgid "Could not parse template code."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\integration\integration.py:213
|
||||
#: .\cookbook\integration\integration.py:200
|
||||
msgid ""
|
||||
"Importer expected a .zip file. Did you choose the correct importer type for "
|
||||
"your data ?"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\integration\integration.py:216
|
||||
#: .\cookbook\integration\integration.py:203
|
||||
msgid ""
|
||||
"An unexpected error occurred during the import. Please make sure you have "
|
||||
"uploaded a valid file."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\integration\integration.py:221
|
||||
#: .\cookbook\integration\integration.py:208
|
||||
msgid "The following recipes were ignored because they already existed:"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\integration\integration.py:225
|
||||
#: .\cookbook\integration\integration.py:212
|
||||
#, python-format
|
||||
msgid "Imported %s recipes."
|
||||
msgstr ""
|
||||
@@ -518,6 +522,7 @@ msgid "Source"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\integration\saffron.py:23
|
||||
#: .\cookbook\templates\include\log_cooking.html:18
|
||||
#: .\cookbook\templates\url_import.html:231
|
||||
#: .\cookbook\templates\url_import.html:462
|
||||
msgid "Servings"
|
||||
@@ -546,7 +551,7 @@ msgid "Rebuilds full text search index on Recipe"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:18
|
||||
msgid "Only Postgresql databases use full text search, no index to rebuild"
|
||||
msgid "Only Postgress databases use full text search, no index to rebuild"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:29
|
||||
@@ -608,78 +613,99 @@ msgstr ""
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:513
|
||||
#: .\cookbook\models.py:512
|
||||
msgid " is part of a recipe step and cannot be deleted"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
|
||||
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
|
||||
msgid "Text"
|
||||
msgstr "Szöveg"
|
||||
|
||||
#: .\cookbook\models.py:586
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
|
||||
#, fuzzy
|
||||
#| msgid "File ID"
|
||||
msgid "File"
|
||||
msgstr "Fájl ID:"
|
||||
|
||||
#: .\cookbook\models.py:586
|
||||
#: .\cookbook\templates\include\recipe_open_modal.html:7
|
||||
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
|
||||
#: .\cookbook\views\new.py:53
|
||||
msgid "Recipe"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
|
||||
msgid "Simple"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
|
||||
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
|
||||
msgid "Phrase"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
|
||||
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
|
||||
msgid "Web"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
|
||||
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
|
||||
msgid "Raw"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1106
|
||||
#: .\cookbook\models.py:1082
|
||||
#, fuzzy
|
||||
#| msgid "New Food"
|
||||
msgid "Food Alias"
|
||||
msgstr "Új Étel"
|
||||
|
||||
#: .\cookbook\models.py:1106
|
||||
#: .\cookbook\models.py:1082
|
||||
msgid "Unit Alias"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1106
|
||||
#: .\cookbook\models.py:1082
|
||||
#, fuzzy
|
||||
#| msgid "Keywords"
|
||||
msgid "Keyword Alias"
|
||||
msgstr "Kulcsszavak"
|
||||
|
||||
#: .\cookbook\serializer.py:180
|
||||
#: .\cookbook\serializer.py:175
|
||||
msgid "A user is required"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:200
|
||||
#: .\cookbook\serializer.py:195
|
||||
msgid "File uploads are not enabled for this Space."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:211
|
||||
#: .\cookbook\serializer.py:206
|
||||
msgid "You have reached your file upload limit."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:977
|
||||
#: .\cookbook\serializer.py:962
|
||||
msgid "Existing shopping list to update"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:979
|
||||
#: .\cookbook\serializer.py:964
|
||||
msgid ""
|
||||
"List of ingredient IDs from the recipe to add, if not provided all "
|
||||
"ingredients will be added."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:980
|
||||
#: .\cookbook\serializer.py:965
|
||||
msgid ""
|
||||
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:988
|
||||
#: .\cookbook\serializer.py:973
|
||||
msgid "Amount of food to add to the shopping list"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:989
|
||||
#: .\cookbook\serializer.py:974
|
||||
msgid "ID of unit to use for the shopping list"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:990
|
||||
#: .\cookbook\serializer.py:975
|
||||
msgid "When set to true will delete all food from active shopping lists."
|
||||
msgstr ""
|
||||
|
||||
@@ -1028,8 +1054,8 @@ msgstr ""
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:228
|
||||
#: .\cookbook\templates\export_response.html:7
|
||||
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
|
||||
#: .\cookbook\templates\export.html:20
|
||||
#: .\cookbook\templates\shopping_list.html:310
|
||||
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
|
||||
msgid "Export"
|
||||
@@ -1118,6 +1144,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\forms\edit_import_recipe.html:14
|
||||
#: .\cookbook\templates\generic\edit_template.html:23
|
||||
#: .\cookbook\templates\generic\new_template.html:23
|
||||
#: .\cookbook\templates\include\log_cooking.html:30
|
||||
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
|
||||
#: .\cookbook\templates\settings.html:130
|
||||
#: .\cookbook\templates\settings.html:202
|
||||
@@ -1158,7 +1185,7 @@ msgstr ""
|
||||
msgid "Recipe Books"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
|
||||
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
|
||||
msgid "Export Recipes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1276,12 +1303,19 @@ msgstr ""
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\include\recipe_open_modal.html:7
|
||||
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
|
||||
#: .\cookbook\views\new.py:53
|
||||
msgid "Recipe"
|
||||
#: .\cookbook\templates\include\log_cooking.html:9
|
||||
msgid "Log Recipe Cooking"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\include\log_cooking.html:15
|
||||
msgid "All fields are optional and can be left empty."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\include\log_cooking.html:21
|
||||
msgid "Rating"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\include\log_cooking.html:29
|
||||
#: .\cookbook\templates\include\recipe_open_modal.html:18
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
@@ -1372,7 +1406,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:57
|
||||
#: .\cookbook\templates\markdown_info.html:73
|
||||
msgid "or by leaving a blank line in between."
|
||||
msgid "or by leaving a blank line inbetween."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:59
|
||||
@@ -1396,7 +1430,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:85
|
||||
msgid ""
|
||||
"Lists can ordered or unordered. It is <b>important to leave a blank line "
|
||||
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
|
||||
"before the list!</b>"
|
||||
msgstr ""
|
||||
|
||||
@@ -1658,7 +1692,7 @@ msgstr ""
|
||||
msgid ""
|
||||
" \n"
|
||||
" Simple searches ignore punctuation and common words such as "
|
||||
"'the', 'a', 'and'. And will treat separate words as required.\n"
|
||||
"'the', 'a', 'and'. And will treat seperate words as required.\n"
|
||||
" Searching for 'apple or flour' will return any recipe that "
|
||||
"includes both 'apple' and 'flour' anywhere in the fields that have been "
|
||||
"selected for a full text search.\n"
|
||||
@@ -1683,7 +1717,7 @@ msgid ""
|
||||
"sites supporting special syntax.\n"
|
||||
" Placing quotes around several words will convert those words "
|
||||
"into a phrase.\n"
|
||||
" 'or' is recognized as searching for the word (or phrase) "
|
||||
" 'or' is recongized as searching for the word (or phrase) "
|
||||
"immediately before 'or' OR the word (or phrase) directly after.\n"
|
||||
" '-' is recognized as searching for recipes that do not include "
|
||||
"the word (or phrase) that comes immediately after. \n"
|
||||
@@ -1713,7 +1747,7 @@ msgid ""
|
||||
"'ppl', 'ple' and will create a score of how closely words match the "
|
||||
"generated trigrams.\n"
|
||||
" One benefit of searching trigams is that a search for 'sandwich' "
|
||||
"will find misspelled words such as 'sandwhich' that would be missed by other "
|
||||
"will find mispelled words such as 'sandwhich' that would be missed by other "
|
||||
"methods.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
@@ -1972,7 +2006,7 @@ msgid "Finished"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\shopping_list.html:267
|
||||
msgid "You are offline, shopping list might not synchronize."
|
||||
msgid "You are offline, shopping list might not syncronize."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\shopping_list.html:318
|
||||
@@ -2230,16 +2264,6 @@ msgstr ""
|
||||
msgid "App"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\templates\url_import.html:44
|
||||
msgid "Text"
|
||||
msgstr "Szöveg"
|
||||
|
||||
#: .\cookbook\templates\url_import.html:46
|
||||
#, fuzzy
|
||||
#| msgid "File ID"
|
||||
msgid "File"
|
||||
msgstr "Fájl ID:"
|
||||
|
||||
#: .\cookbook\templates\url_import.html:64
|
||||
msgid "Enter website URL"
|
||||
msgstr ""
|
||||
@@ -2404,203 +2428,202 @@ msgstr ""
|
||||
msgid "Recipe Markup Specification"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
|
||||
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
|
||||
msgid "Parameter updated_at incorrectly formatted"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
|
||||
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
|
||||
#, python-brace-format
|
||||
msgid "No {self.basename} with id {pk} exists"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:198
|
||||
#: .\cookbook\views\api.py:194
|
||||
msgid "Cannot merge with the same object!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:205
|
||||
#: .\cookbook\views\api.py:201
|
||||
#, python-brace-format
|
||||
msgid "No {self.basename} with id {target} exists"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:210
|
||||
#: .\cookbook\views\api.py:206
|
||||
msgid "Cannot merge with child object!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:243
|
||||
#: .\cookbook\views\api.py:239
|
||||
#, python-brace-format
|
||||
msgid "{source.name} was merged successfully with {target.name}"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:248
|
||||
#: .\cookbook\views\api.py:244
|
||||
#, python-brace-format
|
||||
msgid "An error occurred attempting to merge {source.name} with {target.name}"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:304
|
||||
#: .\cookbook\views\api.py:300
|
||||
#, python-brace-format
|
||||
msgid "{child.name} was moved successfully to the root."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
|
||||
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
|
||||
msgid "An error occurred attempting to move "
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:310
|
||||
#: .\cookbook\views\api.py:306
|
||||
msgid "Cannot move an object to itself!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:316
|
||||
#: .\cookbook\views\api.py:312
|
||||
#, python-brace-format
|
||||
msgid "No {self.basename} with id {parent} exists"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:322
|
||||
#: .\cookbook\views\api.py:318
|
||||
#, python-brace-format
|
||||
msgid "{child.name} was moved successfully to parent {parent.name}"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:474
|
||||
#: .\cookbook\views\api.py:470
|
||||
#, python-brace-format
|
||||
msgid "{obj.name} was removed from the shopping list."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
|
||||
#: .\cookbook\views\api.py:742
|
||||
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
|
||||
#, python-brace-format
|
||||
msgid "{obj.name} was added to the shopping list."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:591
|
||||
#: .\cookbook\views\api.py:587
|
||||
msgid "ID of recipe a step is part of. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:592
|
||||
#: .\cookbook\views\api.py:588
|
||||
msgid "Query string matched (fuzzy) against object name."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:635
|
||||
#: .\cookbook\views\api.py:631
|
||||
msgid ""
|
||||
"Query string matched (fuzzy) against recipe name. In the future also "
|
||||
"fulltext search."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:636
|
||||
#: .\cookbook\views\api.py:632
|
||||
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:637
|
||||
#: .\cookbook\views\api.py:633
|
||||
msgid "ID of food a recipe should have. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:638
|
||||
#: .\cookbook\views\api.py:634
|
||||
msgid "ID of unit a recipe should have."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:639
|
||||
#: .\cookbook\views\api.py:635
|
||||
msgid "Rating a recipe should have. [0 - 5]"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:640
|
||||
#: .\cookbook\views\api.py:636
|
||||
msgid "ID of book a recipe should be in. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:641
|
||||
#: .\cookbook\views\api.py:637
|
||||
msgid ""
|
||||
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
|
||||
"provided keywords."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:642
|
||||
#: .\cookbook\views\api.py:638
|
||||
msgid ""
|
||||
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
|
||||
"provided foods."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:643
|
||||
#: .\cookbook\views\api.py:639
|
||||
msgid ""
|
||||
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
|
||||
"provided books."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:644
|
||||
#: .\cookbook\views\api.py:640
|
||||
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:645
|
||||
#: .\cookbook\views\api.py:641
|
||||
msgid "Returns the results in randomized order. [true/<b>false</b>]"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:646
|
||||
#: .\cookbook\views\api.py:642
|
||||
msgid "Returns new results first in search results. [true/<b>false</b>]"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:784
|
||||
#: .\cookbook\views\api.py:768
|
||||
msgid ""
|
||||
"Returns the shopping list entry with a primary key of id. Multiple values "
|
||||
"allowed."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:787
|
||||
#: .\cookbook\views\api.py:771
|
||||
msgid ""
|
||||
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
|
||||
"b>]<br> - recent includes unchecked items and recently completed items."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:789
|
||||
#: .\cookbook\views\api.py:773
|
||||
msgid "Returns the shopping list entries sorted by supermarket category order."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
|
||||
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
|
||||
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
|
||||
msgid "This feature is not yet available in the hosted version of tandoor!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:971
|
||||
#: .\cookbook\views\api.py:944
|
||||
msgid "Sync successful!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:976
|
||||
#: .\cookbook\views\api.py:949
|
||||
msgid "Error synchronizing with Storage"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1055
|
||||
#: .\cookbook\views\api.py:1028
|
||||
msgid "Nothing to do."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1070
|
||||
#: .\cookbook\views\api.py:1043
|
||||
msgid "The requested site provided malformed data and cannot be read."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1077
|
||||
#: .\cookbook\views\api.py:1050
|
||||
msgid "The requested page could not be found."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1095
|
||||
#: .\cookbook\views\api.py:1068
|
||||
msgid ""
|
||||
"The requested site does not provide any recognized data format to import the "
|
||||
"recipe from."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1109
|
||||
#: .\cookbook\views\api.py:1082
|
||||
msgid "Connection Refused."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1118
|
||||
msgid "No usable data could be found."
|
||||
#: .\cookbook\views\api.py:1091
|
||||
msgid "No useable data could be found."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\api.py:1134
|
||||
#: .\cookbook\views\api.py:1107
|
||||
msgid "I couldn't find anything to do."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
|
||||
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
|
||||
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
|
||||
#: .\cookbook\views\new.py:33
|
||||
msgid "You have reached the maximum number of recipes for your space."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
|
||||
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
|
||||
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
|
||||
#: .\cookbook\views\new.py:37
|
||||
msgid "You have more users than allowed in your space."
|
||||
msgstr ""
|
||||
@@ -2658,16 +2681,20 @@ msgstr ""
|
||||
msgid "Error saving changes!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
|
||||
#: .\cookbook\views\import_export.py:106
|
||||
msgid "Importing is not implemented for this provider"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\import_export.py:130
|
||||
#: .\cookbook\views\import_export.py:127
|
||||
msgid ""
|
||||
"The PDF Exporter is not enabled on this instance as it is still in an "
|
||||
"experimental state."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\import_export.py:132
|
||||
msgid "Exporting is not implemented for this provider"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\lists.py:25
|
||||
msgid "Import Log"
|
||||
msgstr ""
|
||||
@@ -2749,7 +2776,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
@@ -2784,44 +2811,44 @@ msgstr ""
|
||||
msgid "Fuzzy search is not compatible with this search method!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:473
|
||||
#: .\cookbook\views\views.py:470
|
||||
msgid ""
|
||||
"The setup page can only be used to create the first user! If you have "
|
||||
"forgotten your superuser credentials please consult the django documentation "
|
||||
"on how to reset passwords."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:480
|
||||
#: .\cookbook\views\views.py:477
|
||||
msgid "Passwords dont match!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:496
|
||||
#: .\cookbook\views\views.py:493
|
||||
msgid "User has been created, please login!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:512
|
||||
#: .\cookbook\views\views.py:509
|
||||
msgid "Malformed Invite Link supplied!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:519
|
||||
#: .\cookbook\views\views.py:516
|
||||
msgid "You are already member of a space and therefore cannot join this one."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:530
|
||||
#: .\cookbook\views\views.py:527
|
||||
msgid "Successfully joined space."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:536
|
||||
#: .\cookbook\views\views.py:533
|
||||
msgid "Invite Link not valid or already used!"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:617
|
||||
#: .\cookbook\views\views.py:614
|
||||
msgid ""
|
||||
"Reporting share links is not enabled for this instance. Please notify the "
|
||||
"page administrator to report problems."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:623
|
||||
#: .\cookbook\views\views.py:620
|
||||
msgid ""
|
||||
"Recipe sharing link has been disabled! For additional information please "
|
||||
"contact the page administrator."
|
||||
|
||||
@@ -2952,7 +2952,7 @@ msgstr ""
|
||||
"ora."
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
"Non è stato possibile inviare l'email all'utente, condividi il link "
|
||||
"manualmente."
|
||||
|
||||
@@ -2987,7 +2987,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -3104,7 +3104,7 @@ msgstr ""
|
||||
"uren."
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
"E-mail aan gebruiker kon niet verzonden worden, deel de link handmatig."
|
||||
|
||||
|
||||
@@ -2888,7 +2888,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
2808
cookbook/locale/pt_BR/LC_MESSAGES/django.po
Normal file
2808
cookbook/locale/pt_BR/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2724,7 +2724,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -2493,7 +2493,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:229
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:127
|
||||
|
||||
@@ -2501,7 +2501,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:245
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:128
|
||||
|
||||
@@ -2530,7 +2530,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:229
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:127
|
||||
|
||||
@@ -2741,7 +2741,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -2855,7 +2855,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:232
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:126
|
||||
|
||||
@@ -2254,7 +2254,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\new.py:246
|
||||
msgid "Email to user could not be send, please share link manually."
|
||||
msgid "Email could not be sent to user. Please share the link manually."
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\views\views.py:125
|
||||
|
||||
39
cookbook/templates/openid/login.html
Normal file
39
cookbook/templates/openid/login.html
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends "base.html" %}
|
||||
{% load crispy_forms_filters %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
||||
{% load account socialaccount %}
|
||||
|
||||
{% block title %}OpenID {% trans 'Login' %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12" style="text-align: center">
|
||||
<h3>{% trans "Sign In" %}</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-lg-6 col-md-6 offset-lg-3 offset-md-3">
|
||||
<hr>
|
||||
<form id="openid_login_form" class="openid_login" method="post" action="{% url 'openid_login' %}">
|
||||
{% csrf_token %}
|
||||
{{ form | crispy }}
|
||||
<button class="btn btn-success" type="submit">{% trans "Sign In" %}</button>
|
||||
<a class="btn btn-secondary" href="{% url 'account_login' %}">{% trans "Back" %}</a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
$('#id_openid').focus()
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
33
cookbook/templates/socialaccount/authentication_error.html
Normal file
33
cookbook/templates/socialaccount/authentication_error.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
||||
{% load account socialaccount %}
|
||||
|
||||
{% block head_title %}{% trans "Social Network Login Failure" %}{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12" style="text-align: center">
|
||||
<h3>{% trans "Sign In" %}</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-lg-6 col-md-6 offset-lg-3 offset-md-3">
|
||||
<hr>
|
||||
<h6>{% trans "Social Network Login Failure" %}</h6>
|
||||
|
||||
<p>{% trans "An error occurred while attempting to login via your social network account." %}</p>
|
||||
|
||||
<a class="btn btn-secondary" href="{% url 'account_login' %}">{% trans "Back" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -105,7 +105,7 @@
|
||||
<br/>
|
||||
<h4>Debug</h4>
|
||||
<textarea class="form-control" rows="20">
|
||||
Gunicoren Media: {{ gunicorn_media }}
|
||||
Gunicorn Media: {{ gunicorn_media }}
|
||||
Sqlite: {{ postgres }}
|
||||
Debug: {{ debug }}
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@ class InviteLinkCreate(GroupRequiredMixin, CreateView):
|
||||
messages.add_message(self.request, messages.ERROR,
|
||||
_('You have send to many emails, please share the link manually or wait a few hours.'))
|
||||
except (SMTPException, BadHeaderError, TimeoutError):
|
||||
messages.add_message(self.request, messages.ERROR, _('Email to user could not be send, please share link manually.'))
|
||||
messages.add_message(self.request, messages.ERROR, _('Email could not be sent to user. Please share the link manually.'))
|
||||
|
||||
return HttpResponseRedirect(reverse('view_space'))
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import json
|
||||
import traceback
|
||||
|
||||
import requests
|
||||
from django.db.models import Q
|
||||
@@ -52,10 +53,10 @@ def hook(request, token):
|
||||
f = ingredient_parser.get_food(food)
|
||||
u = ingredient_parser.get_unit(unit)
|
||||
|
||||
ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, original_text=ingredient, created_by=request.user, space=request.space)
|
||||
ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, created_by=request.user, space=request.space)
|
||||
|
||||
return JsonResponse({'data': data['message']['text']})
|
||||
except Exception:
|
||||
pass
|
||||
traceback.print_exc()
|
||||
|
||||
return JsonResponse({})
|
||||
|
||||
@@ -14,8 +14,8 @@ It can be run and accessed on port 80 using:
|
||||
|
||||
```shell
|
||||
docker run -d \
|
||||
-v ./staticfiles:/opt/recipes/staticfiles \
|
||||
-v ./mediafiles:/opt/recipes/mediafiles \
|
||||
-v "$(pwd)"/staticfiles:/opt/recipes/staticfiles \
|
||||
-v "$(pwd)"/mediafiles:/opt/recipes/mediafiles \
|
||||
-p 80:8080 \
|
||||
-e SECRET_KEY=YOUR_SECRET_KEY \
|
||||
-e DB_ENGINE=django.db.backends.postgresql \
|
||||
@@ -109,6 +109,9 @@ in combination with [jrcs's letsencrypt companion](https://hub.docker.com/r/jrcs
|
||||
|
||||
Please refer to the appropriate documentation on how to setup the reverse proxy and networks.
|
||||
|
||||
!!!!!!warning "Adjust client_max_body_size"
|
||||
By using jwilder's Nginx-proxy, uploads will be restricted to 1 MB file size. This can be resolved by adjusting the ```client_max_body_size``` variable in the jwilder nginx configuration.
|
||||
|
||||
Remember to add the appropriate environment variables to the `.env` file:
|
||||
|
||||
```
|
||||
|
||||
@@ -19,19 +19,44 @@ Give the user permissions: `chown -R recipes:www-data /var/www/recipes`
|
||||
|
||||
Create virtual env: `python3.9 -m venv /var/www/recipes`
|
||||
|
||||
Install Javascript Tools
|
||||
Install Javascript Tools (nodejs >= 12 required)
|
||||
```shell
|
||||
### Just use one of these possibilites!
|
||||
# Using Ubuntu
|
||||
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
|
||||
# Using Debian, as root
|
||||
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
|
||||
apt-get install -y nodejs
|
||||
|
||||
# Using a RPM based distro
|
||||
## ... as root
|
||||
curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash -
|
||||
|
||||
## ... no root privileges
|
||||
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
|
||||
```
|
||||
```shell
|
||||
sudo apt install nodejs
|
||||
sudo npm install --global yarn
|
||||
```
|
||||
|
||||
!!! info "NodeJS installation issues"
|
||||
If you run into problems with the NodeJS installation, please refer to the [official documentation](https://github.com/nodesource/distributions/blob/master/README.md).
|
||||
|
||||
### Install postgresql requirements
|
||||
|
||||
```shell
|
||||
sudo apt install libpq-dev postgresql
|
||||
```
|
||||
|
||||
###Install project requirements
|
||||
### Install LDAP requirements
|
||||
|
||||
```shell
|
||||
sudo apt install libsasl2-dev python-dev libldap2-dev libssl-dev
|
||||
```
|
||||
|
||||
### Install project requirements
|
||||
|
||||
!!! warning "Update"
|
||||
Dependencies change with most updates so the following steps need to be re-run with every update or else the application might stop working.
|
||||
|
||||
@@ -22,13 +22,14 @@ webdavclient3==3.14.6
|
||||
whitenoise==5.3.0
|
||||
icalendar==4.0.9
|
||||
pyyaml==6.0
|
||||
uritemplate==4.1.1
|
||||
beautifulsoup4==4.10.0
|
||||
microdata==0.8.0
|
||||
Jinja2==3.0.3
|
||||
django-webpack-loader==1.4.1
|
||||
django-js-reverse==0.9.1
|
||||
django-allauth==0.47.0
|
||||
recipe-scrapers==13.18.0
|
||||
recipe-scrapers==13.19.0
|
||||
django-scopes==1.2.0
|
||||
pytest==6.2.5
|
||||
pytest-django==4.5.2
|
||||
|
||||
@@ -1148,7 +1148,10 @@ export default {
|
||||
},
|
||||
showSQL: function () {
|
||||
let params = this.buildParams()
|
||||
this.genericAPI(this.Models.RECIPE, this.Actions.LIST, params).then((result) => {})
|
||||
params.options.query.debug = true
|
||||
this.genericAPI(this.Models.RECIPE, this.Actions.LIST, params).then((result) => {
|
||||
console.log(result.data)
|
||||
})
|
||||
},
|
||||
// TODO refactor to combine with load KeywordChildren
|
||||
loadFoodChildren({ action, parentNode, callback }) {
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
class="btn dropdown-toggle btn-link text-decoration-none text-dark pr-2 dropdown-toggle-no-caret"
|
||||
@click.stop="openContextMenu($event, s, true)"
|
||||
>
|
||||
<i class="fas fa-ellipsis-v fa-lg"></i>
|
||||
<i class="fas fa-ellipsis-v"></i>
|
||||
</button>
|
||||
|
||||
<b-button
|
||||
@@ -116,16 +116,16 @@
|
||||
:aria-expanded="'true' ? x == 'false' : 'true'"
|
||||
>
|
||||
<i class="fa fa-chevron-right rotate" />
|
||||
<span class="h5 ml-2 text-secondary">{{ i }}</span>
|
||||
<span class="h6 ml-2 text-secondary">{{ i }}</span>
|
||||
</b-button>
|
||||
</div>
|
||||
|
||||
<div class="collapse" :id="'section-' + sectionID(x, i)" visible role="tabpanel" :class="{ show: x == 'false' }">
|
||||
<!-- passing an array of values to the table grouped by Food -->
|
||||
<transition-group name="slide-fade">
|
||||
<div class="mx-4" v-for="(entries, x) in Object.entries(s)" :key="x">
|
||||
<div class="ml-4 mr-0" v-for="(entries, x) in Object.entries(s)" :key="x">
|
||||
<transition name="slide-fade" mode="out-in">
|
||||
<ShoppingLineItem
|
||||
<shopping-line-item
|
||||
:entries="entries[1]"
|
||||
:groupby="group_by"
|
||||
:settings="settings"
|
||||
|
||||
@@ -206,7 +206,7 @@ export default {
|
||||
}
|
||||
if (!cancel) {
|
||||
this.$bvModal.hide(`edit-modal`)
|
||||
this.$emit("save-entry", { ...this.mealplan_settings, ...this.entryEditing, ...{ addshopping: this.entryEditing.addshopping && !this.autoMealPlan } })
|
||||
this.$emit("save-entry", { ...this.mealplan_settings, ...this.entryEditing, ...{ addshopping: this.mealplan_settings.addshopping && !this.autoMealPlan } })
|
||||
}
|
||||
},
|
||||
deleteEntry() {
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
<template>
|
||||
<div id="shopping_line_item">
|
||||
<b-row align-h="start">
|
||||
<b-col cols="3" md="2" class="justify-content-start align-items-center d-flex d-md-none pr-0" v-if="settings.left_handed">
|
||||
<b-col cols="2" md="2" class="justify-content-start align-items-center d-flex d-md-none pr-0" v-if="settings.left_handed">
|
||||
<input type="checkbox" class="form-control form-control-sm checkbox-control-mobile" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" />
|
||||
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link">
|
||||
<div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div>
|
||||
</b-button>
|
||||
</b-col>
|
||||
<b-col cols="2" md="1" class="align-items-center d-flex">
|
||||
<b-col cols="1" class="align-items-center d-flex">
|
||||
<div class="dropdown b-dropdown position-static inline-block" data-html2canvas-ignore="true" @click.stop="$emit('open-context-menu', $event, entries)">
|
||||
<button
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false"
|
||||
type="button"
|
||||
:class="settings.left_handed ? 'dropdown-spacing' : ''"
|
||||
class="btn dropdown-toggle btn-link text-decoration-none text-body pr-1 dropdown-toggle-no-caret"
|
||||
class="btn dropdown-toggle btn-link text-decoration-none text-body pr-0 pl-1 dropdown-toggle-no-caret"
|
||||
>
|
||||
<i class="fas fa-ellipsis-v fa-lg"></i>
|
||||
<i class="fas fa-ellipsis-v"></i>
|
||||
</button>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="1" class="px-1 justify-content-center align-items-center d-none d-md-flex">
|
||||
<input type="checkbox" class="form-control form-control-sm checkbox-control" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" />
|
||||
</b-col>
|
||||
<b-col cols="7" md="9">
|
||||
<b-col cols="8" >
|
||||
<b-row class="d-flex h-100">
|
||||
<b-col cols="5" md="3" class="d-flex align-items-center" v-if="Object.entries(formatAmount).length == 1">
|
||||
<b-col cols="6" md="3" class="d-flex align-items-center" v-if="Object.entries(formatAmount).length == 1">
|
||||
<strong class="mr-1">{{ Object.entries(formatAmount)[0][1] }}</strong> {{ Object.entries(formatAmount)[0][0] }}
|
||||
</b-col>
|
||||
<b-col cols="5" md="3" class="d-flex flex-column" v-if="Object.entries(formatAmount).length != 1">
|
||||
<b-col cols="6" md="3" class="d-flex flex-column" v-if="Object.entries(formatAmount).length != 1">
|
||||
<div class="small" v-for="(x, i) in Object.entries(formatAmount)" :key="i">
|
||||
{{ x[1] }}  
|
||||
{{ x[0] }}
|
||||
</div>
|
||||
</b-col>
|
||||
|
||||
<b-col cols="7" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2">
|
||||
<b-col cols="6" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2">
|
||||
{{ formatFood }}
|
||||
</b-col>
|
||||
<b-col cols="3" data-html2canvas-ignore="true" class="align-items-center d-none d-md-flex justify-content-end">
|
||||
@@ -47,7 +47,7 @@
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-col>
|
||||
<b-col cols="3" md="2" class="justify-content-start align-items-center d-flex d-md-none" v-if="!settings.left_handed">
|
||||
<b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0" v-if="!settings.left_handed">
|
||||
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link">
|
||||
<div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div>
|
||||
</b-button>
|
||||
@@ -179,7 +179,7 @@ export default {
|
||||
formatAmount: function () {
|
||||
let amount = {}
|
||||
this.entries.forEach((entry) => {
|
||||
let unit = entry?.unit?.name ?? "----"
|
||||
let unit = entry?.unit?.name ?? "---"
|
||||
if (entry.amount) {
|
||||
if (amount[unit]) {
|
||||
amount[unit] += entry.amount
|
||||
|
||||
380
vue/src/locales/pt.json
Normal file
380
vue/src/locales/pt.json
Normal file
@@ -0,0 +1,380 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "",
|
||||
"err_creating_resource": "",
|
||||
"err_updating_resource": "",
|
||||
"err_deleting_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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"create_shopping_new": "",
|
||||
"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": "",
|
||||
"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": "Criado em",
|
||||
"updatedon": "Atualizado em",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "Interno",
|
||||
"Units": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "",
|
||||
"Supermarkets": "",
|
||||
"User": "Utilizador",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Reset": ""
|
||||
}
|
||||
380
vue/src/locales/pt_BR.json
Normal file
380
vue/src/locales/pt_BR.json
Normal file
@@ -0,0 +1,380 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "",
|
||||
"err_creating_resource": "",
|
||||
"err_updating_resource": "",
|
||||
"err_deleting_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": "Tempo do processo (minutos)",
|
||||
"confirm_delete": "Tem certeza que deseja deletar esse {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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"create_shopping_new": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"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": "",
|
||||
"Reset": ""
|
||||
}
|
||||
Reference in New Issue
Block a user