mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-25 11:19:39 -05:00
Compare commits
133 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8183e350c9 | ||
|
|
4438bfcb89 | ||
|
|
f42b2cfd31 | ||
|
|
09131e8eae | ||
|
|
f5f001b3d2 | ||
|
|
7f8587922d | ||
|
|
a3460bc023 | ||
|
|
5faa74a75d | ||
|
|
65dbc643d3 | ||
|
|
f0b169647b | ||
|
|
d786ee09fa | ||
|
|
a46f3958fe | ||
|
|
6c17937313 | ||
|
|
a26835ccc4 | ||
|
|
86fc4aa2d0 | ||
|
|
4bd3da451d | ||
|
|
0003405e98 | ||
|
|
b586794337 | ||
|
|
460cb43113 | ||
|
|
5128fcc9eb | ||
|
|
243ff8601c | ||
|
|
97f8d46afb | ||
|
|
e469ebf35e | ||
|
|
e04c729476 | ||
|
|
d98bf9155d | ||
|
|
e98d00a962 | ||
|
|
cf5f896cec | ||
|
|
e8d616ac98 | ||
|
|
7a22d43959 | ||
|
|
6b68f48227 | ||
|
|
115f18889a | ||
|
|
0aaffb7545 | ||
|
|
087cbdade8 | ||
|
|
7e55115a3a | ||
|
|
31ee55a113 | ||
|
|
61be55e4b7 | ||
|
|
e3f695bde1 | ||
|
|
0fb3d22f6a | ||
|
|
7ba5187ecf | ||
|
|
168c0f3a0d | ||
|
|
1179e226ab | ||
|
|
bed22c055d | ||
|
|
c25a1df480 | ||
|
|
d1df772218 | ||
|
|
cbdd23020b | ||
|
|
10f8a56343 | ||
|
|
006c5b3af8 | ||
|
|
562a0dceae | ||
|
|
cde03a0f33 | ||
|
|
b42285a9a5 | ||
|
|
f4d4a5b714 | ||
|
|
ee7d611086 | ||
|
|
e51fda5f20 | ||
|
|
bee759e166 | ||
|
|
5802dfd0a5 | ||
|
|
c18ce7635d | ||
|
|
942a8a6119 | ||
|
|
4015edde90 | ||
|
|
1c32940f5c | ||
|
|
447ffa9fe2 | ||
|
|
8480234592 | ||
|
|
2e0345a4a8 | ||
|
|
49fc0cf80f | ||
|
|
c67ecb6e31 | ||
|
|
b4f12c4e84 | ||
|
|
0b2adf5249 | ||
|
|
7dcb5884d9 | ||
|
|
35bd550101 | ||
|
|
707abfacb0 | ||
|
|
ed4f4c77e8 | ||
|
|
c492fb513b | ||
|
|
310b8e04e1 | ||
|
|
efeae4debc | ||
|
|
6bc25c32ff | ||
|
|
7f2b0438fe | ||
|
|
8481f8c658 | ||
|
|
d842795c25 | ||
|
|
58dd700207 | ||
|
|
1331d2cb6d | ||
|
|
ad2a613fd8 | ||
|
|
0565189580 | ||
|
|
5aa351b885 | ||
|
|
d5226eb5cf | ||
|
|
9ead1d0022 | ||
|
|
67342c3ba9 | ||
|
|
3fecd82cd0 | ||
|
|
a033c4290f | ||
|
|
b6597af0d7 | ||
|
|
af6ed4bd24 | ||
|
|
cc4bddb3fe | ||
|
|
95a9df9c05 | ||
|
|
c44de28c2c | ||
|
|
9f1b87fa4f | ||
|
|
b96e0bab11 | ||
|
|
fe97fb371b | ||
|
|
bb7df960cc | ||
|
|
c3c7d803dc | ||
|
|
99ce3327cc | ||
|
|
d1949df23d | ||
|
|
119b47c3c4 | ||
|
|
8b50c59ad3 | ||
|
|
e2ac65467b | ||
|
|
c5cc492f0a | ||
|
|
8c73b5254c | ||
|
|
4b0315ffd3 | ||
|
|
6a96f5b7c5 | ||
|
|
8875dd4083 | ||
|
|
7299f265d3 | ||
|
|
cac186f63c | ||
|
|
fd4c571e48 | ||
|
|
db99450475 | ||
|
|
ec50add571 | ||
|
|
1fc3746619 | ||
|
|
debf4c124a | ||
|
|
0e071255e5 | ||
|
|
4d0b8c690b | ||
|
|
85b3e0a0a6 | ||
|
|
d8573ce16f | ||
|
|
7f7e3180fa | ||
|
|
57cc6feef0 | ||
|
|
fb198a80d2 | ||
|
|
5b324a86dc | ||
|
|
f633274bef | ||
|
|
65b2eb6d7e | ||
|
|
0c509ec02e | ||
|
|
babcddeeb1 | ||
|
|
f23b282f27 | ||
|
|
fcfedd3026 | ||
|
|
efd65c1024 | ||
|
|
6f4f5381ff | ||
|
|
95b63f5180 | ||
|
|
f33a52a94c | ||
|
|
90baf26eb8 |
4
.github/workflows/build-docker.yml
vendored
4
.github/workflows/build-docker.yml
vendored
@@ -107,7 +107,7 @@ jobs:
|
||||
- name: Discord notification
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
uses: Ilshidur/action-discord@0.4.0
|
||||
with:
|
||||
args: '🚀 Version {{ VERSION }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ VERSION }}'
|
||||
|
||||
@@ -121,6 +121,6 @@ jobs:
|
||||
- name: Discord notification
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }}
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
uses: Ilshidur/action-discord@0.4.0
|
||||
with:
|
||||
args: '🚀 The Tandoor 2 Image has been updated! 🥳'
|
||||
|
||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
node-version: ["22"]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: awalsh128/cache-apt-pkgs-action@v1.4.3
|
||||
- uses: awalsh128/cache-apt-pkgs-action@v1.5.1
|
||||
with:
|
||||
packages: libsasl2-dev python3-dev libxml2-dev libxmlsec1-dev libxslt-dev libxmlsec1-openssl libxslt-dev libldap2-dev libssl-dev gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl
|
||||
version: 1.0
|
||||
|
||||
29
Dockerfile
29
Dockerfile
@@ -1,12 +1,11 @@
|
||||
FROM python:3.13-alpine3.21
|
||||
FROM python:3.13-alpine3.22
|
||||
|
||||
#Install all dependencies.
|
||||
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git libgcc libstdc++ nginx
|
||||
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git libgcc libstdc++ nginx tini envsubst
|
||||
|
||||
#Print all logs without buffering it.
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
|
||||
ENV DOCKER true
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
DOCKER=true
|
||||
|
||||
#This port will be used by gunicorn.
|
||||
EXPOSE 80 8080
|
||||
@@ -17,23 +16,14 @@ 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
|
||||
|
||||
# remove Development dependencies from requirements.txt
|
||||
RUN sed -i '/# Development/,$d' requirements.txt
|
||||
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 xmlsec-dev xmlsec build-base g++ curl && \
|
||||
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
|
||||
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 xmlsec-dev xmlsec build-base g++ curl rust && \
|
||||
python -m venv venv && \
|
||||
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
|
||||
venv/bin/pip debug -v && \
|
||||
venv/bin/pip install wheel==0.45.1 && \
|
||||
venv/bin/pip install setuptools_rust==1.10.2 && \
|
||||
if [ `apk --print-arch` = "aarch64" ]; then \
|
||||
curl https://sh.rustup.rs -sSf | sh -s -- -y; \
|
||||
fi &&\
|
||||
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
|
||||
apk --purge del .build-deps
|
||||
|
||||
@@ -41,8 +31,11 @@ RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-de
|
||||
COPY . ./
|
||||
|
||||
# delete default nginx config and link it to tandoors config
|
||||
RUN rm -rf /etc/nginx/http.d
|
||||
RUN ln -s /opt/recipes/http.d /etc/nginx/http.d
|
||||
# create symlinks to access and error log to show them on stdout
|
||||
RUN rm -rf /etc/nginx/http.d && \
|
||||
ln -s /opt/recipes/http.d /etc/nginx/http.d && \
|
||||
ln -sf /dev/stdout /var/log/nginx/access.log && \
|
||||
ln -sf /dev/stderr /var/log/nginx/error.log
|
||||
|
||||
# commented for now https://github.com/TandoorRecipes/recipes/issues/3478
|
||||
#HEALTHCHECK --interval=30s \
|
||||
@@ -57,4 +50,4 @@ RUN /opt/recipes/venv/bin/python version.py
|
||||
RUN find . -type d -name ".git" | xargs rm -rf
|
||||
|
||||
RUN chmod +x boot.sh
|
||||
ENTRYPOINT ["/opt/recipes/boot.sh"]
|
||||
ENTRYPOINT ["/sbin/tini", "--", "/opt/recipes/boot.sh"]
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<a href="https://docs.tandoor.dev/install/docker/" target="_blank" rel="noopener noreferrer">Installation</a> •
|
||||
<a href="https://docs.tandoor.dev/" target="_blank" rel="noopener noreferrer">Docs</a> •
|
||||
<a href="https://app.tandoor.dev/accounts/login/?demo" target="_blank" rel="noopener noreferrer">Demo</a> •
|
||||
<a href="https://community.tandoor.dev" target="_blank" rel="noopener noreferrer">Community</a> •
|
||||
<a href="https://discord.gg/RhzBrfWgtp" target="_blank" rel="noopener noreferrer">Discord</a>
|
||||
</p>
|
||||
|
||||
@@ -81,13 +82,13 @@ Share some information on how you use Tandoor to help me improve the application
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
|
||||
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
|
||||
<td><a href="https://community.tandoor.dev">Community</a></td>
|
||||
<td>Get support, share best practices, discuss feature ideas, and meet other Tandoor users.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://twitter.com/TandoorRecipes">Twitter</a></td>
|
||||
<td>You can follow our Twitter account to get updates on new features or releases</td>
|
||||
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
|
||||
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
11
boot.sh
Normal file → Executable file
11
boot.sh
Normal file → Executable file
@@ -1,7 +1,11 @@
|
||||
#!/bin/sh
|
||||
source venv/bin/activate
|
||||
|
||||
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
|
||||
# these are envsubst in the nginx config, make sure they default to something sensible when unset
|
||||
export TANDOOR_PORT="${TANDOOR_PORT:-8080}"
|
||||
export MEDIA_ROOT=${MEDIA_ROOT:-/opt/recipes/mediafiles};
|
||||
export STATIC_ROOT=${STATIC_ROOT:-/opt/recipes/staticfiles};
|
||||
|
||||
GUNICORN_WORKERS="${GUNICORN_WORKERS:-3}"
|
||||
GUNICORN_THREADS="${GUNICORN_THREADS:-2}"
|
||||
GUNICORN_LOG_LEVEL="${GUNICORN_LOG_LEVEL:-'info'}"
|
||||
@@ -87,10 +91,13 @@ python manage.py collectstatic --noinput
|
||||
|
||||
echo "Done"
|
||||
|
||||
chmod -R 755 /opt/recipes/mediafiles
|
||||
chmod -R 755 ${MEDIA_ROOT:-/opt/recipes/mediafiles}
|
||||
|
||||
ipv6_disable=$(cat /sys/module/ipv6/parameters/disable)
|
||||
|
||||
# prepare nginx config
|
||||
envsubst '$MEDIA_ROOT $STATIC_ROOT $TANDOOR_PORT' < /opt/recipes/http.d/Recipes.conf.template > /opt/recipes/http.d/Recipes.conf
|
||||
|
||||
# start nginx
|
||||
echo "Starting nginx"
|
||||
nginx
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2025-02-16 14:58+0000\n"
|
||||
"Last-Translator: Elvis Gosselin <elvis.gosselin@tutanota.com>\n"
|
||||
"PO-Revision-Date: 2025-08-10 11:36+0000\n"
|
||||
"Last-Translator: Enzo La Rafale <enzo.chaussivert@gmail.com>\n"
|
||||
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/fr/>\n"
|
||||
"Language: fr\n"
|
||||
@@ -405,7 +405,7 @@ msgstr "Rubrique"
|
||||
|
||||
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
|
||||
msgid "Fixes foods with "
|
||||
msgstr ""
|
||||
msgstr "Corriger les aliments avec "
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:14
|
||||
msgid "Rebuilds full text search index on Recipe"
|
||||
@@ -442,8 +442,6 @@ msgid "Other"
|
||||
msgstr "Autre"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
|
||||
#, fuzzy
|
||||
#| msgid "Fats"
|
||||
msgid "Fat"
|
||||
msgstr "Matières grasses"
|
||||
|
||||
@@ -451,7 +449,7 @@ msgstr "Matières grasses"
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
|
||||
msgid "g"
|
||||
msgstr ""
|
||||
msgstr "g"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
|
||||
msgid "Carbohydrates"
|
||||
@@ -467,7 +465,7 @@ msgstr "Calories"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
|
||||
msgid "kcal"
|
||||
msgstr ""
|
||||
msgstr "kcal"
|
||||
|
||||
#: .\cookbook\models.py:325
|
||||
msgid ""
|
||||
@@ -554,30 +552,24 @@ msgid "Instruction Replace"
|
||||
msgstr "Remplacer l'instruction"
|
||||
|
||||
#: .\cookbook\models.py:1472
|
||||
#, fuzzy
|
||||
#| msgid "New Unit"
|
||||
msgid "Never Unit"
|
||||
msgstr "Nouvelle unité"
|
||||
msgstr "Aucune unité"
|
||||
|
||||
#: .\cookbook\models.py:1473
|
||||
msgid "Transpose Words"
|
||||
msgstr ""
|
||||
msgstr "Transposer les mots"
|
||||
|
||||
#: .\cookbook\models.py:1474
|
||||
#, fuzzy
|
||||
#| msgid "Food Alias"
|
||||
msgid "Food Replace"
|
||||
msgstr "Aliment équivalent"
|
||||
msgstr "Aliment alternatif"
|
||||
|
||||
#: .\cookbook\models.py:1475
|
||||
#, fuzzy
|
||||
#| msgid "Description Replace"
|
||||
msgid "Unit Replace"
|
||||
msgstr "Remplacer la Description"
|
||||
msgstr "Remplacer l'unité"
|
||||
|
||||
#: .\cookbook\models.py:1476
|
||||
msgid "Name Replace"
|
||||
msgstr ""
|
||||
msgstr "Remplacer le nom"
|
||||
|
||||
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
|
||||
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
|
||||
@@ -1040,10 +1032,8 @@ msgid "Properties"
|
||||
msgstr "Propriétés"
|
||||
|
||||
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
|
||||
#, fuzzy
|
||||
#| msgid "Account Connections"
|
||||
msgid "Unit Conversions"
|
||||
msgstr "Comptes connectés"
|
||||
msgstr "Conversions d'unités"
|
||||
|
||||
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
|
||||
msgid "Import Recipe"
|
||||
@@ -1063,10 +1053,8 @@ msgid "Space Settings"
|
||||
msgstr "Paramètres de groupe"
|
||||
|
||||
#: .\cookbook\templates\base.html:340
|
||||
#, fuzzy
|
||||
#| msgid "External Recipes"
|
||||
msgid "External Connectors"
|
||||
msgstr "Recettes externes"
|
||||
msgstr "Connecteurs externes"
|
||||
|
||||
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
|
||||
msgid "System"
|
||||
@@ -1530,10 +1518,8 @@ msgid "Back"
|
||||
msgstr "Retour"
|
||||
|
||||
#: .\cookbook\templates\property_editor.html:7
|
||||
#, fuzzy
|
||||
#| msgid "Ingredient Editor"
|
||||
msgid "Property Editor"
|
||||
msgstr "Éditeur d’ingrédients"
|
||||
msgstr "Éditeur de propriété"
|
||||
|
||||
#: .\cookbook\templates\recipe_view.html:36
|
||||
msgid "Comments"
|
||||
@@ -2011,10 +1997,8 @@ msgid "Sign in using"
|
||||
msgstr "Se connecter avec"
|
||||
|
||||
#: .\cookbook\templates\space_manage.html:7
|
||||
#, fuzzy
|
||||
#| msgid "Space Membership"
|
||||
msgid "Space Management"
|
||||
msgstr "Adhésion à l'espace"
|
||||
msgstr "Gestion de l'espace"
|
||||
|
||||
#: .\cookbook\templates\space_manage.html:26
|
||||
msgid "Space:"
|
||||
@@ -2227,10 +2211,8 @@ msgid "Info"
|
||||
msgstr "Info"
|
||||
|
||||
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
|
||||
#, fuzzy
|
||||
#| msgid "Use fractions"
|
||||
msgid "Migrations"
|
||||
msgstr "Utiliser les fractions"
|
||||
msgstr "Migrations"
|
||||
|
||||
#: .\cookbook\templates\system.html:116
|
||||
msgid ""
|
||||
@@ -2265,10 +2247,8 @@ msgid "Hide"
|
||||
msgstr "Cacher"
|
||||
|
||||
#: .\cookbook\templates\system.html:210
|
||||
#, fuzzy
|
||||
#| msgid "Show Log"
|
||||
msgid "Show"
|
||||
msgstr "Afficher le journal"
|
||||
msgstr "Afficher"
|
||||
|
||||
#: .\cookbook\templates\url_import.html:8
|
||||
msgid "URL Import"
|
||||
@@ -2353,11 +2333,9 @@ msgstr ""
|
||||
"MM-DD."
|
||||
|
||||
#: .\cookbook\views\api.py:744
|
||||
#, fuzzy
|
||||
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
|
||||
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
"Identifiant de la recette dont fait partie une étape. Pour plusieurs "
|
||||
"Filtrer le planning des repas avec l'identifiant MealType. Pour plusieurs "
|
||||
"paramètres de répétition."
|
||||
|
||||
#: .\cookbook\views\api.py:872
|
||||
@@ -2460,18 +2438,27 @@ msgstr ""
|
||||
#: .\cookbook\views\api.py:922
|
||||
msgid "ID of book a recipe should be in. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
"ID du livre dans lequel une recette doit se trouver. Pour plusieurs "
|
||||
"paramètres de répétition."
|
||||
|
||||
#: .\cookbook\views\api.py:923
|
||||
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
|
||||
msgstr ""
|
||||
"IDs de livre, répéter pour plusieurs livres. Renvoie les recettes dans "
|
||||
"n'importe quel livre."
|
||||
|
||||
#: .\cookbook\views\api.py:924
|
||||
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
|
||||
msgstr ""
|
||||
"IDs de livre, répéter pour plusieurs livres. Renvoie les recettes dans tous "
|
||||
"les livre."
|
||||
|
||||
#: .\cookbook\views\api.py:925
|
||||
#, fuzzy
|
||||
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
|
||||
msgstr ""
|
||||
"Identifiants de livres : répéter pour plusieurs. Exclure les recettes de "
|
||||
"l'un des livres."
|
||||
|
||||
#: .\cookbook\views\api.py:926
|
||||
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2025-02-16 14:58+0000\n"
|
||||
"Last-Translator: Cots Partier <cots.pastier.34@icloud.com>\n"
|
||||
"PO-Revision-Date: 2025-07-31 19:14+0000\n"
|
||||
"Last-Translator: Justin Straver <justin.straver@gmail.com>\n"
|
||||
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/nl/>\n"
|
||||
"Language: nl\n"
|
||||
@@ -46,7 +46,7 @@ msgstr "Voorbereidingstijd in minuten"
|
||||
|
||||
#: .\cookbook\forms.py:62
|
||||
msgid "Waiting time (cooking/baking) in minutes"
|
||||
msgstr "Wacht tijd in minuten (koken en bakken)"
|
||||
msgstr "Wachttijd in minuten (koken en bakken)"
|
||||
|
||||
#: .\cookbook\forms.py:63 .\cookbook\forms.py:222 .\cookbook\forms.py:246
|
||||
msgid "Path"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2025-07-28 17:58+0000\n"
|
||||
"PO-Revision-Date: 2025-08-01 08:40+0000\n"
|
||||
"Last-Translator: Aleksey <streltsov3@gmail.com>\n"
|
||||
"Language-Team: Russian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/ru/>\n"
|
||||
@@ -446,30 +446,32 @@ msgstr "г"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
|
||||
msgid "Carbohydrates"
|
||||
msgstr ""
|
||||
msgstr "Углеводы"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
|
||||
msgid "Proteins"
|
||||
msgstr ""
|
||||
msgstr "Протеины"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
|
||||
msgid "Calories"
|
||||
msgstr ""
|
||||
msgstr "Калории"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
|
||||
msgid "kcal"
|
||||
msgstr ""
|
||||
msgstr "ккал"
|
||||
|
||||
#: .\cookbook\models.py:325
|
||||
msgid ""
|
||||
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
|
||||
"upload."
|
||||
msgstr ""
|
||||
"Максимальный объем файлового хранилища в МБ. 0 — без ограничений, -1 — чтобы "
|
||||
"отключить загрузку файлов."
|
||||
|
||||
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
|
||||
#: .\cookbook\templates\settings.html:18
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
msgstr "Поиск"
|
||||
|
||||
#: .\cookbook\models.py:455 .\cookbook\templates\base.html:114
|
||||
#: .\cookbook\templates\meal_plan.html:7
|
||||
@@ -488,27 +490,27 @@ msgstr "Покупки"
|
||||
|
||||
#: .\cookbook\models.py:752
|
||||
msgid " is part of a recipe step and cannot be deleted"
|
||||
msgstr ""
|
||||
msgstr " является частью шага рецепта и не может быть удален"
|
||||
|
||||
#: .\cookbook\models.py:918
|
||||
msgid "Nutrition"
|
||||
msgstr ""
|
||||
msgstr "Питательная ценность"
|
||||
|
||||
#: .\cookbook\models.py:918
|
||||
msgid "Allergen"
|
||||
msgstr ""
|
||||
msgstr "Аллерген"
|
||||
|
||||
#: .\cookbook\models.py:919
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "Цена"
|
||||
|
||||
#: .\cookbook\models.py:919
|
||||
msgid "Goal"
|
||||
msgstr ""
|
||||
msgstr "Цель"
|
||||
|
||||
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
|
||||
msgid "Simple"
|
||||
msgstr ""
|
||||
msgstr "Простой"
|
||||
|
||||
#: .\cookbook\models.py:1409 .\cookbook\templates\search_info.html:33
|
||||
msgid "Phrase"
|
||||
@@ -516,19 +518,19 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1410 .\cookbook\templates\search_info.html:38
|
||||
msgid "Web"
|
||||
msgstr ""
|
||||
msgstr "Веб"
|
||||
|
||||
#: .\cookbook\models.py:1411 .\cookbook\templates\search_info.html:47
|
||||
msgid "Raw"
|
||||
msgstr ""
|
||||
msgstr "Необработанный"
|
||||
|
||||
#: .\cookbook\models.py:1467
|
||||
msgid "Food Alias"
|
||||
msgstr ""
|
||||
msgstr "Синоним продукта"
|
||||
|
||||
#: .\cookbook\models.py:1468
|
||||
msgid "Unit Alias"
|
||||
msgstr ""
|
||||
msgstr "Синоним единицы измерения"
|
||||
|
||||
#: .\cookbook\models.py:1469
|
||||
#, fuzzy
|
||||
@@ -538,149 +540,154 @@ msgstr "Ключевые слова"
|
||||
|
||||
#: .\cookbook\models.py:1470
|
||||
msgid "Description Replace"
|
||||
msgstr ""
|
||||
msgstr "Замена описания"
|
||||
|
||||
#: .\cookbook\models.py:1471
|
||||
msgid "Instruction Replace"
|
||||
msgstr ""
|
||||
msgstr "Замена инструкции"
|
||||
|
||||
#: .\cookbook\models.py:1472
|
||||
#, fuzzy
|
||||
#| msgid "New Unit"
|
||||
msgid "Never Unit"
|
||||
msgstr "Новый юнит"
|
||||
msgstr "Без единицы"
|
||||
|
||||
#: .\cookbook\models.py:1473
|
||||
msgid "Transpose Words"
|
||||
msgstr ""
|
||||
msgstr "Транспонировать слова"
|
||||
|
||||
#: .\cookbook\models.py:1474
|
||||
msgid "Food Replace"
|
||||
msgstr ""
|
||||
msgstr "Замена продукта"
|
||||
|
||||
#: .\cookbook\models.py:1475
|
||||
msgid "Unit Replace"
|
||||
msgstr ""
|
||||
msgstr "Замена единицы измерения"
|
||||
|
||||
#: .\cookbook\models.py:1476
|
||||
msgid "Name Replace"
|
||||
msgstr ""
|
||||
msgstr "Замена названия"
|
||||
|
||||
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
|
||||
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
|
||||
msgid "Recipe"
|
||||
msgstr ""
|
||||
msgstr "Рецепт"
|
||||
|
||||
#: .\cookbook\models.py:1504
|
||||
#, fuzzy
|
||||
#| msgid "New Food"
|
||||
msgid "Food"
|
||||
msgstr "Новый продукт"
|
||||
msgstr "Продукт"
|
||||
|
||||
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
|
||||
msgid "Keyword"
|
||||
msgstr ""
|
||||
msgstr "Ключевое слово"
|
||||
|
||||
#: .\cookbook\serializer.py:222
|
||||
msgid "File uploads are not enabled for this Space."
|
||||
msgstr ""
|
||||
msgstr "Загрузка файлов не разрешена для этого пространства."
|
||||
|
||||
#: .\cookbook\serializer.py:233
|
||||
msgid "You have reached your file upload limit."
|
||||
msgstr ""
|
||||
msgstr "Вы достигли лимита загрузки файлов."
|
||||
|
||||
#: .\cookbook\serializer.py:328
|
||||
msgid "Cannot modify Space owner permission."
|
||||
msgstr ""
|
||||
msgstr "Нельзя изменить разрешения владельца пространства."
|
||||
|
||||
#: .\cookbook\serializer.py:1270
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "Привет"
|
||||
|
||||
#: .\cookbook\serializer.py:1270
|
||||
msgid "You have been invited by "
|
||||
msgstr ""
|
||||
msgstr "Вас пригласил "
|
||||
|
||||
#: .\cookbook\serializer.py:1272
|
||||
msgid " to join their Tandoor Recipes space "
|
||||
msgstr ""
|
||||
msgstr " присоединиться к их пространству рецептов Tandoor "
|
||||
|
||||
#: .\cookbook\serializer.py:1274
|
||||
msgid "Click the following link to activate your account: "
|
||||
msgstr ""
|
||||
msgstr "Нажмите на следующую ссылку, чтобы активировать аккаунт: "
|
||||
|
||||
#: .\cookbook\serializer.py:1276
|
||||
msgid ""
|
||||
"If the link does not work use the following code to manually join the space: "
|
||||
msgstr ""
|
||||
"Если ссылка не работает, используйте следующий код для ручного присоединения "
|
||||
"к пространству: "
|
||||
|
||||
#: .\cookbook\serializer.py:1278
|
||||
msgid "The invitation is valid until "
|
||||
msgstr ""
|
||||
msgstr "Приглашение действительно до "
|
||||
|
||||
#: .\cookbook\serializer.py:1280
|
||||
msgid ""
|
||||
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
|
||||
msgstr ""
|
||||
"Tandoor Recipes — это открытый менеджер рецептов. Посмотрите его на GitHub "
|
||||
|
||||
#: .\cookbook\serializer.py:1283
|
||||
msgid "Tandoor Recipes Invite"
|
||||
msgstr ""
|
||||
msgstr "Приглашение в Tandoor Recipes"
|
||||
|
||||
#: .\cookbook\serializer.py:1426
|
||||
msgid "Existing shopping list to update"
|
||||
msgstr ""
|
||||
msgstr "Существующий список покупок для обновления"
|
||||
|
||||
#: .\cookbook\serializer.py:1428
|
||||
msgid ""
|
||||
"List of ingredient IDs from the recipe to add, if not provided all "
|
||||
"ingredients will be added."
|
||||
msgstr ""
|
||||
"Список ID ингредиентов из рецепта для добавления, если не указано — будут "
|
||||
"добавлены все."
|
||||
|
||||
#: .\cookbook\serializer.py:1430
|
||||
msgid ""
|
||||
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
|
||||
msgstr ""
|
||||
"Если указать ID списка рецептов и порции 0 — этот список покупок будет "
|
||||
"удалён."
|
||||
|
||||
#: .\cookbook\serializer.py:1439
|
||||
msgid "Amount of food to add to the shopping list"
|
||||
msgstr ""
|
||||
msgstr "Количество продукта для добавления в список покупок"
|
||||
|
||||
#: .\cookbook\serializer.py:1441
|
||||
msgid "ID of unit to use for the shopping list"
|
||||
msgstr ""
|
||||
msgstr "ID единицы измерения для списка покупок"
|
||||
|
||||
#: .\cookbook\serializer.py:1443
|
||||
msgid "When set to true will delete all food from active shopping lists."
|
||||
msgstr ""
|
||||
msgstr "Если включено, удалит все продукты из активных списков покупок."
|
||||
|
||||
#: .\cookbook\tables.py:69 .\cookbook\tables.py:83
|
||||
#: .\cookbook\templates\generic\delete_template.html:7
|
||||
#: .\cookbook\templates\generic\delete_template.html:15
|
||||
#: .\cookbook\templates\generic\edit_template.html:28
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "Удалить"
|
||||
|
||||
#: .\cookbook\templates\404.html:5
|
||||
msgid "404 Error"
|
||||
msgstr ""
|
||||
msgstr "Ошибка 404"
|
||||
|
||||
#: .\cookbook\templates\404.html:18
|
||||
msgid "The page you are looking for could not be found."
|
||||
msgstr ""
|
||||
msgstr "Страница, которую вы ищете, не найдена."
|
||||
|
||||
#: .\cookbook\templates\404.html:33
|
||||
msgid "Take me Home"
|
||||
msgstr ""
|
||||
msgstr "На главную"
|
||||
|
||||
#: .\cookbook\templates\404.html:35
|
||||
msgid "Report a Bug"
|
||||
msgstr ""
|
||||
msgstr "Сообщить об ошибке"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:6
|
||||
#: .\cookbook\templates\account\email.html:17
|
||||
msgid "E-mail Addresses"
|
||||
msgstr ""
|
||||
msgstr "Электронные адреса"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:12
|
||||
#: .\cookbook\templates\account\password_change.html:11
|
||||
@@ -690,68 +697,70 @@ msgstr ""
|
||||
#: .\cookbook\templates\socialaccount\connections.html:10
|
||||
#: .\cookbook\templates\user_settings.html:8
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
msgstr "Настройки"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:13
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "Электронная почта"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:19
|
||||
msgid "The following e-mail addresses are associated with your account:"
|
||||
msgstr ""
|
||||
msgstr "Следующие электронные адреса связаны с вашим аккаунтом:"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:36
|
||||
msgid "Verified"
|
||||
msgstr ""
|
||||
msgstr "Подтверждён"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:38
|
||||
msgid "Unverified"
|
||||
msgstr ""
|
||||
msgstr "Не подтверждён"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:40
|
||||
msgid "Primary"
|
||||
msgstr ""
|
||||
msgstr "Основной"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:47
|
||||
msgid "Make Primary"
|
||||
msgstr ""
|
||||
msgstr "Сделать основным"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:49
|
||||
msgid "Re-send Verification"
|
||||
msgstr ""
|
||||
msgstr "Отправить подтверждение повторно"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:50
|
||||
#: .\cookbook\templates\generic\delete_template.html:57
|
||||
#: .\cookbook\templates\socialaccount\connections.html:44
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
msgstr "Удалить"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid "Warning:"
|
||||
msgstr ""
|
||||
msgstr "Внимание:"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid ""
|
||||
"You currently do not have any e-mail address set up. You should really add "
|
||||
"an e-mail address so you can receive notifications, reset your password, etc."
|
||||
msgstr ""
|
||||
"У вас пока не добавлен ни один электронный адрес. Рекомендуется добавить "
|
||||
"адрес для получения уведомлений, сброса пароля и т.д."
|
||||
|
||||
#: .\cookbook\templates\account\email.html:64
|
||||
msgid "Add E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "Добавить электронный адрес"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:69
|
||||
msgid "Add E-mail"
|
||||
msgstr ""
|
||||
msgstr "Добавить e-mail"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:79
|
||||
msgid "Do you really want to remove the selected e-mail address?"
|
||||
msgstr ""
|
||||
msgstr "Вы действительно хотите удалить выбранный электронный адрес?"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:6
|
||||
#: .\cookbook\templates\account\email_confirm.html:10
|
||||
msgid "Confirm E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "Подтвердить электронный адрес"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:16
|
||||
#, python-format
|
||||
@@ -765,7 +774,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\email_confirm.html:22
|
||||
#: .\cookbook\templates\generic\delete_template.html:72
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "Подтвердить"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:29
|
||||
#, python-format
|
||||
@@ -778,7 +787,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
|
||||
#: .\cookbook\templates\openid\login.html:8
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Логин"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:15
|
||||
#: .\cookbook\templates\account\login.html:31
|
||||
@@ -790,7 +799,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\openid\login.html:26
|
||||
#: .\cookbook\templates\socialaccount\authentication_error.html:15
|
||||
msgid "Sign In"
|
||||
msgstr ""
|
||||
msgstr "Войти"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:34
|
||||
#: .\cookbook\templates\account\password_reset.html:41
|
||||
@@ -798,34 +807,35 @@ msgstr ""
|
||||
#: .\cookbook\templates\socialaccount\signup.html:8
|
||||
#: .\cookbook\templates\socialaccount\signup.html:57
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
msgstr "Зарегистрироваться"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:38
|
||||
msgid "Lost your password?"
|
||||
msgstr ""
|
||||
msgstr "Забыли пароль?"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:39
|
||||
#: .\cookbook\templates\account\password_reset.html:29
|
||||
msgid "Reset My Password"
|
||||
msgstr ""
|
||||
msgstr "Сбросить мой пароль"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:50
|
||||
msgid "Social Login"
|
||||
msgstr ""
|
||||
msgstr "Вход через соцсети"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:51
|
||||
msgid "You can use any of the following providers to sign in."
|
||||
msgstr ""
|
||||
msgstr "Для входа вы можете использовать любой из следующих сервисов."
|
||||
|
||||
#: .\cookbook\templates\account\logout.html:5
|
||||
#: .\cookbook\templates\account\logout.html:9
|
||||
#: .\cookbook\templates\account\logout.html:18
|
||||
#, fuzzy
|
||||
msgid "Sign Out"
|
||||
msgstr ""
|
||||
msgstr "Выйти"
|
||||
|
||||
#: .\cookbook\templates\account\logout.html:11
|
||||
msgid "Are you sure you want to sign out?"
|
||||
msgstr ""
|
||||
msgstr "Вы действительно хотите выйти?"
|
||||
|
||||
#: .\cookbook\templates\account\password_change.html:6
|
||||
#: .\cookbook\templates\account\password_change.html:16
|
||||
@@ -835,43 +845,48 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\password_reset_from_key_done.html:7
|
||||
#: .\cookbook\templates\account\password_reset_from_key_done.html:13
|
||||
msgid "Change Password"
|
||||
msgstr ""
|
||||
msgstr "Изменить пароль"
|
||||
|
||||
#: .\cookbook\templates\account\password_change.html:12
|
||||
#: .\cookbook\templates\account\password_set.html:12
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Пароль"
|
||||
|
||||
#: .\cookbook\templates\account\password_change.html:22
|
||||
#, fuzzy
|
||||
msgid "Forgot Password?"
|
||||
msgstr ""
|
||||
msgstr "Забыли пароль?"
|
||||
|
||||
#: .\cookbook\templates\account\password_reset.html:7
|
||||
#: .\cookbook\templates\account\password_reset.html:13
|
||||
#: .\cookbook\templates\account\password_reset_done.html:7
|
||||
#: .\cookbook\templates\account\password_reset_done.html:18
|
||||
msgid "Password Reset"
|
||||
msgstr ""
|
||||
msgstr "Сброс пароля"
|
||||
|
||||
#: .\cookbook\templates\account\password_reset.html:24
|
||||
msgid ""
|
||||
"Forgotten your password? Enter your e-mail address below, and we'll send you "
|
||||
"an e-mail allowing you to reset it."
|
||||
msgstr ""
|
||||
"Забыли пароль? Введите свой электронный адрес ниже, и мы отправим вам письмо "
|
||||
"для сброса пароля."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset.html:32
|
||||
msgid "Password reset is disabled on this instance."
|
||||
msgstr ""
|
||||
msgstr "Сброс пароля отключён для этого экземпляра."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_done.html:25
|
||||
msgid ""
|
||||
"We have sent you an e-mail. Please contact us if you do not receive it "
|
||||
"within a few minutes."
|
||||
msgstr ""
|
||||
"Мы отправили вам электронное письмо. Пожалуйста, свяжитесь с нами, если не "
|
||||
"получите его в течение нескольких минут."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:13
|
||||
msgid "Bad Token"
|
||||
msgstr ""
|
||||
msgstr "Неверный токен"
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:25
|
||||
#, python-format
|
||||
@@ -881,71 +896,76 @@ msgid ""
|
||||
" Please request a <a href=\"%(passwd_reset_url)s\">new "
|
||||
"password reset</a>."
|
||||
msgstr ""
|
||||
"Ссылка для сброса пароля недействительна, возможно, она уже была "
|
||||
"использована.\n"
|
||||
" Пожалуйста, запросите <a href=\"%(passwd_reset_url)s\">новую "
|
||||
"ссылку для сброса пароля</a>."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:33
|
||||
msgid "change password"
|
||||
msgstr ""
|
||||
msgstr "изменить пароль"
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:36
|
||||
#: .\cookbook\templates\account\password_reset_from_key_done.html:19
|
||||
msgid "Your password is now changed."
|
||||
msgstr ""
|
||||
msgstr "Ваш пароль изменён."
|
||||
|
||||
#: .\cookbook\templates\account\password_set.html:6
|
||||
#: .\cookbook\templates\account\password_set.html:16
|
||||
#: .\cookbook\templates\account\password_set.html:21
|
||||
msgid "Set Password"
|
||||
msgstr ""
|
||||
msgstr "Установить пароль"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:6
|
||||
#, fuzzy
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Зарегистрироваться"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:12
|
||||
msgid "Create an Account"
|
||||
msgstr ""
|
||||
msgstr "Создать аккаунт"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:42
|
||||
#: .\cookbook\templates\socialaccount\signup.html:33
|
||||
msgid "I accept the follwoing"
|
||||
msgstr ""
|
||||
msgstr "Я принимаю следующие"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:45
|
||||
#: .\cookbook\templates\socialaccount\signup.html:36
|
||||
msgid "Terms and Conditions"
|
||||
msgstr ""
|
||||
msgstr "Условия и положения"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:48
|
||||
#: .\cookbook\templates\socialaccount\signup.html:39
|
||||
msgid "and"
|
||||
msgstr ""
|
||||
msgstr "и"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:52
|
||||
#: .\cookbook\templates\socialaccount\signup.html:43
|
||||
msgid "Privacy Policy"
|
||||
msgstr ""
|
||||
msgstr "Политику конфиденциальности"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:65
|
||||
msgid "Create User"
|
||||
msgstr ""
|
||||
msgstr "Создать пользователя"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:69
|
||||
msgid "Already have an account?"
|
||||
msgstr ""
|
||||
msgstr "Уже есть аккаунт?"
|
||||
|
||||
#: .\cookbook\templates\account\signup_closed.html:5
|
||||
#: .\cookbook\templates\account\signup_closed.html:11
|
||||
msgid "Sign Up Closed"
|
||||
msgstr ""
|
||||
msgstr "Регистрация закрыта"
|
||||
|
||||
#: .\cookbook\templates\account\signup_closed.html:13
|
||||
msgid "We are sorry, but the sign up is currently closed."
|
||||
msgstr ""
|
||||
msgstr "К сожалению, регистрация сейчас закрыта."
|
||||
|
||||
#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:378
|
||||
#: .\cookbook\templates\rest_framework\api.html:11
|
||||
msgid "API Documentation"
|
||||
msgstr ""
|
||||
msgstr "Документация API"
|
||||
|
||||
#: .\cookbook\templates\base.html:110 .\cookbook\templates\index.html:87
|
||||
msgid "Recipes"
|
||||
@@ -953,36 +973,38 @@ msgstr "Рецепты"
|
||||
|
||||
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
|
||||
msgid "Foods"
|
||||
msgstr ""
|
||||
msgstr "Продукты"
|
||||
|
||||
#: .\cookbook\templates\base.html:173 .\cookbook\views\lists.py:137
|
||||
#, fuzzy
|
||||
msgid "Units"
|
||||
msgstr ""
|
||||
msgstr "Единицы измерения"
|
||||
|
||||
#: .\cookbook\templates\base.html:187
|
||||
msgid "Supermarket"
|
||||
msgstr ""
|
||||
msgstr "Супермаркет"
|
||||
|
||||
#: .\cookbook\templates\base.html:199
|
||||
msgid "Supermarket Category"
|
||||
msgstr ""
|
||||
msgstr "Категория супермаркета"
|
||||
|
||||
#: .\cookbook\templates\base.html:211 .\cookbook\views\lists.py:186
|
||||
#, fuzzy
|
||||
msgid "Automations"
|
||||
msgstr ""
|
||||
msgstr "Автоматизация"
|
||||
|
||||
#: .\cookbook\templates\base.html:225 .\cookbook\views\lists.py:222
|
||||
msgid "Files"
|
||||
msgstr ""
|
||||
msgstr "Файлы"
|
||||
|
||||
#: .\cookbook\templates\base.html:237
|
||||
msgid "Batch Edit"
|
||||
msgstr ""
|
||||
msgstr "Пакетное редактирование"
|
||||
|
||||
#: .\cookbook\templates\base.html:249 .\cookbook\templates\history.html:6
|
||||
#: .\cookbook\templates\history.html:14
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
msgstr "История"
|
||||
|
||||
#: .\cookbook\templates\base.html:263
|
||||
#: .\cookbook\templates\ingredient_editor.html:7
|
||||
@@ -996,58 +1018,58 @@ msgstr "Ингредиенты"
|
||||
#: .\cookbook\templates\export_response.html:7
|
||||
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
msgstr "Экспортировать"
|
||||
|
||||
#: .\cookbook\templates\base.html:287
|
||||
msgid "Properties"
|
||||
msgstr ""
|
||||
msgstr "Свойства"
|
||||
|
||||
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
|
||||
msgid "Unit Conversions"
|
||||
msgstr ""
|
||||
msgstr "Конвертация единиц"
|
||||
|
||||
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
|
||||
msgid "Import Recipe"
|
||||
msgstr ""
|
||||
msgstr "Импортировать рецепт"
|
||||
|
||||
#: .\cookbook\templates\base.html:320
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
msgstr "Создать"
|
||||
|
||||
#: .\cookbook\templates\base.html:333
|
||||
#: .\cookbook\templates\generic\list_template.html:14
|
||||
msgid "External Recipes"
|
||||
msgstr ""
|
||||
msgstr "Внешние рецепты"
|
||||
|
||||
#: .\cookbook\templates\base.html:336 .\cookbook\templates\space_manage.html:15
|
||||
msgid "Space Settings"
|
||||
msgstr ""
|
||||
msgstr "Настройки пространства"
|
||||
|
||||
#: .\cookbook\templates\base.html:340
|
||||
msgid "External Connectors"
|
||||
msgstr ""
|
||||
msgstr "Внешние соединения"
|
||||
|
||||
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
|
||||
msgid "System"
|
||||
msgstr ""
|
||||
msgstr "Система"
|
||||
|
||||
#: .\cookbook\templates\base.html:347
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
msgstr "Администрирование"
|
||||
|
||||
#: .\cookbook\templates\base.html:351
|
||||
#: .\cookbook\templates\space_overview.html:25
|
||||
msgid "Your Spaces"
|
||||
msgstr ""
|
||||
msgstr "Ваши пространства"
|
||||
|
||||
#: .\cookbook\templates\base.html:362
|
||||
#: .\cookbook\templates\space_overview.html:6
|
||||
msgid "Overview"
|
||||
msgstr ""
|
||||
msgstr "Обзор"
|
||||
|
||||
#: .\cookbook\templates\base.html:372
|
||||
msgid "Markdown Guide"
|
||||
msgstr ""
|
||||
msgstr "Руководство по Markdown"
|
||||
|
||||
#: .\cookbook\templates\base.html:374
|
||||
msgid "GitHub"
|
||||
@@ -1055,53 +1077,55 @@ msgstr "GitHub"
|
||||
|
||||
#: .\cookbook\templates\base.html:376
|
||||
msgid "Translate Tandoor"
|
||||
msgstr ""
|
||||
msgstr "Перевести Tandoor"
|
||||
|
||||
#: .\cookbook\templates\base.html:380
|
||||
msgid "API Browser"
|
||||
msgstr ""
|
||||
msgstr "Браузер API"
|
||||
|
||||
#: .\cookbook\templates\base.html:383
|
||||
msgid "Log out"
|
||||
msgstr ""
|
||||
msgstr "Выйти"
|
||||
|
||||
#: .\cookbook\templates\base.html:406
|
||||
msgid "You are using the free version of Tandor"
|
||||
msgstr ""
|
||||
msgstr "Вы используете бесплатную версию Tandor"
|
||||
|
||||
#: .\cookbook\templates\base.html:407
|
||||
msgid "Upgrade Now"
|
||||
msgstr ""
|
||||
msgstr "Обновить сейчас"
|
||||
|
||||
#: .\cookbook\templates\batch\edit.html:6
|
||||
msgid "Batch edit Category"
|
||||
msgstr ""
|
||||
msgstr "Пакетное редактирование категорий"
|
||||
|
||||
#: .\cookbook\templates\batch\edit.html:15
|
||||
msgid "Batch edit Recipes"
|
||||
msgstr ""
|
||||
msgstr "Пакетное редактирование рецептов"
|
||||
|
||||
#: .\cookbook\templates\batch\edit.html:20
|
||||
msgid "Add the specified keywords to all recipes containing a word"
|
||||
msgstr ""
|
||||
msgstr "Добавить указанные ключевые слова ко всем рецептам, содержащим слово"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:75
|
||||
msgid "Sync"
|
||||
msgstr ""
|
||||
msgstr "Синхронизировать"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:10
|
||||
msgid "Manage watched Folders"
|
||||
msgstr ""
|
||||
msgstr "Управлять отслеживаемыми папками"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:14
|
||||
msgid ""
|
||||
"On this Page you can manage all storage folder locations that should be "
|
||||
"monitored and synced."
|
||||
msgstr ""
|
||||
"На этой странице вы можете управлять всеми папками для хранения, которые "
|
||||
"нужно отслеживать и синхронизировать."
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:16
|
||||
msgid "The path must be in the following format"
|
||||
msgstr ""
|
||||
msgstr "Путь должен быть в следующем формате"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:20
|
||||
#: .\cookbook\templates\forms\edit_import_recipe.html:14
|
||||
@@ -1109,128 +1133,131 @@ msgstr ""
|
||||
#: .\cookbook\templates\generic\new_template.html:23
|
||||
#: .\cookbook\templates\settings.html:57
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Сохранить"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:21
|
||||
msgid "Manage External Storage"
|
||||
msgstr ""
|
||||
msgstr "Управлять внешним хранилищем"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:28
|
||||
msgid "Sync Now!"
|
||||
msgstr ""
|
||||
msgstr "Синхронизировать сейчас!"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:29
|
||||
msgid "Show Recipes"
|
||||
msgstr ""
|
||||
msgstr "Показать рецепты"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:30
|
||||
msgid "Show Log"
|
||||
msgstr ""
|
||||
msgstr "Показать журнал"
|
||||
|
||||
#: .\cookbook\templates\batch\waiting.html:4
|
||||
#: .\cookbook\templates\batch\waiting.html:10
|
||||
msgid "Importing Recipes"
|
||||
msgstr ""
|
||||
msgstr "Импорт рецептов"
|
||||
|
||||
#: .\cookbook\templates\batch\waiting.html:28
|
||||
msgid ""
|
||||
"This can take a few minutes, depending on the number of recipes in sync, "
|
||||
"please wait."
|
||||
msgstr ""
|
||||
"Это может занять несколько минут, в зависимости от количества рецептов в "
|
||||
"синхронизации. Пожалуйста, подождите."
|
||||
|
||||
#: .\cookbook\templates\books.html:7
|
||||
msgid "Recipe Books"
|
||||
msgstr ""
|
||||
msgstr "Кулинарные книги"
|
||||
|
||||
#: .\cookbook\templates\export.html:7 .\cookbook\templates\test2.html:6
|
||||
msgid "Export Recipes"
|
||||
msgstr ""
|
||||
msgstr "Экспорт рецептов"
|
||||
|
||||
#: .\cookbook\templates\forms\edit_import_recipe.html:5
|
||||
#: .\cookbook\templates\forms\edit_import_recipe.html:9
|
||||
msgid "Import new Recipe"
|
||||
msgstr ""
|
||||
msgstr "Импорт новых рецептов"
|
||||
|
||||
#: .\cookbook\templates\forms\edit_internal_recipe.html:7
|
||||
msgid "Edit Recipe"
|
||||
msgstr ""
|
||||
msgstr "Редактировать рецепт"
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:21
|
||||
#, python-format
|
||||
msgid "Are you sure you want to delete the %(title)s: <b>%(object)s</b> "
|
||||
msgstr ""
|
||||
msgstr "Вы уверены, что хотите удалить %(title)s: <b>%(object)s</b> "
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:22
|
||||
msgid "This cannot be undone!"
|
||||
msgstr ""
|
||||
msgstr "Это действие необратимо!"
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:27
|
||||
msgid "Protected"
|
||||
msgstr ""
|
||||
msgstr "Защищённый"
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:42
|
||||
msgid "Cascade"
|
||||
msgstr ""
|
||||
msgstr "Каскад"
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:73
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Отмена"
|
||||
|
||||
#: .\cookbook\templates\generic\edit_template.html:6
|
||||
#: .\cookbook\templates\generic\edit_template.html:14
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Редактировать"
|
||||
|
||||
#: .\cookbook\templates\generic\edit_template.html:32
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
msgstr "Просмотреть"
|
||||
|
||||
#: .\cookbook\templates\generic\edit_template.html:36
|
||||
msgid "Delete original file"
|
||||
msgstr ""
|
||||
msgstr "Удалить оригинальный файл"
|
||||
|
||||
#: .\cookbook\templates\generic\list_template.html:6
|
||||
#: .\cookbook\templates\generic\list_template.html:22
|
||||
msgid "List"
|
||||
msgstr ""
|
||||
msgstr "Список"
|
||||
|
||||
#: .\cookbook\templates\generic\list_template.html:36
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Фильтр"
|
||||
|
||||
#: .\cookbook\templates\generic\list_template.html:41
|
||||
msgid "Import all"
|
||||
msgstr ""
|
||||
msgstr "Импортировать всё"
|
||||
|
||||
#: .\cookbook\templates\generic\new_template.html:6
|
||||
#: .\cookbook\templates\generic\new_template.html:14
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Новый"
|
||||
|
||||
#: .\cookbook\templates\generic\table_template.html:76
|
||||
msgid "previous"
|
||||
msgstr ""
|
||||
msgstr "предыдущий"
|
||||
|
||||
#: .\cookbook\templates\generic\table_template.html:98
|
||||
msgid "next"
|
||||
msgstr ""
|
||||
msgstr "следующий"
|
||||
|
||||
#: .\cookbook\templates\history.html:20
|
||||
msgid "View Log"
|
||||
msgstr ""
|
||||
msgstr "Просмотреть журнал"
|
||||
|
||||
#: .\cookbook\templates\history.html:24
|
||||
#, fuzzy
|
||||
msgid "Cook Log"
|
||||
msgstr ""
|
||||
msgstr "Журнал приготовления"
|
||||
|
||||
#: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:90
|
||||
#: .\cookbook\views\edit.py:174
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
msgstr "Импортировать"
|
||||
|
||||
#: .\cookbook\templates\include\storage_backend_warning.html:4
|
||||
msgid "Security Warning"
|
||||
msgstr ""
|
||||
msgstr "Предупреждение о безопасности"
|
||||
|
||||
#: .\cookbook\templates\include\storage_backend_warning.html:5
|
||||
msgid ""
|
||||
@@ -1247,32 +1274,32 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\index.html:29
|
||||
msgid "Search recipe ..."
|
||||
msgstr ""
|
||||
msgstr "Поиск рецепта ..."
|
||||
|
||||
#: .\cookbook\templates\index.html:44
|
||||
msgid "New Recipe"
|
||||
msgstr ""
|
||||
msgstr "Новый рецепт"
|
||||
|
||||
#: .\cookbook\templates\index.html:53
|
||||
msgid "Advanced Search"
|
||||
msgstr ""
|
||||
msgstr "Расширенный поиск"
|
||||
|
||||
#: .\cookbook\templates\index.html:57
|
||||
msgid "Reset Search"
|
||||
msgstr ""
|
||||
msgstr "Сбросить поиск"
|
||||
|
||||
#: .\cookbook\templates\index.html:85
|
||||
msgid "Last viewed"
|
||||
msgstr ""
|
||||
msgstr "Недавно просмотренные"
|
||||
|
||||
#: .\cookbook\templates\index.html:94
|
||||
msgid "Log in to view recipes"
|
||||
msgstr ""
|
||||
msgstr "Войдите, чтобы просмотреть рецепты"
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:5
|
||||
#: .\cookbook\templates\markdown_info.html:13
|
||||
msgid "Markdown Info"
|
||||
msgstr ""
|
||||
msgstr "Информация о Markdown"
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:14
|
||||
msgid ""
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2025-02-07 08:58+0000\n"
|
||||
"Last-Translator: Mattias G <mattias.granlund@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-08-10 11:36+0000\n"
|
||||
"Last-Translator: Elias Sjögreen <eliassjogreen1@gmail.com>\n"
|
||||
"Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/sv/>\n"
|
||||
"Language: sv\n"
|
||||
@@ -641,6 +641,8 @@ msgstr "ID eller enhet att använda för inköpslistan"
|
||||
#: .\cookbook\serializer.py:1443
|
||||
msgid "When set to true will delete all food from active shopping lists."
|
||||
msgstr ""
|
||||
"Om det här alternativet är aktiverat kommer alla matvaror att raderas från "
|
||||
"de aktiva inköpslistorna."
|
||||
|
||||
#: .\cookbook\tables.py:69 .\cookbook\tables.py:83
|
||||
#: .\cookbook\templates\generic\delete_template.html:7
|
||||
@@ -723,10 +725,13 @@ msgid ""
|
||||
"You currently do not have any e-mail address set up. You should really add "
|
||||
"an e-mail address so you can receive notifications, reset your password, etc."
|
||||
msgstr ""
|
||||
"Just nu har du inga e-post adresser konfigurerade. Du borde verkligen lägga "
|
||||
"till en e-post adress så att du kan får notiser, återställa ditt lösenord, "
|
||||
"mm."
|
||||
|
||||
#: .\cookbook\templates\account\email.html:64
|
||||
msgid "Add E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "Lägg till en e-post adress"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:69
|
||||
msgid "Add E-mail"
|
||||
@@ -734,12 +739,12 @@ msgstr "Lägg till email"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:79
|
||||
msgid "Do you really want to remove the selected e-mail address?"
|
||||
msgstr ""
|
||||
msgstr "Vill du verkligen ta bort den valda e-postadressen?"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:6
|
||||
#: .\cookbook\templates\account\email_confirm.html:10
|
||||
msgid "Confirm E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "Bekräfta e-postadress"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:16
|
||||
#, python-format
|
||||
@@ -749,6 +754,10 @@ msgid ""
|
||||
"for user %(user_display)s\n"
|
||||
" ."
|
||||
msgstr ""
|
||||
"Vänligen bekräfra att\n"
|
||||
" <a href=\"mailto:%(email)s\">%(email)s</a> är e-postadressen för "
|
||||
"användaren %(user_display)s\n"
|
||||
" ."
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:22
|
||||
#: .\cookbook\templates\generic\delete_template.html:72
|
||||
@@ -762,6 +771,9 @@ msgid ""
|
||||
" <a href=\"%(email_url)s\">issue a new e-mail confirmation "
|
||||
"request</a>."
|
||||
msgstr ""
|
||||
"Denna e-post bekräftelselänk är utgången eller felaktig. Vänligen\n"
|
||||
" <a href=\"%(email_url)s\">skapa en ny "
|
||||
"e-postbekräftelsebegäran</a>."
|
||||
|
||||
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
|
||||
#: .\cookbook\templates\openid\login.html:8
|
||||
@@ -785,19 +797,17 @@ msgstr "Logga in"
|
||||
#: .\cookbook\templates\account\password_reset_done.html:33
|
||||
#: .\cookbook\templates\socialaccount\signup.html:8
|
||||
#: .\cookbook\templates\socialaccount\signup.html:57
|
||||
#, fuzzy
|
||||
#| msgid "Sign In"
|
||||
msgid "Sign Up"
|
||||
msgstr "Logga in"
|
||||
msgstr "Registrera dig"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:38
|
||||
msgid "Lost your password?"
|
||||
msgstr ""
|
||||
msgstr "Glömt ditt lösenord?"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:39
|
||||
#: .\cookbook\templates\account\password_reset.html:29
|
||||
msgid "Reset My Password"
|
||||
msgstr ""
|
||||
msgstr "Återställ mitt lösenord"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:50
|
||||
msgid "Social Login"
|
||||
@@ -824,10 +834,8 @@ msgstr "Är du säker på att du vill logga ut?"
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:13
|
||||
#: .\cookbook\templates\account\password_reset_from_key_done.html:7
|
||||
#: .\cookbook\templates\account\password_reset_from_key_done.html:13
|
||||
#, fuzzy
|
||||
#| msgid "Changes saved!"
|
||||
msgid "Change Password"
|
||||
msgstr "Ändringar sparade!"
|
||||
msgstr "Ändra lösenord"
|
||||
|
||||
#: .\cookbook\templates\account\password_change.html:12
|
||||
#: .\cookbook\templates\account\password_set.html:12
|
||||
@@ -850,18 +858,20 @@ msgid ""
|
||||
"Forgotten your password? Enter your e-mail address below, and we'll send you "
|
||||
"an e-mail allowing you to reset it."
|
||||
msgstr ""
|
||||
"Glömt ditt lösenord? Ange din e-postadress nedanför så skickar vi ett "
|
||||
"återställningmail."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset.html:32
|
||||
#, fuzzy
|
||||
#| msgid "Password reset is not implemented for the time being!"
|
||||
msgid "Password reset is disabled on this instance."
|
||||
msgstr "Återställning av lösenord har ännu inte lagts till!"
|
||||
msgstr "Återställning av lösenord är avaktiverat på denna instans."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_done.html:25
|
||||
msgid ""
|
||||
"We have sent you an e-mail. Please contact us if you do not receive it "
|
||||
"within a few minutes."
|
||||
msgstr ""
|
||||
"Vi har skickat ett e-postmeddelande till dig. Om du inte har fått det inom "
|
||||
"några minuter, vänligen kontakta oss."
|
||||
|
||||
#: .\cookbook\templates\account\password_reset_from_key.html:13
|
||||
#, fuzzy
|
||||
|
||||
@@ -8,22 +8,22 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-11-04 10:29+0000\n"
|
||||
"Last-Translator: Johnny Ip <ip.iohnny@gmail.com>\n"
|
||||
"Language-Team: Chinese (Traditional) <http://translate.tandoor.dev/projects/"
|
||||
"tandoor/recipes-backend/zh_Hant/>\n"
|
||||
"PO-Revision-Date: 2025-08-02 07:49+0000\n"
|
||||
"Last-Translator: TC Kuo <tckuo7@gmail.com>\n"
|
||||
"Language-Team: Chinese (Traditional Han script) <http://translate.tandoor."
|
||||
"dev/projects/tandoor/recipes-backend/zh_Hant/>\n"
|
||||
"Language: zh_Hant\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
"X-Generator: Weblate 5.8.4\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
"Both fields are optional. If none are given the username will be displayed "
|
||||
"instead"
|
||||
msgstr "這兩個字段都是可選的。如果沒有輸入,將顯示用戶名"
|
||||
msgstr "這兩個欄位都是可選的。如果沒有輸入,將顯示用戶名"
|
||||
|
||||
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246
|
||||
msgid "Name"
|
||||
@@ -31,7 +31,7 @@ msgstr "名字"
|
||||
|
||||
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
|
||||
msgid "Keywords"
|
||||
msgstr "關鍵詞"
|
||||
msgstr "關鍵字"
|
||||
|
||||
#: .\cookbook\forms.py:62
|
||||
msgid "Preparation time in minutes"
|
||||
@@ -51,14 +51,13 @@ msgstr "存儲ID"
|
||||
|
||||
#: .\cookbook\forms.py:93
|
||||
msgid "Default"
|
||||
msgstr "默認"
|
||||
msgstr "預設"
|
||||
|
||||
#: .\cookbook\forms.py:121
|
||||
msgid ""
|
||||
"To prevent duplicates recipes with the same name as existing ones are "
|
||||
"ignored. Check this box to import everything."
|
||||
msgstr ""
|
||||
"為防止重復,忽略與現有同名的菜譜。選中此框可導入所有內容(包括同名菜譜)。"
|
||||
msgstr "為防止重複,忽略與現有同名的食譜。選中此框可導入所有內容(包括同名食譜)。"
|
||||
|
||||
#: .\cookbook\forms.py:143
|
||||
msgid "Add your comment: "
|
||||
@@ -241,7 +240,7 @@ msgstr "你沒有必要的權限來查看這個頁面!"
|
||||
#: .\cookbook\helper\permission_helper.py:237
|
||||
#: .\cookbook\helper\permission_helper.py:252
|
||||
msgid "You cannot interact with this object as it is not owned by you!"
|
||||
msgstr "你不能與此對象交互,因為它不屬於你!"
|
||||
msgstr "你不能與此對象互動,因為它不屬於你!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:402
|
||||
msgid "You have reached the maximum number of recipes for your space."
|
||||
@@ -311,16 +310,16 @@ msgstr "在導入過程中發生了一個意外的錯誤。請確認你上傳的
|
||||
|
||||
#: .\cookbook\integration\integration.py:217
|
||||
msgid "The following recipes were ignored because they already existed:"
|
||||
msgstr "以下菜譜被忽略了,因為它們已經存在了:"
|
||||
msgstr "以下食譜被忽略了,因為它們已經存在了:"
|
||||
|
||||
#: .\cookbook\integration\integration.py:221
|
||||
#, python-format
|
||||
msgid "Imported %s recipes."
|
||||
msgstr "導入了%s菜譜。"
|
||||
msgstr "導入了%s食譜。"
|
||||
|
||||
#: .\cookbook\integration\openeats.py:28
|
||||
msgid "Recipe source:"
|
||||
msgstr "菜譜來源:"
|
||||
msgstr "食譜來源:"
|
||||
|
||||
#: .\cookbook\integration\paprika.py:49
|
||||
msgid "Notes"
|
||||
@@ -328,7 +327,7 @@ msgstr "說明"
|
||||
|
||||
#: .\cookbook\integration\paprika.py:52
|
||||
msgid "Nutritional Information"
|
||||
msgstr "營養信息"
|
||||
msgstr "營養資訊"
|
||||
|
||||
#: .\cookbook\integration\paprika.py:56
|
||||
msgid "Source"
|
||||
@@ -645,7 +644,7 @@ msgstr "電子郵件地址"
|
||||
#: .\cookbook\templates\socialaccount\connections.html:10
|
||||
#: .\cookbook\templates\user_settings.html:8
|
||||
msgid "Settings"
|
||||
msgstr "設置"
|
||||
msgstr "設定"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:13
|
||||
msgid "Email"
|
||||
@@ -1878,7 +1877,7 @@ msgstr "你可以被邀請加入現有空間或創建自己的空間。"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:53
|
||||
msgid "Owner"
|
||||
msgstr "所有者"
|
||||
msgstr "擁有者"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:57
|
||||
msgid "Leave Space"
|
||||
|
||||
@@ -1480,7 +1480,7 @@ class InviteLinkSerializer(WritableNestedModelSerializer):
|
||||
fields = (
|
||||
'id', 'uuid', 'email', 'group', 'valid_until', 'used_by', 'reusable', 'internal_note', 'created_by',
|
||||
'created_at',)
|
||||
read_only_fields = ('id', 'uuid', 'created_by', 'created_at',)
|
||||
read_only_fields = ('id', 'uuid', 'used_by' ,'created_by', 'created_at',)
|
||||
|
||||
|
||||
# CORS, REST and Scopes aren't currently working
|
||||
@@ -1768,7 +1768,7 @@ class RecipeFromSourceResponseSerializer(serializers.Serializer):
|
||||
class AiImportSerializer(serializers.Serializer):
|
||||
file = serializers.FileField(allow_null=True)
|
||||
text = serializers.CharField(allow_null=True, allow_blank=True)
|
||||
|
||||
recipe_id = serializers.CharField(allow_null=True, allow_blank=True)
|
||||
|
||||
class ExportRequestSerializer(serializers.Serializer):
|
||||
type = serializers.CharField()
|
||||
|
||||
@@ -1654,7 +1654,8 @@ class AutomationViewSet(LoggingMixin, StandardFilterModelViewSet):
|
||||
|
||||
|
||||
@extend_schema_view(list=extend_schema(parameters=[
|
||||
OpenApiParameter(name='internal_note', description=_('Text field to store data that gets carried over to the UserSpace created from the InviteLink'), type=str)
|
||||
OpenApiParameter(name='internal_note', description=_('Text field to store data that gets carried over to the UserSpace created from the InviteLink'), type=str),
|
||||
OpenApiParameter(name='unused', description=_('Only return InviteLinks that have not been used yet.'), type=bool),
|
||||
]))
|
||||
class InviteLinkViewSet(LoggingMixin, StandardFilterModelViewSet):
|
||||
queryset = InviteLink.objects
|
||||
@@ -1667,6 +1668,10 @@ class InviteLinkViewSet(LoggingMixin, StandardFilterModelViewSet):
|
||||
if internal_note is not None:
|
||||
self.queryset = self.queryset.filter(internal_note=internal_note)
|
||||
|
||||
unused = self.request.query_params.get('unused', False)
|
||||
if unused:
|
||||
self.queryset = self.queryset.filter(used_by=None)
|
||||
|
||||
if is_space_owner(self.request.user, self.request.space):
|
||||
self.queryset = self.queryset.filter(space=self.request.space).all()
|
||||
return super().get_queryset()
|
||||
@@ -1789,9 +1794,9 @@ class RecipeUrlImportView(APIView):
|
||||
return Response(RecipeFromSourceResponseSerializer(context={'request': request}).to_representation(response), status=status.HTTP_200_OK)
|
||||
|
||||
tandoor_url = None
|
||||
if re.match('^(.)*/recipe/[0-9]+/?share=[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
|
||||
if re.match(r'^(.)*/recipe/[0-9]+/\?share=[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
|
||||
tandoor_url = url.replace('/recipe/', '/api/recipe/')
|
||||
elif re.match('^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
|
||||
elif re.match(r'^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
|
||||
tandoor_url = (url.replace('/view/recipe/', '/api/recipe/').replace(re.split('/recipe/[0-9]+', url)[1], '') + '?share=' +
|
||||
re.split('/recipe/[0-9]+', url)[1].replace('/', ''))
|
||||
if tandoor_url and validate_import_url(tandoor_url):
|
||||
@@ -1886,6 +1891,12 @@ class AiImportView(APIView):
|
||||
|
||||
messages = []
|
||||
uploaded_file = serializer.validated_data['file']
|
||||
|
||||
if serializer.validated_data['recipe_id']:
|
||||
if recipe := Recipe.objects.filter(id=serializer.validated_data['recipe_id']).first():
|
||||
if recipe.file_path:
|
||||
uploaded_file = get_recipe_provider(recipe).get_file(recipe)
|
||||
|
||||
if uploaded_file:
|
||||
base64type = None
|
||||
try:
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<a href="https://docs.tandoor.dev/install/docker/" target="_blank" rel="noopener noreferrer">Installation</a> •
|
||||
<a href="https://docs.tandoor.dev/" target="_blank" rel="noopener noreferrer">Docs</a> •
|
||||
<a href="https://app.tandoor.dev/accounts/login/?demo" target="_blank" rel="noopener noreferrer">Demo</a> •
|
||||
<a href="https://community.tandoor.dev" target="_blank" rel="noopener noreferrer">Community</a> •
|
||||
<a href="https://discord.gg/RhzBrfWgtp" target="_blank" rel="noopener noreferrer">Discord</a>
|
||||
</p>
|
||||
|
||||
@@ -65,13 +66,13 @@ Share some information on how you use Tandoor to help me improve the application
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
|
||||
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
|
||||
<td><a href="https://community.tandoor.dev">Community</a></td>
|
||||
<td>Get support, share best practices, discuss feature ideas, and meet other Tandoor users.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://twitter.com/TandoorRecipes">Twitter</a></td>
|
||||
<td>You can follow our Twitter account to get updates on new features or releases</td>
|
||||
<td><a href="https://discord.gg/RhzBrfWgtp">Discord</a></td>
|
||||
<td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -63,7 +63,6 @@ spec:
|
||||
source venv/bin/activate
|
||||
echo "Updating database"
|
||||
python manage.py migrate
|
||||
python manage.py collectstatic_js_reverse
|
||||
python manage.py collectstatic --noinput
|
||||
echo "Setting media file attributes"
|
||||
chown -R 65534:65534 /opt/recipes/mediafiles
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## K8s Setup
|
||||
|
||||
This is a setup which should be sufficient for production use. Be sure to replace the default secrets!
|
||||
This is a setup which should be sufficient for production use. Be sure to replace the default secrets! You can find the example files [here](https://github.com/MyDigitalLife/recipes/tree/fix-k8s-documentation/docs/install/k8s) on Github.
|
||||
|
||||
## Files
|
||||
|
||||
|
||||
@@ -7,20 +7,19 @@ server {
|
||||
|
||||
# serve media files
|
||||
location /media {
|
||||
alias /opt/recipes/mediafiles;
|
||||
alias ${MEDIA_ROOT};
|
||||
add_header Content-Disposition 'attachment; filename="$args"';
|
||||
}
|
||||
|
||||
# serve service worker under main path
|
||||
location = /service-worker.js {
|
||||
alias /opt/recipes/staticfiles/vue3/service-worker.js;
|
||||
alias ${STATIC_ROOT}/vue3/service-worker.js;
|
||||
}
|
||||
|
||||
# pass requests for dynamic content to gunicorn
|
||||
location / {
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_pass http://localhost:8080;
|
||||
|
||||
proxy_pass http://localhost:${TANDOOR_PORT};
|
||||
error_page 502 /errors/http502.html;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ bleach==6.2.0
|
||||
gunicorn==23.0.0
|
||||
lxml==5.3.1
|
||||
Markdown==3.7
|
||||
Pillow==11.1.0
|
||||
Pillow==11.3.0
|
||||
psycopg2-binary==2.9.10
|
||||
python-dotenv==1.0.0
|
||||
requests==2.32.4
|
||||
@@ -26,10 +26,10 @@ pyyaml==6.0.2
|
||||
uritemplate==4.1.1
|
||||
beautifulsoup4==4.12.3
|
||||
microdata==0.8.0
|
||||
mock==5.1.0
|
||||
mock==5.2.0
|
||||
Jinja2==3.1.6
|
||||
django-allauth[mfa,socialaccount]==65.9.0
|
||||
recipe-scrapers==15.6.0
|
||||
recipe-scrapers==15.8.0
|
||||
django-scopes==2.0.0
|
||||
django-treebeard==4.7.1
|
||||
django-cors-headers==4.6.0
|
||||
@@ -41,9 +41,9 @@ python-ldap==3.4.4
|
||||
django-auth-ldap==4.6.0
|
||||
pyppeteer==2.0.0
|
||||
pytubefix==9.2.2
|
||||
aiohttp==3.12.14
|
||||
aiohttp==3.12.15
|
||||
inflection==0.5.1
|
||||
redis==5.2.1
|
||||
redis==6.2.0
|
||||
hiredis==3.2.1
|
||||
requests-oauthlib==2.0.0
|
||||
pyjwt==2.10.1
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/luxon": "^3.6.2",
|
||||
"@types/luxon": "^3.7.1",
|
||||
"@vueform/multiselect": "^2.6.11",
|
||||
"@vueuse/core": "^13.1.0",
|
||||
"@vueuse/router": "^13.1.0",
|
||||
"luxon": "^3.6.1",
|
||||
"@vueuse/core": "^13.6.0",
|
||||
"@vueuse/router": "^13.6.0",
|
||||
"luxon": "^3.7.1",
|
||||
"mavon-editor": "^3.0.1",
|
||||
"pinia": "^3.0.2",
|
||||
"vue": "^3.5.13",
|
||||
@@ -23,7 +23,7 @@
|
||||
"vue-simple-calendar": "7.1.0",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"@types/sortablejs": "^1.15.8",
|
||||
"vuetify": "^3.9.0"
|
||||
"vuetify": "^3.9.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||
@@ -35,7 +35,7 @@
|
||||
"jsdom": "^26.1.0",
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "6.3.5",
|
||||
"vite-plugin-pwa": "^1.0.1",
|
||||
"vite-plugin-pwa": "^1.0.2",
|
||||
"workbox-core": "^7.3.0",
|
||||
"workbox-build": "^7.3.0",
|
||||
"workbox-window": "^7.3.0",
|
||||
|
||||
@@ -137,15 +137,21 @@ import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
|
||||
import NavigationDrawerContextMenu from "@/components/display/NavigationDrawerContextMenu.vue";
|
||||
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
||||
import {onMounted} from "vue";
|
||||
import {nextTick, onMounted} from "vue";
|
||||
import {isSpaceAboveLimit} from "@/utils/logic_utils";
|
||||
import {useMediaQuery} from "@vueuse/core";
|
||||
import {useMediaQuery, useTitle} from "@vueuse/core";
|
||||
import HelpDialog from "@/components/dialogs/HelpDialog.vue";
|
||||
import {NAVIGATION_DRAWER} from "@/utils/navigation.ts";
|
||||
import {useNavigation} from "@/composables/useNavigation.ts";
|
||||
import {useRouter} from "vue-router";
|
||||
import {useI18n} from "vue-i18n";
|
||||
|
||||
const {lgAndUp} = useDisplay()
|
||||
const {getDjangoUrl} = useDjangoUrls()
|
||||
const {t} = useI18n()
|
||||
|
||||
const title = useTitle()
|
||||
const router = useRouter()
|
||||
|
||||
const isPrintMode = useMediaQuery('print')
|
||||
|
||||
@@ -153,6 +159,19 @@ onMounted(() => {
|
||||
useUserPreferenceStore()
|
||||
})
|
||||
|
||||
/**
|
||||
* global title update handler, might be overridden by page specific handlers
|
||||
*/
|
||||
router.afterEach((to, from) => {
|
||||
nextTick(() => {
|
||||
if (to.meta.title) {
|
||||
title.value = t(to.meta.title)
|
||||
} else {
|
||||
title.value = 'Tandoor'
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
@@ -8,54 +8,54 @@ import vuetify from "@/vuetify";
|
||||
import mavonEditor from 'mavon-editor'
|
||||
import 'mavon-editor/dist/css/index.css'
|
||||
import 'vite/modulepreload-polyfill';
|
||||
import { createRulesPlugin } from 'vuetify/labs/rules'
|
||||
import {createRulesPlugin} from 'vuetify/labs/rules'
|
||||
|
||||
import {setupI18n} from "@/i18n";
|
||||
import MealPlanPage from "@/pages/MealPlanPage.vue";
|
||||
import {TANDOOR_PLUGINS, TandoorPlugin} from "@/types/Plugins.ts";
|
||||
|
||||
let routes = [
|
||||
{path: '/', component: () => import("@/pages/StartPage.vue"), name: 'StartPage'},
|
||||
{path: '/', component: () => import("@/pages/StartPage.vue"), name: 'StartPage' },
|
||||
{path: '/search', redirect: {name: 'StartPage'}},
|
||||
{path: '/test', component: () => import("@/pages/TestPage.vue"), name: 'view_test'},
|
||||
{path: '/help', component: () => import("@/pages/HelpPage.vue"), name: 'HelpPage'},
|
||||
{path: '/help', component: () => import("@/pages/HelpPage.vue"), name: 'HelpPage', meta: {title: 'Help'}},
|
||||
{
|
||||
path: '/settings', component: () => import("@/pages/SettingsPage.vue"), name: 'SettingsPage', redirect: '/settings/account',
|
||||
children: [
|
||||
{path: 'account', component: () => import("@/components/settings/AccountSettings.vue"), name: 'AccountSettings'},
|
||||
{path: 'cosmetic', component: () => import("@/components/settings/CosmeticSettings.vue"), name: 'CosmeticSettings'},
|
||||
{path: 'shopping', component: () => import("@/components/settings/ShoppingSettings.vue"), name: 'ShoppingSettings'},
|
||||
{path: 'meal-plan', component: () => import("@/components/settings/MealPlanSettings.vue"), name: 'MealPlanSettings'},
|
||||
{path: 'search', component: () => import("@/components/settings/SearchSettings.vue"), name: 'SearchSettings'},
|
||||
{path: 'space', component: () => import("@/components/settings/SpaceSettings.vue"), name: 'SpaceSettings'},
|
||||
{path: 'space-members', component: () => import("@/components/settings/SpaceMemberSettings.vue"), name: 'SpaceMemberSettings'},
|
||||
{path: 'user-space', component: () => import("@/components/settings/UserSpaceSettings.vue"), name: 'UserSpaceSettings'},
|
||||
{path: 'open-data-import', component: () => import("@/components/settings/OpenDataImportSettings.vue"), name: 'OpenDataImportSettings'},
|
||||
{path: 'export', component: () => import("@/components/settings/ExportDataSettings.vue"), name: 'ExportDataSettings'},
|
||||
{path: 'api', component: () => import("@/components/settings/ApiSettings.vue"), name: 'ApiSettings'},
|
||||
]
|
||||
{path: 'account', component: () => import("@/components/settings/AccountSettings.vue"), name: 'AccountSettings', meta: {title: 'Settings'}},
|
||||
{path: 'cosmetic', component: () => import("@/components/settings/CosmeticSettings.vue"), name: 'CosmeticSettings', meta: {title: 'Settings'}},
|
||||
{path: 'shopping', component: () => import("@/components/settings/ShoppingSettings.vue"), name: 'ShoppingSettings', meta: {title: 'Settings'}},
|
||||
{path: 'meal-plan', component: () => import("@/components/settings/MealPlanSettings.vue"), name: 'MealPlanSettings', meta: {title: 'Settings'}},
|
||||
{path: 'search', component: () => import("@/components/settings/SearchSettings.vue"), name: 'SearchSettings', meta: {title: 'Settings'}},
|
||||
{path: 'space', component: () => import("@/components/settings/SpaceSettings.vue"), name: 'SpaceSettings', meta: {title: 'Settings'}},
|
||||
{path: 'space-members', component: () => import("@/components/settings/SpaceMemberSettings.vue"), name: 'SpaceMemberSettings', meta: {title: 'Settings'}},
|
||||
{path: 'user-space', component: () => import("@/components/settings/UserSpaceSettings.vue"), name: 'UserSpaceSettings', meta: {title: 'Settings'}},
|
||||
{path: 'open-data-import', component: () => import("@/components/settings/OpenDataImportSettings.vue"), name: 'OpenDataImportSettings', meta: {title: 'Settings'}},
|
||||
{path: 'export', component: () => import("@/components/settings/ExportDataSettings.vue"), name: 'ExportDataSettings', meta: {title: 'Settings'}},
|
||||
{path: 'api', component: () => import("@/components/settings/ApiSettings.vue"), name: 'ApiSettings', meta: {title: 'Settings'}},
|
||||
], meta: {title: 'Settings'}
|
||||
},
|
||||
//{path: '/settings/:page', component: SettingsPage, name: 'view_settings_page', props: true},
|
||||
{path: '/advanced-search', component: () => import("@/pages/SearchPage.vue"), name: 'SearchPage'},
|
||||
{path: '/shopping', component: () => import("@/pages/ShoppingListPage.vue"), name: 'ShoppingListPage'},
|
||||
{path: '/mealplan', component: MealPlanPage, name: 'MealPlanPage'},
|
||||
{path: '/books', component: () => import("@/pages/BooksPage.vue"), name: 'BooksPage'},
|
||||
{path: '/book/:bookId', component: () => import("@/pages/BookViewPage.vue"), name: 'BookViewPage', props: true},
|
||||
{path: '/recipe/import', component: () => import("@/pages/RecipeImportPage.vue"), name: 'RecipeImportPage'},
|
||||
{path: '/advanced-search', component: () => import("@/pages/SearchPage.vue"), name: 'SearchPage', meta: {title: 'Search'}},
|
||||
{path: '/shopping', component: () => import("@/pages/ShoppingListPage.vue"), name: 'ShoppingListPage', meta: {title: 'Shopping_list'}},
|
||||
{path: '/mealplan', component: MealPlanPage, name: 'MealPlanPage', meta: {title: 'Meal_Plan'}},
|
||||
{path: '/books', component: () => import("@/pages/BooksPage.vue"), name: 'BooksPage', meta: {title: 'Books'}},
|
||||
{path: '/book/:bookId', component: () => import("@/pages/BookViewPage.vue"), name: 'BookViewPage', props: true, meta: {title: 'Book'}},
|
||||
{path: '/recipe/import', component: () => import("@/pages/RecipeImportPage.vue"), name: 'RecipeImportPage', meta: {title: 'Import'}},
|
||||
|
||||
{path: '/recipe/:id', component: () => import("@/pages/RecipeViewPage.vue"), name: 'RecipeViewPage', props: true},
|
||||
{path: '/recipe/:id', component: () => import("@/pages/RecipeViewPage.vue"), name: 'RecipeViewPage', props: true, meta: {title: 'Recipe'}},
|
||||
{path: '/view/recipe/:id', redirect: {name: 'RecipeViewPage'}}, // old Tandoor v1 url pattern
|
||||
|
||||
{path: '/list/:model?', component: () => import("@/pages/ModelListPage.vue"), props: true, name: 'ModelListPage'},
|
||||
{path: '/edit/:model/:id?', component: () => import("@/pages/ModelEditPage.vue"), props: true, name: 'ModelEditPage'},
|
||||
{path: '/database', component: () => import("@/pages/DatabasePage.vue"), props: true, name: 'DatabasePage'},
|
||||
{path: '/database', component: () => import("@/pages/DatabasePage.vue"), props: true, name: 'DatabasePage', meta: {title: 'Database'}},
|
||||
|
||||
{path: '/ingredient-editor', component: () => import("@/pages/IngredientEditorPage.vue"), name: 'IngredientEditorPage'},
|
||||
{path: '/property-editor', component: () => import("@/pages/PropertyEditorPage.vue"), name: 'PropertyEditorPage'},
|
||||
{path: '/ingredient-editor', component: () => import("@/pages/IngredientEditorPage.vue"), name: 'IngredientEditorPage', meta: {title: 'Ingredient Editor'}},
|
||||
{path: '/property-editor', component: () => import("@/pages/PropertyEditorPage.vue"), name: 'PropertyEditorPage', meta: {title: 'Property_Editor'}},
|
||||
|
||||
{path: '/space-setup', component: () => import("@/pages/SpaceSetupPage.vue"), name: 'SpaceSetupPage'},
|
||||
|
||||
{path: '/:pathMatch(.*)*', component: () => import("@/pages/404Page.vue"), name: '404Page'},
|
||||
{path: '/:pathMatch(.*)*', component: () => import("@/pages/404Page.vue"), name: '404Page', meta: {title: 'NotFound'}},
|
||||
]
|
||||
|
||||
// load plugin routes into routing table
|
||||
@@ -63,8 +63,12 @@ TANDOOR_PLUGINS.forEach(plugin => {
|
||||
routes = routes.concat(plugin.routes)
|
||||
})
|
||||
|
||||
const basePath = localStorage.getItem("BASE_PATH")
|
||||
const pathname = basePath?.startsWith("http") ? new URL(basePath).pathname : undefined
|
||||
const base = pathname === "/" ? undefined : pathname
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
history: createWebHistory(base),
|
||||
routes,
|
||||
})
|
||||
|
||||
@@ -74,7 +78,7 @@ const app = createApp(App)
|
||||
|
||||
app.use(createPinia())
|
||||
app.use(vuetify)
|
||||
app.use(createRulesPlugin({ /* options */ }, vuetify.locale))
|
||||
app.use(createRulesPlugin({ /* options */}, vuetify.locale))
|
||||
app.use(router)
|
||||
app.use(i18n)
|
||||
app.use(mavonEditor) // TODO only use on pages that need it
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
<template>
|
||||
<v-card class="mt-1 h-100">
|
||||
<iframe width="100%" height="700px" :src="externalUrl" v-if="isPdf"></iframe>
|
||||
|
||||
<v-img :src="externalUrl" v-if="isImage"></v-img>
|
||||
</v-card>
|
||||
<v-expansion-panels v-model="panelState">
|
||||
<v-expansion-panel value="show">
|
||||
<v-expansion-panel-title>{{ $t('ExternalRecipe') }}</v-expansion-panel-title>
|
||||
<v-expansion-panel-text>
|
||||
<v-card class="mt-1 h-100">
|
||||
<iframe width="100%" height="700px" :src="externalUrl" v-if="isPdf"></iframe>
|
||||
<v-img :src="externalUrl" v-if="isImage"></v-img>
|
||||
</v-card>
|
||||
</v-expansion-panel-text>
|
||||
</v-expansion-panel>
|
||||
</v-expansion-panels>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {computed, PropType} from "vue";
|
||||
import {computed, onMounted, PropType, ref} from "vue";
|
||||
import {Recipe} from "@/openapi";
|
||||
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
||||
import {useUrlSearchParams} from "@vueuse/core";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
recipe: {type: {} as PropType<Recipe>, required: true}
|
||||
})
|
||||
@@ -20,6 +26,15 @@ const props = defineProps({
|
||||
const params = useUrlSearchParams('history')
|
||||
const {getDjangoUrl} = useDjangoUrls()
|
||||
|
||||
const panelState = ref('')
|
||||
|
||||
onMounted(() => {
|
||||
// open panel by default if recipe has not been converted to internal yet or if it does not have any steps
|
||||
if (!props.recipe.internal || props.recipe.steps.length == 0) {
|
||||
panelState.value = 'show'
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* determines if the file is a PDF based on the path
|
||||
*/
|
||||
|
||||
@@ -1,31 +1,30 @@
|
||||
<template>
|
||||
<!-- <v-row justify="space-between">-->
|
||||
<!-- <v-col>-->
|
||||
<!-- <h2><i class="fas fa-calendar-week fa-fw"></i> Meal Plans</h2>-->
|
||||
<!-- </v-col>-->
|
||||
<!-- </v-row>-->
|
||||
<!-- <v-row justify="space-between">-->
|
||||
<!-- <v-col>-->
|
||||
<!-- <h2><i class="fas fa-calendar-week fa-fw"></i> Meal Plans</h2>-->
|
||||
<!-- </v-col>-->
|
||||
<!-- </v-row>-->
|
||||
|
||||
<v-row class="mt-0" v-if="mealPlanWindows.length > 0">
|
||||
<v-col>
|
||||
<v-window show-arrows>
|
||||
<v-window-item v-for="w in mealPlanWindows" class="pt-1 pb-1">
|
||||
<v-window v-model="currentWindowIndex">
|
||||
<v-window-item v-for="(w, i) in mealPlanWindows" :value="i" class="pt-1 pb-1">
|
||||
<v-row>
|
||||
<v-col v-for="mealPlanGridItem in w">
|
||||
<v-list density="compact" class="pt-0 pb-0">
|
||||
<v-list-item>
|
||||
|
||||
<div class="d-flex justify-space-between">
|
||||
<div class="align-self-center">
|
||||
<v-list-item class="text-center">
|
||||
<div class="d-flex ">
|
||||
<div class="flex-col align-self-start">
|
||||
<v-btn @click="currentWindowIndex--" v-if="currentWindowIndex != 0" icon="fa-solid fa-chevron-left" size="small"></v-btn>
|
||||
</div>
|
||||
<div class="flex-col flex-grow-1 mt-auto mb-auto">
|
||||
{{ mealPlanGridItem.date_label }}
|
||||
</div>
|
||||
<div class="align-self-center">
|
||||
<v-btn variant="flat" icon="">
|
||||
<i class="fas fa-plus"></i>
|
||||
<model-edit-dialog model="MealPlan" :item-defaults="{fromDate: mealPlanGridItem.date.toJSDate()}" :close-after-create="false" :close-after-save="false"></model-edit-dialog>
|
||||
</v-btn>
|
||||
<div class="flex-col align-self-end">
|
||||
<v-btn @click="currentWindowIndex++" v-if="currentWindowIndex + 1 < mealPlanWindows.length" icon="fa-solid fa-chevron-right"
|
||||
size="small"></v-btn>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</v-list-item>
|
||||
<v-divider v-if="mealPlanGridItem.plan_entries.length > 0"></v-divider>
|
||||
<v-list-item v-for="p in mealPlanGridItem.plan_entries" :key="p.id" @click="clickMealPlan(p)" link>
|
||||
@@ -47,7 +46,7 @@
|
||||
<v-menu activator="parent">
|
||||
<v-list>
|
||||
<v-list-item prepend-icon="$edit" link>
|
||||
{{$t('Edit')}}
|
||||
{{ $t('Edit') }}
|
||||
<model-edit-dialog model="MealPlan" :item="p"></model-edit-dialog>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
@@ -55,7 +54,11 @@
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-list-item>
|
||||
|
||||
<v-list-item class="text-center cursor-pointer" variant="tonal">
|
||||
<model-edit-dialog model="MealPlan" :item-defaults="{fromDate: mealPlanGridItem.date.toJSDate()}" :close-after-create="false"
|
||||
:close-after-save="false"></model-edit-dialog>
|
||||
<v-icon icon="$create" size="small"></v-icon>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-col>
|
||||
</v-row>
|
||||
@@ -79,7 +82,9 @@ import {useRouter} from "vue-router";
|
||||
|
||||
const router = useRouter()
|
||||
const {name} = useDisplay()
|
||||
|
||||
const loading = ref(false)
|
||||
const currentWindowIndex = ref(0)
|
||||
|
||||
let numberOfCols = computed(() => {
|
||||
return homePageCols(name.value)
|
||||
@@ -100,7 +105,12 @@ const meal_plan_grid = computed(() => {
|
||||
grid.push({
|
||||
date: grid_day_date,
|
||||
create_default_date: grid_day_date.toISODate(), // improve meal plan edit modal to do formatting itself and accept dates
|
||||
date_label: grid_day_date.toLocaleString(DateTime.DATE_MED),
|
||||
date_label: grid_day_date.toLocaleString({
|
||||
weekday: 'short',
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
year: '2-digit',
|
||||
}),
|
||||
plan_entries: useMealPlanStore().planList.filter((m: MealPlan) => ((DateTime.fromJSDate(m.fromDate).startOf('day') <= grid_day_date.startOf('day')) && (DateTime.fromJSDate((m.toDate != undefined) ? m.toDate : m.fromDate).startOf('day') >= grid_day_date.startOf('day')))),
|
||||
} as MealPlanGridItem)
|
||||
}
|
||||
@@ -134,9 +144,9 @@ onMounted(() => {
|
||||
})
|
||||
})
|
||||
|
||||
function clickMealPlan(plan: MealPlan){
|
||||
if(plan.recipe){
|
||||
router.push( {name: 'RecipeViewPage', params: {id: plan.recipe.id}})
|
||||
function clickMealPlan(plan: MealPlan) {
|
||||
if (plan.recipe) {
|
||||
router.push({name: 'RecipeViewPage', params: {id: plan.recipe.id}})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
<div v-if="props.keywords">
|
||||
<slot name="prepend"></slot>
|
||||
|
||||
<v-chip class="me-1 mb-1" :label="props.label" :color="props.color" :size="props.size" :variant="props.variant" v-for="k in keywords"> {{ k.label }}</v-chip>
|
||||
<v-chip class="me-1 mb-1" :label="props.label" :color="props.color" :size="props.size" :variant="props.variant" v-for="k in keywords"
|
||||
:to="{name: 'SearchPage', query: {keywords: k.id}}"> {{ k.label }}
|
||||
</v-chip>
|
||||
|
||||
<slot name="append"></slot>
|
||||
</div>
|
||||
@@ -21,11 +23,11 @@ const props = defineProps({
|
||||
variant: {type: String as PropType<NonNullable<"tonal" | "flat" | "text" | "elevated" | "outlined" | "plain"> | undefined>, default: 'tonal'},
|
||||
label: {type: Boolean, default: true},
|
||||
// maximum number of keywords, 0 for all
|
||||
maxKeywords : {type: Number, default: 0},
|
||||
maxKeywords: {type: Number, default: 0},
|
||||
})
|
||||
|
||||
const keywords = computed(() => {
|
||||
if (props.maxKeywords > 0){
|
||||
if (props.maxKeywords > 0) {
|
||||
return props.keywords?.slice(0, props.maxKeywords)
|
||||
} else {
|
||||
return props.keywords
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<v-card class="mt-2">
|
||||
<v-card class="mt-2" v-if="hasFoodProperties || hasRecipeProperties">
|
||||
<v-card-title>
|
||||
<v-icon icon="$properties"></v-icon>
|
||||
{{ $t('Properties') }}
|
||||
@@ -22,8 +22,8 @@
|
||||
<tbody>
|
||||
<tr v-for="p in propertyList" :key="p.id">
|
||||
<td>{{ p.name }}</td>
|
||||
<td>{{ $n(p.propertyAmountPerServing) }} {{ p.unit }}</td>
|
||||
<td>{{ $n(p.propertyAmountTotal) }} {{ p.unit }}</td>
|
||||
<td>{{ $n(roundDecimals(p.propertyAmountPerServing)) }} {{ p.unit }}</td>
|
||||
<td>{{ $n(roundDecimals(p.propertyAmountTotal)) }} {{ p.unit }}</td>
|
||||
<td v-if="sourceSelectedToShow == 'food'">
|
||||
<v-btn @click="dialogProperty = p; dialog = true" variant="plain" color="warning" icon="fa-solid fa-triangle-exclamation" size="small" class="d-print-none"
|
||||
v-if="p.missingValue"></v-btn>
|
||||
@@ -86,6 +86,7 @@ import {ApiApi, PropertyType, Recipe} from "@/openapi";
|
||||
import VClosableCardTitle from "@/components/dialogs/VClosableCardTitle.vue";
|
||||
import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue";
|
||||
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
|
||||
import {roundDecimals} from "@/utils/number_utils.ts";
|
||||
|
||||
type PropertyWrapper = {
|
||||
id: number,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<v-avatar color="primary">V</v-avatar>
|
||||
</template>
|
||||
<v-list-item-title class="font-weight-bold">{{ c.createdBy.displayName }}
|
||||
<v-rating density="comfortable" size="x-small" color="tandoor" class="float-right" v-model="c.rating"></v-rating>
|
||||
<v-rating density="comfortable" size="x-small" color="tandoor" class="float-right" v-model="c.rating" readonly v-if="c.rating != undefined"></v-rating>
|
||||
</v-list-item-title>
|
||||
|
||||
{{ c.comment }}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<template>
|
||||
<template v-if="!props.loading">
|
||||
|
||||
<router-link :to="{name: 'RecipeViewPage', params: {id: props.recipe.id}}">
|
||||
<router-link :to="{name: 'RecipeViewPage', params: {id: props.recipe.id}}" :target="linkTarget">
|
||||
<recipe-image :style="{height: props.height}" :recipe="props.recipe" rounded="lg" class="mr-3 ml-3">
|
||||
|
||||
</recipe-image>
|
||||
</router-link>
|
||||
<div class="ml-3">
|
||||
<div class="d-flex ">
|
||||
<div class="flex-grow-1 cursor-pointer" @click="router.push({name: 'RecipeViewPage', params: {id: props.recipe.id}})">
|
||||
<div class="flex-grow-1 cursor-pointer" @click="openRecipe()">
|
||||
<p class="font-weight-bold mt-2">{{ props.recipe.name }}</p>
|
||||
</div>
|
||||
<div class="mt-1">
|
||||
@@ -107,10 +107,23 @@ const props = defineProps({
|
||||
show_keywords: {type: Boolean, required: false},
|
||||
show_description: {type: Boolean, required: false},
|
||||
height: {type: String, required: false, default: '15vh'},
|
||||
linkTarget: {type: String, required: false, default: ''}
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
/**
|
||||
* open the recipe either in the same tab or in a new tab depending on the link target prop
|
||||
*/
|
||||
function openRecipe() {
|
||||
if (props.linkTarget != '') {
|
||||
const routeData = router.resolve({name: 'RecipeViewPage', params: {id: props.recipe.id}});
|
||||
window.open(routeData.href, props.linkTarget);
|
||||
} else {
|
||||
router.push({name: 'RecipeViewPage', params: {id: props.recipe.id}})
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
|
||||
<template class="d-block d-lg-none">
|
||||
|
||||
<!-- mobile layout -->
|
||||
<v-card class="rounded-0">
|
||||
<recipe-image
|
||||
max-height="25vh"
|
||||
:recipe="recipe"
|
||||
v-if="recipe.internal"
|
||||
>
|
||||
v-if="recipe.image != undefined">
|
||||
</recipe-image>
|
||||
|
||||
<v-card>
|
||||
@@ -27,47 +27,47 @@
|
||||
</span>
|
||||
<recipe-context-menu :recipe="recipe" v-if="useUserPreferenceStore().isAuthenticated"></recipe-context-menu>
|
||||
</v-sheet>
|
||||
<keywords-component variant="flat" class="ms-1 mb-2" :keywords="recipe.keywords"></keywords-component>
|
||||
<keywords-component variant="flat" class="ms-1" :keywords="recipe.keywords"></keywords-component>
|
||||
<v-rating v-model="recipe.rating" size="x-small" v-if="recipe.rating" half-increments readonly></v-rating>
|
||||
<v-sheet class="ps-2 text-disabled">
|
||||
{{ recipe.description }}
|
||||
</v-sheet>
|
||||
</v-card>
|
||||
</v-card>
|
||||
|
||||
<template v-if="recipe.internal">
|
||||
<v-card class="mt-1">
|
||||
<v-container>
|
||||
<v-row class="text-center text-body-2">
|
||||
<v-col class="pt-1 pb-1">
|
||||
<i class="fas fa-cogs fa-fw mr-1"></i> {{ recipe.workingTime }} min<br/>
|
||||
<div class="text-grey">{{ $t('WorkingTime') }}</div>
|
||||
</v-col>
|
||||
<v-col class="pt-1 pb-1">
|
||||
<div><i class="fas fa-hourglass-half fa-fw mr-1"></i> {{ recipe.waitingTime }} min</div>
|
||||
<div class="text-grey">{{ $t('WaitingTime') }}</div>
|
||||
</v-col>
|
||||
<v-col class="pt-1 pb-1">
|
||||
<!-- only display values if not all are default (e.g. for external recipes) -->
|
||||
<v-card class="mt-1" v-if="recipe.workingTime != 0 || recipe.waitingTime != 0 || recipe.servings != 1">
|
||||
<v-container>
|
||||
<v-row class="text-center text-body-2">
|
||||
<v-col class="pt-1 pb-1">
|
||||
<i class="fas fa-cogs fa-fw mr-1"></i> {{ recipe.workingTime }} min<br/>
|
||||
<div class="text-grey">{{ $t('WorkingTime') }}</div>
|
||||
</v-col>
|
||||
<v-col class="pt-1 pb-1">
|
||||
<div><i class="fas fa-hourglass-half fa-fw mr-1"></i> {{ recipe.waitingTime }} min</div>
|
||||
<div class="text-grey">{{ $t('WaitingTime') }}</div>
|
||||
</v-col>
|
||||
<v-col class="pt-1 pb-1">
|
||||
|
||||
<div class="cursor-pointer">
|
||||
<i class="fas fa-sort-numeric-up fa-fw mr-1"></i> {{ servings }} <br/>
|
||||
<div class="text-grey"><span v-if="recipe.servingsText">{{ recipe.servingsText }}</span><span v-else>{{ $t('Servings') }}</span></div>
|
||||
<number-scaler-dialog :number="servings" @confirm="(s: number) => {servings = s}" title="Servings">
|
||||
</number-scaler-dialog>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card>
|
||||
</template>
|
||||
<div class="cursor-pointer">
|
||||
<i class="fas fa-sort-numeric-up fa-fw mr-1"></i> {{ servings }} <br/>
|
||||
<div class="text-grey"><span v-if="recipe.servingsText">{{ recipe.servingsText }}</span><span v-else>{{ $t('Servings') }}</span></div>
|
||||
<number-scaler-dialog :number="servings" @confirm="(s: number) => {servings = s}" title="Servings">
|
||||
</number-scaler-dialog>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card>
|
||||
</template>
|
||||
<!-- Desktop horizontal layout -->
|
||||
<template class="d-none d-lg-block">
|
||||
<v-row dense>
|
||||
<v-col cols="8">
|
||||
<recipe-image
|
||||
:rounded="true"
|
||||
max-height="40vh"
|
||||
:recipe="recipe"
|
||||
v-if="recipe.internal">
|
||||
:recipe="recipe">
|
||||
</recipe-image>
|
||||
</v-col>
|
||||
<v-col cols="4">
|
||||
@@ -75,7 +75,8 @@
|
||||
<v-card-text class="flex-grow-1">
|
||||
<div class="d-flex">
|
||||
<h1 class="flex-column flex-grow-1">{{ recipe.name }}</h1>
|
||||
<recipe-context-menu :recipe="recipe" v-if="useUserPreferenceStore().isAuthenticated" class="flex-column mb-auto mt-2 float-right"></recipe-context-menu>
|
||||
<recipe-context-menu :recipe="recipe" v-if="useUserPreferenceStore().isAuthenticated"
|
||||
class="flex-column mb-auto mt-2 float-right"></recipe-context-menu>
|
||||
</div>
|
||||
<p>
|
||||
{{ $t('created_by') }} {{ recipe.createdBy.displayName }} ({{ DateTime.fromJSDate(recipe.createdAt).toLocaleString(DateTime.DATE_SHORT) }})
|
||||
@@ -84,6 +85,8 @@
|
||||
<i>{{ recipe.description }}</i>
|
||||
</p>
|
||||
|
||||
<v-rating v-model="recipe.rating" size="x-small" v-if="recipe.rating" readonly></v-rating>
|
||||
|
||||
<keywords-component variant="flat" class="mt-4" :keywords="recipe.keywords"></keywords-component>
|
||||
|
||||
</v-card-text>
|
||||
@@ -113,20 +116,27 @@
|
||||
</v-row>
|
||||
</template>
|
||||
|
||||
<template v-if="!recipe.internal">
|
||||
<external-recipe-viewer :recipe="recipe"></external-recipe-viewer>
|
||||
</template>
|
||||
<template v-else>
|
||||
<v-card class="mt-1" v-if="recipe.steps.length > 1 && recipe.showIngredientOverview">
|
||||
<steps-overview :steps="recipe.steps" :ingredient-factor="ingredientFactor"></steps-overview>
|
||||
</v-card>
|
||||
<template v-if="recipe.filePath">
|
||||
<external-recipe-viewer class="mt-2" :recipe="recipe"></external-recipe-viewer>
|
||||
|
||||
<v-card class="mt-1" v-for="(step, index) in recipe.steps" :key="step.id">
|
||||
<step-view v-model="recipe.steps[index]" :step-number="index+1" :ingredientFactor="ingredientFactor"></step-view>
|
||||
<v-card :title="$t('AI')" prepend-icon="$ai" @click="aiConvertRecipe()" :loading="fileApiLoading || loading" :disabled="fileApiLoading || loading"
|
||||
v-if="!recipe.internal">
|
||||
<v-card-text>
|
||||
Convert the recipe using AI
|
||||
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<property-view v-model="recipe" :servings="servings" v-if="recipe.internal"></property-view>
|
||||
<v-card class="mt-1" v-if="(recipe.steps.length > 1 || (recipe.steps.length == 1 && !recipe.steps[0].showIngredientsTable)) && recipe.showIngredientOverview">
|
||||
<steps-overview :steps="recipe.steps" :ingredient-factor="ingredientFactor"></steps-overview>
|
||||
</v-card>
|
||||
|
||||
<v-card class="mt-1" v-for="(step, index) in recipe.steps" :key="step.id">
|
||||
<step-view v-model="recipe.steps[index]" :step-number="index+1" :ingredientFactor="ingredientFactor"></step-view>
|
||||
</v-card>
|
||||
|
||||
<property-view v-model="recipe" :servings="servings"></property-view>
|
||||
|
||||
<v-card class="mt-2">
|
||||
<v-card-text>
|
||||
@@ -176,7 +186,7 @@
|
||||
<script setup lang="ts">
|
||||
|
||||
import {computed, onBeforeUnmount, onMounted, ref, watch} from 'vue'
|
||||
import {Recipe} from "@/openapi"
|
||||
import {ApiApi, Recipe} from "@/openapi"
|
||||
import NumberScalerDialog from "@/components/inputs/NumberScalerDialog.vue"
|
||||
import StepsOverview from "@/components/display/StepsOverview.vue";
|
||||
import RecipeActivity from "@/components/display/RecipeActivity.vue";
|
||||
@@ -184,23 +194,33 @@ import RecipeContextMenu from "@/components/inputs/RecipeContextMenu.vue";
|
||||
import KeywordsComponent from "@/components/display/KeywordsBar.vue";
|
||||
import RecipeImage from "@/components/display/RecipeImage.vue";
|
||||
import ExternalRecipeViewer from "@/components/display/ExternalRecipeViewer.vue";
|
||||
import {useMediaQuery, useWakeLock} from "@vueuse/core";
|
||||
import {useWakeLock} from "@vueuse/core";
|
||||
import StepView from "@/components/display/StepView.vue";
|
||||
import {DateTime} from "luxon";
|
||||
import PropertyView from "@/components/display/PropertyView.vue";
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
|
||||
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore.ts";
|
||||
import {useFileApi} from "@/composables/useFileApi.ts";
|
||||
|
||||
const {request, release} = useWakeLock()
|
||||
const {doAiImport, fileApiLoading} = useFileApi()
|
||||
|
||||
const loading = ref(false)
|
||||
const recipe = defineModel<Recipe>({required: true})
|
||||
|
||||
const servings = ref(1)
|
||||
const showFullRecipeName = ref(false)
|
||||
|
||||
/**
|
||||
* factor for multiplying ingredient amounts based on recipe base servings and user selected servings
|
||||
*/
|
||||
const ingredientFactor = computed(() => {
|
||||
return servings.value / ((recipe.value.servings != undefined) ? recipe.value.servings : 1)
|
||||
})
|
||||
|
||||
/**
|
||||
* change servings when recipe servings are changed
|
||||
*/
|
||||
watch(() => recipe.value.servings, () => {
|
||||
if (recipe.value.servings) {
|
||||
servings.value = recipe.value.servings
|
||||
@@ -217,6 +237,43 @@ onBeforeUnmount(() => {
|
||||
release()
|
||||
})
|
||||
|
||||
/**
|
||||
* converts the recipe into an internal recipe using AI
|
||||
*/
|
||||
function aiConvertRecipe() {
|
||||
let api = new ApiApi()
|
||||
|
||||
doAiImport(null, '', recipe.value.id!).then(r => {
|
||||
if (r.recipe) {
|
||||
recipe.value.internal = true
|
||||
recipe.value.steps = r.recipe.steps
|
||||
recipe.value.keywords = r.recipe.keywords
|
||||
recipe.value.servings = r.recipe.servings
|
||||
recipe.value.servingsText = r.recipe.servingsText
|
||||
recipe.value.workingTime = r.recipe.workingTime
|
||||
recipe.value.waitingTime = r.recipe.waitingTime
|
||||
|
||||
servings.value = r.recipe.servings
|
||||
loading.value = true
|
||||
|
||||
api.apiRecipeUpdate({id: recipe.value.id!, recipe: recipe.value}).then(r => {
|
||||
recipe.value = r
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
|
||||
} else {
|
||||
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, [r.error, r.msg])
|
||||
}
|
||||
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<v-list-item class="swipe-container" :id="itemContainerId" @touchend="handleSwipe()"
|
||||
<v-list-item class="swipe-container border-t-sm" :id="itemContainerId" @touchend="handleSwipe()"
|
||||
v-if="isShoppingListFoodVisible(props.shoppingListFood, useUserPreferenceStore().deviceSettings)"
|
||||
>
|
||||
<!-- <div class="swipe-action" :class="{'bg-success': !isChecked , 'bg-warning': isChecked }">-->
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<timer :seconds="step.time != undefined ? step.time*60 : 0" @stop="timerRunning = false" v-if="timerRunning"></timer>
|
||||
<v-card-text v-if="step.ingredients.length > 0 || step.instruction != ''">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6" v-if="step.ingredients.length > 0">
|
||||
<v-col cols="12" md="6" v-if="step.ingredients.length > 0 && step.showIngredientsTable">
|
||||
<ingredients-table v-model="step.ingredients" :ingredient-factor="ingredientFactor"></ingredients-table>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6" class="markdown-body">
|
||||
@@ -35,11 +35,11 @@
|
||||
</v-card-text>
|
||||
|
||||
<template v-if="step.stepRecipe">
|
||||
<v-card-text>
|
||||
<v-card class="mt-1" v-for="(subRecipeStep, subRecipeStepIndex) in step.stepRecipeData.steps" :key="subRecipeStep.id">
|
||||
<v-card class="ma-2 border-md" prepend-icon="$recipes" :title="step.stepRecipeData.name">
|
||||
<v-card-text class="mt-1" v-for="(subRecipeStep, subRecipeStepIndex) in step.stepRecipeData.steps" :key="subRecipeStep.id">
|
||||
<step-view v-model="step.stepRecipeData.steps[subRecipeStepIndex]" :step-number="subRecipeStepIndex+1" :ingredientFactor="ingredientFactor"></step-view>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</template>
|
||||
<template v-if="step.file">
|
||||
<v-img :src="step.file.preview" v-if="step.file.preview"></v-img>
|
||||
|
||||
@@ -1,13 +1,24 @@
|
||||
<template>
|
||||
<v-expansion-panels>
|
||||
<v-expansion-panel>
|
||||
<v-expansion-panel-title><i class="far fa-list-alt fa-fw me-2"></i> {{$t('StepsOverview')}}</v-expansion-panel-title>
|
||||
<v-expansion-panel-title><i class="far fa-list-alt fa-fw me-2"></i> {{ $t('StepsOverview') }}</v-expansion-panel-title>
|
||||
<v-expansion-panel-text>
|
||||
<v-container>
|
||||
<v-row v-for="(s, i) in props.steps">
|
||||
<v-col class="pa-1" cols="12" md="6">
|
||||
<b v-if="s.showAsHeader">{{ i + 1 }}. {{ s.name }} </b>
|
||||
<ingredients-table v-model="s.ingredients" :ingredient-factor="props.ingredientFactor"></ingredients-table>
|
||||
|
||||
<template v-if="s.stepRecipe">
|
||||
<v-card class="ma-2 border-md" prepend-icon="$recipes" :title="s.stepRecipeData.name"
|
||||
:to="{name: 'RecipeViewPage', params: {id: s.stepRecipeData.id}}" target="_blank">
|
||||
<v-row v-for="subRecipeStep in s.stepRecipeData.steps">
|
||||
<v-col>
|
||||
<ingredients-table v-model="subRecipeStep.ingredients" :ingredient-factor="props.ingredientFactor"></ingredients-table>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card>
|
||||
</template>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
@@ -22,6 +33,7 @@
|
||||
import {PropType} from 'vue'
|
||||
import {Step} from "@/openapi";
|
||||
import IngredientsTable from "@/components/display/IngredientsTable.vue";
|
||||
import StepView from "@/components/display/StepView.vue";
|
||||
|
||||
const props = defineProps({
|
||||
steps: {
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
valueProp="id"
|
||||
label="name"
|
||||
:delay="300"
|
||||
append-to-body
|
||||
:searchable="true"
|
||||
:strict="false"
|
||||
:classes="{
|
||||
@@ -68,9 +67,7 @@ function addIngredient(amount: number, unit: Unit|null, food: Food|null) {
|
||||
food: food,
|
||||
} as ShoppingListEntry
|
||||
|
||||
console.log('adding SLR ? ', props.mealPlan)
|
||||
if (props.mealPlan) {
|
||||
console.log('yes')
|
||||
sle.mealplanId = props.mealPlan.id
|
||||
}
|
||||
|
||||
@@ -134,7 +131,6 @@ function search(query: string) {
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<style src="@vueform/multiselect/themes/default.css"></style>
|
||||
<!-- style can't be scoped (for whatever reason) -->
|
||||
<style>
|
||||
|
||||
@@ -47,7 +47,8 @@
|
||||
<v-number-input :label="$t('Time')" v-model="step.time" :min="0" :step="5" control-variant="split"></v-number-input>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6" v-if="showRecipe || step.stepRecipe != null">
|
||||
<model-select model="Recipe" v-model="step.stepRecipeData" @update:modelValue="step.stepRecipe = (step.stepRecipeData != null) ? step.stepRecipeData.id! : null"></model-select>
|
||||
<model-select model="Recipe" v-model="step.stepRecipeData"
|
||||
@update:modelValue="step.stepRecipe = (step.stepRecipeData != null) ? step.stepRecipeData.id! : null"></model-select>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6" v-if="showFile || step.file != null">
|
||||
<model-select model="UserFile" v-model="step.file"></model-select>
|
||||
@@ -60,6 +61,10 @@
|
||||
<div v-if="!mobile">
|
||||
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients" :empty-insert-threshold="25" group="ingredients">
|
||||
<v-row v-for="(ingredient, index) in step.ingredients" :key="ingredient.id" dense>
|
||||
<v-col cols="12" class="pa-0 ma-0 text-center text-disabled">
|
||||
<v-icon icon="$import" size="x-small"></v-icon>
|
||||
{{ ingredient.originalText }}
|
||||
</v-col>
|
||||
<v-col cols="2" v-if="!ingredient.isHeader">
|
||||
<v-input hide-details>
|
||||
<template #prepend>
|
||||
@@ -99,26 +104,22 @@
|
||||
<v-list-item link>
|
||||
<v-switch v-model="step.ingredients[index].noAmount" :label="$t('Disable_Amount')" hide-details></v-switch>
|
||||
</v-list-item>
|
||||
<v-list-item @click="editingIngredientIndex = index; dialogIngredientSorter = true" prepend-icon="fa-solid fa-sort">{{
|
||||
$t('Move')
|
||||
}}
|
||||
</v-list-item>
|
||||
<v-list-item v-if="ingredient.originalText" prepend-icon="$import">
|
||||
<v-list-item-title>{{ $t('Original_Text') }}</v-list-item-title>
|
||||
<v-list-item-subtitle>{{ ingredient.originalText }}</v-list-item-subtitle>
|
||||
<v-list-item @click="editingIngredientIndex = index; dialogIngredientSorter = true" prepend-icon="fa-solid fa-sort">
|
||||
{{ $t('Move') }}
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</v-btn>
|
||||
|
||||
</v-col>
|
||||
|
||||
</v-row>
|
||||
</vue-draggable>
|
||||
</div>
|
||||
|
||||
<v-list v-if="mobile">
|
||||
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients" group="ingredients" empty-insert-threshold="25">
|
||||
<v-list-item v-for="(ingredient, index) in step.ingredients" :key="ingredient.id" border @click="editingIngredientIndex = index; dialogIngredientEditor = true">
|
||||
<v-list-item v-for="(ingredient, index) in step.ingredients" :key="ingredient.id" border
|
||||
@click="editingIngredientIndex = index; dialogIngredientEditor = true">
|
||||
<ingredient-string :ingredient="ingredient"></ingredient-string>
|
||||
<template #append>
|
||||
<v-icon icon="$dragHandle" class="drag-handle"></v-icon>
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
<model-select :label="$t('Properties_Food_Unit')" v-model="editingObj.propertiesFoodUnit" model="Unit"></model-select>
|
||||
|
||||
<properties-editor v-model="editingObj.properties" :amount-for="propertiesAmountFor"></properties-editor>
|
||||
|
||||
<!-- TODO remove once append to body for model select is working properly -->
|
||||
<v-spacer style="margin-top: 60px;"></v-spacer>
|
||||
</v-form>
|
||||
</v-tabs-window-item>
|
||||
|
||||
@@ -101,6 +104,8 @@
|
||||
|
||||
</v-card>
|
||||
</v-form>
|
||||
<!-- TODO remove once append to body for model select is working properly -->
|
||||
<v-spacer style="margin-top: 60px;"></v-spacer>
|
||||
</v-tabs-window-item>
|
||||
|
||||
<v-tabs-window-item value="misc">
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
<v-date-input :label="$t('Valid Until')" v-model="editingObj.validUntil"></v-date-input>
|
||||
<v-textarea :label="$t('Note')" v-model="editingObj.internalNote"></v-textarea>
|
||||
<v-checkbox :label="$t('Reusable')" v-model="editingObj.reusable"></v-checkbox>
|
||||
<v-text-field :label="$t('Link')" readonly :model-value="inviteLinkUrl(editingObj)">
|
||||
<template #append-inner>
|
||||
<btn-copy variant="plain" color="undefined" :copy-value="inviteLinkUrl(editingObj)"></btn-copy>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</v-form>
|
||||
</v-card-text>
|
||||
</model-editor-base>
|
||||
@@ -31,6 +36,7 @@ import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
|
||||
import {DateTime} from "luxon";
|
||||
import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue";
|
||||
import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions";
|
||||
import BtnCopy from "@/components/buttons/BtnCopy.vue";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
@@ -79,6 +85,16 @@ function initializeEditor(){
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* returns url for invite link
|
||||
* @param inviteLink InviteLink object to create url for
|
||||
*/
|
||||
function inviteLinkUrl(inviteLink: InviteLink) {
|
||||
return `${location.protocol}//${location.host}/invite/${inviteLink.uuid}`
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
@update:modelValue="editingObj.servings = editingObj.recipe ? editingObj.recipe.servings : 1"></ModelSelect>
|
||||
<!-- <v-number-input label="Days" control-variant="split" :min="1"></v-number-input>-->
|
||||
<!--TODO create days input with +/- synced to date -->
|
||||
<recipe-card :recipe="editingObj.recipe" v-if="editingObj && editingObj.recipe"></recipe-card>
|
||||
<recipe-card :recipe="editingObj.recipe" v-if="editingObj && editingObj.recipe" link-target="_blank"></recipe-card>
|
||||
<v-btn prepend-icon="$shopping" color="create" class="mt-1" v-if="!editingObj.shopping && editingObj.recipe && isUpdate()">
|
||||
{{$t('Add')}}
|
||||
<add-to-shopping-dialog :recipe="editingObj.recipe" :meal-plan="editingObj" @created="loadShoppingListEntries(); editingObj.shopping = true;"></add-to-shopping-dialog>
|
||||
@@ -47,6 +47,7 @@
|
||||
multiple="range"
|
||||
prepend-icon=""
|
||||
prepend-inner-icon="$calendar"
|
||||
hide-details
|
||||
></v-date-input>
|
||||
|
||||
<v-input>
|
||||
@@ -77,7 +78,7 @@
|
||||
<v-tabs-window-item value="shopping">
|
||||
<closable-help-alert class="mb-2" :text="$t('MealPlanShoppingHelp')"></closable-help-alert>
|
||||
|
||||
<v-row v-if="isUpdate()" dense style="max-height: 75vh" class="overflow-y-scroll">
|
||||
<v-row v-if="isUpdate()" dense style="max-height: 75vh; min-height: 30vh" class="overflow-y-scroll">
|
||||
<v-col>
|
||||
<shopping-list-entry-input :loading="useShoppingStore().currentlyUpdating" :meal-plan="editingObj"></shopping-list-entry-input>
|
||||
<v-list v-if="editingObj.id">
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
<v-form :disabled="loading || fileApiLoading">
|
||||
<v-text-field :label="$t('Name')" v-model="editingObj.name"></v-text-field>
|
||||
<v-textarea :label="$t('Description')" v-model="editingObj.description" clearable counter="512" rows="2" auto-grow></v-textarea>
|
||||
<v-textarea :label="$t('Description')" v-model="editingObj.description" clearable counter="512" maxlength="512" rows="2" auto-grow></v-textarea>
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
@@ -50,13 +50,13 @@
|
||||
<model-select mode="tags" v-model="editingObj.keywords" model="Keyword" allow-create></model-select>
|
||||
<v-row dense>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field :label="$t('WaitingTime')" v-model="editingObj.waitingTime"></v-text-field>
|
||||
<v-number-input :label="$t('WaitingTime')" v-model="editingObj.waitingTime" :step="5"></v-number-input>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field :label="$t('WorkingTime')" v-model="editingObj.workingTime"></v-text-field>
|
||||
<v-number-input :label="$t('WorkingTime')" v-model="editingObj.workingTime" :step="5"></v-number-input>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field :label="$t('Servings')" v-model="editingObj.servings"></v-text-field>
|
||||
<v-number-input :label="$t('Servings')" v-model="editingObj.servings"></v-number-input>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field :label="$t('ServingsText')" v-model="editingObj.servingsText"></v-text-field>
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
<v-divider class="mb-3"></v-divider>
|
||||
|
||||
<v-row>
|
||||
<database-link-col prepend-icon="fa-solid fa-terminal" :href="useDjangoUrls().getDjangoUrl('api')" :lg="6" :title="$t('API Browser')"></database-link-col>
|
||||
<database-link-col prepend-icon="fa-solid fa-terminal" :href="useDjangoUrls().getDjangoUrl('api')" :lg="6" :title="$t('API_Browser')"></database-link-col>
|
||||
<database-link-col prepend-icon="fa-solid fa-laptop-code" :href="useDjangoUrls().getDjangoUrl('/docs/api/')" :lg="6"
|
||||
:title="$t('API Dokumentation')"></database-link-col>
|
||||
:title="$t('API_Documentation')"></database-link-col>
|
||||
</v-row>
|
||||
|
||||
<v-row>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<v-divider class="mb-3"></v-divider>
|
||||
|
||||
<v-text-field v-model="useUserPreferenceStore().userSettings.defaultUnit" :label="$t('Default_Unit')"></v-text-field>
|
||||
<!-- <v-text-field v-model="useUserPreferenceStore().userSettings.ingredientDecimals" :label="$t('Decimals')"></v-text-field>-->
|
||||
<v-number-input v-model="useUserPreferenceStore().userSettings.ingredientDecimals" :label="$t('Decimals')"></v-number-input>
|
||||
|
||||
<!-- <v-select-->
|
||||
<!-- :label="$t('DefaultPage')"-->
|
||||
|
||||
@@ -27,6 +27,11 @@
|
||||
<v-divider class="mb-3"></v-divider>
|
||||
|
||||
<v-data-table :items="spaceInviteLinks" :headers="inviteTableHeaders" density="compact" :hide-default-footer="spaceInviteLinks.length < 10">
|
||||
<template #item.reusable="{item}">
|
||||
<v-icon icon="fa-solid fa-check" color="success" v-if="item.reusable"></v-icon>
|
||||
<v-icon icon="fa-solid fa-times" color="error" v-if="!item.reusable"></v-icon>
|
||||
</template>
|
||||
|
||||
<template #item.edit="{item}">
|
||||
<btn-copy size="small" :copy-value="inviteLinkUrl(item)" class="me-1"></btn-copy>
|
||||
<v-btn color="edit" size="small">
|
||||
@@ -65,6 +70,7 @@ const inviteTableHeaders = [
|
||||
{title: 'ID', key: 'id'},
|
||||
{title: t('Email'), key: 'email'},
|
||||
{title: t('Role'), key: 'group.name'},
|
||||
{title: t('Reusable'), key: 'reusable'},
|
||||
{title: t('Edit'), key: 'edit', align: 'end'},
|
||||
]
|
||||
|
||||
@@ -77,7 +83,7 @@ onMounted(() => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
})
|
||||
|
||||
api.apiInviteLinkList().then(r => {
|
||||
api.apiInviteLinkList({unused: true}).then(r => {
|
||||
spaceInviteLinks.value = r.results
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
|
||||
@@ -84,8 +84,9 @@ export function useFileApi() {
|
||||
* uploads the given file to the image recognition endpoint
|
||||
* @param file file object to upload
|
||||
* @param text text to import
|
||||
* @param recipeId id of a recipe to use as import base (for external recipes
|
||||
*/
|
||||
function doAiImport(file: File | null, text: string = '') {
|
||||
function doAiImport(file: File | null, text: string = '', recipeId: string = '') {
|
||||
let formData = new FormData()
|
||||
|
||||
if (file != null) {
|
||||
@@ -94,6 +95,8 @@ export function useFileApi() {
|
||||
formData.append('file', '')
|
||||
}
|
||||
formData.append('text', text)
|
||||
formData.append('recipe_id', recipeId)
|
||||
fileApiLoading.value = true
|
||||
|
||||
return fetch(getDjangoUrl(`api/ai-import/`), {
|
||||
method: 'POST',
|
||||
|
||||
@@ -5,6 +5,7 @@ import {useI18n} from "vue-i18n";
|
||||
import {ResponseError} from "@/openapi";
|
||||
import {getNestedProperty} from "@/utils/utils";
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
|
||||
import {useTitle} from "@vueuse/core";
|
||||
|
||||
// TODO type emit parameter (https://mokkapps.de/vue-tips/emit-event-from-composable)
|
||||
// TODO alternatively there seems to be a getContext method to get the calling context (good practice?)
|
||||
@@ -18,6 +19,7 @@ export function useModelEditorFunctions<T>(modelName: EditorSupportedModels, emi
|
||||
const editingObjChanged = ref(false)
|
||||
|
||||
const {t} = useI18n()
|
||||
const title = useTitle()
|
||||
|
||||
/**
|
||||
* watch editing object to detect changes
|
||||
@@ -108,12 +110,14 @@ export function useModelEditorFunctions<T>(modelName: EditorSupportedModels, emi
|
||||
newItemFunction()
|
||||
|
||||
loading.value = false
|
||||
title.value = editingObjName()
|
||||
return Promise.resolve(editingObj.value)
|
||||
} else if (item !== null) {
|
||||
// item is given so return that
|
||||
editingObj.value = item
|
||||
existingItemFunction()
|
||||
loading.value = false
|
||||
title.value = editingObjName()
|
||||
return Promise.resolve(editingObj.value)
|
||||
} else if (itemId !== undefined && itemId != '') {
|
||||
// itemId is given => fetch from server and return item
|
||||
@@ -126,6 +130,7 @@ export function useModelEditorFunctions<T>(modelName: EditorSupportedModels, emi
|
||||
return modelClass.value.retrieve(itemId).then((r: T) => {
|
||||
editingObj.value = r
|
||||
existingItemFunction()
|
||||
title.value = editingObjName()
|
||||
return editingObj.value
|
||||
}).catch((err: any) => {
|
||||
if (err instanceof ResponseError && err.response.status == 404) {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Add": "",
|
||||
"AddFoodToShopping": "",
|
||||
"AddToShopping": "",
|
||||
@@ -19,6 +21,7 @@
|
||||
"Automation": "",
|
||||
"Bookmarklet": "",
|
||||
"Books": "",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "",
|
||||
"Cancel": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
@@ -52,6 +55,7 @@
|
||||
"Create_New_Unit": "",
|
||||
"Current_Period": "",
|
||||
"Custom Filter": "",
|
||||
"DELETE_ERROR": "",
|
||||
"Date": "",
|
||||
"DelayFor": "",
|
||||
"DelayUntil": "",
|
||||
@@ -78,7 +82,9 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "",
|
||||
"Fats": "",
|
||||
"File": "",
|
||||
@@ -270,6 +276,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "",
|
||||
"Unit": "",
|
||||
"Unit_Alias": "",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Add": "Добави",
|
||||
"AddFoodToShopping": "Добавете {food} към списъка си за пазаруване",
|
||||
"AddToShopping": "Добавяне към списъка за пазаруване",
|
||||
@@ -19,6 +21,7 @@
|
||||
"Automation": "Автоматизация",
|
||||
"Bookmarklet": "Книжен пазар",
|
||||
"Books": "Книги",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "Калории",
|
||||
"Cancel": "Откажи",
|
||||
"Cannot_Add_Notes_To_Shopping": "Бележки не могат да се добавят към списъка за пазаруване",
|
||||
@@ -49,6 +52,7 @@
|
||||
"Create_New_Unit": "Добавяне на нова единица",
|
||||
"Current_Period": "Текущ период",
|
||||
"Custom Filter": "Персонализиран филтър",
|
||||
"DELETE_ERROR": "",
|
||||
"Date": "Дата",
|
||||
"DelayFor": "Закъснение за {hours} часа",
|
||||
"DelayUntil": "Забавяне до",
|
||||
@@ -75,7 +79,9 @@
|
||||
"Export_Supported": "Поддържа се експорт",
|
||||
"Export_To_ICal": "Експортиране на .ics",
|
||||
"External": "Външен",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Външно изображение на рецептата",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Неуспешно",
|
||||
"Fats": "Мазнини",
|
||||
"File": "Файл",
|
||||
@@ -263,6 +269,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Тип",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Недефиниран",
|
||||
"Unit": "Единица",
|
||||
"Unit_Alias": "Псевдоним на единица",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Compte",
|
||||
"Add": "Afegir",
|
||||
"AddFoodToShopping": "Afegeix {food} a la llista de la compra",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Enrere",
|
||||
"Bookmarklet": "Marcadors",
|
||||
"Books": "Llibres",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Calculadora",
|
||||
"Calories": "Calories",
|
||||
"Cancel": "Cancelar",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "Pengeu una imatge per utilitzar com a logotip a la barra de navegació.",
|
||||
"CustomTheme": "Tema Personalitzat",
|
||||
"CustomThemeHelp": "Cancel·la els estils del tema seleccionat Carregant un fitxer CSS personalitzat.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Millora el teu Espai important llistes d’aliments, unitats i més, seleccionats per la comunitat per millorar la teva col·lecció de receptes.",
|
||||
"Datatype": "Tipus de Dades",
|
||||
"Date": "Data",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "Exportació suportada",
|
||||
"Export_To_ICal": "Exportar .ics",
|
||||
"External": "Extern",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Imatge externa de la recepta",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "Base de dades FDC ID",
|
||||
"FDC_Search": "Cerca FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Error",
|
||||
"Fats": "Greixos",
|
||||
"File": "Arxiu",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Tipus",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Sense Canvis",
|
||||
"Undefined": "indefinit",
|
||||
"Undo": "Desfer",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Účet",
|
||||
"Add": "Přidat",
|
||||
"AddFoodToShopping": "Přidat {food} na váš nákupní seznam",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Zpět",
|
||||
"Bookmarklet": "Skript v záložce",
|
||||
"Books": "Kuchařky",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Kalkulačka",
|
||||
"Calories": "Kalorie",
|
||||
"Cancel": "Zrušit",
|
||||
@@ -73,6 +76,7 @@
|
||||
"CustomNavLogoHelp": "Nahrajte obrázek, který se má zobrazit jako logo v navigačním panelu.",
|
||||
"CustomTheme": "Vlastní téma",
|
||||
"CustomThemeHelp": "Přepsat styly vybraného motivu nahráním vlastního souboru CSS.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Rozšiřte svůj prostor o seznamy potravin, jednotek a dalších položek spravovaných komunitou, a vylepšete tak svoji sbírku receptů.",
|
||||
"Datatype": "Datový typ",
|
||||
"Date": "Datum",
|
||||
@@ -113,10 +117,12 @@
|
||||
"Export_Supported": "Export podporován",
|
||||
"Export_To_ICal": "Export ovat .ics",
|
||||
"External": "Externí",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Externí obrázek receptu",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "ID v databázi FDC",
|
||||
"FDC_Search": "Vyhledávání v FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Selhání",
|
||||
"Fats": "Tuky",
|
||||
"File": "Soubor",
|
||||
@@ -351,6 +357,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Typ",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Neurčeno",
|
||||
"Unit": "Jednotka",
|
||||
"Unit_Alias": "Přezdívka jednotky",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Bruger",
|
||||
"Add": "Tilføj",
|
||||
"AddFoodToShopping": "Tilføj {food} til indkøbsliste",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Tilbage",
|
||||
"Bookmarklet": "Bogmærke",
|
||||
"Books": "Bøger",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Lommeregner",
|
||||
"Calories": "Kalorier",
|
||||
"Cancel": "Annuller",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "Upload et billede til brug som navigationsbarrelogo.",
|
||||
"CustomTheme": "Personaliseret tema",
|
||||
"CustomThemeHelp": "Overskriv det valgte temas stil ved at uploade en personlig CSS-fil.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Udbyg dit Space og gør din opskriftsamling bedre ved at importere en netværkskurateret liste af ingredienser, enheder og mere.",
|
||||
"Datatype": "Datatype",
|
||||
"Date": "Dato",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "Eksport understøttet",
|
||||
"Export_To_ICal": "Eksporter .ics",
|
||||
"External": "Ekstern",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Eksternt billede af opskrift",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC database ID",
|
||||
"FDC_Search": "FDC søgning",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Mislykkedes",
|
||||
"Fats": "Fedtstoffer",
|
||||
"File": "Fil",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Type",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Uændret",
|
||||
"Undefined": "Ikke defineret",
|
||||
"Undo": "Fortryd",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Λογαριασμός",
|
||||
"Add": "Προσθήκη",
|
||||
"AddFoodToShopping": "Προσθήκη του φαγητού {food} στη λίστα αγορών σας",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Πίσω",
|
||||
"Bookmarklet": "Bookmarklet",
|
||||
"Books": "Βιβλία",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Υπολογιστής",
|
||||
"Calories": "Θερμίδες",
|
||||
"Cancel": "Ακύρωση",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "Μεταφορτώστε μια εικόνα για χρήση ως λογότυπο της γραμμής πλοήγησης.",
|
||||
"CustomTheme": "Προσαρμοσμένο Θέμα",
|
||||
"CustomThemeHelp": "Αντικαταστήστε τα στυλ του επιλεγμένου θέματος μεταφορτώνοντας ένα προσαρμοσμένο αρχείο CSS.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Βελτιώστε τον χώρο και τη συλλογή συνταγών σας κάνοντας εισαγωγή μιας λίστας από φαγητά, μονάδες μέτρησης κ.α., επιμελημένη από την κοινότητα.",
|
||||
"Datatype": "Τύπος δεδομένων",
|
||||
"Date": "Ημερομηνία",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "Υποστηρίζεται εξαγωγή",
|
||||
"Export_To_ICal": "Εξαγωγή .ics",
|
||||
"External": "Εξωτερική",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Εξωτερική εικόνα συνταγής",
|
||||
"FDC_ID": "Ταυτότητα FDC",
|
||||
"FDC_ID_help": "Ταυτότητα βάσης δεδομένων FDC",
|
||||
"FDC_Search": "Αναζήτηση FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Αποτυχία",
|
||||
"Fats": "Λιπαρά",
|
||||
"File": "Αρχείο",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Είδος",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Αμετάβλητο",
|
||||
"Undefined": "Απροσδιόριστο",
|
||||
"Undo": "Ανέρεση",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Tili",
|
||||
"Add": "Lisää",
|
||||
"AddFoodToShopping": "Lisää {food} ostoslistaan",
|
||||
@@ -27,6 +29,7 @@
|
||||
"Back": "Takaisin",
|
||||
"Bookmarklet": "Kirjamerkki",
|
||||
"Books": "Kirjat",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Laskin",
|
||||
"Calories": "Kalorit",
|
||||
"Cancel": "Peruuta",
|
||||
@@ -71,6 +74,7 @@
|
||||
"CustomNavLogoHelp": "Lataa kuva käytettäväksi navigointipalkin logona.",
|
||||
"CustomTheme": "Mukautettu Teema",
|
||||
"CustomThemeHelp": "Ohita valitun teeman tyylit lataamalla mukautettu CSS-tiedosto.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Paranna tilaasi tuomalla yhteisön kuratoitu luettelo ruoista, yksiköistä ja muusta parantaaksesi reseptikokoelmaasi .",
|
||||
"Datatype": "Tietotyyppi",
|
||||
"Date": "Päivämäärä",
|
||||
@@ -111,10 +115,12 @@
|
||||
"Export_Supported": "Vienti tuettu",
|
||||
"Export_To_ICal": "Vie .ics",
|
||||
"External": "Ulkoinen",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Ulkoinen reseptin kuva",
|
||||
"FDC_ID": "FDC -tunnus",
|
||||
"FDC_ID_help": "FDC tietokanta tunnus",
|
||||
"FDC_Search": "FDC Haku",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Epäonnistui",
|
||||
"Fats": "Rasvat",
|
||||
"File": "Tiedosto",
|
||||
@@ -338,6 +344,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Tyyppi",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Muuttumaton",
|
||||
"Undefined": "Määrittelemätön",
|
||||
"Undo": "Kumoa",
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
{
|
||||
"AI": "IA",
|
||||
"AIImportSubtitle": "Utiliser l'IA pour importer des images de recettes.",
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"AccessTokenHelp": "Clé d'accès pour l'API REST.",
|
||||
"Access_Token": "Jeton d'accès",
|
||||
"Account": "Compte",
|
||||
"Actions": "Actions",
|
||||
"Activity": "Activité",
|
||||
"Add": "Ajouter",
|
||||
"AddAll": "Tout ajouter",
|
||||
"AddFilter": "Ajouter un filtre",
|
||||
"AddFoodToShopping": "Ajouter l’aliment {food} à votre liste de courses",
|
||||
"AddMany": "Ajouter plusieurs",
|
||||
"AddToShopping": "Ajouter à la liste de courses",
|
||||
"Add_Servings_to_Shopping": "Ajouter {servings} portions aux courses",
|
||||
"Add_Step": "Ajouter une étape",
|
||||
@@ -12,31 +23,49 @@
|
||||
"Added_To_Shopping_List": "Ajouté à la liste de courses",
|
||||
"Added_by": "Ajouté par",
|
||||
"Added_on": "Ajouté le",
|
||||
"Admin": "Admin",
|
||||
"Advanced": "Avancé",
|
||||
"Advanced Search Settings": "Paramètres de recherche avancée",
|
||||
"Alignment": "Alignement",
|
||||
"AllRecipes": "Toutes les recettes",
|
||||
"Amount": "Quantité",
|
||||
"App": "Appli",
|
||||
"Apply": "",
|
||||
"Are_You_Sure": "Etes-vous sûr ?",
|
||||
"AppImportSubtitle": "Importer votre base de données de recettes existante.",
|
||||
"Apply": "Appliquer",
|
||||
"Are_You_Sure": "Êtes-vous sûr ?",
|
||||
"Auto_Planner": "Planning Auto",
|
||||
"Auto_Sort": "Tri automatique",
|
||||
"Auto_Sort_Help": "Déplacer tous les ingrédients à l’étape la mieux adaptée.",
|
||||
"Automate": "Automatiser",
|
||||
"Automation": "Automatisation",
|
||||
"AutomationHelp": "Les automatisations vous permettent, selon le type, d'appliquer certaines modifications automatiques aux recettes, aux ingrédients, ... par exemple lors de l'importation de recettes. ",
|
||||
"Available": "Disponible",
|
||||
"AvailableCategories": "Catégories disponibles",
|
||||
"Back": "Retour",
|
||||
"BaseUnit": "Unité de base",
|
||||
"BaseUnitHelp": "Unité standard pour la conversion automatique des unités",
|
||||
"Basics": "Les bases",
|
||||
"Book": "Livre",
|
||||
"Bookmarklet": "Signet",
|
||||
"BookmarkletHelp1": "Faites glisser le bouton suivant dans votre barre de signets",
|
||||
"BookmarkletHelp2": "Ouvrez la page à partir de laquelle vous souhaitez effectuer l'importation",
|
||||
"BookmarkletHelp3": "Cliquez sur le signet pour effectuer l'importation.",
|
||||
"BookmarkletImportSubtitle": "Utilisez un signet pour importer depuis des pages non publiques.",
|
||||
"Books": "Livres",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Calculatrice",
|
||||
"Calories": "Calories",
|
||||
"Cancel": "Annuler",
|
||||
"Cannot_Add_Notes_To_Shopping": "Les notes ne peuvent pas être ajoutées à la liste de courses",
|
||||
"Carbohydrates": "Glucides",
|
||||
"Cards": "Cartes",
|
||||
"Categories": "Catégories",
|
||||
"Category": "Catégorie",
|
||||
"CategoryInstruction": "Faites glisser les catégories pour modifier l'ordre dans lequel elles apparaissent dans la liste des courses.",
|
||||
"CategoryName": "Intitulé de la catégorie",
|
||||
"Change_Password": "Modifier le mot de passe",
|
||||
"ChildInheritFields": "Les enfants héritent des champs",
|
||||
"ChildInheritFields_help": "Les enfants hériteront de ces champs par défaut.",
|
||||
"Choose_Category": "Choisir une catégorie",
|
||||
"Clear": "Supprimer",
|
||||
"Click_To_Edit": "Cliquer pour éditer",
|
||||
@@ -45,9 +74,19 @@
|
||||
"Color": "Couleur",
|
||||
"Combine_All_Steps": "Combiner toutes les étapes en un seul champ.",
|
||||
"Coming_Soon": "Bientôt disponible",
|
||||
"Comment": "Commenter",
|
||||
"Comments_setting": "Montrer les commentaires",
|
||||
"Completed": "Achevé",
|
||||
"Confirm": "Confirmer",
|
||||
"ConnectorConfig": "Connecteurs",
|
||||
"ConnectorConfigHelp": "Avec les connecteurs, vous pouvez automatiquement synchroniser les données de Tandoor avec des services externes. ",
|
||||
"Continue": "Continuer",
|
||||
"Conversion": "Conversion",
|
||||
"ConversionsHelp": "Avec les conversions, vous pouvez calculer une quantité dans différentes unités. Actuellement, c'est utilisé uniquement pour le calcul des propriétés, mais ça pourrait être utilisé dans d'autres parties de Tandoor dans le futur. ",
|
||||
"CookLog": "Journal de cuisine",
|
||||
"CookLogHelp": "Entrées dans le journal de cuisine pour les recettes. ",
|
||||
"Cooked": "Cuit",
|
||||
"Copied": "Copié",
|
||||
"Copy": "Copier",
|
||||
"Copy Link": "Copier le lien",
|
||||
"Copy Token": "Copier le jeton",
|
||||
@@ -65,6 +104,8 @@
|
||||
"Create_New_Shopping_Category": "Ajouter une nouvelle catégorie de courses",
|
||||
"Create_New_Unit": "Ajouter une nouvelle unité",
|
||||
"Created": "Créé",
|
||||
"CreatedBy": "Créé par",
|
||||
"Ctrl+K": "Ctrl+K",
|
||||
"Current_Period": "Période actuelle",
|
||||
"Custom Filter": "Filtre personnalisé",
|
||||
"CustomImageHelp": "Téléchargez une image à afficher dans l'aperçu de l'espace.",
|
||||
@@ -73,83 +114,118 @@
|
||||
"CustomNavLogoHelp": "Téléchargez une image à utiliser comme logo de la barre de navigation.",
|
||||
"CustomTheme": "Thème personnalisé",
|
||||
"CustomThemeHelp": "Remplacer les styles du thème sélectionné en téléchargeant un fichier CSS personnalisé.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Améliorez votre groupe en important des données partagées par la communauté afin d'améliorer vos collections de recettes : listes d'aliments, unités et plus encore.",
|
||||
"Database": "Base de données",
|
||||
"DatabaseHelp": "Tandoor utilise beaucoup de mécanismes pour que vous puissiez créer des recettes, des listes de courses, des plans de repas et plus encore. C'est ici que vous pouvez gérer tous ces modèles.",
|
||||
"Datatype": "Type de donnée",
|
||||
"Date": "Date",
|
||||
"Day": "Jour",
|
||||
"Days": "Jours",
|
||||
"Decimals": "Décimales",
|
||||
"Default": "Par défaut",
|
||||
"DefaultPage": "Page par défaut",
|
||||
"Default_Unit": "Unité par défaut",
|
||||
"DelayFor": "Retard de {hours} heures",
|
||||
"DelayUntil": "Retard jusqu'à",
|
||||
"Delete": "Supprimer",
|
||||
"DeleteConfirmQuestion": "Voulez-vous vraiment supprimer cet objet ?",
|
||||
"DeleteShoppingConfirm": "Êtes-vous sûr(e) de vouloir supprimer tous les aliments {food} de votre liste de courses ?",
|
||||
"Delete_All": "Supprimer tout",
|
||||
"Delete_Food": "Supprimer l’aliment",
|
||||
"Delete_Keyword": "Supprimer le mot-clé",
|
||||
"Deleted": "Supprimé",
|
||||
"Description": "Description",
|
||||
"Description_Replace": "Remplacer la Description",
|
||||
"DeviceSettings": "Paramètres de l'appareil",
|
||||
"DeviceSettingsHelp": "Pour permettre Tandoor de paraître élégant de partout, ces paramètres sont uniquement stockés sur cet appareil.",
|
||||
"Disable": "Désactiver",
|
||||
"Disable_Amount": "Désactiver la quantité",
|
||||
"Disabled": "Désactivé",
|
||||
"Documentation": "Documentation",
|
||||
"Down": "Bas",
|
||||
"Download": "Télécharger",
|
||||
"DragToUpload": "Déplacer ou cliquer pour sélectionner",
|
||||
"Drag_Here_To_Delete": "Glissez ici pour supprimer",
|
||||
"Duplicate": "Dupliquer",
|
||||
"DuplicateFoundInfo": "Une recette avec cette URL existe déjà dans votre groupe. Continuer ?",
|
||||
"Edit": "Modifier",
|
||||
"Edit_Food": "Modifier l’aliment",
|
||||
"Edit_Keyword": "Modifier le mot-clé",
|
||||
"Edit_Meal_Plan_Entry": "Modifier une entrée de menu",
|
||||
"Edit_Recipe": "Modifier la recette",
|
||||
"Email": "Adresse email",
|
||||
"Empty": "Vider",
|
||||
"Enable": "Activer",
|
||||
"Enable_Amount": "Activer la quantité",
|
||||
"Enabled": "Activé",
|
||||
"EndDate": "Date de fin",
|
||||
"Energy": "Énergie",
|
||||
"Entries": "Entrées",
|
||||
"Error": "Erreur",
|
||||
"ErrorUrlListImport": "Une erreur est survenue lors de l'importation de la première URL de la liste. Les autres URLs n'apparaissant plus ont été importées avec succès. ",
|
||||
"Events": "Évènements",
|
||||
"Export": "Exporter",
|
||||
"Export_As_ICal": "Exporter la période en cours au format iCal",
|
||||
"Export_Not_Yet_Supported": "Exportation pas encore prise en charge",
|
||||
"Export_Supported": "Exportation prise en charge",
|
||||
"Export_To_ICal": "Exporter .ics",
|
||||
"External": "Externe",
|
||||
"ExternalRecipe": "",
|
||||
"ExternalRecipeImport": "Importation d'une recette externe",
|
||||
"ExternalRecipeImportHelp": "Les fichiers des dossiers synchronisés sur des stockages externes ne sont pas importés directement, mais enregistrés temporairement comme recettes d'importation externe. Vous pouvez ainsi visualiser et modifier rapidement les fichiers nouvellement trouvés avant leur transfert vers la collection principale. ",
|
||||
"ExternalStorage": "Stockage externe",
|
||||
"External_Recipe_Image": "Image de recette externe",
|
||||
"FDC_ID": "ID FCD",
|
||||
"FDC_ID_help": "ID de base de données FDC",
|
||||
"FDC_Search": "Recherche dans le FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Échec",
|
||||
"Fats": "Matières grasses",
|
||||
"File": "Fichier",
|
||||
"Files": "Fichiers",
|
||||
"FinishedAt": "Terminé à",
|
||||
"First": "Premier",
|
||||
"First_name": "Prénom",
|
||||
"Food": "Aliment",
|
||||
"FoodHelp": "Les aliments constituent la base essentielle du Tandoor. Avec leurs unités et leurs quantités respectives, ils constituent les ingrédients d'une recette. Ils peuvent également être utilisés pour les courses, les propriétés et bien plus encore. ",
|
||||
"FoodInherit": "Ingrédient hérité",
|
||||
"FoodNotOnHand": "L’aliment {food} n’est pas disponible.",
|
||||
"FoodOnHand": "L’aliment {food} est disponible.",
|
||||
"Food_Alias": "Alias pour les aliments",
|
||||
"Food_Replace": "Remplacer l'aliment",
|
||||
"Foods": "Aliments",
|
||||
"Fulltext": "",
|
||||
"FulltextHelp": "",
|
||||
"Fuzzy": "",
|
||||
"FuzzySearchHelp": "",
|
||||
"Friday": "Vendredi",
|
||||
"Fulltext": "Texte intégral",
|
||||
"FulltextHelp": "Champs de recherche en texte intégral. Remarque : les méthodes de recherche \"web\", \"phrase\" et \"raw\" ne fonctionnent qu'avec des champs en texte intégral.",
|
||||
"Fuzzy": "Approximatif",
|
||||
"FuzzySearchHelp": "Utilisez la recherche approximative pour trouver des entrées même lorsqu'il existe des différences dans la façon dont le mot est écrit.",
|
||||
"GettingStarted": "Commencer",
|
||||
"GroupBy": "Grouper par",
|
||||
"HeaderWarning": "Attention : Changer pour un En-tête supprimera la quantité / l'unité / l'aliment",
|
||||
"Headline": "En-tête",
|
||||
"Help": "Aide",
|
||||
"Hide_External": "Cacher les externes",
|
||||
"Hide_Food": "Cacher l’aliment",
|
||||
"Hide_Keyword": "masquer les mots clefs",
|
||||
"Hide_Keywords": "Cacher le mot-clé",
|
||||
"Hide_Recipes": "Cacher les recettes",
|
||||
"Hide_as_header": "Cacher comme en-tête",
|
||||
"History": "Historique",
|
||||
"HostedFreeVersion": "Vous utilisez la version gratuite de Tandoor",
|
||||
"Hour": "Heure",
|
||||
"Hours": "Heures",
|
||||
"Icon": "Icône",
|
||||
"IgnoreAccents": "",
|
||||
"IgnoreAccentsHelp": "",
|
||||
"IgnoreAccents": "Ignorer les accents",
|
||||
"IgnoreAccentsHelp": "Ignorez les accents lors de la recherche dans les champs donnés. ",
|
||||
"IgnoreThis": "Ne jamais ajouter automatiquement l’aliment {food} aux courses",
|
||||
"Ignore_Shopping": "Ignorer les courses",
|
||||
"IgnoredFood": "Ignorer les courses est paramétré pour l’aliment {food}.",
|
||||
"Image": "Image",
|
||||
"Import": "Importer",
|
||||
"Import Recipe": "Importer une recette",
|
||||
"ImportAll": "Tout importer",
|
||||
"ImportIntoTandoor": "Importer dans Tandoor",
|
||||
"Import_Error": "Une erreur est survenue pendant votre importation. Veuillez développer les détails au bas de la page pour la consulter.",
|
||||
"Import_Not_Yet_Supported": "Importation pas encore prise en charge",
|
||||
"Import_Result_Info": "{imported} sur {total} recettes ont été importées",
|
||||
@@ -159,8 +235,11 @@
|
||||
"Imported_From": "Importé depuis",
|
||||
"Importer_Help": "Plus d'information et d'aide sur cet importateur :",
|
||||
"Information": "Information",
|
||||
"Ingredient": "Ingrédient",
|
||||
"Ingredient Editor": "Éditeur d’ingrédients",
|
||||
"Ingredient Overview": "Aperçu des ingrédients",
|
||||
"IngredientEditorHelp": "Grâce à l'éditeur d'ingrédients, vous pouvez modifier simultanément tous les ingrédients utilisant un aliment et/ou une unité spécifique. Cela vous permet de corriger facilement les erreurs ou de modifier plusieurs recettes simultanément.",
|
||||
"IngredientHelp": "Les ingrédients se composent généralement d'une quantité, d'une unité et d'un aliment, la quantité et l'unité étant facultatives. Ils peuvent également contenir une note ou servir d'en-tête. ",
|
||||
"IngredientInShopping": "Cet ingrédient est dans votre liste de courses.",
|
||||
"Ingredients": "Ingrédients",
|
||||
"Inherit": "Hériter",
|
||||
@@ -170,37 +249,54 @@
|
||||
"Input": "Entrée",
|
||||
"Instruction_Replace": "Instruction Remplacer",
|
||||
"Instructions": "Instructions",
|
||||
"InstructionsEditHelp": "Cliquer ici pour ajouter des instructions. ",
|
||||
"Internal": "Interne",
|
||||
"InviteLinkHelp": "Liens pour inviter des nouvelles personnes dans votre groupe. ",
|
||||
"Invite_Link": "Lien d'invitation",
|
||||
"Invites": "Invitations",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"Key_Shift": "Maj",
|
||||
"Keyword": "Mot-clé",
|
||||
"KeywordHelp": "Les mots-clés peuvent être utilisés pour organiser votre collection de recettes.",
|
||||
"Keyword_Alias": "Alias de mot-clé",
|
||||
"Keywords": "Mots-clés",
|
||||
"Language": "Langue",
|
||||
"Last": "Dernier",
|
||||
"Last_name": "Nom",
|
||||
"Learn_More": "Apprenez-en plus",
|
||||
"Link": "Lien",
|
||||
"Load": "Chargement",
|
||||
"Load_More": "Charger plus",
|
||||
"Log_Cooking": "Marquer comme cuisiné",
|
||||
"Log_Recipe_Cooking": "Marquer la recette comme cuisinée",
|
||||
"Logo": "Logo",
|
||||
"Logout": "Déconnexion",
|
||||
"Make_Header": "Créer un en-tête",
|
||||
"Make_Ingredient": "Créer un ingrédient",
|
||||
"ManageSubscription": "Gérer l'abonnement",
|
||||
"Manage_Books": "Gérer les livres",
|
||||
"Manage_Emails": "Gérer les e-mails",
|
||||
"MealPlanHelp": "Un Plan de repas est une entrée de calendrier utilisée pour planifier des repas. Il doit contenir une recette ou un titre et peut être lié aux listes de courses. ",
|
||||
"Meal_Plan": "Menu de la semaine",
|
||||
"Meal_Plan_Days": "Futurs menus",
|
||||
"Meal_Type": "Type de repas",
|
||||
"Meal_Type_Required": "Type de repas obligatoire",
|
||||
"Meal_Types": "Types de repas",
|
||||
"Merge": "Fusionner",
|
||||
"MergeAutomateHelp": "Créer une automatisation pour remplacer les prochains objets de ce type par l'objet sélectionner.",
|
||||
"Merge_Keyword": "Fusionner le mot-clé",
|
||||
"Message": "Message",
|
||||
"MissingProperties": "",
|
||||
"Messages": "Messages",
|
||||
"Miscellaneous": "Autres",
|
||||
"MissingConversion": "Conversation manquante",
|
||||
"MissingProperties": "Propriétés manquantes",
|
||||
"ModelSelectResultsHelp": "Chercher plus de résultats",
|
||||
"Monday": "Lundi",
|
||||
"Month": "Mois",
|
||||
"More": "Plus",
|
||||
"Move": "Déplacer",
|
||||
"MoveCategory": "Déplacer vers : ",
|
||||
"MoveToStep": "Passer aux étapes",
|
||||
"Move_Down": "Descendre",
|
||||
"Move_Food": "Déplacer l’aliment",
|
||||
"Move_Keyword": "Déplacer le mot-clé",
|
||||
@@ -223,13 +319,16 @@
|
||||
"New_Supermarket": "Créer un nouveau supermarché",
|
||||
"New_Supermarket_Category": "Créer une nouvelle catégorie de supermarché",
|
||||
"New_Unit": "Nouvelle unité",
|
||||
"Next": "Suivant",
|
||||
"Next_Day": "Prochain jour",
|
||||
"Next_Period": "Prochaine période",
|
||||
"NoCategory": "Pas de catégorie sélectionnée.",
|
||||
"NoMoreUndo": "Aucun changement à annuler.",
|
||||
"NoUnit": "",
|
||||
"NoUnit": "Pas d'unité",
|
||||
"No_ID": "ID introuvable, impossible de supprimer.",
|
||||
"No_Results": "Aucun résultat",
|
||||
"NotFound": "Introuvable",
|
||||
"NotFoundHelp": "La page ou l'objet que vous recherchez n'a pas pu être trouvé.",
|
||||
"NotInShopping": "L’aliment {food} n’est pas dans votre liste de courses.",
|
||||
"Note": "Notes",
|
||||
"Number of Objects": "Nombre d'objets",
|
||||
@@ -242,13 +341,18 @@
|
||||
"Open_Data_Import": "Import Open Data",
|
||||
"Open_Data_Slug": "Open Data Slug",
|
||||
"Options": "Options",
|
||||
"Order": "Ordre",
|
||||
"OrderInformation": "Les objects sont classés du plus petit au plus grand.",
|
||||
"Original_Text": "Texte d’origine",
|
||||
"Owner": "Propriétaire",
|
||||
"Page": "Page",
|
||||
"Parameter": "Paramètre",
|
||||
"Parent": "Parent",
|
||||
"PartialMatch": "",
|
||||
"PartialMatchHelp": "",
|
||||
"PartialMatch": "Correspondance partielle",
|
||||
"PartialMatchHelp": "Champs pour rechercher des correspondances partielles. (Par exemple, la recherche de « Tarte » renverra « tarte », « tartelette » et « entarté »)",
|
||||
"Password": "Mot de passe",
|
||||
"Path": "Chemin",
|
||||
"PerPage": "Par page",
|
||||
"Period": "Période",
|
||||
"Periods": "Périodes",
|
||||
"Pin": "Épingler",
|
||||
@@ -259,62 +363,100 @@
|
||||
"Planned": "Planifié",
|
||||
"Planner": "Planificateur",
|
||||
"Planner_Settings": "Paramètres du planificateur",
|
||||
"Planning&Shopping": "Planification et achats",
|
||||
"Plural": "Pluriel",
|
||||
"PrecisionSearchHelp": "",
|
||||
"Postpone": "Reporter",
|
||||
"PostponedUntil": "Reporté jusqu'à",
|
||||
"PrecisionSearchHelp": "Préréglage qui renvoie uniquement les entrées avec une orthographe correcte. ",
|
||||
"Preferences": "Préférences",
|
||||
"Preparation": "Préparation",
|
||||
"Preview": "Aperçu",
|
||||
"Previous_Day": "Jour précédent",
|
||||
"Previous_Period": "Période précédente",
|
||||
"Print": "Imprimer",
|
||||
"Private_Recipe": "Recette privée",
|
||||
"Private_Recipe_Help": "La recette est uniquement visible par vous et les gens avec qui elle est partagée.",
|
||||
"Profile": "Profile",
|
||||
"Properties": "Propriétés",
|
||||
"PropertiesFoodHelp": "Des propriétés peuvent être ajoutées aux recettes et aux aliments. Les propriétés des aliments sont automatiquement calculées en fonction de leur quantité dans la recette.",
|
||||
"Properties_Food_Amount": "Propriété Quantité de nourriture",
|
||||
"Properties_Food_Unit": "Propriété Unité de nourriture",
|
||||
"Property": "Propriété",
|
||||
"PropertyHelp": "Combinaison du type de propriété, de la nourriture, de la recette et de la quantité",
|
||||
"PropertyType": "Type de propriété",
|
||||
"PropertyTypeHelp": "Les propriétés vous permettent de suivre différentes valeurs (nutrition, prix, …) pour des aliments individuels ou des recettes complètes. ",
|
||||
"Property_Editor": "Editeur de propriétés",
|
||||
"Protected": "Protégé",
|
||||
"Proteins": "Protéines",
|
||||
"Quick actions": "Actions Rapides",
|
||||
"QuickEntry": "Entrée rapide",
|
||||
"Random Recipes": "Recettes Aléatoires",
|
||||
"RandomOrder": "Ordre aléatoire",
|
||||
"RateLimit": "Fréquence limite",
|
||||
"RateLimitHelp": "Vous avez atteint la limite de requêtes pour le moment.",
|
||||
"Rating": "Note",
|
||||
"Ratings": "Notes",
|
||||
"Recently_Viewed": "Vu récemment",
|
||||
"Recipe": "Recette",
|
||||
"RecipeBookEntryHelp": "Les entrées du livre de recettes relient les recettes à des emplacements spécifiques dans les livres. ",
|
||||
"RecipeBookHelp": "Les livres de recettes contiennent des entrées de livre de recettes ou peuvent être automatiquement remplis à l'aide de filtres de recherche enregistrés. ",
|
||||
"RecipeHelp": "Les recettes sont la base de Tandoor et se composent d'informations générales et d'étapes, elles-mêmes composées d'ingrédients, d'instructions et plus encore. ",
|
||||
"RecipeStepsHelp": "Les ingrédients, les instructions et plus encore, peuvent être modifiés dans l'onglet Étapes.",
|
||||
"Recipe_Book": "Livre de recettes",
|
||||
"Recipe_Image": "Image de la recette",
|
||||
"Recipes": "Recettes",
|
||||
"Recipes_In_Import": "Recettes dans votre fichier d’importation",
|
||||
"Recipes_per_page": "Nombre de recettes par page",
|
||||
"Remove": "Enlever",
|
||||
"RemoveFoodFromShopping": "Supprimer l’aliment {food} de votre liste de courses",
|
||||
"Remove_nutrition_recipe": "Supprimer les valeurs nutritionelles de la recette",
|
||||
"Reset": "Réinitialiser",
|
||||
"ResetHelp": "Aide à la réinitialisation",
|
||||
"Reset_Search": "Réinitialiser la recherche",
|
||||
"Reusable": "Réutilisable",
|
||||
"Role": "Rôle",
|
||||
"Root": "Racine",
|
||||
"Saturday": "Samedi",
|
||||
"Save": "Sauvegarder",
|
||||
"Save_and_View": "Sauvegarder et visualiser",
|
||||
"Save/Load": "Enregistrer/Charger",
|
||||
"Save_and_View": "Enregistrer et visualiser",
|
||||
"SavedSearch": "Recherches enregistrées",
|
||||
"SavedSearchHelp": "Les recherches enregistrées peuvent être utilisées pour enregistrer des filtres de recherche afin de les récupérer facilement plus tard ou de remplir automatiquement des livres de recettes. ",
|
||||
"ScalableNumber": "Nombre évolutif",
|
||||
"Search": "Rechercher",
|
||||
"Search Settings": "Paramètres de recherche",
|
||||
"SearchMethod": "",
|
||||
"SearchSettingsOverview": "",
|
||||
"SearchSettingsWarning": "",
|
||||
"SearchMethod": "Méthode de recherche",
|
||||
"SearchSettingsOverview": "Choisissez l’un des préréglages recommandés ou ajustez vous-même les paramètres ci-dessous.",
|
||||
"SearchSettingsWarning": "Il n'est généralement pas nécessaire de modifier les paramètres de recherche. Ces paramètres sont réservés aux experts ayant des besoins spécifiques. ",
|
||||
"Second": "Seconde",
|
||||
"Seconds": "Secondes",
|
||||
"Select": "Sélectionner",
|
||||
"SelectAll": "Tout sélectionner",
|
||||
"SelectNone": "Sélection unique",
|
||||
"Select_App_To_Import": "Veuillez sélectionner une App pour importer depuis",
|
||||
"Select_Book": "Sélectionner le livre",
|
||||
"Select_File": "Sélectionner le fichier",
|
||||
"Selected": "Sélectionné",
|
||||
"SelectedCategories": "Catégories sélectionnées",
|
||||
"Serving": "Portion",
|
||||
"Servings": "Portions",
|
||||
"ServingsText": "Texte des portions",
|
||||
"Settings": "Paramètres",
|
||||
"Share": "Partager",
|
||||
"ShopLater": "Acheter plus tard",
|
||||
"ShopNow": "Acheter maintenant",
|
||||
"ShoppingBackgroundSyncWarning": "Mauvais réseau, en attente de synchronisation ...",
|
||||
"ShoppingListEntry": "Entrée de liste de courses",
|
||||
"ShoppingListEntryHelp": "Les entrées de liste de courses peuvent être créées manuellement ou via des recettes et des plans de repas.",
|
||||
"ShoppingListRecipe": "Recette de liste de courses",
|
||||
"Shopping_Categories": "Catégories de courses",
|
||||
"Shopping_Category": "Catégorie de courses",
|
||||
"Shopping_List_Empty": "Votre liste de courses est actuellement vide, vous pouvez ajouter des articles via le menu contextuel d’une entrée de menu de la semaine (clic droit sur la carte ou clic gauche sur l’icône du menu)",
|
||||
"Shopping_input_placeholder": "par ex. Pommes de terre/100 Pommes de terre/100 gr Pomme de terre",
|
||||
"Shopping_list": "Liste de courses",
|
||||
"ShowDelayed": "Afficher les éléments retardés",
|
||||
"ShowIngredients": "Montrer les ingrédients",
|
||||
"ShowMealPlanOnStartPage": "Afficher les plans de repas sur la page de démarrage.",
|
||||
"ShowRecentlyCompleted": "Afficher les éléments récemment complétés",
|
||||
"ShowUncategorizedFood": "Montrer ce qui est indéfini",
|
||||
"Show_Logo": "Montrer le logo",
|
||||
@@ -325,47 +467,92 @@
|
||||
"Size": "Taille",
|
||||
"Social_Authentication": "Authentification Sociale",
|
||||
"Sort_by_new": "Trier par nouveautés",
|
||||
"Source": "Source",
|
||||
"SourceImportHelp": "Importez du JSON au format schema.org/recipe ou des pages HTML avec une recette json+ld ou des microdonnées.",
|
||||
"SourceImportSubtitle": "Importez en JSON ou HTML manuellement.",
|
||||
"SpaceLimitExceeded": "Votre groupe a dépassé une de ses limites, certaines fonctions pourraient être restreintes.",
|
||||
"SpaceLimitReached": "Ce groupe a atteint sa limite. Aucun nouvel objet de ce type ne peut être créé.",
|
||||
"SpaceMemberHelp": "Ajoutez des utilisateurs à votre espace en créant un lien d'invitation et en l'envoyant à la personne que vous souhaitez ajouter.",
|
||||
"SpaceMembers": "Membres du groupe",
|
||||
"SpaceMembersHelp": "Utilisateurs et permissions dans un groupe. ",
|
||||
"SpaceSettings": "Paramètres du groupe",
|
||||
"Space_Cosmetic_Settings": "Certains paramètres cosmétiques peuvent être modifiés par un administrateur de l'espace et seront prioritaires sur les paramètres des utilisateurs pour cet espace.",
|
||||
"Split": "Diviser",
|
||||
"Split_All_Steps": "Diviser toutes les lignes en étapes séparées.",
|
||||
"StartDate": "Date de début",
|
||||
"Starting_Day": "Jour de début de la semaine",
|
||||
"StartsWith": "",
|
||||
"StartsWithHelp": "",
|
||||
"StartsWith": "Commence par",
|
||||
"StartsWithHelp": "Champs dans lesquels les débuts de mots correspondants sont recherchés. (Par exemple, une recherche pour « po » renverra « pomme » et « poireau ».)",
|
||||
"Step": "Étape",
|
||||
"StepHelp": "Les étapes contiennent des ingrédients (constitués de quantité / unité / aliment), des instructions, des images et plus d'informations sur cette étape dans la recette. ",
|
||||
"Step_Name": "Nom de l’étape",
|
||||
"Step_Type": "Type d’étape",
|
||||
"Step_start_time": "Heure de début de l’étape",
|
||||
"Steps": "Étapes",
|
||||
"StepsOverview": "Aperçu des étapes",
|
||||
"Sticky_Nav": "Barre de navigation collante",
|
||||
"Sticky_Nav_Help": "Toujours afficher le menu de navigation en haut de l’écran.",
|
||||
"Storage": "Stockage externe",
|
||||
"StorageHelp": "Emplacements de stockage externes où les fichiers de recettes (images / PDF) peuvent être stockés et synchronisés avec Tandoor.",
|
||||
"StoragePasswordTokenHelp": "Le mot de passe / jeton enregistré ne sera jamais affiché. Il ne sera modifié que si un nouveau mot de passe est saisi dans le champ. ",
|
||||
"SubstituteOnHand": "Vous avez une alternative sous la main.",
|
||||
"Substitutes": "Alternatives",
|
||||
"Success": "Réussite",
|
||||
"SuccessClipboard": "Liste de courses copiée dans le presse-papiers",
|
||||
"Sunday": "Dimanche",
|
||||
"Supermarket": "Supermarché",
|
||||
"SupermarketCategoriesOnly": "Catégories de supermarché uniquement",
|
||||
"SupermarketCategoryHelp": "Les catégories décrivent les zones dans les supermarchés (par exemple, Fruits et légumes, Épicerie fine, Charcuterie …). Elles peuvent être liés aux aliments et aux supermarchés pour automatiser le tri.",
|
||||
"SupermarketHelp": "Avec les supermarchés, vous pouvez lier des catégories pour trier et filtrer automatiquement les listes de courses. ",
|
||||
"SupermarketName": "Nom du supermarché",
|
||||
"Supermarkets": "Supermarchés",
|
||||
"SupportsDescriptionField": "Supporte le champ Description",
|
||||
"SyncLog": "Journal de synchronisation",
|
||||
"SyncLogHelp": "Protocole pour la synchronisation des recettes externes.",
|
||||
"SyncedPath": "Dossier synchronisé",
|
||||
"SyncedPathHelp": "Dossiers sur des emplacements de stockage externes qui sont surveillés. ",
|
||||
"System": "Système",
|
||||
"Table": "Tableau",
|
||||
"Table_of_Contents": "Table des Matières",
|
||||
"Text": "Texte",
|
||||
"ThankYou": "Merci",
|
||||
"ThanksTextHosted": "Pour soutenir l'open source en utilisant le serveur officiel Tandoor.",
|
||||
"ThanksTextSelfhosted": "Pour utiliser Tandoor, si vous souhaitez soutenir le développement futur, pensez à sponsoriser le projet via GitHub.",
|
||||
"Theme": "Thème",
|
||||
"Thursday": "Jeudi",
|
||||
"Time": "Temps",
|
||||
"Title": "Titre",
|
||||
"Title_or_Recipe_Required": "Sélection du titre ou de la recette requise",
|
||||
"Today": "Aujoud'hui",
|
||||
"Toggle": "Basculer",
|
||||
"Transpose_Words": "Transposer les mots",
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"TrigramThreshold": "Seuil du trigramme",
|
||||
"TrigramThresholdHelp": "Contrôle le nombre de fautes d'orthographe ignorées lors de la recherche approximative. Les valeurs faibles ignorent davantage de différences.",
|
||||
"Tuesday": "Mardi",
|
||||
"Type": "Type",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Inchangé",
|
||||
"Undefined": "Indéfini",
|
||||
"Undo": "annuler",
|
||||
"Unit": "Unité",
|
||||
"UnitConversion": "Conversion d'unités",
|
||||
"UnitConversionHelp": "La conversion d'unités vous permet de convertir des unités unique, de manière générale ou pour un aliment spécifique. Vous pouvez par exemple convertir 1 tasse de farine en 125 grammes. Tandoor effectue ensuite automatiquement la conversion dans les différentes unités de poids ou de volume, si celles-ci ont les bonnes unités de base. Les conversions d'unités sont utilisées pour les calculs de propriétés.",
|
||||
"UnitHelp": "Les unités, les aliments et les quantités constituent les ingrédients du recette. Vous pouvez les nommer selon vos préférences et les associer à des unités standardisées pour une conversion automatique. De plus, ils donnent du contexte aux quantités dans de nombreux contextes, comme les listes de courses, les conversions et les propriétés. ",
|
||||
"Unit_Alias": "Alias pour les unités",
|
||||
"Unit_Replace": "Remplacer l'Unité",
|
||||
"Units": "Unités",
|
||||
"Unpin": "Détacher",
|
||||
"UnpinnedConfirmation": "{recipe} a été désépinglée.",
|
||||
"Unrated": "Non évalué",
|
||||
"Up": "Haut",
|
||||
"Update": "Mettre à jour",
|
||||
"Update_Existing_Data": "Mettre à jour les données existantes",
|
||||
"Updated": "Mis à jour",
|
||||
"UpgradeNow": "Mettre à niveau maintenant",
|
||||
"Url": "URL",
|
||||
"UrlImportSubtitle": "Importez des recettes à partir de milliers de pages prises en charge.",
|
||||
"UrlList": "Liste d'URLs",
|
||||
"UrlListSubtitle": "Importer automatiquement une liste d'URLs.",
|
||||
"Url_Import": "Importation de l’url",
|
||||
"Use_Fractions": "Utiliser les fractions",
|
||||
"Use_Fractions_Help": "Convertir les décimales en fractions automatiquement lors de la visualisation d’une recette.",
|
||||
@@ -376,30 +563,45 @@
|
||||
"Use_Plural_Unit_Always": "Toujours utiliser la forme plurielle pour les unités",
|
||||
"Use_Plural_Unit_Simple": "Utiliser la forme plurielle pour les unités de manière dynamique",
|
||||
"User": "Utilisateur",
|
||||
"UserFileHelp": "Fichiers téléchargés au groupe. ",
|
||||
"UserHelp": "Les utilisateurs sont les membres de votre groupe. ",
|
||||
"Username": "Nom d’utilisateur",
|
||||
"Users": "Utilisateurs",
|
||||
"Valid Until": "Valide jusqu’au",
|
||||
"View": "Voir",
|
||||
"ViewLogHelp": "Historique des recettes consultées. ",
|
||||
"View_Recipes": "Voir les recettes",
|
||||
"Viewed": "Vue",
|
||||
"Waiting": "Attente",
|
||||
"WaitingTime": "Temps d'attente",
|
||||
"WarnPageLeave": "Certaines modifications non enregistrées seront perdues. Voulez-vous quand même quitter la page ?",
|
||||
"Warning": "Avertissement",
|
||||
"WarningRecipeBookEntryDuplicate": "Une recette ne peut être ajoutée à un livre qu'une seule fois.",
|
||||
"Warning_Delete_Supermarket_Category": "Supprimer une catégorie de supermarché supprimera également toutes les relations avec les aliments. Êtes-vous sûr ?",
|
||||
"Website": "Site",
|
||||
"Wednesday": "Mercredi",
|
||||
"Week": "Semaine",
|
||||
"Week_Numbers": "Numéro de semaine",
|
||||
"Welcome": "Bienvenue",
|
||||
"WorkingTime": "Temps de préparation",
|
||||
"Year": "Année",
|
||||
"YourSpaces": "Vos groupes",
|
||||
"active": "actif",
|
||||
"add_keyword": "Ajouter un Mot Clé",
|
||||
"additional_options": "Options Supplémentaires",
|
||||
"advanced": "Avancé",
|
||||
"advanced_search_settings": "Paramètres de recherche avancée",
|
||||
"after": "après",
|
||||
"all": "tout",
|
||||
"all_fields_optional": "Tous les champs sont facultatifs et peuvent être laissés vides.",
|
||||
"and": "et",
|
||||
"and_down": "& Dessous",
|
||||
"and_up": "&Au-dessus",
|
||||
"any": "n'importe",
|
||||
"asc": "Ordre croissant",
|
||||
"base_amount": "Quantité de base",
|
||||
"base_unit": "Unités de base",
|
||||
"before": "avant",
|
||||
"book_filter_help": "Inclure les recettes filtrées en plus de celles ajoutées manuellement.",
|
||||
"click_image_import": "Cliquez sur l'image que vous souhaitez importer pour cette recette",
|
||||
"confirm_delete": "Voulez-vous vraiment supprimer {objet} ?",
|
||||
@@ -442,6 +644,8 @@
|
||||
"err_move_self": "Impossible de déplacer un élément vers lui-même",
|
||||
"err_moving_resource": "Erreur lors du déplacement d’une ressource !",
|
||||
"err_updating_resource": "Erreur lors de la mise à jour d’une ressource !",
|
||||
"exact": "exacte",
|
||||
"exclude": "exclure",
|
||||
"expert_mode": "Mode expert",
|
||||
"explain": "Expliquer",
|
||||
"fields": "Champs",
|
||||
@@ -450,11 +654,20 @@
|
||||
"filter_name": "Filtrer par nom",
|
||||
"filter_to_supermarket": "Limiter au supermarché",
|
||||
"filter_to_supermarket_desc": "Par défaut, la liste de courses est filtrée pour n'inclure que les catégories du supermarché sélectionné.",
|
||||
"fluid_ounce": "once liquide [fl oz] (US, volume)",
|
||||
"food_inherit_info": "Champs sur les aliments à hériter par défaut.",
|
||||
"food_recipe_help": "Ajouter un lien vers la recette ici incluera cette recette dans n'importe qu'elle autre recette qui utilise cet ingrédient",
|
||||
"g": "gramme [g] (métrique, poids)",
|
||||
"gallon": "gallon [gal] (US, volume)",
|
||||
"hide_step_ingredients": "Cacher les ingrédients de l'étape",
|
||||
"hours": "heures",
|
||||
"ignore_shopping_help": "Ne jamais ajouter d’aliment à la liste de courses (ex. : eau)",
|
||||
"imperial_fluid_ounce": "once liquide impériale [imp fl oz] (Royaume-Uni, volume)",
|
||||
"imperial_gallon": "gal impériale [gal imp.] (Royaume-Uni, volume)",
|
||||
"imperial_pint": "pinte impériale [pt imp.] (Royaume-Uni, volume)",
|
||||
"imperial_quart": "quart impérial [imp qt] (Royaume-Uni, volume)",
|
||||
"imperial_tbsp": "cuillère à soupe impériale [imp c. à soupe] (Royaume-Uni, volume)",
|
||||
"imperial_tsp": "cuillère à thé impériale [imp c. à thé] (Royaume-Uni, volume)",
|
||||
"import_duplicates": "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher la case pour tout importer.",
|
||||
"import_running": "Importation en cours, veuillez patienter !",
|
||||
"in_shopping": "Dans la liste de courses",
|
||||
@@ -487,6 +700,7 @@
|
||||
"not": "pas",
|
||||
"nothing": "Rien à effectuer",
|
||||
"nothing_planned_today": "Vous n'avez rien de prévu pour aujourd'hui !",
|
||||
"on": "sur",
|
||||
"one_url_per_line": "Une URL par ligne",
|
||||
"open_data_help_text": "Le projet «Tandoor Open Data» est une base de données fournie par la communauté. Ce champ est rempli automatiquement lors de l'importation des données et permet les mises à jour dans le futur.",
|
||||
"or": "ou",
|
||||
@@ -496,11 +710,13 @@
|
||||
"paste_ingredients_placeholder": "Copier la liste d'ingrédients ici...",
|
||||
"paste_json": "Collez une source json ou html pour charger la recette.",
|
||||
"per_serving": "par portions",
|
||||
"pint": "pinte [pt] (US, volume)",
|
||||
"plan_share_desc": "Les nouvelles entrées de menu de la semaine seront partagées automatiquement avec des utilisateurs sélectionnés.",
|
||||
"plural_short": "pluriel",
|
||||
"plural_usage_info": "Utiliser la forme plurielle pour les unités et les aliments dans ce groupe.",
|
||||
"pound": "livre (poids)",
|
||||
"property_type_fdc_hint": "Seules les propriétés avec un ID FDC peuvent être mises à jour automatiquement depuis la base FDC",
|
||||
"quart": "quart [qt] (US, volume)",
|
||||
"recipe_filter": "Filtrer les recettes",
|
||||
"recipe_name": "Nom de la recette",
|
||||
"recipe_property_info": "Vous pouvez également ajouter des propriétés aux aliments pour les calculer automatiquement en fonction de votre recette !",
|
||||
@@ -509,15 +725,22 @@
|
||||
"remember_search": "Enregistrer la recherche",
|
||||
"remove_selection": "Désélectionner",
|
||||
"reset_children": "Réinitialiser l'héritage enfant",
|
||||
"reset_children_help": "Remplacer tous les enfants par les valeurs des champs hérités. Les champs hérités des enfants seront définis sur « Champs hérités », sauf si « Champs hérités des enfants » est défini.",
|
||||
"reset_food_inheritance": "Réinitialiser l'héritage",
|
||||
"reset_food_inheritance_info": "Réinitialiser tous les champs d'héritage des aliments par les valeurs de leurs parents.",
|
||||
"reusable_help_text": "Le lien d’invitation doit-il être utilisable par plus d’un utilisateur.",
|
||||
"review_shopping": "Vérifier les éléments de la liste avant de sauvegarder",
|
||||
"save_filter": "Sauvegarder le filtre",
|
||||
"searchFilterCreatedByHelp": "Recettes créées par l'utilisateur sélectionné.",
|
||||
"searchFilterObjectsAndHelp": "Recettes avec tous les {type} sélectionnés",
|
||||
"searchFilterObjectsAndNotHelp": "Exclure les recettes avec tous les {type} sélectionnés",
|
||||
"searchFilterObjectsHelp": "Recettes avec l'un des {type} sélectionnés",
|
||||
"searchFilterObjectsOrNotHelp": "Seules les recettes où tous les aliments (ou leurs alternatives) sont marqués comme étant sous la main.",
|
||||
"search_create_help_text": "Créer une nouvelle recette directement dans Tandoor.",
|
||||
"search_import_help_text": "Importer une recette depuis un site ou une application externe.",
|
||||
"search_no_recipes": "Aucune recette trouvée !",
|
||||
"search_rank": "Rechercher par note",
|
||||
"seconds": "secondes",
|
||||
"select_file": "Sélectionner Fichier",
|
||||
"select_food": "Sélectionner l’aliment",
|
||||
"select_keyword": "Sélectionner Mot Clé",
|
||||
@@ -552,8 +775,10 @@
|
||||
"sort_by": "Trié par",
|
||||
"sql_debug": "Débogage de la base SQL",
|
||||
"step_time_minutes": "Temps passé en minutes",
|
||||
"substitute_children": "Enfants alternatifs",
|
||||
"substitute_children_help": "Tout aliment étant enfant de cet aliment est considéré comme substitut.",
|
||||
"substitute_help": "Les substituts sont pris en compte lors d'une recherche de recette pouvant être cuisinée avec les ingrédients disponibles.",
|
||||
"substitute_siblings": "Frères et sœurs alternatifs",
|
||||
"substitute_siblings_help": "Tous les aliments qui partagent un parent avec cet aliment sont considérés comme des substituts.",
|
||||
"success_creating_resource": "Ressource créée avec succès !",
|
||||
"success_deleting_resource": "Ressource supprimée avec succès !",
|
||||
@@ -561,12 +786,18 @@
|
||||
"success_merging_resource": "Ressource fusionnée avec succès !",
|
||||
"success_moving_resource": "Ressource déplacée avec succès !",
|
||||
"success_updating_resource": "Ressource mise à jour avec succès !",
|
||||
"tbsp": "",
|
||||
"tbsp": "cuillère à soupe [tbsp] (US, volume)",
|
||||
"theUsernameCannotBeChanged": "Le nom d'utilisateur ne peut pas être modifié.",
|
||||
"times_cooked": "Nombre de fois cuisiné",
|
||||
"to_close": "pour fermer",
|
||||
"to_navigate": "pour naviguer",
|
||||
"to_select": "pour sélectionner",
|
||||
"today_recipes": "Recettes du jour",
|
||||
"total": "total",
|
||||
"tree_root": "Racine de l’arbre",
|
||||
"tree_select": "Utiliser l'arbre de sélection",
|
||||
"tsp": "cuillère à thé [tsp] (US, volume)",
|
||||
"unsaved": "non enregistré",
|
||||
"updatedon": "Mis à jour le",
|
||||
"view_recipe": "Voir la recette",
|
||||
"warning_duplicate_filter": "Attention : en raison de limitations techniques, l'emploi de multiples filtres (and/or/not) peut mener à des résultats inattendus.",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "חשבון",
|
||||
"Add": "הוספה",
|
||||
"AddFoodToShopping": "הוסף {מזון} לרשימת הקניות",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "חזור",
|
||||
"Bookmarklet": "סימניה",
|
||||
"Books": "ספרים",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "מחשבון",
|
||||
"Calories": "קלוריות",
|
||||
"Cancel": "ביטול",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "העלאת תמונה שתשמש כתמונה באזור הניווט.",
|
||||
"CustomTheme": "ערכת נושא מותאמת אישית",
|
||||
"CustomThemeHelp": "העלאה של קובץ CSS מותאם אישית תדרוס את העיצוב של הערכת נושא שנבחרה.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "שפר את המרחב שלך ע\"י ייבוא רשימת משאבים קהילתית כמו מאכלים, ערכים ועוד.",
|
||||
"Datatype": "סוג מידע",
|
||||
"Date": "תאריך",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "ייצוא נתמך",
|
||||
"Export_To_ICal": "ייצא .ics",
|
||||
"External": "חיצוני",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "תמונת מתכון חיצונית",
|
||||
"FDC_ID": "מספר FDC",
|
||||
"FDC_ID_help": "מספר FDC",
|
||||
"FDC_Search": "חפש FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "כשלון",
|
||||
"Fats": "שומנים",
|
||||
"File": "קובץ",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "סוג",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "ללא שינוי",
|
||||
"Undefined": "בלתי מוגדר",
|
||||
"Undo": "שחזר",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Korisnički račun",
|
||||
"Add": "Dodaj",
|
||||
"AddFoodToShopping": "Dodaj {food} na svoj popis za kupovinu",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Nazad",
|
||||
"Bookmarklet": "Knjižna oznaka",
|
||||
"Books": "Knjige",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Kalkulator",
|
||||
"Calories": "Kalorije",
|
||||
"Cancel": "Otkaži",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "Učitaj sliku koju ćeš koristiti kao logotip navigacijske trake.",
|
||||
"CustomTheme": "Prilagođena tema",
|
||||
"CustomThemeHelp": "Nadjačaj stilove odabrane teme učitavanjem prilagođene CSS datoteke.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Unaprijedite svoj prostor uvozom popisa namirnica, jedinica i još mnogo toga koje je pripremila zajednica kako biste poboljšali svoju kolekciju recepata.",
|
||||
"Datatype": "Tip podataka",
|
||||
"Date": "Datum",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "Izvoz podržan",
|
||||
"Export_To_ICal": "Izvoz .ics",
|
||||
"External": "Vanjski",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Slika vanjskog recepta",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC ID baze podataka",
|
||||
"FDC_Search": "FDC Pretraga",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Neuspješno",
|
||||
"Fats": "Masti",
|
||||
"File": "Datoteka",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Vrsta",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Nepromijenjeno",
|
||||
"Undefined": "Nedefinirano",
|
||||
"Undo": "Poništi",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Fiók",
|
||||
"Add": "Hozzáadás",
|
||||
"AddFoodToShopping": "{food} hozzáadása bevásárlólistához",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Vissza",
|
||||
"Bookmarklet": "Könyvjelző",
|
||||
"Books": "Könyvek",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "Kalóriák",
|
||||
"Cancel": "Mégsem",
|
||||
"Cannot_Add_Notes_To_Shopping": "A bevásárlólistához nem adható hozzá megjegyzés",
|
||||
@@ -65,6 +68,7 @@
|
||||
"Create_New_Unit": "Új mértékegység hozzáadása",
|
||||
"Current_Period": "Jelenlegi periódus",
|
||||
"Custom Filter": "Egyéni szűrő",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Bővítse Terét alapanyagok, mértékegységek és egyebek közösség által összeállított listájának importálásával, hogy ezzel is javítsa a receptgyűjteményét.",
|
||||
"Datatype": "Adattípus",
|
||||
"Date": "Dátum",
|
||||
@@ -100,7 +104,9 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "Külső",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Külső receptkép",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Hiba",
|
||||
"Fats": "Zsírok",
|
||||
"File": "Fájl",
|
||||
@@ -320,6 +326,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Típus",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Meghatározatlan",
|
||||
"Unit": "Mennyiségi egység",
|
||||
"Unit_Alias": "",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Add": "",
|
||||
"Add_nutrition_recipe": "Ավելացնել սննդայնություն բաղադրատոմսին",
|
||||
"Add_to_Book": "",
|
||||
@@ -8,6 +10,7 @@
|
||||
"Apply": "",
|
||||
"Automate": "Ավտոմատացնել",
|
||||
"Books": "",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "",
|
||||
"Cancel": "",
|
||||
"Carbohydrates": "",
|
||||
@@ -19,6 +22,7 @@
|
||||
"Create_New_Food": "Ավելացնել նոր սննդամթերք",
|
||||
"Create_New_Keyword": "Ավելացնել նոր բանալի բառ",
|
||||
"Create_New_Shopping Category": "Ստեղծել գնումների նոր կատեգորիա",
|
||||
"DELETE_ERROR": "",
|
||||
"Date": "",
|
||||
"Delete": "",
|
||||
"Delete_Food": "Ջնջել սննդամթերքը",
|
||||
@@ -33,7 +37,9 @@
|
||||
"Energy": "",
|
||||
"Export": "",
|
||||
"External": "",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "",
|
||||
"FETCH_ERROR": "",
|
||||
"Fats": "",
|
||||
"File": "",
|
||||
"Files": "",
|
||||
@@ -118,6 +124,7 @@
|
||||
"Table_of_Contents": "Բովանդակություն",
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Url_Import": "URL ներմուծում",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "",
|
||||
"Add": "Tambahkan",
|
||||
"AddFoodToShopping": "",
|
||||
@@ -21,6 +23,7 @@
|
||||
"Automation": "Automatis",
|
||||
"Bookmarklet": "",
|
||||
"Books": "Buku",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "Kalori",
|
||||
"Cancel": "Batal",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
@@ -57,6 +60,7 @@
|
||||
"Create_New_Unit": "",
|
||||
"Current_Period": "",
|
||||
"Custom Filter": "",
|
||||
"DELETE_ERROR": "",
|
||||
"Date": "Tanggal",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
@@ -89,7 +93,9 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "Luar",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Gambar Resep Eksternal",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Kegagalan",
|
||||
"Fats": "Lemak",
|
||||
"File": "Berkas",
|
||||
@@ -296,6 +302,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "",
|
||||
"Unit": "",
|
||||
"Unit_Alias": "",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "",
|
||||
"Add": "",
|
||||
"AddFoodToShopping": "",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "",
|
||||
"Bookmarklet": "",
|
||||
"Books": "",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "",
|
||||
"Calories": "",
|
||||
"Cancel": "",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "",
|
||||
"CustomTheme": "",
|
||||
"CustomThemeHelp": "",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "",
|
||||
"Datatype": "",
|
||||
"Date": "",
|
||||
@@ -113,10 +117,12 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "",
|
||||
"FDC_ID": "",
|
||||
"FDC_ID_help": "",
|
||||
"FDC_Search": "",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "",
|
||||
"Fats": "",
|
||||
"File": "",
|
||||
@@ -354,6 +360,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "",
|
||||
"Undefined": "",
|
||||
"Undo": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "",
|
||||
"Add": "",
|
||||
"AddFoodToShopping": "",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "",
|
||||
"Bookmarklet": "",
|
||||
"Books": "",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "",
|
||||
"Cancel": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
@@ -66,6 +69,7 @@
|
||||
"Create_New_Unit": "",
|
||||
"Current_Period": "",
|
||||
"Custom Filter": "",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "",
|
||||
"Datatype": "",
|
||||
"Date": "",
|
||||
@@ -102,7 +106,9 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Išorinis recepto vaizdas",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "",
|
||||
"Fats": "",
|
||||
"File": "",
|
||||
@@ -327,6 +333,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "",
|
||||
"Unit": "",
|
||||
"Unit_Alias": "",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "",
|
||||
"Add": "",
|
||||
"AddFoodToShopping": "",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "",
|
||||
"Bookmarklet": "",
|
||||
"Books": "",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "",
|
||||
"Calories": "",
|
||||
"Cancel": "",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "",
|
||||
"CustomTheme": "",
|
||||
"CustomThemeHelp": "",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "",
|
||||
"Datatype": "",
|
||||
"Date": "",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "",
|
||||
"External": "",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "",
|
||||
"FDC_ID": "",
|
||||
"FDC_ID_help": "",
|
||||
"FDC_Search": "",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "",
|
||||
"Fats": "",
|
||||
"File": "",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "",
|
||||
"Undefined": "",
|
||||
"Undo": "",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "",
|
||||
"Add": "Legg til",
|
||||
"AddFoodToShopping": "Legg til {food] i handlelisten din",
|
||||
@@ -25,6 +27,7 @@
|
||||
"Automation": "Automatiser",
|
||||
"Bookmarklet": "",
|
||||
"Books": "Bøker",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Kalkulator",
|
||||
"Calories": "Kalorier",
|
||||
"Cancel": "Avbryt",
|
||||
@@ -71,6 +74,7 @@
|
||||
"CustomNavLogoHelp": "Last opp logo til navigasjonsområde.",
|
||||
"CustomTheme": "Egendefinert tema",
|
||||
"CustomThemeHelp": "Overskriv det valgte tema ved å laste opp en egendefinert CSS-fil.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Utvid ditt \"Space\" ved å importere en felleskapsberiket liste over mat, enheter og mer for å berike din oppskriftskolleksjon.",
|
||||
"Datatype": "Data-type",
|
||||
"Date": "Dato",
|
||||
@@ -108,8 +112,10 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "Eksporter .ics",
|
||||
"External": "Ekstern",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Bilde av ekstern oppskrift",
|
||||
"FDC_ID_help": "FDC database-ID",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Feil",
|
||||
"Fats": "Fett",
|
||||
"File": "Fil",
|
||||
@@ -336,6 +342,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Type",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Udefinert",
|
||||
"Undo": "Angre",
|
||||
"Unit": "Enhet",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,17 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"AccessTokenHelp": "Klucze dostępu do REST API.",
|
||||
"Access_Token": "Token Dostępu",
|
||||
"Account": "Konto",
|
||||
"Actions": "Akcje",
|
||||
"Activity": "Aktywność",
|
||||
"Add": "Dodaj",
|
||||
"AddAll": "Dodaj wszystkie",
|
||||
"AddFilter": "Dodaj filtr",
|
||||
"AddFoodToShopping": "Dodaj {food} do swojej listy zakupów",
|
||||
"AddMany": "Dodaj wiele",
|
||||
"AddToShopping": "Dodaj do listy zakupów",
|
||||
"Add_Servings_to_Shopping": "Dodaj {servings} porcje do zakupów",
|
||||
"Add_Step": "Dodaj krok",
|
||||
@@ -12,26 +21,42 @@
|
||||
"Added_To_Shopping_List": "Dodano do listy zakupów",
|
||||
"Added_by": "Dodane przez",
|
||||
"Added_on": "Dodano dnia",
|
||||
"Admin": "Administator",
|
||||
"Advanced": "Zaawansowany",
|
||||
"Advanced Search Settings": "Ustawienia zaawansowanego wyszukiwania",
|
||||
"Alignment": "Wyrównanie",
|
||||
"AllRecipes": "Wszystkie przepisy",
|
||||
"Amount": "Ilość",
|
||||
"App": "Aplikacja",
|
||||
"Apply": "",
|
||||
"AppImportSubtitle": "Zaimportuj istniejącą bazę przepisów.",
|
||||
"Apply": "Zastosuj",
|
||||
"Are_You_Sure": "Jesteś pewny?",
|
||||
"Auto_Planner": "Plan automatyczny",
|
||||
"Auto_Sort": "Auto sortowanie",
|
||||
"Auto_Sort_Help": "Przenieś wszystkie składniki do najlepiej dopasowanego kroku.",
|
||||
"Automate": "Automatyzacja",
|
||||
"Automation": "Automatyzacja",
|
||||
"AutomationHelp": "Automatyzacje pozwalają Ci, zależnie od typu, zastosować niektóre automatyczne zmiany w przepisach, składnikach, ... na przykład podczas importowania przepisów. ",
|
||||
"Available": "Dostępne",
|
||||
"AvailableCategories": "Dostępne kategorie",
|
||||
"Back": "Z powrotem",
|
||||
"BaseUnit": "Podstawowa jednostka",
|
||||
"BaseUnitHelp": "Standardowa jednostka dla automatyczne konwersji jednostek",
|
||||
"Basics": "Podstawy",
|
||||
"Book": "Książka",
|
||||
"Bookmarklet": "Skryptozakładka",
|
||||
"BookmarkletHelp1": "Przeciągnij następujący przycisk do twojego paska zakładek",
|
||||
"BookmarkletHelp2": "Otwórz stonę z której chcesz zaimportować",
|
||||
"BookmarkletHelp3": "Kliknij na zakładkę, aby wykonać import.",
|
||||
"BookmarkletImportSubtitle": "Użyj skryptozakładki do zaimportowania z niepublicznych stron.",
|
||||
"Books": "Książki",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Kalkulator",
|
||||
"Calories": "Kalorie",
|
||||
"Cancel": "Anuluj",
|
||||
"Cannot_Add_Notes_To_Shopping": "Notatki nie mogą być dodawane do listy zakupów",
|
||||
"Carbohydrates": "Węglowodany",
|
||||
"Cards": "Karty",
|
||||
"Categories": "Kategorie",
|
||||
"Category": "Kategorie",
|
||||
"CategoryInstruction": "Przeciągnij kategorie, aby zmienić kolejność w jakiej kategorie pojawiają się na liście zakupów.",
|
||||
@@ -47,8 +72,11 @@
|
||||
"Color": "Kolor",
|
||||
"Combine_All_Steps": "Połącz wszystkie kroki w jedno pole.",
|
||||
"Coming_Soon": "Dostępne wkrótce",
|
||||
"Comment": "Komentarz",
|
||||
"Comments_setting": "Pokaż komentarze",
|
||||
"Completed": "Zakończone",
|
||||
"Confirm": "Potwierdź",
|
||||
"Continue": "Kontynuuj",
|
||||
"Conversion": "Konwersja",
|
||||
"Copy": "Kopiuj",
|
||||
"Copy Link": "Skopiuj link",
|
||||
@@ -75,6 +103,7 @@
|
||||
"CustomNavLogoHelp": "Prześlij obraz, który będzie używany jako logo paska nawigacyjnego.",
|
||||
"CustomTheme": "Własny motyw",
|
||||
"CustomThemeHelp": "Zastąp style wybranego motywu, przesyłając własny plik CSS.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Wzbogać swoją Przestrzeń, importując wyselekcjonowaną przez społeczność listę żywności, jednostek i nie tylko, aby ulepszyć swoją kolekcję przepisów.",
|
||||
"Datatype": "Typ danych",
|
||||
"Date": "Data",
|
||||
@@ -115,10 +144,12 @@
|
||||
"Export_Supported": "Eksportowanie wspierane",
|
||||
"Export_To_ICal": "Eksportuj .ics",
|
||||
"External": "Zewnętrzny",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Zewnętrzny obraz dla przepisu",
|
||||
"FDC_ID": "Identyfikator FDC",
|
||||
"FDC_ID_help": "Identyfikator bazy FDC",
|
||||
"FDC_Search": "Wyszukiwanie w FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Niepowodzenie",
|
||||
"Fats": "Tłuszcze",
|
||||
"File": "Plik",
|
||||
@@ -357,6 +388,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Typ",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Niezmienione",
|
||||
"Undefined": "Nieokreślony",
|
||||
"Undo": "Cofnij",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Add": "Adicionar",
|
||||
"AddFoodToShopping": "Adicionar {food} à sua lista de compras",
|
||||
"AddToShopping": "Adicionar á lista de compras",
|
||||
@@ -20,6 +22,7 @@
|
||||
"Automate": "Automatizar",
|
||||
"Automation": "Automação",
|
||||
"Books": "Livros",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Calculadora",
|
||||
"Calories": "Calorias",
|
||||
"Cancel": "Cancelar",
|
||||
@@ -57,6 +60,7 @@
|
||||
"CustomImageHelp": "Fazer upload de uma image para mostrar na visão geral do espaço.",
|
||||
"CustomTheme": "Tema customizado",
|
||||
"CustomThemeHelp": "Substituir os estilos do tema selecionado com o upload de um arquivo CSS customizado.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Melhore seu Espaço importando uma lista curada de comidas, unidades e mais para melhorar sua coleção de receitas.",
|
||||
"Datatype": "Tipo de dados",
|
||||
"Date": "Data",
|
||||
@@ -87,10 +91,12 @@
|
||||
"Export_As_ICal": "Exportar período atual para o formato ICal",
|
||||
"Export_To_ICal": "Exportar .ics",
|
||||
"External": "Externo",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Imagem da receita externa",
|
||||
"FDC_ID": "ID FDC",
|
||||
"FDC_ID_help": "ID database FDC",
|
||||
"FDC_Search": "Pesquisa FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Falha",
|
||||
"Fats": "Gorduras",
|
||||
"File": "Ficheiro",
|
||||
@@ -283,6 +289,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Tipo",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Não definido",
|
||||
"Undo": "Desfazer",
|
||||
"Unit": "Unidade",
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
"AI": "IA",
|
||||
"AIImportSubtitle": "Use IA para importar imagens das receitas.",
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"AccessTokenHelp": "Chaves de acesso para a REST API.",
|
||||
"Access_Token": "Token de acesso",
|
||||
"Account": "Conta",
|
||||
@@ -28,6 +30,7 @@
|
||||
"Amount": "Quantidade",
|
||||
"App": "Aplicação",
|
||||
"AppImportSubtitle": "Importar seu banco de dados de receitas existente.",
|
||||
"Apply": "Aplicar",
|
||||
"Are_You_Sure": "Você tem certeza?",
|
||||
"Auto_Planner": "Planejamento Automático",
|
||||
"Auto_Sort": "Classificação automática",
|
||||
@@ -48,6 +51,7 @@
|
||||
"BookmarkletHelp3": "Clique no favorito para realizar a importação.",
|
||||
"BookmarkletImportSubtitle": "Use um bookmarklet para importar de páginas não públicas.",
|
||||
"Books": "Livros",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Calculadora",
|
||||
"Calories": "Calorias",
|
||||
"Cancel": "Cancelar",
|
||||
@@ -69,6 +73,7 @@
|
||||
"Color": "Cor",
|
||||
"Combine_All_Steps": "Combinar todos os passos em um único campo.",
|
||||
"Coming_Soon": "Em breve",
|
||||
"Comment": "Comentário",
|
||||
"Comments_setting": "Mostrar Comentários",
|
||||
"Completed": "Finalizado",
|
||||
"Confirm": "Confirmar",
|
||||
@@ -108,6 +113,7 @@
|
||||
"CustomNavLogoHelp": "Faça upload de uma imagem para usar como logotipo na barra de navegação.",
|
||||
"CustomTheme": "Tema Personalizado",
|
||||
"CustomThemeHelp": "Substituir estilos do tema selecionado fazendo upload de um arquivo CSS personalizado.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Enriqueça seu espaço importando uma lista comunitariamente curada de alimentos, unidades e mais para melhorar sua coleção de receitas.",
|
||||
"Database": "Banco de dados",
|
||||
"DatabaseHelp": "O Tandoor utiliza diversos recursos para que você possa criar receitas, listas de compras, planos de refeições e muito mais. Aqui você pode gerenciar todos esses modelos.",
|
||||
@@ -130,60 +136,95 @@
|
||||
"Deleted": "Excluído",
|
||||
"Description": "Descrição",
|
||||
"Description_Replace": "Substituir Descrição",
|
||||
"DeviceSettings": "Configurações do Dispositivo",
|
||||
"DeviceSettingsHelp": "Para que o Tandoor fique bonito onde quer que você use, essas configurações são armazenadas neste dispositivo.",
|
||||
"Disable": "Desabilitar",
|
||||
"Disable_Amount": "Desabilitar Quantidade",
|
||||
"Disabled": "Desabilitado",
|
||||
"Documentation": "Documentação",
|
||||
"Down": "Abaixo",
|
||||
"Download": "Baixar",
|
||||
"DragToUpload": "Clique e arraste ou clique para selecionar",
|
||||
"Drag_Here_To_Delete": "Arraste aqui para deletar",
|
||||
"Duplicate": "Duplicar",
|
||||
"DuplicateFoundInfo": "Uma receita com essa URL foi encontrada no seu espaço. Continuar mesmo assim?",
|
||||
"Edit": "Editar",
|
||||
"Edit_Food": "Editar Comida",
|
||||
"Edit_Keyword": "Editar palavra-chave",
|
||||
"Edit_Meal_Plan_Entry": "Editar plano de refeição",
|
||||
"Edit_Recipe": "Editar Receita",
|
||||
"Email": "E-mail",
|
||||
"Empty": "Vazio",
|
||||
"Enable": "Ativar",
|
||||
"Enable_Amount": "Habilitar Quantidade",
|
||||
"Enabled": "Ativo",
|
||||
"EndDate": "Data Fim",
|
||||
"Energy": "Energia",
|
||||
"Entries": "Registros",
|
||||
"Error": "Erro",
|
||||
"ErrorUrlListImport": "Ocorreu um erro durante a importação da primeira URL na lista. Todas as URLs que não estão mais sendo exibidas foram importadas com sucesso. ",
|
||||
"Events": "Eventos",
|
||||
"Export": "Exportar",
|
||||
"Export_As_ICal": "Exportar período atual para o formato iCal",
|
||||
"Export_Not_Yet_Supported": "Exportação ainda não suportada",
|
||||
"Export_Supported": "Exportação suportada",
|
||||
"Export_To_ICal": "Exportar .ics",
|
||||
"External": "Externo",
|
||||
"ExternalRecipe": "",
|
||||
"ExternalRecipeImport": "Importar receita externa",
|
||||
"ExternalRecipeImportHelp": "Arquivos em pastas sincronizadas em armazenamentos externos não são importados diretamente, mas salvos temporariamente como receitas de importação externa. Aqui, você pode visualizar e editar rapidamente os arquivos recém-encontrados antes que eles sejam movidos para a coleção principal. ",
|
||||
"ExternalStorage": "Armazenamento externo",
|
||||
"External_Recipe_Image": "Imagem externa da receita",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "ID do banco de dados FDC",
|
||||
"FDC_Search": "Busca FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Falha",
|
||||
"Fats": "Gorduras",
|
||||
"File": "Arquivo",
|
||||
"Files": "Arquivos",
|
||||
"FinishedAt": "Finalizado em",
|
||||
"First": "Primeiro",
|
||||
"First_name": "Primeiro Nome",
|
||||
"Food": "Comida",
|
||||
"FoodHelp": "Os alimentos são a base mais importante do Tandoor. Juntamente com as quantidades e suas respectivas unidades, eles compõem os ingredientes das receitas. Eles também podem ser usados para listas de compras, propriedades e muito mais. ",
|
||||
"FoodInherit": "Campos herdados por alimento",
|
||||
"FoodNotOnHand": "Não tem {food} disponível.",
|
||||
"FoodOnHand": "Tem {food} disponível.",
|
||||
"Food_Alias": "Apelido da Comida",
|
||||
"Food_Replace": "Substituir Alimento",
|
||||
"Foods": "Alimentos",
|
||||
"Friday": "Sexta-feira",
|
||||
"Fulltext": "Texto completo",
|
||||
"FulltextHelp": "Campos para pesquisa textual completa. Observação: os métodos de pesquisa 'web', 'phrase' e 'raw' só funcionam com campos de pesquisa textual completa.",
|
||||
"Fuzzy": "Fuzzy",
|
||||
"FuzzySearchHelp": "Use pesquisa fuzzy para encontrar registros mesmo quando existem diferenças na grafia das palavras utilizadas.",
|
||||
"GettingStarted": "Começando",
|
||||
"GroupBy": "Agrupar Por",
|
||||
"HeaderWarning": "Alerta: Mudanças de Cabeçalho apagam a Quantidade/Unidade/Alimento",
|
||||
"Headline": "Título",
|
||||
"Help": "Ajuda",
|
||||
"Hide_External": "Esconder Externo",
|
||||
"Hide_Food": "Esconder Comida",
|
||||
"Hide_Keyword": "Oculta palavras-chave",
|
||||
"Hide_Keywords": "Esconder palavra-chave",
|
||||
"Hide_Recipes": "Esconder Receitas",
|
||||
"Hide_as_header": "Esconder cabeçalho",
|
||||
"History": "Histórico",
|
||||
"HostedFreeVersion": "Você está utilizando a versão gratuita do Tandoor",
|
||||
"Hour": "Hora",
|
||||
"Hours": "Horas",
|
||||
"Icon": "Ícone",
|
||||
"IgnoreAccents": "Ignorar acentuação",
|
||||
"IgnoreAccentsHelp": "Ignorar acentuação quando pesquisando nos campos selecionados. ",
|
||||
"IgnoreThis": "Nunca auto incluir {food} para compras",
|
||||
"Ignore_Shopping": "Ignorar Mercado",
|
||||
"IgnoredFood": "{food} está definido para ignorar compras.",
|
||||
"Image": "Imagem",
|
||||
"Import": "Importar",
|
||||
"Import Recipe": "Importar Receita",
|
||||
"ImportAll": "Importar todos",
|
||||
"ImportIntoTandoor": "Importar para Tandoor",
|
||||
"Import_Error": "Ocorreu um erro durante a importação. Expanda os detalhes na parte inferior da página para visualizá-los.",
|
||||
"Import_Not_Yet_Supported": "Importação ainda não suportada",
|
||||
"Import_Result_Info": "{imported} de {total} receitas foram importadas",
|
||||
@@ -193,8 +234,11 @@
|
||||
"Imported_From": "Importado de",
|
||||
"Importer_Help": "Mais informações neste importador:",
|
||||
"Information": "Informação",
|
||||
"Ingredient": "Ingrediente",
|
||||
"Ingredient Editor": "Editor de Ingrediente",
|
||||
"Ingredient Overview": "Ingredientes - Visão Geral",
|
||||
"IngredientEditorHelp": "Com o editor de ingredientes você pode editar todos os ingredientes que usam um certo Alimento e/ou unidade ao mesmo tempo. Pode ser utilizado para corrigir erros facilmente, ou para editar várias receitas simultaneamente.",
|
||||
"IngredientHelp": "Ingredientes normalmente são compostos por uma quantidade, uma unidade de medida e um alimento, quantidade e unidade são opcionais. Também pode conter uma anotação, ou ser utilizado como cabeçalho. ",
|
||||
"IngredientInShopping": "Este ingrediente está na sua lista de compras.",
|
||||
"Ingredients": "Ingredientes",
|
||||
"Inherit": "Herdado",
|
||||
@@ -204,25 +248,35 @@
|
||||
"Input": "Entrada",
|
||||
"Instruction_Replace": "Substituir Instrução",
|
||||
"Instructions": "Instruções",
|
||||
"InstructionsEditHelp": "Clique aqui para adicionar instruções. ",
|
||||
"Internal": "Interno",
|
||||
"InviteLinkHelp": "Links para convidar pessoas ao seu espaço. ",
|
||||
"Invite_Link": "Link de convite",
|
||||
"Invites": "Convites",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"Key_Shift": "Shift",
|
||||
"Keyword": "Palavra-chave",
|
||||
"KeywordHelp": "Palavras-chave podem ser utilizadas para organizar sua coleção de receitas.",
|
||||
"Keyword_Alias": "Apelido da palavra-chave",
|
||||
"Keywords": "Palavras-chave",
|
||||
"Language": "Idioma",
|
||||
"Last": "Último",
|
||||
"Last_name": "Último Nome",
|
||||
"Learn_More": "Aprender Mais",
|
||||
"Link": "Link",
|
||||
"Load": "Carregar",
|
||||
"Load_More": "Carregar mais",
|
||||
"Log_Cooking": "Registro de Cozinha",
|
||||
"Log_Recipe_Cooking": "Registrar receitas feitas",
|
||||
"Logo": "Logotipo",
|
||||
"Logout": "Sair",
|
||||
"Make_Header": "Criar cabeçalho",
|
||||
"Make_Ingredient": "Criar Ingrediente",
|
||||
"ManageSubscription": "Gerenciar a inscrição",
|
||||
"Manage_Books": "Gerenciar Livros",
|
||||
"Manage_Emails": "Gerenciar Emails",
|
||||
"MealPlanHelp": "O Plano de Refeição é um calendário usado para planejar refeições. Ele deve conter uma receita ou título e pode ser vinculado à listas de compras. ",
|
||||
"MealPlanShoppingHelp": "Itens na sua lista de compras podem ser vinculados a um Plano de Refeições para organizar sua lista ou atualizar/excluir todos de uma só vez. Ao criar um Plano de Refeições com uma Receita, os ingredientes correspondentes podem ser adicionados automaticamente à Lista de Compras (configurações). ",
|
||||
"Meal_Plan": "Plano de Refeição",
|
||||
"Meal_Plan_Days": "Planos de refeição futuros",
|
||||
"Meal_Type": "Tipo de Comida",
|
||||
@@ -379,6 +433,7 @@
|
||||
"Toggle": "Alternar",
|
||||
"Transpose_Words": "Transpor palavras",
|
||||
"Type": "Tipo",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Sem alterações",
|
||||
"Undefined": "Indefinido",
|
||||
"Undo": "Desfazer",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Cont",
|
||||
"Add": "Adaugă",
|
||||
"AddFoodToShopping": "Adăugă {food} în lista de cumpărături",
|
||||
@@ -25,6 +27,7 @@
|
||||
"Automation": "Automatizare",
|
||||
"Bookmarklet": "Marcaj",
|
||||
"Books": "Cărți",
|
||||
"CREATE_ERROR": "",
|
||||
"Calories": "Calorii",
|
||||
"Cancel": "Anulează",
|
||||
"Cannot_Add_Notes_To_Shopping": "Notele nu pot fi adăugate la lista de cumpărături",
|
||||
@@ -63,6 +66,7 @@
|
||||
"Create_New_Unit": "Adaugă unitate nouă",
|
||||
"Current_Period": "Perioada curentă",
|
||||
"Custom Filter": "Filtru personalizat",
|
||||
"DELETE_ERROR": "",
|
||||
"Date": "Dată",
|
||||
"Day": "Zi",
|
||||
"Days": "Zile",
|
||||
@@ -96,7 +100,9 @@
|
||||
"Export_Supported": "Export compatibil",
|
||||
"Export_To_ICal": "Exportă .ics",
|
||||
"External": "Extern",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Imagine rețetă externă",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Eșec",
|
||||
"Fats": "Grăsimi",
|
||||
"File": "Fișier",
|
||||
@@ -309,6 +315,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Tip",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Nedefinit",
|
||||
"Unit": "Unitate",
|
||||
"Unit_Alias": "Pseudonim unitate",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,18 @@
|
||||
{
|
||||
"AIImportSubtitle": "Använd AI för att importera bilder av recept.",
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"AccessTokenHelp": "Nycklar för tillgång till REST API:t.",
|
||||
"Access_Token": "Åtkomstnyckel",
|
||||
"Account": "Konto",
|
||||
"Actions": "Åtgärder",
|
||||
"Activity": "Aktivitet",
|
||||
"Add": "Lägg till",
|
||||
"AddAll": "Lägg till alla",
|
||||
"AddFilter": "Lägg till filter",
|
||||
"AddFoodToShopping": "Lägg till {food} på din inköpslista",
|
||||
"AddMany": "Lägg till flera",
|
||||
"AddToShopping": "Lägg till i inköpslista",
|
||||
"Add_Servings_to_Shopping": "Lägg till {servings} portioner till inköp",
|
||||
"Add_Step": "Lägg till steg",
|
||||
@@ -13,25 +23,41 @@
|
||||
"Added_To_Shopping_List": "Lades till i inköpslistan",
|
||||
"Added_by": "Tillagd av",
|
||||
"Added_on": "Tillagd på",
|
||||
"Admin": "Administratör",
|
||||
"Advanced": "Avancerat",
|
||||
"Alignment": "Orientering",
|
||||
"AllRecipes": "Alla recept",
|
||||
"Amount": "Mängd",
|
||||
"App": "App",
|
||||
"Apply": "",
|
||||
"AppImportSubtitle": "Importera din existerande receptdatabas.",
|
||||
"Apply": "Tillämpa",
|
||||
"Are_You_Sure": "Är du säker?",
|
||||
"Auto_Planner": "Autoplanera",
|
||||
"Auto_Sort": "Automatisk Sortering",
|
||||
"Auto_Sort_Help": "Flytta alla ingredienser till det bästa passande steget.",
|
||||
"Automate": "Automatisera",
|
||||
"Automation": "Automatisering",
|
||||
"AutomationHelp": "Automatiseringar låter dig, beroende på typ, tillämpa vissa automatiska ändringar på recept, ingredienser, ... till exempel vid receptimport. ",
|
||||
"Available": "Tillgänglig",
|
||||
"AvailableCategories": "Tillgängliga Kategorier",
|
||||
"Back": "Tillbaka",
|
||||
"BaseUnit": "Basenhet",
|
||||
"BaseUnitHelp": "Standardenhet för automatisk enhetsomvandling",
|
||||
"Basics": "Grunderna",
|
||||
"Book": "Bok",
|
||||
"Bookmarklet": "Bokmärke",
|
||||
"BookmarkletHelp1": "Dra följande knapp till ditt bokmärkesfält",
|
||||
"BookmarkletHelp2": "Öppna sidan du vill importera från",
|
||||
"BookmarkletHelp3": "Klicka på bokmärket för att utföra importen.",
|
||||
"BookmarkletImportSubtitle": "Använd bokmärket för att importera från icke-publika sidor.",
|
||||
"Books": "Böcker",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Räknare",
|
||||
"Calories": "Kalorier",
|
||||
"Cancel": "Avbryt",
|
||||
"Cannot_Add_Notes_To_Shopping": "Anteckningar kan inte läggas till inköpslistan",
|
||||
"Carbohydrates": "Kolhydrater",
|
||||
"Cards": "Kort",
|
||||
"Categories": "Kategorier",
|
||||
"Category": "Kategori",
|
||||
"CategoryInstruction": "Dra kategorier för att ändra den ordning som kategorierna visas i inköpslistan.",
|
||||
@@ -47,9 +73,19 @@
|
||||
"Color": "Färg",
|
||||
"Combine_All_Steps": "Kombinera alla steg i ett enda fält.",
|
||||
"Coming_Soon": "Kommer snart",
|
||||
"Comment": "Kommentar",
|
||||
"Comments_setting": "Visa Kommentarer",
|
||||
"Completed": "Avslutad",
|
||||
"Confirm": "Bekräfta",
|
||||
"ConnectorConfig": "Integrationer",
|
||||
"ConnectorConfigHelp": "Med integrationer kan du automatiskt synka data från Tandoor till externa tjänster. ",
|
||||
"Continue": "Fortsätt",
|
||||
"Conversion": "Omvandling",
|
||||
"ConversionsHelp": "Med omvandlingar kan du beräkna mängden av ett livsmedel i olika enheter. För närvarande används detta endast för egenskapsberäkning, senare kan det även användas i andra delar av Tandoor. ",
|
||||
"CookLog": "Tillagningslogg",
|
||||
"CookLogHelp": "Poster i tillagningsloggen för recept. ",
|
||||
"Cooked": "Tillagad",
|
||||
"Copied": "Kopierad",
|
||||
"Copy": "Kopiera",
|
||||
"Copy Link": "Kopiera Länk",
|
||||
"Copy Token": "Kopiera token",
|
||||
@@ -67,6 +103,8 @@
|
||||
"Create_New_Shopping_Category": "Lägg till ny shoppingkategori",
|
||||
"Create_New_Unit": "Lägg till enhet",
|
||||
"Created": "Skapad",
|
||||
"CreatedBy": "Skapad av",
|
||||
"Ctrl+K": "Ctrl+K",
|
||||
"Current_Period": "Nuvarande period",
|
||||
"Custom Filter": "Anpassat filter",
|
||||
"CustomImageHelp": "Ladda upp en bild som visas i överblicken.",
|
||||
@@ -75,7 +113,9 @@
|
||||
"CustomNavLogoHelp": "Ladda upp en bild att använda som meny-logga.",
|
||||
"CustomTheme": "Anpassat tema",
|
||||
"CustomThemeHelp": "Skriv över nuvarande tema genom att ladda upp en anpassad CSS-fil.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Förbättra din samling genom att importera en framtagen lista av livsmedel, enheter och mer för att förbättra din recept-samling.",
|
||||
"Database": "Databas",
|
||||
"Datatype": "Datatyp",
|
||||
"Date": "Datum",
|
||||
"Day": "Dag",
|
||||
@@ -115,10 +155,12 @@
|
||||
"Export_Supported": "Export stöds",
|
||||
"Export_To_ICal": "Exportera .ics",
|
||||
"External": "Extern",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Extern receptbild",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC databas ID",
|
||||
"FDC_Search": "FDC Sök",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Misslyckas",
|
||||
"Fats": "Fett",
|
||||
"File": "Fil",
|
||||
@@ -357,6 +399,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Typ",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Oförändrad",
|
||||
"Undefined": "Odefinierad",
|
||||
"Undo": "Ångra",
|
||||
@@ -489,7 +532,7 @@
|
||||
"merge_selection": "Ersätt alla förekomster av {source} med den valda {type}.",
|
||||
"merge_title": "Slå samman {type}",
|
||||
"min": "min",
|
||||
"ml": "millimeter [ml] (metrisk, volym)",
|
||||
"ml": "milliliter [ml] (metrisk, volym)",
|
||||
"move_confirmation": "Flytta<i>{child}</i> till förälder <i>{parent}</i>",
|
||||
"move_selection": "Välj en förälder {type} att flytta {source} till.",
|
||||
"move_title": "Flytta {type}",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "Hesap",
|
||||
"Add": "Ekle",
|
||||
"AddFoodToShopping": "{food}'ı alışveriş listenize ekleyin",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "Geri",
|
||||
"Bookmarklet": "Yer İmi",
|
||||
"Books": "Kitaplar",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Hesap Makinesi",
|
||||
"Calories": "Kaloriler",
|
||||
"Cancel": "İptal",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "Gezinme çubuğu logosu olarak kullanılacak bir resim yükleyin.",
|
||||
"CustomTheme": "Özel Tema",
|
||||
"CustomThemeHelp": "Özel bir CSS dosyası yükleyerek seçilen temanın stillerini geçersiz kılın.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Tarif koleksiyonunuzu geliştirmek için topluluk tarafından oluşturulmuş yiyecek, birim ve daha fazlasını olduğu listeleri içeri aktararak Alanlarınızı genişletin.",
|
||||
"Datatype": "Veri tipi",
|
||||
"Date": "Tarih",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "Desteklenen Dışa Aktarma",
|
||||
"Export_To_ICal": ".ics olarak dışa aktar",
|
||||
"External": "Harici",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Harici Tarif Resim",
|
||||
"FDC_ID": "FDC Kimlik",
|
||||
"FDC_ID_help": "FDC veritabanı Kimlik",
|
||||
"FDC_Search": "FDC Arama",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Başarısız",
|
||||
"Fats": "Yağlar",
|
||||
"File": "Dosya",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Tür",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "Değiştirilmemiş",
|
||||
"Undefined": "Tanımlanmamış",
|
||||
"Undo": "Geri Al",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Add": "Додати",
|
||||
"AddFoodToShopping": "Додати {food} до вашого списку покупок",
|
||||
"AddToShopping": "Додати до списку покупок",
|
||||
@@ -23,6 +25,7 @@
|
||||
"Automation": "Автоматизація",
|
||||
"Bookmarklet": "",
|
||||
"Books": "Книги",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "Калькулятор",
|
||||
"Calories": "Калорії",
|
||||
"Cancel": "Відмінити",
|
||||
@@ -64,6 +67,7 @@
|
||||
"CustomNavLogoHelp": "Завантажте зображення що буде використовуватись як логотип у навігаційній панелі.",
|
||||
"CustomTheme": "Власна Тема",
|
||||
"CustomThemeHelp": "Переписати стили вибраної теми завантаживши власний CSS файл.",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "Покращуйте свій Простір, імпортуючи курований спільнотою список продуктів, одиниць виміру тощо, щоб вдосконалити свою колекцію рецептів.",
|
||||
"Datatype": "Тип данних",
|
||||
"Date": "Дата",
|
||||
@@ -97,10 +101,12 @@
|
||||
"Export_Supported": "",
|
||||
"Export_To_ICal": "Експортувати .ics",
|
||||
"External": "Зовнішній",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "Зображення Зовнішнього Рецепту",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "Ідентифікатор Бази FDC",
|
||||
"FDC_Search": "Пошук FDC",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "Невдало",
|
||||
"Fats": "Жири",
|
||||
"File": "Файл",
|
||||
@@ -308,6 +314,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "Тип",
|
||||
"UPDATE_ERROR": "",
|
||||
"Undefined": "Невідомо",
|
||||
"Undo": "Скасувати",
|
||||
"Unit": "Одиниця",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"Account": "账户",
|
||||
"Add": "添加",
|
||||
"AddFoodToShopping": "添加 {food} 到购物清单",
|
||||
@@ -26,6 +28,7 @@
|
||||
"Back": "后退",
|
||||
"Bookmarklet": "书签",
|
||||
"Books": "烹饪手册",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "计算器",
|
||||
"Calories": "卡路里",
|
||||
"Cancel": "取消",
|
||||
@@ -74,6 +77,7 @@
|
||||
"CustomNavLogoHelp": "上传图像以用作导航栏徽标。",
|
||||
"CustomTheme": "自定义主题",
|
||||
"CustomThemeHelp": "通过上传自定义 CSS 文件覆盖所选主题的样式。",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "通过导入社区精选的食物、单位等列表来增强您的空间,以提升您的食谱收藏。",
|
||||
"Datatype": "数据类型",
|
||||
"Date": "日期",
|
||||
@@ -114,10 +118,12 @@
|
||||
"Export_Supported": "导出支持",
|
||||
"Export_To_ICal": "导出 .ics",
|
||||
"External": "外部",
|
||||
"ExternalRecipe": "",
|
||||
"External_Recipe_Image": "外部食谱图像",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC数据库ID",
|
||||
"FDC_Search": "FDC搜索",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "失败",
|
||||
"Fats": "脂肪",
|
||||
"File": "文件",
|
||||
@@ -356,6 +362,7 @@
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"Type": "类型",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "未更改",
|
||||
"Undefined": "未定义的",
|
||||
"Undo": "撤销",
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
{
|
||||
"AI": "人工智慧",
|
||||
"AIImportSubtitle": "以人工智慧匯入食譜圖片。",
|
||||
"API": "API",
|
||||
"API_Browser": "",
|
||||
"API_Documentation": "",
|
||||
"AccessTokenHelp": "REST API 的訪問金鑰。",
|
||||
"Access_Token": "訪問令牌",
|
||||
"Account": "賬戶",
|
||||
"Actions": "動作",
|
||||
"Activity": "活動",
|
||||
"Add": "新增",
|
||||
"AddAll": "增加全部",
|
||||
"AddFilter": "增加過濾器",
|
||||
"AddFoodToShopping": "添加食物到購物",
|
||||
"AddMany": "增加多個",
|
||||
"AddToShopping": "添加到購物",
|
||||
"Add_Servings_to_Shopping": "添加份量到購物",
|
||||
"Add_Step": "添加步驟",
|
||||
@@ -12,196 +23,281 @@
|
||||
"Added_To_Shopping_List": "已添加到購物清單",
|
||||
"Added_by": "添加者",
|
||||
"Added_on": "添加於",
|
||||
"Admin": "管理者",
|
||||
"Advanced": "高級",
|
||||
"Alignment": "對齊",
|
||||
"AllRecipes": "所有食譜",
|
||||
"Amount": "數量",
|
||||
"App": "應用程式",
|
||||
"Apply": "",
|
||||
"AppImportSubtitle": "匯入您現有的食譜資料庫。",
|
||||
"Apply": "套用",
|
||||
"Are_You_Sure": "你確定嗎?",
|
||||
"Auto_Planner": "自動計劃",
|
||||
"Auto_Sort": "自動排序",
|
||||
"Auto_Sort_Help": "將所有食材移動到最恰當的步驟。",
|
||||
"Automate": "自動化",
|
||||
"Automation": "自動化",
|
||||
"AutomationHelp": "自動化功能根據類型允許您對食譜、食材等進行一些自動更改,例如在匯入食譜時。 ",
|
||||
"Available": "可用的",
|
||||
"AvailableCategories": "可用的類別",
|
||||
"Back": "返回",
|
||||
"BaseUnit": "基礎單位",
|
||||
"BaseUnitHelp": "自動單位轉換的標準單位",
|
||||
"Basics": "基礎",
|
||||
"Book": "書籍",
|
||||
"Bookmarklet": "書籤小工具",
|
||||
"Books": "書籍",
|
||||
"BookmarkletHelp1": "將以下按鈕拖到您的書籤欄中",
|
||||
"BookmarkletHelp2": "開啟您想要匯入的頁面",
|
||||
"BookmarkletHelp3": "點擊書籤以執行匯入。",
|
||||
"BookmarkletImportSubtitle": "使用書籤小工具從非公開頁面匯入。",
|
||||
"Books": "烹飪手冊",
|
||||
"CREATE_ERROR": "",
|
||||
"Calculator": "計算器",
|
||||
"Calories": "卡路里",
|
||||
"Cancel": "取消",
|
||||
"Cannot_Add_Notes_To_Shopping": "無法添加備註到購物",
|
||||
"Carbohydrates": "碳水化合物",
|
||||
"Cards": "卡片",
|
||||
"Categories": "分類",
|
||||
"Category": "類別",
|
||||
"CategoryInstruction": "拖動類別可更改出現在購物清單中的訂單類別。",
|
||||
"CategoryName": "分類名稱",
|
||||
"Change_Password": "更改密碼",
|
||||
"ChildInheritFields": "子項繼承字段",
|
||||
"ChildInheritFields_help": "默認情況下,子項將繼承這些字段。",
|
||||
"ChildInheritFields": "子項繼承欄位",
|
||||
"ChildInheritFields_help": "預設情況下,子項將繼承這些欄位。",
|
||||
"Choose_Category": "選擇分類",
|
||||
"Clear": "清除",
|
||||
"Click_To_Edit": "點擊編輯",
|
||||
"Clone": "克隆",
|
||||
"Clone": "複製",
|
||||
"Close": "關閉",
|
||||
"Color": "顏色",
|
||||
"Combine_All_Steps": "將所有步驟合併到一個字段中。",
|
||||
"Combine_All_Steps": "將所有步驟合併到一個欄位中。",
|
||||
"Coming_Soon": "即將推出",
|
||||
"Comment": "意見",
|
||||
"Comments_setting": "評論設置",
|
||||
"Completed": "已完成",
|
||||
"Confirm": "確認",
|
||||
"ConnectorConfig": "連接器",
|
||||
"ConnectorConfigHelp": "使用連接器,您可以將 Tandoor 中的資料自動同步到外部服務。 ",
|
||||
"Continue": "繼續",
|
||||
"Conversion": "轉換",
|
||||
"ConversionsHelp": "透過轉換功能,您可以計算食物在不同單位下的數量。目前這僅用於屬性計算,未來也可能用於 Tandoor 的其他部分。 ",
|
||||
"CookLog": "烹飪記錄",
|
||||
"CookLogHelp": "食譜的烹飪記錄條目。 ",
|
||||
"Cooked": "已烹飪",
|
||||
"Copied": "已複製",
|
||||
"Copy": "複製",
|
||||
"Copy Link": "複製連結",
|
||||
"Copy Token": "複製令牌",
|
||||
"Copy_template_reference": "複製參考模板",
|
||||
"Cosmetic": "外觀",
|
||||
"CountMore": "計數更多",
|
||||
"CountMore": "...+{count} 更多",
|
||||
"Create": "建立",
|
||||
"Create Food": "創建食物",
|
||||
"Create Recipe": "創建食譜",
|
||||
"Create_Meal_Plan_Entry": "創建餐計劃條目",
|
||||
"Create_New_Food": "創建新食物",
|
||||
"Create_New_Keyword": "創建新關鍵字",
|
||||
"Create_New_Meal_Type": "創建新餐類型",
|
||||
"Create_New_Shopping Category": "創建新購物分類",
|
||||
"Create_New_Shopping_Category": "創建新購物分類",
|
||||
"Create_New_Unit": "創建新單位",
|
||||
"Created": "創建",
|
||||
"Create Food": "建立食物",
|
||||
"Create Recipe": "建立食譜",
|
||||
"Create_Meal_Plan_Entry": "建立餐飲計劃條目",
|
||||
"Create_New_Food": "建立新食物",
|
||||
"Create_New_Keyword": "建立新關鍵字",
|
||||
"Create_New_Meal_Type": "建立新餐飲類型",
|
||||
"Create_New_Shopping Category": "建立新購物分類",
|
||||
"Create_New_Shopping_Category": "建立新購物分類",
|
||||
"Create_New_Unit": "建立新單位",
|
||||
"Created": "建立",
|
||||
"CreatedBy": "建立者",
|
||||
"Ctrl+K": "Ctrl+K",
|
||||
"Current_Period": "當前期間",
|
||||
"Custom Filter": "自定義篩選器",
|
||||
"CustomImageHelp": "上傳圖片以在空間概覽中顯示。",
|
||||
"CustomLogoHelp": "上傳不同尺寸的方形圖像以更改為瀏覽器選項卡和安裝的網絡應用程序中的徽標。",
|
||||
"CustomLogos": "自定義標誌",
|
||||
"CustomNavLogoHelp": "上傳圖像以用作導航欄徽標。",
|
||||
"CustomNavLogoHelp": "上傳圖像以用作導覽欄徽標",
|
||||
"CustomTheme": "自定義主題",
|
||||
"CustomThemeHelp": "通過上傳自定義 CSS 文件覆蓋所選主題的樣式。",
|
||||
"Data_Import_Info": "通過導入社區精選的食物、單位等列表來增強您的空間,以提升您的食譜收藏。",
|
||||
"Datatype": "數據類型",
|
||||
"DELETE_ERROR": "",
|
||||
"Data_Import_Info": "透過匯入社群精選的食物、單位等清單來增強您的空間,以提升您的食譜收藏。",
|
||||
"Database": "資料庫",
|
||||
"DatabaseHelp": "Tandoor 使用許多不同的項目來讓您建立食譜、購物清單、餐飲計劃等。在這裡您可以管理所有這些模型。",
|
||||
"Datatype": "資料類型",
|
||||
"Date": "日期",
|
||||
"Day": "天",
|
||||
"Days": "天",
|
||||
"Decimals": "小數",
|
||||
"DefaultPage": "默認頁面",
|
||||
"Default_Unit": "默認單位",
|
||||
"DelayFor": "延遲",
|
||||
"DelayUntil": "延遲到",
|
||||
"Default": "預設",
|
||||
"DefaultPage": "預設頁面",
|
||||
"Default_Unit": "預設單位",
|
||||
"DelayFor": "延遲 {hours} 小時",
|
||||
"DelayUntil": "延遲直到",
|
||||
"Delete": "刪除",
|
||||
"DeleteConfirmQuestion": "您確定要刪除此物件嗎?",
|
||||
"DeleteShoppingConfirm": "確定要移除購物清單中所有 {food} 嗎?",
|
||||
"Delete_All": "刪除全部",
|
||||
"Delete_Food": "刪除食物",
|
||||
"Delete_Keyword": "刪除關鍵字",
|
||||
"Deleted": "已刪除",
|
||||
"Description": "描述",
|
||||
"Description_Replace": "描述替換",
|
||||
"Disable": "禁用",
|
||||
"Disable_Amount": "禁用數量",
|
||||
"Disabled": "禁用",
|
||||
"Documentation": "文檔",
|
||||
"DeviceSettings": "裝置設定",
|
||||
"DeviceSettingsHelp": "為了讓 Tandoor 在您使用的任何地方都能正常顯示,這些設定僅儲存在此裝置上。",
|
||||
"Disable": "停用",
|
||||
"Disable_Amount": "停用數量",
|
||||
"Disabled": "已停用",
|
||||
"Documentation": "文件",
|
||||
"Down": "下",
|
||||
"Download": "下載",
|
||||
"DragToUpload": "拖放或點擊選擇",
|
||||
"Drag_Here_To_Delete": "拖到這裡刪除",
|
||||
"Duplicate": "重複",
|
||||
"DuplicateFoundInfo": "在您的空間中已找到具有此網址的食譜。是否仍要繼續?",
|
||||
"Edit": "編輯",
|
||||
"Edit_Food": "編輯食物",
|
||||
"Edit_Keyword": "編輯關鍵字",
|
||||
"Edit_Meal_Plan_Entry": "編輯餐計劃條目",
|
||||
"Edit_Meal_Plan_Entry": "編輯餐飲計劃條目",
|
||||
"Edit_Recipe": "編輯食譜",
|
||||
"Email": "電子郵件",
|
||||
"Empty": "空",
|
||||
"Enable": "啟用",
|
||||
"Enable_Amount": "啟用數量",
|
||||
"Enabled": "已啟用",
|
||||
"EndDate": "結束日期",
|
||||
"Energy": "能量",
|
||||
"Entries": "條目",
|
||||
"Error": "錯誤",
|
||||
"ErrorUrlListImport": "匯入清單中第一個網址時發生錯誤。所有不再顯示的網址都已成功匯入。 ",
|
||||
"Events": "事件",
|
||||
"Export": "匯出",
|
||||
"Export_As_ICal": "匯出為 iCal",
|
||||
"Export_Not_Yet_Supported": "匯出尚不支持",
|
||||
"Export_Supported": "支持匯出",
|
||||
"Export_Not_Yet_Supported": "匯出尚不支援",
|
||||
"Export_Supported": "支援匯出",
|
||||
"Export_To_ICal": "匯出到 iCal",
|
||||
"External": "外部",
|
||||
"ExternalRecipe": "",
|
||||
"ExternalRecipeImport": "外部食譜匯入",
|
||||
"ExternalRecipeImportHelp": "外部儲存同步資料夾中的檔案不會直接匯入,而是暫時儲存為外部匯入食譜。在這裡您可以快速檢視和編輯新發現的檔案,然後再將它們移至主要收藏。 ",
|
||||
"ExternalStorage": "外部儲存",
|
||||
"External_Recipe_Image": "外部食譜圖片",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC ID 幫助",
|
||||
"FDC_ID_help": "FDC資料庫編號",
|
||||
"FDC_Search": "FDC 搜尋",
|
||||
"FETCH_ERROR": "",
|
||||
"Failure": "失敗",
|
||||
"Fats": "脂肪",
|
||||
"File": "檔案",
|
||||
"Files": "檔案",
|
||||
"FinishedAt": "完成於",
|
||||
"First": "第一個",
|
||||
"First_name": "名字",
|
||||
"Food": "食物",
|
||||
"FoodHelp": "食物是 Tandoor 最重要的基礎。與單位及其相應數量一起構成食譜食材。它們也可用於購物、屬性和更多功能。 ",
|
||||
"FoodInherit": "食物繼承",
|
||||
"FoodNotOnHand": "你還沒有 {food}。",
|
||||
"FoodNotOnHand": "你手上還沒有 {food}。",
|
||||
"FoodOnHand": "你手上有 {food}。",
|
||||
"Food_Alias": "食物別名",
|
||||
"Food_Replace": "食物替換",
|
||||
"Foods": "食物",
|
||||
"Fulltext": "",
|
||||
"FulltextHelp": "",
|
||||
"Fuzzy": "",
|
||||
"FuzzySearchHelp": "",
|
||||
"Friday": "星期五",
|
||||
"Fulltext": "全文",
|
||||
"FulltextHelp": "全文搜索的字段。注意:'web'、'phrase' 和 'raw' 搜索方法僅對全文欄位有效。",
|
||||
"Fuzzy": "模糊",
|
||||
"FuzzySearchHelp": "使用模糊搜索來查找條目,即使單詞的寫法存在差異。",
|
||||
"GettingStarted": "開始使用",
|
||||
"GroupBy": "分組依據",
|
||||
"HeaderWarning": "警告:變更為標題會刪除數量/單位/食物",
|
||||
"Headline": "標題",
|
||||
"Help": "說明",
|
||||
"Hide_External": "隱藏外部",
|
||||
"Hide_Food": "隱藏食物",
|
||||
"Hide_Keyword": "隱藏關鍵字",
|
||||
"Hide_Keywords": "隱藏關鍵字",
|
||||
"Hide_Recipes": "隱藏食譜",
|
||||
"Hide_as_header": "隱藏為標題",
|
||||
"History": "歷史記錄",
|
||||
"HostedFreeVersion": "您正在使用 Tandoor 的免費版本",
|
||||
"Hour": "小時",
|
||||
"Hours": "小時",
|
||||
"Icon": "圖標",
|
||||
"IgnoreAccents": "",
|
||||
"IgnoreAccentsHelp": "",
|
||||
"IgnoreThis": "忽略這個",
|
||||
"IgnoreAccents": "忽略重音",
|
||||
"IgnoreAccentsHelp": "搜尋時忽略重音符號 ",
|
||||
"IgnoreThis": "永遠不自動將 {food} 添加到購物清單中",
|
||||
"Ignore_Shopping": "忽略購物",
|
||||
"IgnoredFood": "已忽略購買 {food}。",
|
||||
"Image": "圖片",
|
||||
"Import": "匯入",
|
||||
"Import Recipe": "匯入食譜",
|
||||
"Import_Error": "導入時發生錯誤。 請跳轉至頁面底部的詳細信息進行查看。",
|
||||
"Import_Not_Yet_Supported": "匯入尚不支持",
|
||||
"Import_Result_Info": "匯入結果信息",
|
||||
"Import_Supported": "支持匯入",
|
||||
"ImportAll": "全部匯入",
|
||||
"ImportIntoTandoor": "匯入到 Tandoor",
|
||||
"Import_Error": "導入時發生錯誤。 請跳轉至頁面底部的詳細資訊進行查看。",
|
||||
"Import_Not_Yet_Supported": "匯入尚不支援",
|
||||
"Import_Result_Info": "匯入結果資訊",
|
||||
"Import_Supported": "支援匯入",
|
||||
"Import_finished": "匯入完成",
|
||||
"Imported": "匯入",
|
||||
"Imported_From": "匯入自",
|
||||
"Importer_Help": "有關此進口商的更多信息和幫助:",
|
||||
"Importer_Help": "有關此匯入器的更多資訊和幫助:",
|
||||
"Information": "資訊",
|
||||
"Ingredient": "食材",
|
||||
"Ingredient Editor": "食材編輯器",
|
||||
"Ingredient Overview": "食材概覽",
|
||||
"IngredientEditorHelp": "使用食材編輯器,您可以一次編輯使用特定食物和/或單位的所有食材。這可用於輕鬆修正錯誤或一次變更多個食譜。",
|
||||
"IngredientHelp": "食材通常由數量、單位和食物組成,數量和單位是可選的。它也可以包含備註或用作標題。 ",
|
||||
"IngredientInShopping": "此食材已在購物清單中。",
|
||||
"Ingredients": "食材",
|
||||
"Inherit": "繼承",
|
||||
"InheritFields": "繼承字段",
|
||||
"InheritFields_help": "繼承字段幫助",
|
||||
"InheritWarning": "{food} 設置為繼承, 更改可能無法保存。",
|
||||
"InheritFields": "繼承欄位",
|
||||
"InheritFields_help": "繼承欄位說明",
|
||||
"InheritWarning": "{food} 設定為繼承,更改可能無法儲存。",
|
||||
"Input": "輸入",
|
||||
"Instruction_Replace": "指示替換",
|
||||
"Instructions": "指示",
|
||||
"InstructionsEditHelp": "點擊此處新增指示。 ",
|
||||
"Internal": "內部",
|
||||
"InviteLinkHelp": "邀請新成員加入您空間的連結。 ",
|
||||
"Invite_Link": "邀請連結",
|
||||
"Invites": "邀請",
|
||||
"Key_Ctrl": "Ctrl 鍵",
|
||||
"Key_Shift": "Shift 鍵",
|
||||
"Keyword": "關鍵字",
|
||||
"KeywordHelp": "關鍵字可用於組織您的食譜收藏。",
|
||||
"Keyword_Alias": "關鍵字別名",
|
||||
"Keywords": "關鍵字",
|
||||
"Language": "語言",
|
||||
"Last_name": "姓氏",
|
||||
"Last": "最後",
|
||||
"Last_name": "姓",
|
||||
"Learn_More": "了解更多",
|
||||
"Link": "連結",
|
||||
"Load": "載入",
|
||||
"Load_More": "載入更多",
|
||||
"Log_Cooking": "記錄烹飪",
|
||||
"Log_Recipe_Cooking": "記錄食譜烹飪",
|
||||
"Logo": "標誌",
|
||||
"Logout": "登出",
|
||||
"Make_Header": "設為標題",
|
||||
"Make_Ingredient": "設為食材",
|
||||
"ManageSubscription": "管理訂閱",
|
||||
"Manage_Books": "管理書籍",
|
||||
"Manage_Emails": "管理電子郵件",
|
||||
"Meal_Plan": "膳食計劃",
|
||||
"Meal_Plan_Days": "餐計劃天數",
|
||||
"Meal_Type": "餐類型",
|
||||
"Meal_Type_Required": "需要餐類型",
|
||||
"Meal_Types": "餐類型",
|
||||
"MealPlanHelp": "餐飲計劃是用於規劃餐點的日曆條目。它必須包含食譜或標題,並可以連結到購物清單。 ",
|
||||
"MealPlanShoppingHelp": "您購物清單上的條目可以與餐飲計劃相關聯,以排序您的清單或一次更新/刪除所有條目。使用食譜建立餐飲計劃時,可以自動建立該食譜的購物清單條目(設定)。 ",
|
||||
"MealTypeHelp": "餐飲類型允許您排序餐飲計劃。 ",
|
||||
"Meal_Plan": "餐飲計劃",
|
||||
"Meal_Plan_Days": "餐飲計劃天數",
|
||||
"Meal_Type": "餐飲類型",
|
||||
"Meal_Type_Required": "需要餐飲類型",
|
||||
"Meal_Types": "餐飲類型",
|
||||
"Merge": "合併",
|
||||
"MergeAutomateHelp": "建立一個自動化程序,將此類型的未來物件替換為選定的物件。",
|
||||
"Merge_Keyword": "合併關鍵字",
|
||||
"Message": "消息",
|
||||
"MissingProperties": "",
|
||||
"Message": "訊息",
|
||||
"Messages": "訊息",
|
||||
"Miscellaneous": "其他",
|
||||
"MissingConversion": "缺少轉換",
|
||||
"MissingProperties": "缺少屬性",
|
||||
"ModelSelectResultsHelp": "搜尋更多結果",
|
||||
"Monday": "星期一",
|
||||
"Month": "月",
|
||||
"More": "更多",
|
||||
"Move": "移動",
|
||||
"MoveCategory": "移動分類 ",
|
||||
"MoveCategory": "移動至: ",
|
||||
"MoveToStep": "移至步驟",
|
||||
"Move_Down": "下移",
|
||||
"Move_Food": "移動食物",
|
||||
"Move_Keyword": "移動關鍵字",
|
||||
@@ -209,28 +305,31 @@
|
||||
"Multiple": "多個",
|
||||
"Name": "名稱",
|
||||
"Name_Replace": "名稱替換",
|
||||
"Nav_Color": "導航顏色",
|
||||
"Nav_Color_Help": "改變導航欄顏色。",
|
||||
"Nav_Text_Mode": "導航文本模式",
|
||||
"Nav_Text_Mode_Help": "每個主題的行為都不同。",
|
||||
"Nav_Color": "導覽顏色",
|
||||
"Nav_Color_Help": "改變導覽欄顏色。",
|
||||
"Nav_Text_Mode": "導覽文本模式",
|
||||
"Nav_Text_Mode_Help": "對於每個主題的行為都不同。",
|
||||
"Never_Unit": "從不使用單位",
|
||||
"New": "新的",
|
||||
"New_Cookbook": "新食譜書",
|
||||
"New_Entry": "新條目",
|
||||
"New_Food": "新食物",
|
||||
"New_Keyword": "新關鍵字",
|
||||
"New_Meal_Type": "新餐類型",
|
||||
"New_Meal_Type": "新餐飲類型",
|
||||
"New_Recipe": "新食譜",
|
||||
"New_Supermarket": "新超市",
|
||||
"New_Supermarket_Category": "新超市分類",
|
||||
"New_Unit": "新單位",
|
||||
"Next": "下一個",
|
||||
"Next_Day": "下一天",
|
||||
"Next_Period": "下一期間",
|
||||
"NoCategory": "未選擇分類。",
|
||||
"NoCategory": "無分類",
|
||||
"NoMoreUndo": "沒有可撤消的更改。",
|
||||
"NoUnit": "",
|
||||
"NoUnit": "無單位",
|
||||
"No_ID": "未找到標識,不能刪除。",
|
||||
"No_Results": "無結果",
|
||||
"NotFound": "找不到",
|
||||
"NotFoundHelp": "找不到您要尋找的頁面或物件。",
|
||||
"NotInShopping": "購物清單中沒有 {food}。",
|
||||
"Note": "備註",
|
||||
"Number of Objects": "對象數量",
|
||||
@@ -238,170 +337,272 @@
|
||||
"OfflineAlert": "您處於離線狀態,購物清單可能無法同步。",
|
||||
"Ok": "確定",
|
||||
"OnHand": "手頭有",
|
||||
"OnHand_help": "食物在庫存中時,不會自動添加到購物清單中。 並且現有狀態會與購物用戶共享。",
|
||||
"OnHand_help": "食物在庫存中時,不會自動添加到購物清單中。並且現有狀態會與購物用戶共享。",
|
||||
"Open": "打開",
|
||||
"Open_Data_Import": "開放數據匯入",
|
||||
"Open_Data_Slug": "開放數據標籤",
|
||||
"Open_Data_Import": "匯入開放資料",
|
||||
"Open_Data_Slug": "開放資料短名稱",
|
||||
"Options": "選項",
|
||||
"OrderInformation": "對象按照從小到大的順序排列。",
|
||||
"Original_Text": "原始文本",
|
||||
"Order": "順序",
|
||||
"OrderInformation": "物件按照從小到大的順序排列。",
|
||||
"Original_Text": "原始文字",
|
||||
"Owner": "擁有者",
|
||||
"Page": "頁面",
|
||||
"Parameter": "參數",
|
||||
"Parent": "父項",
|
||||
"PartialMatch": "",
|
||||
"PartialMatchHelp": "",
|
||||
"PartialMatch": "部分匹配",
|
||||
"PartialMatchHelp": "用於搜索部分匹配的欄位。(例如,搜索 'Pie' 將返回 'pie'、'piece' 和 'soapie')",
|
||||
"Password": "密碼",
|
||||
"Path": "路徑",
|
||||
"PerPage": "每頁",
|
||||
"Period": "期間",
|
||||
"Periods": "期間",
|
||||
"Pin": "釘住",
|
||||
"Pinned": "釘住",
|
||||
"PinnedConfirmation": "{recipe} 已固定。",
|
||||
"Pin": "釘選",
|
||||
"Pinned": "已釘選",
|
||||
"PinnedConfirmation": "{recipe} 已釘選。",
|
||||
"Plan_Period_To_Show": "顯示計劃期間",
|
||||
"Plan_Show_How_Many_Periods": "顯示多少期間",
|
||||
"Planned": "計劃",
|
||||
"Planner": "計劃者",
|
||||
"Planner_Settings": "計劃者設定",
|
||||
"Planned": "已計劃",
|
||||
"Planner": "計劃器",
|
||||
"Planner_Settings": "計劃器設定",
|
||||
"Planning&Shopping": "規劃與購物",
|
||||
"Plural": "複數",
|
||||
"PrecisionSearchHelp": "",
|
||||
"Postpone": "延後",
|
||||
"PostponedUntil": "延後至",
|
||||
"PrecisionSearchHelp": "只返回拼寫準確條目的預設 ",
|
||||
"Preferences": "偏好設定",
|
||||
"Preparation": "準備",
|
||||
"Preview": "預覽",
|
||||
"Previous_Day": "前一天",
|
||||
"Previous_Period": "上一期間",
|
||||
"Print": "列印",
|
||||
"Private_Recipe": "私人食譜",
|
||||
"Private_Recipe_Help": "食譜只有你和共享的人會顯示。",
|
||||
"Profile": "個人資料",
|
||||
"Properties": "屬性",
|
||||
"PropertiesFoodHelp": "可以為食譜和食物新增屬性。食物上的屬性會根據其在食譜中的數量自動計算。",
|
||||
"Properties_Food_Amount": "食物數量屬性",
|
||||
"Properties_Food_Unit": "食物單位屬性",
|
||||
"Property": "屬性",
|
||||
"PropertyHelp": "屬性類型、食物/食譜和數量的組合",
|
||||
"PropertyType": "屬性類型",
|
||||
"PropertyTypeHelp": "屬性允許您追蹤個別食物或完整食譜的不同值(營養、價格等)。 ",
|
||||
"Property_Editor": "屬性編輯器",
|
||||
"Protected": "受保護",
|
||||
"Proteins": "蛋白質",
|
||||
"Quick actions": "快速操作",
|
||||
"QuickEntry": "快速輸入",
|
||||
"Random Recipes": "隨機食譜",
|
||||
"RandomOrder": "隨機順序",
|
||||
"RateLimit": "速率限制",
|
||||
"RateLimitHelp": "您已達到特定時間內的請求限制。",
|
||||
"Rating": "評分",
|
||||
"Ratings": "評分",
|
||||
"Recently_Viewed": "最近瀏覽",
|
||||
"Recipe": "食譜",
|
||||
"RecipeBookEntryHelp": "食譜書條目將食譜連結到書中的特定位置。 ",
|
||||
"RecipeBookHelp": "食譜書包含食譜書條目,或可以透過使用已儲存的搜尋篩選器自動填充。 ",
|
||||
"RecipeHelp": "食譜是 Tandoor 的基礎,由一般資訊和步驟組成,步驟由食材、指示等組成。 ",
|
||||
"RecipeStepsHelp": "食材、指示等可以在步驟標籤中編輯。",
|
||||
"Recipe_Book": "食譜書",
|
||||
"Recipe_Image": "食譜圖片",
|
||||
"Recipes": "食譜",
|
||||
"Recipes_In_Import": "匯入中的食譜",
|
||||
"Recipes_per_page": "每頁食譜",
|
||||
"RemoveFoodFromShopping": "從購物中移除食物",
|
||||
"Recipes_In_Import": "匯入檔中的食譜",
|
||||
"Recipes_per_page": "每頁中食譜",
|
||||
"Remove": "移除",
|
||||
"RemoveFoodFromShopping": "從購物清單中移除 {food}",
|
||||
"Remove_nutrition_recipe": "從食譜中刪除營養資訊",
|
||||
"Reset": "重置",
|
||||
"ResetHelp": "重置說明",
|
||||
"Reset_Search": "重置搜尋",
|
||||
"Reusable": "可重複使用",
|
||||
"Role": "角色",
|
||||
"Root": "根目錄",
|
||||
"Saturday": "星期六",
|
||||
"Save": "儲存",
|
||||
"Save/Load": "儲存/載入",
|
||||
"Save_and_View": "儲存並查看",
|
||||
"SavedSearch": "已儲存搜尋",
|
||||
"SavedSearchHelp": "已儲存搜尋可用於儲存搜尋篩選器,以便稍後輕鬆檢索或自動填充食譜書。 ",
|
||||
"ScalableNumber": "可縮放數字",
|
||||
"Search": "搜尋",
|
||||
"Search Settings": "搜尋設定",
|
||||
"SearchMethod": "",
|
||||
"SearchSettingsOverview": "",
|
||||
"SearchSettingsWarning": "",
|
||||
"SearchMethod": "搜尋方法",
|
||||
"SearchSettingsOverview": "選擇其中一個推薦的預設,或自行調整下面的設置。",
|
||||
"SearchSettingsWarning": "通常不需要更改任何搜索設置。這些設置僅適用於有特殊需求的專家。 ",
|
||||
"Second": "秒",
|
||||
"Seconds": "秒",
|
||||
"Select": "選擇",
|
||||
"Select_App_To_Import": "選擇應用程式匯入",
|
||||
"SelectAll": "全選",
|
||||
"SelectNone": "全不選",
|
||||
"Select_App_To_Import": "請選擇應用程式以執行匯入",
|
||||
"Select_Book": "選擇書籍",
|
||||
"Select_File": "選擇檔案",
|
||||
"Selected": "已選擇",
|
||||
"SelectedCategories": "已選分類",
|
||||
"Serving": "份量",
|
||||
"Servings": "份量",
|
||||
"ServingsText": "份量文字",
|
||||
"Settings": "設定",
|
||||
"Share": "分享",
|
||||
"ShopLater": "稍後購物",
|
||||
"ShopNow": "立即購物",
|
||||
"ShoppingBackgroundSyncWarning": "網絡狀況不佳,正在等待進行同步……",
|
||||
"ShoppingListEntry": "購物清單條目",
|
||||
"ShoppingListEntryHelp": "購物清單條目可以手動建立或透過食譜和餐飲計劃建立。",
|
||||
"ShoppingListRecipe": "購物清單食譜",
|
||||
"Shopping_Categories": "購物分類",
|
||||
"Shopping_Category": "購物分類",
|
||||
"Shopping_List_Empty": "購物清單空",
|
||||
"Shopping_input_placeholder": "購物輸入佔位符",
|
||||
"Shopping_List_Empty": "您的購物清單目前是空的,您可以通過餐飲計劃項目的上下文選單添加項目(右鍵單擊卡片或左鍵單擊選單圖示)",
|
||||
"Shopping_input_placeholder": "例如:馬鈴薯/100 馬鈴薯/100 克 馬鈴薯",
|
||||
"Shopping_list": "購物清單",
|
||||
"ShowDelayed": "顯示延遲",
|
||||
"ShowDelayed": "顯示延遲項目",
|
||||
"ShowIngredients": "顯示食材",
|
||||
"ShowMealPlanOnStartPage": "在開始頁面顯示餐飲計劃。",
|
||||
"ShowRecentlyCompleted": "顯示最近完成",
|
||||
"ShowUncategorizedFood": "顯示未分類食物",
|
||||
"Show_Logo": "顯示標誌",
|
||||
"Show_Logo_Help": "在導航欄中顯示 Tandoor 或空間徽標。",
|
||||
"Show_Logo_Help": "在導覽欄中顯示 Tandoor 或空間徽標。",
|
||||
"Show_Week_Numbers": "顯示周數?",
|
||||
"Show_as_header": "顯示為標題",
|
||||
"Single": "單一",
|
||||
"Size": "大小",
|
||||
"Social_Authentication": "社交認證",
|
||||
"Sort_by_new": "按最新排序",
|
||||
"Source": "來源",
|
||||
"SourceImportHelp": "匯入 schema.org/recipe 格式的 JSON 或包含 json+ld 食譜或微資料的 HTML 頁面。",
|
||||
"SourceImportSubtitle": "手動匯入 JSON 或 HTML。",
|
||||
"SpaceLimitExceeded": "您的空間已超過其中一個限制,某些功能可能會受到限制。",
|
||||
"SpaceLimitReached": "此空間已達到限制。無法再建立此類型的物件。",
|
||||
"SpaceMemberHelp": "透過建立邀請連結並發送給您要新增的人來將使用者新增到您的空間。",
|
||||
"SpaceMembers": "空間成員",
|
||||
"SpaceMembersHelp": "空間中的使用者及其權限。 ",
|
||||
"SpaceSettings": "空間設定",
|
||||
"Space_Cosmetic_Settings": "空間管理員可以更改某些裝飾設置,並將覆蓋該空間的客戶端設置。",
|
||||
"Split": "分割",
|
||||
"Split_All_Steps": "將所有行拆分為單獨的步驟。",
|
||||
"StartDate": "開始日期",
|
||||
"Starting_Day": "開始日",
|
||||
"StartsWith": "",
|
||||
"StartsWithHelp": "",
|
||||
"StartsWith": "開頭為",
|
||||
"StartsWithHelp": "用於搜索單詞開頭匹配的字段。(例如,搜索 'sa' 將返回 'salad' 和 'sandwich')",
|
||||
"Step": "步驟",
|
||||
"StepHelp": "步驟包含食材(由數量/單位/食物組成)、指示、圖片和食譜中該步驟的更多資訊。 ",
|
||||
"Step_Name": "步驟名稱",
|
||||
"Step_Type": "步驟類型",
|
||||
"Step_start_time": "步驟開始時間",
|
||||
"Sticky_Nav": "固定導航",
|
||||
"Sticky_Nav_Help": "始終在屏幕頂部顯示導航菜單。",
|
||||
"Steps": "步驟",
|
||||
"StepsOverview": "步驟概覽",
|
||||
"Sticky_Nav": "固定導覽",
|
||||
"Sticky_Nav_Help": "始終在螢幕頂部顯示導覽列。",
|
||||
"Storage": "外部儲存",
|
||||
"StorageHelp": "可以儲存和與 Tandoor 同步食譜檔案(圖片/pdf)的外部儲存位置。",
|
||||
"StoragePasswordTokenHelp": "儲存的密碼/令牌永遠不會顯示。只有在欄位中輸入新內容時才會變更。 ",
|
||||
"SubstituteOnHand": "你手頭有一個替代品。",
|
||||
"Substitutes": "替代品",
|
||||
"Success": "成功",
|
||||
"SuccessClipboard": "成功複製到剪貼板",
|
||||
"SuccessClipboard": "成功複製到剪貼簿",
|
||||
"Sunday": "星期日",
|
||||
"Supermarket": "超市",
|
||||
"SupermarketCategoriesOnly": "僅超市分類",
|
||||
"SupermarketCategoryHelp": "分類描述超市中的區域(例如水果、熟食等)。它們可以連結到食物和超市以進行自動排序/篩選。",
|
||||
"SupermarketHelp": "透過超市,您可以連結分類以自動排序和篩選購物清單。 ",
|
||||
"SupermarketName": "超市名稱",
|
||||
"Supermarkets": "超市",
|
||||
"SupportsDescriptionField": "支援描述欄位",
|
||||
"SyncLog": "同步記錄",
|
||||
"SyncLogHelp": "外部食譜同步的協議。",
|
||||
"SyncedPath": "同步資料夾",
|
||||
"SyncedPathHelp": "受監控的外部儲存位置上的資料夾。 ",
|
||||
"System": "系統",
|
||||
"Table": "表格",
|
||||
"Table_of_Contents": "目錄",
|
||||
"Text": "文本",
|
||||
"ThankYou": "謝謝您",
|
||||
"ThanksTextHosted": "感謝您使用官方 Tandoor 伺服器來支援開源。",
|
||||
"ThanksTextSelfhosted": "感謝您使用 Tandoor。如果您想支援未來開發,請考慮使用 GitHub sponsors 贊助專案。",
|
||||
"Theme": "主題",
|
||||
"Thursday": "星期四",
|
||||
"Time": "時間",
|
||||
"Title": "標題",
|
||||
"Title_or_Recipe_Required": "需要標題或食譜",
|
||||
"Today": "今天",
|
||||
"Toggle": "切換",
|
||||
"Transpose_Words": "轉置單詞",
|
||||
"TrigramThreshold": "",
|
||||
"TrigramThresholdHelp": "",
|
||||
"TrigramThreshold": "三元組閾值",
|
||||
"TrigramThresholdHelp": "控制在使用模糊搜索時忽略多少拼寫錯誤。較低的值會忽略更多差異/產生更多結果。",
|
||||
"Tuesday": "星期二",
|
||||
"Type": "類型",
|
||||
"UPDATE_ERROR": "",
|
||||
"Unchanged": "未更改",
|
||||
"Undefined": "未定義",
|
||||
"Undo": "撤銷",
|
||||
"Unit": "單位",
|
||||
"UnitConversion": "單位轉換",
|
||||
"UnitConversionHelp": "單位轉換允許您轉換一般單位或僅針對特定食物。例如,您可以將 1 杯麵粉轉換為 125 克。如果單位有正確的基礎單位,Tandoor 然後可以在不同的重量或體積單位之間自動轉換。單位轉換用於屬性計算。",
|
||||
"UnitHelp": "單位與食物和數量一起構成食材。它們可以根據您的個人偏好命名,並連結到標準化單位以進行自動轉換。此外,它們在購物清單、轉換和屬性等許多地方為數量提供上下文。 ",
|
||||
"Unit_Alias": "單位別名",
|
||||
"Unit_Replace": "單位替換",
|
||||
"Units": "單位",
|
||||
"Unpin": "取消釘住",
|
||||
"UnpinnedConfirmation": "{recipe} 已取消固定。",
|
||||
"Unpin": "取消釘選",
|
||||
"UnpinnedConfirmation": "已取消釘選{recipe} 。",
|
||||
"Unrated": "未評分",
|
||||
"Update_Existing_Data": "更新現有數據",
|
||||
"Updated": "更新",
|
||||
"Up": "上",
|
||||
"Update": "更新",
|
||||
"Update_Existing_Data": "更新現有資料",
|
||||
"Updated": "已更新",
|
||||
"UpgradeNow": "立即升級",
|
||||
"Url": "網址",
|
||||
"UrlImportSubtitle": "從數千個支援的頁面匯入食譜。",
|
||||
"UrlList": "網址清單",
|
||||
"UrlListSubtitle": "自動匯入網址清單。",
|
||||
"Url_Import": "網址匯入",
|
||||
"Use_Fractions": "使用分數",
|
||||
"Use_Fractions_Help": "查看食譜時自動將小數轉換為分數。",
|
||||
"Use_Kj": "使用千焦",
|
||||
"Use_Kj": "使用千焦KJ替代千卡KCal",
|
||||
"Use_Metric": "使用公制",
|
||||
"Use_Plural_Food_Always": "總是使用複數食物",
|
||||
"Use_Plural_Food_Simple": "簡單使用複數食物",
|
||||
"Use_Plural_Unit_Always": "總是使用複數單位",
|
||||
"Use_Plural_Unit_Simple": "簡單使用複數單位",
|
||||
"User": "用戶",
|
||||
"UserFileHelp": "上傳到空間的檔案。 ",
|
||||
"UserHelp": "使用者是您空間的成員。 ",
|
||||
"Username": "用戶名",
|
||||
"Users": "用戶",
|
||||
"Valid Until": "有效期至",
|
||||
"View": "查看",
|
||||
"ViewLogHelp": "已檢視食譜的歷史記錄。 ",
|
||||
"View_Recipes": "查看食譜",
|
||||
"Viewed": "已檢視",
|
||||
"Waiting": "等待",
|
||||
"WaitingTime": "等待時間",
|
||||
"WarnPageLeave": "有未儲存的變更將會遺失。仍要離開頁面嗎?",
|
||||
"Warning": "警告",
|
||||
"WarningRecipeBookEntryDuplicate": "食譜只能新增一次到書中。",
|
||||
"Warning_Delete_Supermarket_Category": "刪除超市類別也會刪除與食品的所有關係。 你確定嗎?",
|
||||
"Website": "網站",
|
||||
"Wednesday": "星期三",
|
||||
"Week": "週",
|
||||
"Week_Numbers": "週數",
|
||||
"Welcome": "歡迎",
|
||||
"WorkingTime": "製作時間",
|
||||
"Year": "年",
|
||||
"YourSpaces": "您的空間",
|
||||
"active": "啟用",
|
||||
"add_keyword": "添加關鍵字",
|
||||
"additional_options": "附加選項",
|
||||
"advanced": "高級",
|
||||
"advanced_search_settings": "高級搜索設置",
|
||||
"advanced": "進階",
|
||||
"advanced_search_settings": "進階搜索設置",
|
||||
"after": "之後",
|
||||
"all": "全部",
|
||||
"all_fields_optional": "所有欄位都是可選的,可以留空。",
|
||||
"and": "和",
|
||||
"and_down": "及以下",
|
||||
"and_up": "及以上",
|
||||
"any": "任何",
|
||||
"asc": "升序",
|
||||
"base_amount": "基礎數量",
|
||||
"base_unit": "基礎單位",
|
||||
"before": "之前",
|
||||
"book_filter_help": "除手動選擇的食譜外,還包括篩選中的食譜。",
|
||||
"click_image_import": "點擊圖片匯入",
|
||||
"confirm_delete": "您確定要刪除這個{object}嗎?",
|
||||
@@ -409,109 +610,113 @@
|
||||
"converted_amount": "轉換數量",
|
||||
"converted_unit": "轉換單位",
|
||||
"copy_markdown_table": "複製 Markdown 表格",
|
||||
"copy_to_clipboard": "複製到剪貼板",
|
||||
"copy_to_new": "複製到新",
|
||||
"create_food_desc": "創建食物並將其鏈接到此食譜。",
|
||||
"create_rule": "創建規則",
|
||||
"create_title": "創建標題",
|
||||
"created_by": "創建者",
|
||||
"created_on": "創建於",
|
||||
"copy_to_clipboard": "複製到剪貼簿",
|
||||
"copy_to_new": "複製到新食譜",
|
||||
"create_food_desc": "建立食物並將其鏈接到此食譜。",
|
||||
"create_rule": "建立自動化規則",
|
||||
"create_title": "建立 {type}",
|
||||
"created_by": "建立者",
|
||||
"created_on": "建立於",
|
||||
"csv_delim_help": "用於 CSV 導出的分隔符。",
|
||||
"csv_delim_label": "CSV 分隔符標籤",
|
||||
"csv_prefix_help": "將清單複製到剪貼板時要添加的前綴。",
|
||||
"csv_prefix_help": "將清單複製到剪貼簿時要添加的前綴。",
|
||||
"csv_prefix_label": "CSV 前綴標籤",
|
||||
"date_created": "創建日期",
|
||||
"date_created": "建立日期",
|
||||
"date_viewed": "查看日期",
|
||||
"default_delay": "默認延遲",
|
||||
"default_delay_desc": "延遲購物清單條目的默認小時數。",
|
||||
"default_delay": "預設延遲小時",
|
||||
"default_delay_desc": "延遲購物清單條目的預設小時數。",
|
||||
"del_confirmation_tree": "你確定要刪除 {source} 及其所有子項嗎?",
|
||||
"delete_confirmation": "你確定要刪除 {source} 嗎?",
|
||||
"delete_title": "刪除標題",
|
||||
"delete_title": "刪除 {type}",
|
||||
"desc": "降序",
|
||||
"download_csv": "下載 CSV",
|
||||
"download_pdf": "下載 PDF",
|
||||
"edit_title": "編輯標題",
|
||||
"edit_title": "編輯 {type}",
|
||||
"empty_list": "列表為空。",
|
||||
"enable_expert": "啟用專家模式",
|
||||
"err_creating_resource": "創建資源時發生錯誤!",
|
||||
"err_creating_resource": "建立資源時發生錯誤!",
|
||||
"err_deleting_protected_resource": "您嘗試刪除的對象仍在使用中,無法刪除。",
|
||||
"err_deleting_resource": "刪除資源時發生錯誤!",
|
||||
"err_fetching_resource": "獲取資源時發生錯誤!",
|
||||
"err_importing_recipe": "匯入食譜時發生錯誤!",
|
||||
"err_merge_self": "錯誤合併自己",
|
||||
"err_merge_self": "無法合併自身項目",
|
||||
"err_merging_resource": "合併資源時發生錯誤!",
|
||||
"err_move_self": "錯誤移動自己",
|
||||
"err_move_self": "無法移動自身項目",
|
||||
"err_moving_resource": "移動資源時發生錯誤!",
|
||||
"err_updating_resource": "更新資源時發生錯誤!",
|
||||
"exact": "精確",
|
||||
"exclude": "排除",
|
||||
"expert_mode": "專家模式",
|
||||
"explain": "解釋",
|
||||
"fields": "字段",
|
||||
"fields": "欄位",
|
||||
"file_upload_disabled": "您的空間未啟用檔案上傳功能。",
|
||||
"filter": "篩選",
|
||||
"filter_name": "篩選器名稱",
|
||||
"filter_to_supermarket": "篩選到超市",
|
||||
"filter_to_supermarket_desc": "默認情況下,過濾購物清單只包括所選超市的類別。",
|
||||
"fluid_ounce": "液盎司",
|
||||
"filter_to_supermarket_desc": "預設情況下,篩選購物清單只包括所選超市的類別。",
|
||||
"fluid_ounce": "液體盎司 [fl oz](美國,容量單位)",
|
||||
"food_inherit_info": "食物上應該預設繼承的欄位。",
|
||||
"food_recipe_help": "食物食譜幫助",
|
||||
"g": "克",
|
||||
"gallon": "加侖",
|
||||
"food_recipe_help": "在此處連結食譜將使任何使用此食材的其他食譜,包含該連結的食譜",
|
||||
"g": "克 [g](公制,重量單位)",
|
||||
"gallon": "加侖 [gal](美國,容量單位)",
|
||||
"hide_step_ingredients": "隱藏步驟食材",
|
||||
"ignore_shopping_help": "忽略購物幫助",
|
||||
"imperial_fluid_ounce": "英制液盎司",
|
||||
"imperial_gallon": "英制加侖",
|
||||
"imperial_pint": "英制品脫",
|
||||
"imperial_quart": "英制夸脫",
|
||||
"imperial_tbsp": "英制湯匙",
|
||||
"imperial_tsp": "英制茶匙",
|
||||
"import_duplicates": "為防止食譜與現有食譜同名,將被忽略。 選中此框以導入所有內容。",
|
||||
"hours": "小時",
|
||||
"ignore_shopping_help": "購物清單中忽略食物項目 (例:水)",
|
||||
"imperial_fluid_ounce": "英制液體盎司 [imp fl oz](英國,容量單位)",
|
||||
"imperial_gallon": "英制加侖 [imp gal](英國,容量單位)",
|
||||
"imperial_pint": "英制品脫 [imp pt](英國,容量單位)",
|
||||
"imperial_quart": "英制夸脫 [imp qt](英國,容量單位)",
|
||||
"imperial_tbsp": "英制湯匙 [imp tbsp](英國,容量單位)",
|
||||
"imperial_tsp": "英制茶匙 [imp tsp](英國,容量單位)",
|
||||
"import_duplicates": "為了防止重複,與現有食譜同名的食譜將被忽略。勾選此框以導入所有內容。",
|
||||
"import_running": "正在進行匯入,請稍候!",
|
||||
"in_shopping": "在購物中",
|
||||
"in_shopping": "在購物清單中",
|
||||
"ingredient_list": "食材清單",
|
||||
"kg": "千克",
|
||||
"l": "升",
|
||||
"kg": "公斤",
|
||||
"l": "公升",
|
||||
"last_cooked": "最後烹飪",
|
||||
"last_viewed": "最後查看",
|
||||
"left_handed": "左撇子",
|
||||
"left_handed": "左手模式",
|
||||
"left_handed_help": "將使用左手模式優化界面顯示。",
|
||||
"make_now": "立即製作",
|
||||
"make_now_count": "立即製作次數",
|
||||
"make_now_count": "最多缺少的成分",
|
||||
"mark_complete": "標記完成",
|
||||
"mealplan_autoadd_shopping": "餐計劃自動添加購物",
|
||||
"mealplan_autoadd_shopping_desc": "自動將膳食計劃食材添加到購物清單中。",
|
||||
"mealplan_autoexclude_onhand": "餐計劃自動排除手頭有的",
|
||||
"mealplan_autoexclude_onhand_desc": "將膳食計劃添加到購物清單時(手動或自動),排除當前手頭上的食材。",
|
||||
"mealplan_autoinclude_related": "餐計劃自動包含相關",
|
||||
"mealplan_autoinclude_related_desc": "將膳食計劃(手動或自動)添加到購物清單時,包括所有相關食譜。",
|
||||
"mealplan_autoadd_shopping": "餐飲計劃自動添加購物",
|
||||
"mealplan_autoadd_shopping_desc": "自動將餐飲計劃食材添加到購物清單中。",
|
||||
"mealplan_autoexclude_onhand": "餐飲計劃自動排除手頭有的",
|
||||
"mealplan_autoexclude_onhand_desc": "將餐飲計劃添加到購物清單時(手動或自動),排除當前手頭上的食材。",
|
||||
"mealplan_autoinclude_related": "增加相關食譜",
|
||||
"mealplan_autoinclude_related_desc": "將餐飲計劃(手動或自動)添加到購物清單時,包括所有相關食譜。",
|
||||
"merge_confirmation": "將 <i>{source}</i> 替換為 <i>{target}</i>",
|
||||
"merge_selection": "將所有出現的 {source} 替換為 {type}。",
|
||||
"merge_title": "合併標題",
|
||||
"merge_title": "合併 {type}",
|
||||
"min": "分鐘",
|
||||
"ml": "毫升",
|
||||
"move_confirmation": "移動 <i>{child}</i> 到 <i>{parent}</i>",
|
||||
"move_selection": "選擇要將 {source} 移動到的父級 {type}。",
|
||||
"move_title": "移動標題",
|
||||
"move_title": "移動 {type}",
|
||||
"no_more_images_found": "沒有在網站上找到其他圖片。",
|
||||
"no_pinned_recipes": "你沒有固定的食譜!",
|
||||
"no_pinned_recipes": "你沒有已釘選的食譜!",
|
||||
"not": "不是",
|
||||
"nothing": "無",
|
||||
"nothing_planned_today": "你今天沒有任何計劃!",
|
||||
"nothing": "無事可做",
|
||||
"nothing_planned_today": "你今天沒有任何排定計劃!",
|
||||
"on": "在",
|
||||
"one_url_per_line": "每行一個網址",
|
||||
"open_data_help_text": "Tandoor開放數據項目為Tandoor提供社區貢獻的數據。該字段在導入時會自動填充,並可以之後更新。",
|
||||
"open_data_help_text": "Tandoor開放資料項目為Tandoor提供社群貢獻的資料。該欄位在匯入時會自動填充,並可以之後更新。",
|
||||
"or": "或",
|
||||
"ounce": "盎司",
|
||||
"parameter_count": "參數計數",
|
||||
"paste_ingredients": "粘貼食材",
|
||||
"paste_ingredients_placeholder": "在此處粘貼食材表...",
|
||||
"paste_json": "在此處粘貼 json 或 html 源代碼以加載食譜。",
|
||||
"ounce": "盎司 [oz](重量)",
|
||||
"parameter_count": "參數 {count}",
|
||||
"paste_ingredients": "貼上食材",
|
||||
"paste_ingredients_placeholder": "在此處貼上食材表...",
|
||||
"paste_json": "在此處貼上 json 或 html 原始碼以匯入食譜。",
|
||||
"per_serving": "每份",
|
||||
"pint": "品脫",
|
||||
"plan_share_desc": "新的膳食計劃條目將自動與選定的用戶共享。",
|
||||
"plural_short": "複數簡寫",
|
||||
"pint": "品脫 [pt](美國,容量單位)",
|
||||
"plan_share_desc": "新的餐飲計劃條目將自動與選定的用戶共享。",
|
||||
"plural_short": "複數簡稱",
|
||||
"plural_usage_info": "在此空間內使用複數形式表示單位和食物。",
|
||||
"pound": "磅",
|
||||
"property_type_fdc_hint": "屬性類型 FDC 提示",
|
||||
"quart": "夸脫",
|
||||
"property_type_fdc_hint": "只有具有 FDC ID 的屬性類型才能自動從 FDC 資料庫中取出資料",
|
||||
"quart": "夸脫 [qt](美國,容量單位)",
|
||||
"recipe_filter": "食譜篩選器",
|
||||
"recipe_name": "食譜名稱",
|
||||
"recipe_property_info": "您也可以為食材添加屬性,以便根據您的食譜自動計算它們!",
|
||||
@@ -520,16 +725,22 @@
|
||||
"remember_search": "記住搜索",
|
||||
"remove_selection": "移除選擇",
|
||||
"reset_children": "重置子項",
|
||||
"reset_children_help": "用繼承字段中的值覆蓋所有子項。 繼承的子字段將設置為繼承,除非它們已設置為繼承。",
|
||||
"reset_children_help": "用繼承字段中的值覆蓋所有子項。繼承的子字段將設置為繼承,除非它們已設置為繼承。",
|
||||
"reset_food_inheritance": "重置食物繼承",
|
||||
"reset_food_inheritance_info": "將所有食物重置為默認繼承字段及其父值。",
|
||||
"reset_food_inheritance_info": "將所有食物重置為預設繼承欄位及其父值。",
|
||||
"reusable_help_text": "邀請鏈接是否可用於多個用戶。",
|
||||
"review_shopping": "審查購物",
|
||||
"save_filter": "保存篩選器",
|
||||
"search_create_help_text": "直接在 Tandoor 中創建新食譜。",
|
||||
"search_import_help_text": "從外部網站或應用程序導入食譜。",
|
||||
"review_shopping": "在儲存之前檢查購物條目",
|
||||
"save_filter": "儲存篩選器",
|
||||
"searchFilterCreatedByHelp": "由選定用戶建立的食譜。",
|
||||
"searchFilterObjectsAndHelp": "包含所有選定 {type} 的食譜",
|
||||
"searchFilterObjectsAndNotHelp": "排除所有選定 {type} 的食譜",
|
||||
"searchFilterObjectsHelp": "包含任何選定 {type} 的食譜",
|
||||
"searchFilterObjectsOrNotHelp": "只有所有食材(或其替代品)標記為現有的食譜。",
|
||||
"search_create_help_text": "直接在 Tandoor 中建立新食譜。",
|
||||
"search_import_help_text": "從外部網站或應用程式匯入食譜。",
|
||||
"search_no_recipes": "找不到任何食譜!",
|
||||
"search_rank": "搜索排名",
|
||||
"seconds": "秒",
|
||||
"select_file": "選擇文件",
|
||||
"select_food": "選擇食物",
|
||||
"select_keyword": "選擇關鍵字",
|
||||
@@ -539,12 +750,12 @@
|
||||
"shopping_add_onhand": "購物添加手頭有的",
|
||||
"shopping_add_onhand_desc": "在核對購物清單時,將食物標記為“入手”。",
|
||||
"shopping_auto_sync": "購物自動同步",
|
||||
"shopping_auto_sync_desc": "設置為0將禁用自動同步。當查看購物列表時,該列表每隔一秒更新一次,以同步其他人可能做出的更改。在多人購物時很有用,但會使用移動數據。",
|
||||
"shopping_auto_sync_desc": "設定為0將停用自動同步。當查看購物清單時,該清單每隔一秒更新一次,以同步其他人可能做出的更改。在多人購物時很有用,但會使用行動網路流量。",
|
||||
"shopping_category_help": "超市可以按購物分類進行篩選使其與商店的內部佈局相匹配。",
|
||||
"shopping_recent_days": "購物最近天數",
|
||||
"shopping_recent_days_desc": "顯示最近幾天的購物清單列表。",
|
||||
"shopping_share": "購物分享",
|
||||
"shopping_share_desc": "用戶將看到您添加到購物清單中的所有商品。他們必須添加你才能看到他們清單上的內容。",
|
||||
"shopping_recent_days": "最近天數",
|
||||
"shopping_recent_days_desc": "顯示最近幾天的購物清單清單。 ",
|
||||
"shopping_share": "分享購物清單",
|
||||
"shopping_share_desc": "用戶將看到您添加到購物清單中的所有商品。他們必須添加您,才能看到他們清單上的內容。",
|
||||
"show_books": "顯示書籍",
|
||||
"show_filters": "顯示篩選器",
|
||||
"show_foods": "顯示食物",
|
||||
@@ -556,36 +767,41 @@
|
||||
"show_sortby": "顯示排序依據",
|
||||
"show_split_screen": "分割視圖",
|
||||
"show_sql": "顯示 SQL",
|
||||
"show_step_ingredients": "顯示步驟食材",
|
||||
"show_step_ingredients_setting": "顯示步驟食材設置",
|
||||
"show_step_ingredients_setting_help": "在食譜步驟旁邊添加成分表。在創建時應用。可以在編輯配方視圖中覆蓋。",
|
||||
"show_step_ingredients": "顯示食譜步驟食材",
|
||||
"show_step_ingredients_setting": "在食譜步驟旁顯示成分",
|
||||
"show_step_ingredients_setting_help": "在食譜步驟旁邊呈現成分表。在建立時套用。可以在編輯配方視圖中覆蓋。",
|
||||
"show_units": "顯示單位",
|
||||
"simple_mode": "簡單模式",
|
||||
"simple_mode": "簡易模式",
|
||||
"sort_by": "排序依據",
|
||||
"sql_debug": "SQL 調試",
|
||||
"sql_debug": "SQL 除錯",
|
||||
"step_time_minutes": "步驟時間(以分鐘為單位)",
|
||||
"substitute_children": "替代子項",
|
||||
"substitute_children_help": "所有與這種食物相同子級的食物都被視作替代品。",
|
||||
"substitute_help": "搜索可以用現有食材製作的食譜時,會考慮替代品。",
|
||||
"substitute_siblings": "替代兄弟項",
|
||||
"substitute_siblings_help": "所有與這種食物相同父級的食物都被視作替代品。",
|
||||
"success_creating_resource": "成功創建資源!",
|
||||
"success_creating_resource": "成功建立資源!",
|
||||
"success_deleting_resource": "成功刪除資源!",
|
||||
"success_fetching_resource": "成功獲取資源!",
|
||||
"success_merging_resource": "成功合併資源!",
|
||||
"success_moving_resource": "成功移動資源!",
|
||||
"success_updating_resource": "成功更新資源!",
|
||||
"tbsp": "湯匙",
|
||||
"tbsp": "湯匙 [tbsp](美國,容量單位)",
|
||||
"theUsernameCannotBeChanged": "使用者名稱無法變更。",
|
||||
"times_cooked": "烹飪次數",
|
||||
"to_close": "關閉",
|
||||
"to_navigate": "導覽",
|
||||
"to_select": "選擇",
|
||||
"today_recipes": "今天的食譜",
|
||||
"total": "總計",
|
||||
"tree_root": "樹根",
|
||||
"tree_select": "樹選擇",
|
||||
"tsp": "茶匙",
|
||||
"tree_root": "樹的根節點",
|
||||
"tree_select": "使用樹形選擇",
|
||||
"tsp": "茶匙 [tsp](美國,容量單位)",
|
||||
"unsaved": "未儲存",
|
||||
"updatedon": "更新於",
|
||||
"us_cup": "美制杯",
|
||||
"view_recipe": "查看食譜",
|
||||
"warning_duplicate_filter": "警告:由於技術限制,使用相同組合(和/或/不)的多個篩選器可能會產生意想不到的結果。",
|
||||
"warning_feature_beta": "此功能目前處於測試階段 (BETA)。使用此功能時,請預期可能會有漏洞和破壞性變更,未來可能會丟失與功能相關的數據。",
|
||||
"warning_space_delete": "您可以刪除您的空間,包括所有食譜、購物清單、餐飲計畫以及其他您創建的內容。此操作無法撤銷!您確定要這樣做嗎?"
|
||||
"warning_feature_beta": "此功能目前處於測試階段 (BETA)。使用此功能時,請預期可能會有漏洞和破壞性變更,未來可能會丟失與功能相關的資料。",
|
||||
"warning_space_delete": "您可以刪除您的空間,包括所有食譜、購物清單、餐飲計畫以及其他您建立的內容。此操作無法撤銷!您確定要這樣做嗎?"
|
||||
}
|
||||
@@ -64,13 +64,6 @@ models/PaginatedInviteLinkList.ts
|
||||
models/PaginatedKeywordList.ts
|
||||
models/PaginatedMealPlanList.ts
|
||||
models/PaginatedMealTypeList.ts
|
||||
models/PaginatedOpenDataCategoryList.ts
|
||||
models/PaginatedOpenDataConversionList.ts
|
||||
models/PaginatedOpenDataFoodList.ts
|
||||
models/PaginatedOpenDataPropertyList.ts
|
||||
models/PaginatedOpenDataStoreList.ts
|
||||
models/PaginatedOpenDataUnitList.ts
|
||||
models/PaginatedOpenDataVersionList.ts
|
||||
models/PaginatedPropertyList.ts
|
||||
models/PaginatedPropertyTypeList.ts
|
||||
models/PaginatedRecipeBookEntryList.ts
|
||||
|
||||
@@ -60,13 +60,6 @@ import type {
|
||||
PaginatedKeywordList,
|
||||
PaginatedMealPlanList,
|
||||
PaginatedMealTypeList,
|
||||
PaginatedOpenDataCategoryList,
|
||||
PaginatedOpenDataConversionList,
|
||||
PaginatedOpenDataFoodList,
|
||||
PaginatedOpenDataPropertyList,
|
||||
PaginatedOpenDataStoreList,
|
||||
PaginatedOpenDataUnitList,
|
||||
PaginatedOpenDataVersionList,
|
||||
PaginatedPropertyList,
|
||||
PaginatedPropertyTypeList,
|
||||
PaginatedRecipeBookEntryList,
|
||||
@@ -259,20 +252,6 @@ import {
|
||||
PaginatedMealPlanListToJSON,
|
||||
PaginatedMealTypeListFromJSON,
|
||||
PaginatedMealTypeListToJSON,
|
||||
PaginatedOpenDataCategoryListFromJSON,
|
||||
PaginatedOpenDataCategoryListToJSON,
|
||||
PaginatedOpenDataConversionListFromJSON,
|
||||
PaginatedOpenDataConversionListToJSON,
|
||||
PaginatedOpenDataFoodListFromJSON,
|
||||
PaginatedOpenDataFoodListToJSON,
|
||||
PaginatedOpenDataPropertyListFromJSON,
|
||||
PaginatedOpenDataPropertyListToJSON,
|
||||
PaginatedOpenDataStoreListFromJSON,
|
||||
PaginatedOpenDataStoreListToJSON,
|
||||
PaginatedOpenDataUnitListFromJSON,
|
||||
PaginatedOpenDataUnitListToJSON,
|
||||
PaginatedOpenDataVersionListFromJSON,
|
||||
PaginatedOpenDataVersionListToJSON,
|
||||
PaginatedPropertyListFromJSON,
|
||||
PaginatedPropertyListToJSON,
|
||||
PaginatedPropertyTypeListFromJSON,
|
||||
@@ -500,6 +479,7 @@ export interface ApiAccessTokenUpdateRequest {
|
||||
export interface ApiAiImportCreateRequest {
|
||||
file: string | null;
|
||||
text: string | null;
|
||||
recipeId: string | null;
|
||||
}
|
||||
|
||||
export interface ApiAutoPlanCreateRequest {
|
||||
@@ -762,6 +742,7 @@ export interface ApiGroupRetrieveRequest {
|
||||
export interface ApiImportCreateRequest {
|
||||
file: string | null;
|
||||
text: string | null;
|
||||
recipeId: string | null;
|
||||
}
|
||||
|
||||
export interface ApiImportLogCreateRequest {
|
||||
@@ -829,7 +810,7 @@ export interface ApiIngredientUpdateRequest {
|
||||
}
|
||||
|
||||
export interface ApiInviteLinkCreateRequest {
|
||||
inviteLink: Omit<InviteLink, 'uuid'|'createdBy'|'createdAt'>;
|
||||
inviteLink: Omit<InviteLink, 'uuid'|'usedBy'|'createdBy'|'createdAt'>;
|
||||
}
|
||||
|
||||
export interface ApiInviteLinkDestroyRequest {
|
||||
@@ -843,12 +824,13 @@ export interface ApiInviteLinkListRequest {
|
||||
pageSize?: number;
|
||||
query?: string;
|
||||
random?: string;
|
||||
unused?: boolean;
|
||||
updatedAt?: string;
|
||||
}
|
||||
|
||||
export interface ApiInviteLinkPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedInviteLink?: Omit<PatchedInviteLink, 'uuid'|'createdBy'|'createdAt'>;
|
||||
patchedInviteLink?: Omit<PatchedInviteLink, 'uuid'|'usedBy'|'createdBy'|'createdAt'>;
|
||||
}
|
||||
|
||||
export interface ApiInviteLinkRetrieveRequest {
|
||||
@@ -857,7 +839,7 @@ export interface ApiInviteLinkRetrieveRequest {
|
||||
|
||||
export interface ApiInviteLinkUpdateRequest {
|
||||
id: number;
|
||||
inviteLink: Omit<InviteLink, 'uuid'|'createdBy'|'createdAt'>;
|
||||
inviteLink: Omit<InviteLink, 'uuid'|'usedBy'|'createdBy'|'createdAt'>;
|
||||
}
|
||||
|
||||
export interface ApiKeywordCreateRequest {
|
||||
@@ -976,11 +958,6 @@ export interface ApiOpenDataCategoryDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataCategoryListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataCategoryPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataCategory?: Omit<PatchedOpenDataCategory, 'createdBy'>;
|
||||
@@ -1003,11 +980,6 @@ export interface ApiOpenDataConversionDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataConversionListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataConversionPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataConversion?: Omit<PatchedOpenDataConversion, 'createdBy'>;
|
||||
@@ -1034,16 +1006,6 @@ export interface ApiOpenDataFoodDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataFoodFdcCreateRequest {
|
||||
id: number;
|
||||
openDataFood: Omit<OpenDataFood, 'createdBy'>;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataFoodListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataFoodPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataFood?: Omit<PatchedOpenDataFood, 'createdBy'>;
|
||||
@@ -1066,11 +1028,6 @@ export interface ApiOpenDataPropertyDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataPropertyListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataPropertyPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataProperty?: Omit<PatchedOpenDataProperty, 'createdBy'>;
|
||||
@@ -1093,11 +1050,6 @@ export interface ApiOpenDataStoreDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataStoreListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataStorePartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataStore?: Omit<PatchedOpenDataStore, 'createdBy'>;
|
||||
@@ -1120,11 +1072,6 @@ export interface ApiOpenDataUnitDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataUnitListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataUnitPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataUnit?: Omit<PatchedOpenDataUnit, 'createdBy'>;
|
||||
@@ -1147,11 +1094,6 @@ export interface ApiOpenDataVersionDestroyRequest {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataVersionListRequest {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}
|
||||
|
||||
export interface ApiOpenDataVersionPartialUpdateRequest {
|
||||
id: number;
|
||||
patchedOpenDataVersion?: PatchedOpenDataVersion;
|
||||
@@ -2147,6 +2089,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
);
|
||||
}
|
||||
|
||||
if (requestParameters['recipeId'] == null) {
|
||||
throw new runtime.RequiredError(
|
||||
'recipeId',
|
||||
'Required parameter "recipeId" was null or undefined when calling apiAiImportCreate().'
|
||||
);
|
||||
}
|
||||
|
||||
const queryParameters: any = {};
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
@@ -2177,6 +2126,10 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
formParams.append('text', requestParameters['text'] as any);
|
||||
}
|
||||
|
||||
if (requestParameters['recipeId'] != null) {
|
||||
formParams.append('recipe_id', requestParameters['recipeId'] as any);
|
||||
}
|
||||
|
||||
const response = await this.request({
|
||||
path: `/api/ai-import/`,
|
||||
method: 'POST',
|
||||
@@ -4485,6 +4438,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
);
|
||||
}
|
||||
|
||||
if (requestParameters['recipeId'] == null) {
|
||||
throw new runtime.RequiredError(
|
||||
'recipeId',
|
||||
'Required parameter "recipeId" was null or undefined when calling apiImportCreate().'
|
||||
);
|
||||
}
|
||||
|
||||
const queryParameters: any = {};
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
@@ -4515,6 +4475,10 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
formParams.append('text', requestParameters['text'] as any);
|
||||
}
|
||||
|
||||
if (requestParameters['recipeId'] != null) {
|
||||
formParams.append('recipe_id', requestParameters['recipeId'] as any);
|
||||
}
|
||||
|
||||
const response = await this.request({
|
||||
path: `/api/import/`,
|
||||
method: 'POST',
|
||||
@@ -5227,6 +5191,10 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
queryParameters['random'] = requestParameters['random'];
|
||||
}
|
||||
|
||||
if (requestParameters['unused'] != null) {
|
||||
queryParameters['unused'] = requestParameters['unused'];
|
||||
}
|
||||
|
||||
if (requestParameters['updatedAt'] != null) {
|
||||
queryParameters['updated_at'] = requestParameters['updatedAt'];
|
||||
}
|
||||
@@ -6385,17 +6353,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataCategoryListRaw(requestParameters: ApiOpenDataCategoryListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataCategoryList>> {
|
||||
async apiOpenDataCategoryListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataCategory>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -6409,13 +6369,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataCategoryListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataCategoryFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataCategoryList(requestParameters: ApiOpenDataCategoryListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataCategoryList> {
|
||||
const response = await this.apiOpenDataCategoryListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataCategoryList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataCategory>> {
|
||||
const response = await this.apiOpenDataCategoryListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -6611,17 +6571,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataConversionListRaw(requestParameters: ApiOpenDataConversionListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataConversionList>> {
|
||||
async apiOpenDataConversionListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataConversion>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -6635,13 +6587,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataConversionListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataConversionFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataConversionList(requestParameters: ApiOpenDataConversionListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataConversionList> {
|
||||
const response = await this.apiOpenDataConversionListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataConversionList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataConversion>> {
|
||||
const response = await this.apiOpenDataConversionListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -6870,67 +6822,12 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
}
|
||||
|
||||
/**
|
||||
* updates the food with all possible data from the FDC Api if properties with a fdc_id already exist they will be overridden, if existing properties don\'t have a fdc_id they won\'t be changed
|
||||
*/
|
||||
async apiOpenDataFoodFdcCreateRaw(requestParameters: ApiOpenDataFoodFdcCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OpenDataFood>> {
|
||||
if (requestParameters['id'] == null) {
|
||||
throw new runtime.RequiredError(
|
||||
'id',
|
||||
'Required parameter "id" was null or undefined when calling apiOpenDataFoodFdcCreate().'
|
||||
);
|
||||
}
|
||||
|
||||
if (requestParameters['openDataFood'] == null) {
|
||||
throw new runtime.RequiredError(
|
||||
'openDataFood',
|
||||
'Required parameter "openDataFood" was null or undefined when calling apiOpenDataFoodFdcCreate().'
|
||||
);
|
||||
}
|
||||
|
||||
async apiOpenDataFoodListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataFood>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
headerParameters['Content-Type'] = 'application/json';
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication
|
||||
}
|
||||
|
||||
const response = await this.request({
|
||||
path: `/api/open-data-food/{id}/fdc/`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
|
||||
method: 'POST',
|
||||
headers: headerParameters,
|
||||
query: queryParameters,
|
||||
body: OpenDataFoodToJSON(requestParameters['openDataFood']),
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => OpenDataFoodFromJSON(jsonValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* updates the food with all possible data from the FDC Api if properties with a fdc_id already exist they will be overridden, if existing properties don\'t have a fdc_id they won\'t be changed
|
||||
*/
|
||||
async apiOpenDataFoodFdcCreate(requestParameters: ApiOpenDataFoodFdcCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OpenDataFood> {
|
||||
const response = await this.apiOpenDataFoodFdcCreateRaw(requestParameters, initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataFoodListRaw(requestParameters: ApiOpenDataFoodListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataFoodList>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication
|
||||
}
|
||||
@@ -6942,13 +6839,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataFoodListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataFoodFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataFoodList(requestParameters: ApiOpenDataFoodListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataFoodList> {
|
||||
const response = await this.apiOpenDataFoodListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataFoodList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataFood>> {
|
||||
const response = await this.apiOpenDataFoodListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -7144,17 +7041,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataPropertyListRaw(requestParameters: ApiOpenDataPropertyListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataPropertyList>> {
|
||||
async apiOpenDataPropertyListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataProperty>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -7168,13 +7057,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataPropertyListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataPropertyFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataPropertyList(requestParameters: ApiOpenDataPropertyListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataPropertyList> {
|
||||
const response = await this.apiOpenDataPropertyListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataPropertyList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataProperty>> {
|
||||
const response = await this.apiOpenDataPropertyListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -7397,17 +7286,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataStoreListRaw(requestParameters: ApiOpenDataStoreListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataStoreList>> {
|
||||
async apiOpenDataStoreListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataStore>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -7421,13 +7302,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataStoreListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataStoreFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataStoreList(requestParameters: ApiOpenDataStoreListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataStoreList> {
|
||||
const response = await this.apiOpenDataStoreListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataStoreList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataStore>> {
|
||||
const response = await this.apiOpenDataStoreListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -7623,17 +7504,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataUnitListRaw(requestParameters: ApiOpenDataUnitListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataUnitList>> {
|
||||
async apiOpenDataUnitListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataUnit>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -7647,13 +7520,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataUnitListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataUnitFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataUnitList(requestParameters: ApiOpenDataUnitListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataUnitList> {
|
||||
const response = await this.apiOpenDataUnitListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataUnitList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataUnit>> {
|
||||
const response = await this.apiOpenDataUnitListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
@@ -7849,17 +7722,9 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataVersionListRaw(requestParameters: ApiOpenDataVersionListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedOpenDataVersionList>> {
|
||||
async apiOpenDataVersionListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OpenDataVersion>>> {
|
||||
const queryParameters: any = {};
|
||||
|
||||
if (requestParameters['page'] != null) {
|
||||
queryParameters['page'] = requestParameters['page'];
|
||||
}
|
||||
|
||||
if (requestParameters['pageSize'] != null) {
|
||||
queryParameters['page_size'] = requestParameters['pageSize'];
|
||||
}
|
||||
|
||||
const headerParameters: runtime.HTTPHeaders = {};
|
||||
|
||||
if (this.configuration && this.configuration.apiKey) {
|
||||
@@ -7873,13 +7738,13 @@ export class ApiApi extends runtime.BaseAPI {
|
||||
query: queryParameters,
|
||||
}, initOverrides);
|
||||
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedOpenDataVersionListFromJSON(jsonValue));
|
||||
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OpenDataVersionFromJSON));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
async apiOpenDataVersionList(requestParameters: ApiOpenDataVersionListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedOpenDataVersionList> {
|
||||
const response = await this.apiOpenDataVersionListRaw(requestParameters, initOverrides);
|
||||
async apiOpenDataVersionList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OpenDataVersion>> {
|
||||
const response = await this.apiOpenDataVersionListRaw(initOverrides);
|
||||
return await response.value();
|
||||
}
|
||||
|
||||
|
||||
@@ -14,47 +14,43 @@
|
||||
|
||||
|
||||
/**
|
||||
* * `g` - g
|
||||
* * `kg` - kg
|
||||
* * `ounce` - ounce
|
||||
* * `pound` - pound
|
||||
* * `ml` - ml
|
||||
* * `l` - l
|
||||
* * `fluid_ounce` - fluid_ounce
|
||||
* * `pint` - pint
|
||||
* * `quart` - quart
|
||||
* * `gallon` - gallon
|
||||
* * `tbsp` - tbsp
|
||||
* * `tsp` - tsp
|
||||
* * `us_cup` - US Cup
|
||||
* * `imperial_fluid_ounce` - imperial fluid ounce
|
||||
* * `imperial_pint` - imperial pint
|
||||
* * `imperial_quart` - imperial quart
|
||||
* * `imperial_gallon` - imperial gallon
|
||||
* * `imperial_tbsp` - imperial tbsp
|
||||
* * `imperial_tsp` - imperial tsp
|
||||
* * `G` - g
|
||||
* * `KG` - kg
|
||||
* * `ML` - ml
|
||||
* * `L` - l
|
||||
* * `OUNCE` - ounce
|
||||
* * `POUND` - pound
|
||||
* * `FLUID_OUNCE` - fluid_ounce
|
||||
* * `TSP` - tsp
|
||||
* * `TBSP` - tbsp
|
||||
* * `CUP` - cup
|
||||
* * `PINT` - pint
|
||||
* * `QUART` - quart
|
||||
* * `GALLON` - gallon
|
||||
* * `IMPERIAL_FLUID_OUNCE` - imperial fluid ounce
|
||||
* * `IMPERIAL_PINT` - imperial pint
|
||||
* * `IMPERIAL_QUART` - imperial quart
|
||||
* * `IMPERIAL_GALLON` - imperial gallon
|
||||
* @export
|
||||
*/
|
||||
export const BaseUnitEnum = {
|
||||
G: 'g',
|
||||
Kg: 'kg',
|
||||
Ounce: 'ounce',
|
||||
Pound: 'pound',
|
||||
Ml: 'ml',
|
||||
L: 'l',
|
||||
FluidOunce: 'fluid_ounce',
|
||||
Pint: 'pint',
|
||||
Quart: 'quart',
|
||||
Gallon: 'gallon',
|
||||
Tbsp: 'tbsp',
|
||||
Tsp: 'tsp',
|
||||
UsCup: 'us_cup',
|
||||
ImperialFluidOunce: 'imperial_fluid_ounce',
|
||||
ImperialPint: 'imperial_pint',
|
||||
ImperialQuart: 'imperial_quart',
|
||||
ImperialGallon: 'imperial_gallon',
|
||||
ImperialTbsp: 'imperial_tbsp',
|
||||
ImperialTsp: 'imperial_tsp'
|
||||
G: 'G',
|
||||
Kg: 'KG',
|
||||
Ml: 'ML',
|
||||
L: 'L',
|
||||
Ounce: 'OUNCE',
|
||||
Pound: 'POUND',
|
||||
FluidOunce: 'FLUID_OUNCE',
|
||||
Tsp: 'TSP',
|
||||
Tbsp: 'TBSP',
|
||||
Cup: 'CUP',
|
||||
Pint: 'PINT',
|
||||
Quart: 'QUART',
|
||||
Gallon: 'GALLON',
|
||||
ImperialFluidOunce: 'IMPERIAL_FLUID_OUNCE',
|
||||
ImperialPint: 'IMPERIAL_PINT',
|
||||
ImperialQuart: 'IMPERIAL_QUART',
|
||||
ImperialGallon: 'IMPERIAL_GALLON'
|
||||
} as const;
|
||||
export type BaseUnitEnum = typeof BaseUnitEnum[keyof typeof BaseUnitEnum];
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ export interface InviteLink {
|
||||
* @type {number}
|
||||
* @memberof InviteLink
|
||||
*/
|
||||
usedBy?: number;
|
||||
readonly usedBy: number | null;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
@@ -94,6 +94,7 @@ export interface InviteLink {
|
||||
export function instanceOfInviteLink(value: object): value is InviteLink {
|
||||
if (!('uuid' in value) || value['uuid'] === undefined) return false;
|
||||
if (!('group' in value) || value['group'] === undefined) return false;
|
||||
if (!('usedBy' in value) || value['usedBy'] === undefined) return false;
|
||||
if (!('createdBy' in value) || value['createdBy'] === undefined) return false;
|
||||
if (!('createdAt' in value) || value['createdAt'] === undefined) return false;
|
||||
return true;
|
||||
@@ -114,7 +115,7 @@ export function InviteLinkFromJSONTyped(json: any, ignoreDiscriminator: boolean)
|
||||
'email': json['email'] == null ? undefined : json['email'],
|
||||
'group': GroupFromJSON(json['group']),
|
||||
'validUntil': json['valid_until'] == null ? undefined : (new Date(json['valid_until'])),
|
||||
'usedBy': json['used_by'] == null ? undefined : json['used_by'],
|
||||
'usedBy': json['used_by'],
|
||||
'reusable': json['reusable'] == null ? undefined : json['reusable'],
|
||||
'internalNote': json['internal_note'] == null ? undefined : json['internal_note'],
|
||||
'createdBy': json['created_by'],
|
||||
@@ -122,7 +123,7 @@ export function InviteLinkFromJSONTyped(json: any, ignoreDiscriminator: boolean)
|
||||
};
|
||||
}
|
||||
|
||||
export function InviteLinkToJSON(value?: Omit<InviteLink, 'uuid'|'createdBy'|'createdAt'> | null): any {
|
||||
export function InviteLinkToJSON(value?: Omit<InviteLink, 'uuid'|'usedBy'|'createdBy'|'createdAt'> | null): any {
|
||||
if (value == null) {
|
||||
return value;
|
||||
}
|
||||
@@ -132,7 +133,6 @@ export function InviteLinkToJSON(value?: Omit<InviteLink, 'uuid'|'createdBy'|'cr
|
||||
'email': value['email'],
|
||||
'group': GroupToJSON(value['group']),
|
||||
'valid_until': value['validUntil'] == null ? undefined : ((value['validUntil']).toISOString().substring(0,10)),
|
||||
'used_by': value['usedBy'],
|
||||
'reusable': value['reusable'],
|
||||
'internal_note': value['internalNote'],
|
||||
};
|
||||
|
||||
@@ -164,10 +164,10 @@ export interface OpenDataFood {
|
||||
propertiesSource?: string;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
* @type {string}
|
||||
* @memberof OpenDataFood
|
||||
*/
|
||||
fdcId?: number;
|
||||
fdcId: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@@ -193,6 +193,7 @@ export function instanceOfOpenDataFood(value: object): value is OpenDataFood {
|
||||
if (!('storeCategory' in value) || value['storeCategory'] === undefined) return false;
|
||||
if (!('properties' in value) || value['properties'] === undefined) return false;
|
||||
if (!('propertiesFoodUnit' in value) || value['propertiesFoodUnit'] === undefined) return false;
|
||||
if (!('fdcId' in value) || value['fdcId'] === undefined) return false;
|
||||
if (!('createdBy' in value) || value['createdBy'] === undefined) return false;
|
||||
return true;
|
||||
}
|
||||
@@ -221,7 +222,7 @@ export function OpenDataFoodFromJSONTyped(json: any, ignoreDiscriminator: boolea
|
||||
'propertiesFoodAmount': json['properties_food_amount'] == null ? undefined : json['properties_food_amount'],
|
||||
'propertiesFoodUnit': OpenDataUnitFromJSON(json['properties_food_unit']),
|
||||
'propertiesSource': json['properties_source'] == null ? undefined : json['properties_source'],
|
||||
'fdcId': json['fdc_id'] == null ? undefined : json['fdc_id'],
|
||||
'fdcId': json['fdc_id'],
|
||||
'comment': json['comment'] == null ? undefined : json['comment'],
|
||||
'createdBy': json['created_by'],
|
||||
};
|
||||
|
||||
@@ -61,7 +61,7 @@ export interface PatchedInviteLink {
|
||||
* @type {number}
|
||||
* @memberof PatchedInviteLink
|
||||
*/
|
||||
usedBy?: number;
|
||||
readonly usedBy?: number;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
@@ -118,7 +118,7 @@ export function PatchedInviteLinkFromJSONTyped(json: any, ignoreDiscriminator: b
|
||||
};
|
||||
}
|
||||
|
||||
export function PatchedInviteLinkToJSON(value?: Omit<PatchedInviteLink, 'uuid'|'createdBy'|'createdAt'> | null): any {
|
||||
export function PatchedInviteLinkToJSON(value?: Omit<PatchedInviteLink, 'uuid'|'usedBy'|'createdBy'|'createdAt'> | null): any {
|
||||
if (value == null) {
|
||||
return value;
|
||||
}
|
||||
@@ -128,7 +128,6 @@ export function PatchedInviteLinkToJSON(value?: Omit<PatchedInviteLink, 'uuid'|'
|
||||
'email': value['email'],
|
||||
'group': GroupToJSON(value['group']),
|
||||
'valid_until': value['validUntil'] == null ? undefined : ((value['validUntil']).toISOString().substring(0,10)),
|
||||
'used_by': value['usedBy'],
|
||||
'reusable': value['reusable'],
|
||||
'internal_note': value['internalNote'],
|
||||
};
|
||||
|
||||
@@ -164,10 +164,10 @@ export interface PatchedOpenDataFood {
|
||||
propertiesSource?: string;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
* @type {string}
|
||||
* @memberof PatchedOpenDataFood
|
||||
*/
|
||||
fdcId?: number;
|
||||
fdcId?: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
|
||||
@@ -62,13 +62,6 @@ export * from './PaginatedInviteLinkList';
|
||||
export * from './PaginatedKeywordList';
|
||||
export * from './PaginatedMealPlanList';
|
||||
export * from './PaginatedMealTypeList';
|
||||
export * from './PaginatedOpenDataCategoryList';
|
||||
export * from './PaginatedOpenDataConversionList';
|
||||
export * from './PaginatedOpenDataFoodList';
|
||||
export * from './PaginatedOpenDataPropertyList';
|
||||
export * from './PaginatedOpenDataStoreList';
|
||||
export * from './PaginatedOpenDataUnitList';
|
||||
export * from './PaginatedOpenDataVersionList';
|
||||
export * from './PaginatedPropertyList';
|
||||
export * from './PaginatedPropertyTypeList';
|
||||
export * from './PaginatedRecipeBookEntryList';
|
||||
|
||||
@@ -101,10 +101,12 @@ import ModelMergeDialog from "@/components/dialogs/ModelMergeDialog.vue";
|
||||
import {VDataTableUpdateOptions} from "@/vuetify";
|
||||
import SyncDialog from "@/components/dialogs/SyncDialog.vue";
|
||||
import {ApiApi, RecipeImport} from "@/openapi";
|
||||
import {useTitle} from "@vueuse/core";
|
||||
|
||||
const {t} = useI18n()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const title = useTitle()
|
||||
|
||||
const props = defineProps({
|
||||
model: {
|
||||
@@ -160,6 +162,8 @@ onBeforeMount(() => {
|
||||
genericModel.value = getGenericModelFromString('Food', t)
|
||||
}
|
||||
|
||||
title.value = t(genericModel.value.model.localizationKey)
|
||||
|
||||
if (typeof route.query.page == "string" && !isNaN(parseInt(route.query.page))) {
|
||||
tablePage.value = parseInt(route.query.page)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import {onMounted, ref, watch} from 'vue'
|
||||
import {ApiApi, ApiRecipeRetrieveRequest, Recipe, ViewLog} from "@/openapi";
|
||||
import RecipeView from "@/components/display/RecipeView.vue";
|
||||
import {useDisplay} from "vuetify";
|
||||
import {useUrlSearchParams} from "@vueuse/core";
|
||||
import {useTitle, useUrlSearchParams} from "@vueuse/core";
|
||||
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
|
||||
|
||||
@@ -20,6 +20,7 @@ const props = defineProps({
|
||||
|
||||
const params = useUrlSearchParams('history')
|
||||
const {mobile} = useDisplay()
|
||||
const title = useTitle()
|
||||
|
||||
const recipe = ref({} as Recipe)
|
||||
|
||||
@@ -42,6 +43,7 @@ function refreshData(recipeId: string) {
|
||||
|
||||
api.apiRecipeRetrieve(requestParameters).then(r => {
|
||||
recipe.value = r
|
||||
title.value = recipe.value.name
|
||||
|
||||
if (useUserPreferenceStore().isAuthenticated) {
|
||||
api.apiViewLogCreate({viewLog: {recipe: Number(recipeId)} as ViewLog})
|
||||
|
||||
@@ -244,9 +244,10 @@ function searchRecipes(options: VDataTableUpdateOptions) {
|
||||
let api = new ApiApi()
|
||||
loading.value = true
|
||||
|
||||
page.value = options.page
|
||||
let searchParameters = {
|
||||
query: query.value,
|
||||
page: page.value,
|
||||
page: options.page,
|
||||
pageSize: pageSize.value,
|
||||
} as ApiRecipeListRequest
|
||||
|
||||
@@ -268,7 +269,7 @@ function searchRecipes(options: VDataTableUpdateOptions) {
|
||||
}
|
||||
|
||||
/**
|
||||
* reset all search parameters and perform emtpy searchj
|
||||
* reset all search parameters and perform emtpy search
|
||||
*/
|
||||
function reset() {
|
||||
page.value = 1
|
||||
|
||||
@@ -16,10 +16,10 @@ export enum MessageType {
|
||||
|
||||
/** @enum {string} pre defined error messages */
|
||||
export enum ErrorMessageType {
|
||||
FETCH_ERROR = 'Fehler beim Laden',
|
||||
UPDATE_ERROR = 'Fehler beim Aktualisieren',
|
||||
DELETE_ERROR = 'Fehler beim Löschen',
|
||||
CREATE_ERROR = 'Fehler beim Erstellen',
|
||||
FETCH_ERROR = 'FETCH_ERROR',
|
||||
UPDATE_ERROR = 'UPDATE_ERROR',
|
||||
DELETE_ERROR = 'DELETE_ERROR',
|
||||
CREATE_ERROR = 'CREATE_ERROR',
|
||||
}
|
||||
|
||||
/** @enum {MessageType} prepared messages */
|
||||
@@ -117,18 +117,18 @@ export const useMessageStore = defineStore('message_store', () => {
|
||||
messageText += ` - ${key}: ${flatResponseJson[key]}\n`
|
||||
}
|
||||
addMessage(MessageType.ERROR, {
|
||||
title: `${errorType} - ${data.response.statusText} (${data.response.status})`,
|
||||
title: `${t(errorType)} - ${data.response.statusText} (${data.response.status})`,
|
||||
text: messageText
|
||||
} as StructuredMessage, 5000 + Object.keys(responseJson).length * 1500, responseJson)
|
||||
}).catch(() => {
|
||||
// if response does not contain parsable JSON or parsing fails for some other reason show generic error
|
||||
addMessage(MessageType.ERROR, {title: errorType, text: ''} as StructuredMessage, 7000, data)
|
||||
addMessage(MessageType.ERROR, {title: t(errorType), text: ''} as StructuredMessage, 7000, data)
|
||||
})
|
||||
} catch (e) {
|
||||
addMessage(MessageType.ERROR, {title: errorType, text: ''} as StructuredMessage, 7000, data)
|
||||
addMessage(MessageType.ERROR, {title: t(errorType), text: ''} as StructuredMessage, 7000, data)
|
||||
}
|
||||
} else {
|
||||
addMessage(MessageType.ERROR, {title: errorType, text: ''} as StructuredMessage, 7000, data)
|
||||
addMessage(MessageType.ERROR, {title: t(errorType), text: ''} as StructuredMessage, 7000, data)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import {ShoppingGroupingOptions} from "@/types/Shopping";
|
||||
import {computed, ComputedRef, ref} from "vue";
|
||||
import {DeviceSettings} from "@/types/settings";
|
||||
import {useTheme} from "vuetify";
|
||||
import {useRouter} from "vue-router";
|
||||
|
||||
const DEVICE_SETTINGS_KEY = 'TANDOOR_DEVICE_SETTINGS'
|
||||
const USER_PREFERENCE_KEY = 'TANDOOR_USER_PREFERENCE'
|
||||
@@ -44,7 +45,8 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
|
||||
*/
|
||||
let isAuthenticated = ref(false)
|
||||
|
||||
let theme = useTheme()
|
||||
const theme = useTheme()
|
||||
const router = useRouter()
|
||||
|
||||
/**
|
||||
* holds the active user space if there is one or null if not
|
||||
@@ -159,7 +161,9 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
|
||||
|
||||
api.apiSwitchActiveSpaceRetrieve({spaceId: space.id!}).then(r => {
|
||||
loadActiveSpace()
|
||||
location.reload()
|
||||
router.push({name: 'StartPage'}).then(() => {
|
||||
location.reload()
|
||||
})
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
})
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
|
||||
|
||||
/**
|
||||
* round to the number of decimals specified in user preferences
|
||||
* @param num number to round
|
||||
*/
|
||||
export function roundDecimals(num: number) {
|
||||
let decimals = 2 //TODO get user preference
|
||||
let decimals = useUserPreferenceStore().userSettings.ingredientDecimals
|
||||
return Number(num.toFixed(decimals))
|
||||
}
|
||||
|
||||
|
||||
@@ -6,43 +6,46 @@ import vuetify, {transformAssetUrls} from 'vite-plugin-vuetify'
|
||||
import {VitePWA} from "vite-plugin-pwa";
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
base: '/static/vue3/',
|
||||
plugins: [
|
||||
vue({
|
||||
template: {transformAssetUrls}
|
||||
}),
|
||||
vuetify({
|
||||
autoImport: true,
|
||||
}),
|
||||
VitePWA({
|
||||
//registerType: 'autoUpdate',
|
||||
strategies: 'injectManifest',
|
||||
srcDir: 'src',
|
||||
filename: 'service-worker.ts',
|
||||
})
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||
vue: fileURLToPath(new URL("./node_modules/vue/dist/vue.esm-bundler.js", import.meta.url)),
|
||||
export default defineConfig(({command, mode, isSsrBuild, isPreview}) => {
|
||||
console.log('MODE: ', mode)
|
||||
return {
|
||||
base: mode == 'development' ? '/static/vue3/' : './',
|
||||
plugins: [
|
||||
vue({
|
||||
template: {transformAssetUrls}
|
||||
}),
|
||||
vuetify({
|
||||
autoImport: true,
|
||||
}),
|
||||
VitePWA({
|
||||
//registerType: 'autoUpdate',
|
||||
strategies: 'injectManifest',
|
||||
srcDir: 'src',
|
||||
filename: 'service-worker.ts',
|
||||
})
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||
vue: fileURLToPath(new URL("./node_modules/vue/dist/vue.esm-bundler.js", import.meta.url)),
|
||||
},
|
||||
extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue',],
|
||||
},
|
||||
extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue',],
|
||||
},
|
||||
clearScreen: false,
|
||||
build: {
|
||||
outDir: '../cookbook/static/vue3/',
|
||||
// generate manifest.json in outDir
|
||||
manifest: 'manifest.json',
|
||||
rollupOptions: {
|
||||
// overwrite default .html entry
|
||||
input: [
|
||||
'src/apps/tandoor/main.ts',
|
||||
],
|
||||
clearScreen: false,
|
||||
build: {
|
||||
outDir: '../cookbook/static/vue3/',
|
||||
// generate manifest.json in outDir
|
||||
manifest: 'manifest.json',
|
||||
rollupOptions: {
|
||||
// overwrite default .html entry
|
||||
input: [
|
||||
'src/apps/tandoor/main.ts',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
server: {
|
||||
host: '0.0.0.0', // only needed to expose dev server to network bound IPs
|
||||
origin: 'http://localhost:5173',
|
||||
server: {
|
||||
host: '0.0.0.0', // only needed to expose dev server to network bound IPs
|
||||
origin: 'http://localhost:5173',
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1213,10 +1213,10 @@
|
||||
"@types/tough-cookie" "*"
|
||||
parse5 "^7.0.0"
|
||||
|
||||
"@types/luxon@^3.6.2":
|
||||
version "3.6.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.6.2.tgz#be6536931801f437eafcb9c0f6d6781f72308041"
|
||||
integrity sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==
|
||||
"@types/luxon@^3.7.1":
|
||||
version "3.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.7.1.tgz#ef51b960ff86801e4e2de80c68813a96e529d531"
|
||||
integrity sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==
|
||||
|
||||
"@types/node@*", "@types/node@^24.0.8":
|
||||
version "24.0.8"
|
||||
@@ -1429,31 +1429,31 @@
|
||||
dependencies:
|
||||
upath "^2.0.1"
|
||||
|
||||
"@vueuse/core@^13.1.0":
|
||||
version "13.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-13.4.0.tgz#c9b3c21e2e284797e9d899ca2ae01b143d1e901e"
|
||||
integrity sha512-OnK7zW3bTq/QclEk17+vDFN3tuAm8ONb9zQUIHrYQkkFesu3WeGUx/3YzpEp+ly53IfDAT9rsYXgGW6piNZC5w==
|
||||
"@vueuse/core@^13.6.0":
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-13.6.0.tgz#4137f63dc4cef2ff8ae74ee146d6b6070d707878"
|
||||
integrity sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==
|
||||
dependencies:
|
||||
"@types/web-bluetooth" "^0.0.21"
|
||||
"@vueuse/metadata" "13.4.0"
|
||||
"@vueuse/shared" "13.4.0"
|
||||
"@vueuse/metadata" "13.6.0"
|
||||
"@vueuse/shared" "13.6.0"
|
||||
|
||||
"@vueuse/metadata@13.4.0":
|
||||
version "13.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-13.4.0.tgz#c65ca82dc920548d655307f6f3a3344fe3b28a44"
|
||||
integrity sha512-CPDQ/IgOeWbqItg1c/pS+Ulum63MNbpJ4eecjFJqgD/JUCJ822zLfpw6M9HzSvL6wbzMieOtIAW/H8deQASKHg==
|
||||
"@vueuse/metadata@13.6.0":
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-13.6.0.tgz#49196025c96c7daeb591c20a54b61cc336af99b6"
|
||||
integrity sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==
|
||||
|
||||
"@vueuse/router@^13.1.0":
|
||||
version "13.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.4.0.tgz#cdebb6b76488b34333a548f33171c138e7c29646"
|
||||
integrity sha512-3NL9RFgTiWN4SVp6CUFK/9db10BnoLU3iX+TRgcG4HEuR7GC1g+yMqxe33L6kjUTv8Dc9WeaER714vGBc9Xyjg==
|
||||
"@vueuse/router@^13.6.0":
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.6.0.tgz#29456dab42eb75a0dc5fe4c62f59dd3f7c21a6ab"
|
||||
integrity sha512-iXRwR4K7nz4PReW0QudhnM9NtYGvN4KrskFgF9G7NouM43big3bpSNRRocJKFWK7iu97ww5y82B3QA2zz3S/vw==
|
||||
dependencies:
|
||||
"@vueuse/shared" "13.4.0"
|
||||
"@vueuse/shared" "13.6.0"
|
||||
|
||||
"@vueuse/shared@13.4.0":
|
||||
version "13.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.4.0.tgz#0bc48d961bc8154b2fb96c26de869659ead55b71"
|
||||
integrity sha512-+AxuKbw8R1gYy5T21V5yhadeNM7rJqb4cPaRI9DdGnnNl3uqXh+unvQ3uCaA2DjYLbNr1+l7ht/B4qEsRegX6A==
|
||||
"@vueuse/shared@13.6.0":
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.6.0.tgz#872fdbd725fb4e3a12bd5aab85af9a5db0b1e481"
|
||||
integrity sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==
|
||||
|
||||
acorn@^8.14.0:
|
||||
version "8.15.0"
|
||||
@@ -2531,10 +2531,10 @@ lru-cache@^5.1.1:
|
||||
dependencies:
|
||||
yallist "^3.0.2"
|
||||
|
||||
luxon@^3.6.1:
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
|
||||
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
|
||||
luxon@^3.7.1:
|
||||
version "3.7.1"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.1.tgz#9bd09aa84a56afb00c57ea78a8ec5bd16eb24ec0"
|
||||
integrity sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==
|
||||
|
||||
magic-string@^0.25.0, magic-string@^0.25.7:
|
||||
version "0.25.9"
|
||||
@@ -3317,10 +3317,10 @@ update-browserslist-db@^1.1.3:
|
||||
escalade "^3.2.0"
|
||||
picocolors "^1.1.1"
|
||||
|
||||
vite-plugin-pwa@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-1.0.1.tgz#fec0cc65ffd592bb9ca8374176bd9a2aeaafe97b"
|
||||
integrity sha512-STyUomQbydj7vGamtgQYIJI0YsUZ3T4pJLGBQDQPhzMse6aGSncmEN21OV35PrFsmCvmtiH+Nu1JS1ke4RqBjQ==
|
||||
vite-plugin-pwa@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-1.0.2.tgz#ad70181256633c56ce7aa85c66377d916b9e8296"
|
||||
integrity sha512-O3UwjsCnoDclgJANoOgzzqW7SFgwXE/th2OmUP/ILxHKwzWxxKDBu+B/Xa9Cv4IgSVSnj2HgRVIJ7F15+vQFkA==
|
||||
dependencies:
|
||||
debug "^4.3.6"
|
||||
pretty-bytes "^6.1.1"
|
||||
@@ -3412,10 +3412,10 @@ vuedraggable@^4.1.0:
|
||||
dependencies:
|
||||
sortablejs "1.14.0"
|
||||
|
||||
vuetify@^3.9.0:
|
||||
version "3.9.0"
|
||||
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.9.0.tgz#e9412e9ba662fcd4b9946c589a984d157460943a"
|
||||
integrity sha512-vjqyHP5gBFH4x0BAjdRAcS3FXY5OfHaKnC6Hhgln8tePZtKc3AUhF7BEJtcrD3l6XwL8gaYx/wMt+UP7X5EZJw==
|
||||
vuetify@^3.9.3:
|
||||
version "3.9.3"
|
||||
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.9.3.tgz#b97dab322132e82fb247c469f674d5610bd19396"
|
||||
integrity sha512-0eruHdmRoAMBo/08RLDkTdtdu1vfkx+/PurUIDW2tz/k2GCp51e7KwgCn4uVyzH88KRgf2PKiz5UI5f93Xn05w==
|
||||
|
||||
w3c-xmlserializer@^5.0.0:
|
||||
version "5.0.0"
|
||||
|
||||
Reference in New Issue
Block a user