mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-25 19:29:30 -05:00
Compare commits
136 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e13fb3b8c | ||
|
|
24f331c208 | ||
|
|
16d0fc38f9 | ||
|
|
5e4cac52d6 | ||
|
|
b489a2d849 | ||
|
|
7c5707e0c0 | ||
|
|
946699a335 | ||
|
|
44b2c02034 | ||
|
|
c150c7f84e | ||
|
|
97503a68d8 | ||
|
|
126a2d870e | ||
|
|
02bad8cfb9 | ||
|
|
d9465c7f9d | ||
|
|
ead3168d80 | ||
|
|
a71bba307e | ||
|
|
c2c08391cc | ||
|
|
bc9d077b9d | ||
|
|
fe0f739bd5 | ||
|
|
e5b11a34f6 | ||
|
|
1df7a4df91 | ||
|
|
d401c143ec | ||
|
|
00a59baa92 | ||
|
|
327c83ce32 | ||
|
|
3371102e64 | ||
|
|
aec396e214 | ||
|
|
2b52b5c264 | ||
|
|
19c24a85a1 | ||
|
|
c147903f1e | ||
|
|
9dedc5b8fa | ||
|
|
d781cbe743 | ||
|
|
37bd2017b0 | ||
|
|
2de8070156 | ||
|
|
f70377c59b | ||
|
|
6fc4151de5 | ||
|
|
1fa001aad3 | ||
|
|
b84e03c58b | ||
|
|
e9dac25ff4 | ||
|
|
611787dbb6 | ||
|
|
bfbfb1d2a8 | ||
|
|
d9662f7fa5 | ||
|
|
9e44944b1d | ||
|
|
4de9a7ff89 | ||
|
|
32a663c5d7 | ||
|
|
3bee5ed35a | ||
|
|
bee5d6b7eb | ||
|
|
00ed9b07b6 | ||
|
|
2279bba838 | ||
|
|
57f5343c77 | ||
|
|
da8262a9b5 | ||
|
|
f0cf4a23e4 | ||
|
|
489c81c378 | ||
|
|
730344e326 | ||
|
|
7e6b1d3638 | ||
|
|
15f65cd711 | ||
|
|
dba205dafb | ||
|
|
5ae149a1b6 | ||
|
|
4bb2307007 | ||
|
|
be0088aec6 | ||
|
|
c56710ae0c | ||
|
|
1a420bc002 | ||
|
|
545e4f7af4 | ||
|
|
d2a148ae7d | ||
|
|
580591a69e | ||
|
|
409b438776 | ||
|
|
549175b56d | ||
|
|
0e3f5006b1 | ||
|
|
54043a0ae5 | ||
|
|
36fdc8cd9e | ||
|
|
87cf3b2289 | ||
|
|
adb4071fdb | ||
|
|
2a20f5e6e2 | ||
|
|
00f7ae3d66 | ||
|
|
f1f4e7ca8e | ||
|
|
6d7b3b8bfa | ||
|
|
7ebccf564d | ||
|
|
0421a1aa6c | ||
|
|
c118ab9a3c | ||
|
|
02a12cf724 | ||
|
|
f28ca41b7b | ||
|
|
6e677cf3cd | ||
|
|
d30a23f7ef | ||
|
|
88fea6f25d | ||
|
|
fc0b5bd738 | ||
|
|
5174f9939c | ||
|
|
8f9a489c7e | ||
|
|
fc72efac04 | ||
|
|
72f57cf671 | ||
|
|
85b95d1e96 | ||
|
|
35dee43f0b | ||
|
|
fb683bf230 | ||
|
|
a852f581ba | ||
|
|
cc417f1499 | ||
|
|
7f9da4c4fb | ||
|
|
31d3f9abee | ||
|
|
f9670e9833 | ||
|
|
465af8c1a4 | ||
|
|
ffe743e233 | ||
|
|
6b09731a55 | ||
|
|
182a94e0c7 | ||
|
|
2adaedfd1a | ||
|
|
5074326471 | ||
|
|
4807a16a0f | ||
|
|
af044f1002 | ||
|
|
cdf77c8796 | ||
|
|
e68bedf7eb | ||
|
|
5e21e7fa8e | ||
|
|
f49b39b216 | ||
|
|
0d24292f52 | ||
|
|
f3b7016be8 | ||
|
|
0f77c831c9 | ||
|
|
be48e57453 | ||
|
|
3b45ca18af | ||
|
|
da1b22c148 | ||
|
|
9dab21f972 | ||
|
|
89a5f92ace | ||
|
|
7be705f6a1 | ||
|
|
8e60566311 | ||
|
|
33e5bb7d0a | ||
|
|
0cf63cd715 | ||
|
|
5dc7bf5b0e | ||
|
|
c4c66aa640 | ||
|
|
f64be72a98 | ||
|
|
a3ed2bdcac | ||
|
|
996b8bedac | ||
|
|
a05a785e22 | ||
|
|
b470602317 | ||
|
|
cf8ab02d0e | ||
|
|
60043fff59 | ||
|
|
ca9c96647e | ||
|
|
70e6585669 | ||
|
|
d0cb7a79f9 | ||
|
|
cfd24de72a | ||
|
|
54acfe3e39 | ||
|
|
12ad6af8c3 | ||
|
|
cf24e1014a | ||
|
|
2f8b479fdd |
@@ -71,8 +71,7 @@ Because of that there are several ways you can support us
|
||||
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
|
||||
|
||||
## Contributing
|
||||
|
||||
You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. We are always welcoming new pull requests containing bug fixes, refactors and new features. We have a list of tasks and bugs on our issue tracker on Github. Please comment on issues if you want to contribute with, to avoid duplicating effort.
|
||||
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/#contributing-code) **BEFORE** contributing anything!
|
||||
|
||||
## Your Feedback
|
||||
|
||||
|
||||
@@ -6,5 +6,4 @@ Since this software is still considered beta/WIP support is always only given fo
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please open a normal public issue if you have any security related concerns. If you feel like the issue should not be discussed in
|
||||
public just open a generic issue and we will discuss further communication there (since GitHub does not allow everyone to create a security advisory :/).
|
||||
Please open a normal public issue if you have any security related concerns. If you feel like the issue should not be discussed in public just open a generic issue and we will discuss further communication there (since GitHub does not allow everyone to create a security advisory :/).
|
||||
|
||||
@@ -235,6 +235,10 @@ class IngredientParser:
|
||||
# leading spaces before commas result in extra tokens, clean them out
|
||||
ingredient = ingredient.replace(' ,', ',')
|
||||
|
||||
# if amount and unit are connected add space in between
|
||||
if re.match('([0-9])+([A-z])+\s', ingredient):
|
||||
ingredient = re.sub(r'(?<=([a-z])|\d)(?=(?(1)\d|[a-z]))', ' ', ingredient)
|
||||
|
||||
tokens = ingredient.split() # split at each space into tokens
|
||||
if len(tokens) == 1:
|
||||
# there only is one argument, that must be the food
|
||||
|
||||
@@ -52,7 +52,6 @@ def has_group_permission(user, groups, no_cache=False):
|
||||
return cached_result
|
||||
|
||||
result = False
|
||||
print('running check', user, groups_allowed)
|
||||
if user.is_authenticated:
|
||||
if user_space := user.userspace_set.filter(active=True):
|
||||
if len(user_space) != 1:
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import json
|
||||
import re
|
||||
from io import BytesIO
|
||||
from io import BytesIO, StringIO
|
||||
from zipfile import ZipFile
|
||||
from PIL import Image
|
||||
|
||||
from cookbook.helper.image_processing import get_filetype
|
||||
from cookbook.helper.ingredient_parser import IngredientParser
|
||||
from cookbook.helper.recipe_url_import import iso_duration_to_minutes
|
||||
from cookbook.integration.integration import Integration
|
||||
from cookbook.models import Ingredient, Keyword, Recipe, Step
|
||||
from cookbook.models import Ingredient, Keyword, Recipe, Step, NutritionInformation
|
||||
|
||||
|
||||
class NextcloudCookbook(Integration):
|
||||
@@ -70,12 +71,21 @@ class NextcloudCookbook(Integration):
|
||||
recipe.steps.add(step)
|
||||
|
||||
if 'nutrition' in recipe_json:
|
||||
nutrition = {}
|
||||
try:
|
||||
recipe.nutrition.calories = recipe_json['nutrition']['calories'].replace(' kcal', '').replace(' ', '')
|
||||
recipe.nutrition.proteins = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
|
||||
recipe.nutrition.fats = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
|
||||
recipe.nutrition.carbohydrates = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '')
|
||||
except Exception:
|
||||
if 'calories' in recipe_json['nutrition']:
|
||||
nutrition['calories'] = int(re.search(r'\d+', recipe_json['nutrition']['calories']).group())
|
||||
if 'proteinContent' in recipe_json['nutrition']:
|
||||
nutrition['proteins'] = int(re.search(r'\d+', recipe_json['nutrition']['proteinContent']).group())
|
||||
if 'fatContent' in recipe_json['nutrition']:
|
||||
nutrition['fats'] = int(re.search(r'\d+', recipe_json['nutrition']['fatContent']).group())
|
||||
if 'carbohydrateContent' in recipe_json['nutrition']:
|
||||
nutrition['carbohydrates'] = int(re.search(r'\d+', recipe_json['nutrition']['carbohydrateContent']).group())
|
||||
|
||||
if nutrition != {}:
|
||||
recipe.nutrition = NutritionInformation.objects.create(**nutrition, space=self.request.space)
|
||||
recipe.save()
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
for f in self.files:
|
||||
@@ -87,5 +97,92 @@ class NextcloudCookbook(Integration):
|
||||
|
||||
return recipe
|
||||
|
||||
def formatTime(self, min):
|
||||
h = min//60
|
||||
m = min % 60
|
||||
return f'PT{h}H{m}M0S'
|
||||
|
||||
|
||||
def get_file_from_recipe(self, recipe):
|
||||
raise NotImplementedError('Method not implemented in storage integration')
|
||||
|
||||
export = {}
|
||||
export['name'] = recipe.name
|
||||
export['description'] = recipe.description
|
||||
export['url'] = recipe.source_url
|
||||
export['prepTime'] = self.formatTime(recipe.working_time)
|
||||
export['cookTime'] = self.formatTime(recipe.waiting_time)
|
||||
export['totalTime'] = self.formatTime(recipe.working_time+recipe.waiting_time)
|
||||
export['recipeYield'] = recipe.servings
|
||||
export['image'] = f'/Recipes/{recipe.name}/full.jpg'
|
||||
export['imageUrl'] = f'/Recipes/{recipe.name}/full.jpg'
|
||||
|
||||
recipeKeyword = []
|
||||
for k in recipe.keywords.all():
|
||||
recipeKeyword.append(k.name)
|
||||
|
||||
export['keywords'] = recipeKeyword
|
||||
|
||||
recipeInstructions = []
|
||||
recipeIngredient = []
|
||||
for s in recipe.steps.all():
|
||||
recipeInstructions.append(s.instruction)
|
||||
|
||||
for i in s.ingredients.all():
|
||||
recipeIngredient.append(f'{float(i.amount)} {i.unit} {i.food}')
|
||||
|
||||
export['recipeIngredient'] = recipeIngredient
|
||||
export['recipeInstructions'] = recipeInstructions
|
||||
|
||||
|
||||
return "recipe.json", json.dumps(export)
|
||||
|
||||
def get_files_from_recipes(self, recipes, el, cookie):
|
||||
export_zip_stream = BytesIO()
|
||||
export_zip_obj = ZipFile(export_zip_stream, 'w')
|
||||
|
||||
for recipe in recipes:
|
||||
if recipe.internal and recipe.space == self.request.space:
|
||||
|
||||
recipe_stream = StringIO()
|
||||
filename, data = self.get_file_from_recipe(recipe)
|
||||
recipe_stream.write(data)
|
||||
export_zip_obj.writestr(f'{recipe.name}/{filename}', recipe_stream.getvalue())
|
||||
recipe_stream.close()
|
||||
|
||||
try:
|
||||
imageByte = recipe.image.file.read()
|
||||
export_zip_obj.writestr(f'{recipe.name}/full.jpg', self.getJPEG(imageByte))
|
||||
export_zip_obj.writestr(f'{recipe.name}/thumb.jpg', self.getThumb(171, imageByte))
|
||||
export_zip_obj.writestr(f'{recipe.name}/thumb16.jpg', self.getThumb(16, imageByte))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
el.exported_recipes += 1
|
||||
el.msg += self.get_recipe_processed_msg(recipe)
|
||||
el.save()
|
||||
|
||||
export_zip_obj.close()
|
||||
|
||||
return [[ self.get_export_file_name(), export_zip_stream.getvalue() ]]
|
||||
|
||||
def getJPEG(self, imageByte):
|
||||
image = Image.open(BytesIO(imageByte))
|
||||
image = image.convert('RGB')
|
||||
|
||||
bytes = BytesIO()
|
||||
image.save(bytes, "JPEG")
|
||||
return bytes.getvalue()
|
||||
|
||||
def getThumb(self, size, imageByte):
|
||||
image = Image.open(BytesIO(imageByte))
|
||||
|
||||
w, h = image.size
|
||||
m = min(w, h)
|
||||
|
||||
image = image.crop(((w-m)//2, (h-m)//2, (w+m)//2, (h+m)//2))
|
||||
image = image.resize([size, size], Image.Resampling.LANCZOS)
|
||||
image = image.convert('RGB')
|
||||
|
||||
bytes = BytesIO()
|
||||
image.save(bytes, "JPEG")
|
||||
return bytes.getvalue()
|
||||
|
||||
@@ -41,7 +41,7 @@ class RecipeKeeper(Integration):
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
step = Step.objects.create(instruction='', space=self.request.space,)
|
||||
step = Step.objects.create(instruction='', space=self.request.space, )
|
||||
|
||||
ingredient_parser = IngredientParser(self.request, True)
|
||||
for ingredient in file.find("div", {"itemprop": "recipeIngredients"}).findChildren("p"):
|
||||
@@ -51,13 +51,20 @@ class RecipeKeeper(Integration):
|
||||
f = ingredient_parser.get_food(food)
|
||||
u = ingredient_parser.get_unit(unit)
|
||||
step.ingredients.add(Ingredient.objects.create(
|
||||
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
|
||||
food=f, unit=u, amount=amount, note=note, original_text=str(ingredient).replace('<p>', '').replace('</p>', ''), space=self.request.space,
|
||||
))
|
||||
|
||||
for s in file.find("div", {"itemprop": "recipeDirections"}).find_all("p"):
|
||||
if s.text == "":
|
||||
continue
|
||||
step.instruction += s.text + ' \n'
|
||||
step.save()
|
||||
|
||||
for s in file.find("div", {"itemprop": "recipeNotes"}).find_all("p"):
|
||||
if s.text == "":
|
||||
continue
|
||||
step.instruction += s.text + ' \n'
|
||||
step.save()
|
||||
|
||||
if file.find("span", {"itemprop": "recipeSource"}).text != '':
|
||||
step.instruction += "\n\n" + _("Imported from") + ": " + file.find("span", {"itemprop": "recipeSource"}).text
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
cookbook/locale/el/LC_MESSAGES/django.mo
Normal file
BIN
cookbook/locale/el/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
2610
cookbook/locale/el/LC_MESSAGES/django.po
Normal file
2610
cookbook/locale/el/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,10 +14,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2022-02-09 01:31+0000\n"
|
||||
"Last-Translator: Marion Kämpfer <marion@murphyslantech.de>\n"
|
||||
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/fr/>\n"
|
||||
"PO-Revision-Date: 2022-09-26 16:33+0000\n"
|
||||
"Last-Translator: Noé Feutry <noe.feutry@free.fr>\n"
|
||||
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/fr/>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -85,7 +85,7 @@ msgstr "Commentaires"
|
||||
|
||||
#: .\cookbook\forms.py:66
|
||||
msgid "Left-handed mode"
|
||||
msgstr ""
|
||||
msgstr "Mode gaucher"
|
||||
|
||||
#: .\cookbook\forms.py:70
|
||||
msgid ""
|
||||
|
||||
Binary file not shown.
BIN
cookbook/locale/id/LC_MESSAGES/django.mo
Normal file
BIN
cookbook/locale/id/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
2647
cookbook/locale/id/LC_MESSAGES/django.po
Normal file
2647
cookbook/locale/id/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2022-08-04 11:32+0000\n"
|
||||
"PO-Revision-Date: 2022-10-10 17:33+0000\n"
|
||||
"Last-Translator: Oliver Cervera <olivercervera@yahoo.it>\n"
|
||||
"Language-Team: Italian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/it/>\n"
|
||||
@@ -122,10 +122,8 @@ msgstr ""
|
||||
"devono essere condivise per impostazione predefinita."
|
||||
|
||||
#: .\cookbook\forms.py:78
|
||||
#, fuzzy
|
||||
#| msgid "Try the new shopping list"
|
||||
msgid "Users with whom to share shopping lists."
|
||||
msgstr "Prova la nuova lista della spesa"
|
||||
msgstr "Utenti con i quali condividere le liste della spesa."
|
||||
|
||||
#: .\cookbook\forms.py:80
|
||||
msgid "Show recently viewed recipes on search page."
|
||||
@@ -352,6 +350,9 @@ msgid ""
|
||||
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
|
||||
"Note: this option will conflict with 'web' and 'raw' methods of search."
|
||||
msgstr ""
|
||||
"Campi in cui usare la ricerca 'vaga'. (ad esempio cercando per 'riceta' "
|
||||
"verrà mostrato 'ricetta'). Nota: questa opzione non è compatibile con la "
|
||||
"ricerca 'web' o 'raw'."
|
||||
|
||||
#: .\cookbook\forms.py:459
|
||||
msgid ""
|
||||
@@ -502,10 +503,8 @@ msgid "Fields on food that should be inherited by default."
|
||||
msgstr "Alimento che dovrebbe essere rimpiazzato."
|
||||
|
||||
#: .\cookbook\forms.py:545
|
||||
#, fuzzy
|
||||
#| msgid "Show recently viewed recipes on search page."
|
||||
msgid "Show recipe counts on search filters"
|
||||
msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca."
|
||||
msgstr "Mostra il conteggio delle ricette nei filtri di ricerca"
|
||||
|
||||
#: .\cookbook\helper\AllAuthCustomAdapter.py:36
|
||||
msgid ""
|
||||
@@ -552,10 +551,8 @@ msgid "One of queryset or hash_key must be provided"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:152
|
||||
#, fuzzy
|
||||
#| msgid "You must provide at least a recipe or a title."
|
||||
msgid "You must supply a servings size"
|
||||
msgstr "Devi fornire almeno una ricetta o un titolo."
|
||||
msgstr "Devi fornire le dimensione delle porzioni"
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:64
|
||||
#: .\cookbook\helper\template_helper.py:66
|
||||
@@ -744,10 +741,8 @@ msgid "Recipe"
|
||||
msgstr "Ricetta"
|
||||
|
||||
#: .\cookbook\models.py:1228
|
||||
#, fuzzy
|
||||
#| msgid "Foods"
|
||||
msgid "Food"
|
||||
msgstr "Alimenti"
|
||||
msgstr "Alimento"
|
||||
|
||||
#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138
|
||||
msgid "Keyword"
|
||||
@@ -910,7 +905,7 @@ msgstr "Rimuovi"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid "Warning:"
|
||||
msgstr "Avviso:"
|
||||
msgstr "Attenzione:"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid ""
|
||||
@@ -1169,7 +1164,7 @@ msgstr "Supermercato"
|
||||
|
||||
#: .\cookbook\templates\base.html:188
|
||||
msgid "Supermarket Category"
|
||||
msgstr "Categoria Supermercato"
|
||||
msgstr "Categoria supermercato"
|
||||
|
||||
#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171
|
||||
msgid "Automations"
|
||||
@@ -1191,10 +1186,8 @@ msgstr "Cronologia"
|
||||
#: .\cookbook\templates\base.html:252
|
||||
#: .\cookbook\templates\ingredient_editor.html:7
|
||||
#: .\cookbook\templates\ingredient_editor.html:13
|
||||
#, fuzzy
|
||||
#| msgid "Ingredients"
|
||||
msgid "Ingredient Editor"
|
||||
msgstr "Ingredienti"
|
||||
msgstr "Editor Ingredienti"
|
||||
|
||||
#: .\cookbook\templates\base.html:264
|
||||
#: .\cookbook\templates\export_response.html:7
|
||||
@@ -1377,10 +1370,11 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Questo modulo può essere utilizzato se, accidentalmente, sono stati "
|
||||
"creati due (o più) unità di misura o ingredienti che dovrebbero essere lo "
|
||||
"stesso. \n"
|
||||
"Unisce due unità di misura o ingredienti e aggiorna tutte le ricette che li "
|
||||
"utilizzano."
|
||||
"creati due (o più) unità di misura o ingredienti che\n"
|
||||
" dovrebbero essere lo stesso.\n"
|
||||
" Unisce due unità di misura o ingredienti e aggiorna tutte le ricette "
|
||||
"che li utilizzano.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\forms\ingredients.html:26
|
||||
msgid "Are you sure that you want to merge these two units?"
|
||||
@@ -1398,7 +1392,7 @@ msgstr "Sei sicuro di volere unire questi due ingredienti?"
|
||||
#: .\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 "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b>"
|
||||
msgstr "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b> "
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:22
|
||||
msgid "This cannot be undone!"
|
||||
@@ -1490,11 +1484,14 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel database.\n"
|
||||
"È necessario perché servono per fare richieste API, ma questo aumenta il "
|
||||
"rischio che\n"
|
||||
"qualcuno possa impossessarsene.<br/>\n"
|
||||
"Per liminare il danno puoi usare account con accesso limitato o i token."
|
||||
" I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel "
|
||||
"database.\n"
|
||||
" È necessario perché sono usati per fare richieste API, ma ciò "
|
||||
"aumenta il rischio che\n"
|
||||
" qualcuno possa impossessarsene.<br/>\n"
|
||||
" Per liminare i possibili danni puoi usare account con accesso "
|
||||
"limitato o i token.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\index.html:29
|
||||
msgid "Search recipe ..."
|
||||
@@ -1541,16 +1538,17 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Markdown è un linguaggio di markup molto leggero che può essere "
|
||||
" Markdown è un linguaggio di markup molto leggero che può essere "
|
||||
"utilizzato per formattare facilmente del testo.\n"
|
||||
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
|
||||
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
|
||||
"github.io/\" target=\"_blank\">Python Markdown</a> per\n"
|
||||
" convertire il tuo testo in HTML formattato. È possibile trovare la "
|
||||
" convertire il tuo testo in HTML formattato. È possibile trovare la "
|
||||
"documentazione completa del markdown\n"
|
||||
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" target="
|
||||
"\"_blank\">qui</a>.\n"
|
||||
" Di seguito è possibile trovare una documentazione incompleta ma molto "
|
||||
"probabilmente sufficiente."
|
||||
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" "
|
||||
"target=\"_blank\">qui</a>.\n"
|
||||
" Di seguito è possibile trovare una documentazione incompleta ma "
|
||||
"probabilmente sufficiente.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:25
|
||||
msgid "Headers"
|
||||
@@ -1697,7 +1695,7 @@ msgstr "Condiviso con"
|
||||
#: .\cookbook\templates\meal_plan_entry.html:48
|
||||
#: .\cookbook\templates\recipes_table.html:64
|
||||
msgid "Last cooked"
|
||||
msgstr "Cucinato ultimamente"
|
||||
msgstr "Cucinato di recente"
|
||||
|
||||
#: .\cookbook\templates\meal_plan_entry.html:50
|
||||
msgid "Never cooked before."
|
||||
@@ -1755,7 +1753,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\openid\login.html:27
|
||||
#: .\cookbook\templates\socialaccount\authentication_error.html:27
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
msgstr "Indietro"
|
||||
|
||||
#: .\cookbook\templates\recipe_view.html:26
|
||||
msgid "by"
|
||||
@@ -2136,7 +2134,8 @@ msgid ""
|
||||
"You can sign in to your account using any of the following third party\n"
|
||||
" accounts:"
|
||||
msgstr ""
|
||||
"Puoi accedere al tuo account usando uno dei seguenti account di terze parti:"
|
||||
"Puoi accedere al tuo account usando uno di questi \n"
|
||||
" account di terze parti:"
|
||||
|
||||
#: .\cookbook\templates\socialaccount\connections.html:52
|
||||
msgid ""
|
||||
@@ -2155,26 +2154,27 @@ msgstr "Iscriviti"
|
||||
#: .\cookbook\templates\socialaccount\login.html:9
|
||||
#, python-format
|
||||
msgid "Connect %(provider)s"
|
||||
msgstr ""
|
||||
msgstr "Collega %(provider)s"
|
||||
|
||||
#: .\cookbook\templates\socialaccount\login.html:11
|
||||
#, python-format
|
||||
msgid "You are about to connect a new third party account from %(provider)s."
|
||||
msgstr ""
|
||||
msgstr "Stai per collegare un nuovo account di terze parti da %(provider)s."
|
||||
|
||||
#: .\cookbook\templates\socialaccount\login.html:13
|
||||
#, python-format
|
||||
msgid "Sign In Via %(provider)s"
|
||||
msgstr ""
|
||||
msgstr "Accedi tramite %(provider)s"
|
||||
|
||||
#: .\cookbook\templates\socialaccount\login.html:15
|
||||
#, python-format
|
||||
msgid "You are about to sign in using a third party account from %(provider)s."
|
||||
msgstr ""
|
||||
"Stai per fare l'accesso usando un account di terze parti da %(provider)s."
|
||||
|
||||
#: .\cookbook\templates\socialaccount\login.html:20
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Continua"
|
||||
|
||||
#: .\cookbook\templates\socialaccount\signup.html:10
|
||||
#, python-format
|
||||
@@ -2213,10 +2213,8 @@ msgid "Manage Subscription"
|
||||
msgstr "Gestisci iscrizione"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216
|
||||
#, fuzzy
|
||||
#| msgid "Space:"
|
||||
msgid "Space"
|
||||
msgstr "Istanza:"
|
||||
msgstr "Istanza"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:17
|
||||
msgid ""
|
||||
@@ -2233,7 +2231,7 @@ msgstr "Puoi essere invitato in una istanza già esistente o crearne una nuova."
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:45
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
msgstr "Proprietario"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:49
|
||||
#, fuzzy
|
||||
@@ -2315,10 +2313,12 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Django Recipes è una applicazione gratuita e open source. È disponibile su "
|
||||
"<a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
|
||||
"Le ultime novità sono disponibili <a href=\"https://github.com/vabene1111/"
|
||||
"recipes/releases\">qui</a>."
|
||||
" Django Recipes è una applicazione gratuita e open source. È "
|
||||
"disponibile su\n"
|
||||
" <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
|
||||
" Puoi consultare le ultime novità <a href=\"https://github.com/"
|
||||
"vabene1111/recipes/releases\">qui</a>.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:36
|
||||
msgid "Media Serving"
|
||||
@@ -2327,7 +2327,7 @@ msgstr "File multimediali"
|
||||
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
|
||||
#: .\cookbook\templates\system.html:68
|
||||
msgid "Warning"
|
||||
msgstr "Avviso"
|
||||
msgstr "Attenzione"
|
||||
|
||||
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
|
||||
#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83
|
||||
@@ -2343,11 +2343,12 @@ msgid ""
|
||||
" your installation.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Erogare i file multimediali usando gunicorn/python <b>non è raccomandato</"
|
||||
"b>!\n"
|
||||
"Segui i passi descritti\n"
|
||||
"<a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8.1\">qui</a> "
|
||||
"per aggiornare la tua installazione."
|
||||
"<b>Non è raccomandato</b> erogare i file multimediali con gunicorn/pyton!\n"
|
||||
" Segui i passi descritti\n"
|
||||
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
|
||||
"1\">qui</a> per aggiornare\n"
|
||||
" la tua installazione.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61
|
||||
#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90
|
||||
@@ -2371,10 +2372,13 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Non hai inserito una <code>SECRET_KEY</code> nel file <code>.env</code>. "
|
||||
"Django ha dovuto usare la chiave standard\n"
|
||||
"dell'installazione che è pubblica e insicura! Sei pregato di aggiungere una\n"
|
||||
"<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>."
|
||||
" Non hai inserito una <code>SECRET_KEY</code> nel file <code>."
|
||||
"env</code>. Django ha dovuto usare la\n"
|
||||
" chiave standard\n"
|
||||
" dell'installazione che è pubblica e insicura! Sei pregato di "
|
||||
"aggiungere una\n"
|
||||
"\t\t\t<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:66
|
||||
msgid "Debug Mode"
|
||||
@@ -2391,10 +2395,12 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Questa applicazione è in esecuzione in modalità di debug. Probabilmente non "
|
||||
"è necessario, spegni la modalità di debug \n"
|
||||
"configurando\n"
|
||||
"<code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
|
||||
" Questa applicazione è in esecuzione in modalità di debug. "
|
||||
"Probabilmente non è necessario, spegni la modalità di debug\n"
|
||||
" configurando\n"
|
||||
" <code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:81
|
||||
msgid "Database"
|
||||
@@ -2413,9 +2419,10 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Questa applicazione non sta girando su un database Postgres. Non è "
|
||||
"raccomandato perché alcune\n"
|
||||
"funzionalità sono disponibili solo con un database Posgres."
|
||||
" Questa applicazione non sta girando su un database Postgres. Non "
|
||||
"è raccomandato perché alcune\n"
|
||||
" funzionalità sono disponibili solo con un database Posgres.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\url_import.html:8
|
||||
msgid "URL Import"
|
||||
@@ -2472,20 +2479,22 @@ msgstr "{child.name} è stato spostato con successo al primario {parent.name}"
|
||||
|
||||
#: .\cookbook\views\api.py:542
|
||||
msgid "{obj.name} was removed from the shopping list."
|
||||
msgstr ""
|
||||
msgstr "{obj.name} è stato rimosso dalla lista della spesa."
|
||||
|
||||
#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879
|
||||
#: .\cookbook\views\api.py:892
|
||||
msgid "{obj.name} was added to the shopping list."
|
||||
msgstr ""
|
||||
msgstr "{obj.name} è stato aggiunto alla lista della spesa."
|
||||
|
||||
#: .\cookbook\views\api.py:674
|
||||
msgid "ID of recipe a step is part of. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
"ID di una ricetta di cui uno step ne fa parte. Usato per parametri di "
|
||||
"ripetizione multipla."
|
||||
|
||||
#: .\cookbook\views\api.py:676
|
||||
msgid "Query string matched (fuzzy) against object name."
|
||||
msgstr ""
|
||||
msgstr "Stringa di ricerca abbinata (vaga) al nome dell'oggetto."
|
||||
|
||||
#: .\cookbook\views\api.py:720
|
||||
msgid ""
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2021-11-12 20:06+0000\n"
|
||||
"Last-Translator: Henrique Silva <hds@mailbox.org>\n"
|
||||
"PO-Revision-Date: 2022-10-14 17:19+0000\n"
|
||||
"Last-Translator: Shaxine <shaxine@protonmail.com>\n"
|
||||
"Language-Team: Portuguese <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/pt/>\n"
|
||||
"Language: pt\n"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 4.8\n"
|
||||
"X-Generator: Weblate 4.10.1\n"
|
||||
|
||||
#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34
|
||||
#: .\cookbook\templates\stats.html:28
|
||||
@@ -83,7 +83,7 @@ msgstr "Comentários"
|
||||
|
||||
#: .\cookbook\forms.py:66
|
||||
msgid "Left-handed mode"
|
||||
msgstr ""
|
||||
msgstr "Modo canhoto"
|
||||
|
||||
#: .\cookbook\forms.py:70
|
||||
msgid ""
|
||||
@@ -109,18 +109,14 @@ msgstr ""
|
||||
"Mostrar quantidades de energia nutricional em joules em vez de calorias"
|
||||
|
||||
#: .\cookbook\forms.py:77
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Users with whom newly created meal plan/shopping list entries should be "
|
||||
#| "shared by default."
|
||||
msgid "Users with whom newly created meal plans should be shared by default."
|
||||
msgstr ""
|
||||
"Utilizadores com os quais novos planos de refeições/listas de compras devem "
|
||||
"ser partilhados por defeito."
|
||||
"Utilizadores com os quais novos planos de refeições devem ser partilhados "
|
||||
"por defeito."
|
||||
|
||||
#: .\cookbook\forms.py:78
|
||||
msgid "Users with whom to share shopping lists."
|
||||
msgstr ""
|
||||
msgstr "Utilizadores com os quais novas listas de compras serão partilhadas."
|
||||
|
||||
#: .\cookbook\forms.py:80
|
||||
msgid "Show recently viewed recipes on search page."
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -6,21 +6,21 @@
|
||||
# Translators:
|
||||
# Emre S, 2020
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
|
||||
"Last-Translator: Emre S, 2020\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/django-recipes/"
|
||||
"teams/110507/tr/)\n"
|
||||
"PO-Revision-Date: 2022-11-06 22:09+0000\n"
|
||||
"Last-Translator: Gorkem <g.kalipcilar@gmail.com>\n"
|
||||
"Language-Team: Turkish <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/tr/>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
|
||||
#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34
|
||||
#: .\cookbook\templates\stats.html:28
|
||||
@@ -29,7 +29,7 @@ msgstr "Malzemeler"
|
||||
|
||||
#: .\cookbook\forms.py:53
|
||||
msgid "Default unit"
|
||||
msgstr ""
|
||||
msgstr "Varsayılan birim"
|
||||
|
||||
#: .\cookbook\forms.py:54
|
||||
msgid "Use fractions"
|
||||
@@ -82,7 +82,7 @@ msgstr ""
|
||||
#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21
|
||||
#: .\cookbook\templates\stats.html:47
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
msgstr "Yorumlar"
|
||||
|
||||
#: .\cookbook\forms.py:66
|
||||
msgid "Left-handed mode"
|
||||
@@ -192,7 +192,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:165
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
msgstr "Varsayılan"
|
||||
|
||||
#: .\cookbook\forms.py:177
|
||||
msgid ""
|
||||
@@ -224,7 +224,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:271
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
msgstr "Aktif"
|
||||
|
||||
#: .\cookbook\forms.py:277
|
||||
msgid "Search String"
|
||||
|
||||
2621
cookbook/locale/tr/id/LC_MESSAGES/django.po
Normal file
2621
cookbook/locale/tr/id/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -35,9 +35,7 @@
|
||||
{% endif %}
|
||||
|
||||
{% if EMAIL_ENABLED %}
|
||||
<a class="btn btn-warning float-right d-none d-xl-block d-lg-block"
|
||||
href="{% url 'account_reset_password' %}">{% trans "Reset My Password" %}</a>
|
||||
<p class="d-xl-none d-lg-none">{% trans 'Lost your password?' %} <a
|
||||
<p>{% trans 'Lost your password?' %} <a
|
||||
href="{% url 'account_reset_password' %}">{% trans "Reset My Password" %}</a></p>
|
||||
{% endif %}
|
||||
</form>
|
||||
|
||||
22
cookbook/tests/api/test_api_share_link.py
Normal file
22
cookbook/tests/api/test_api_share_link.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import json
|
||||
|
||||
from django.urls import reverse
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from cookbook.helper.permission_helper import share_link_valid
|
||||
from cookbook.models import Recipe
|
||||
|
||||
|
||||
def test_get_share_link(recipe_1_s1, u1_s1, u1_s2, g1_s1, a_u, space_1):
|
||||
assert u1_s1.get(reverse('api_share_link', args=[recipe_1_s1.pk])).status_code == 200
|
||||
assert u1_s2.get(reverse('api_share_link', args=[recipe_1_s1.pk])).status_code == 404
|
||||
assert g1_s1.get(reverse('api_share_link', args=[recipe_1_s1.pk])).status_code == 403
|
||||
assert a_u.get(reverse('api_share_link', args=[recipe_1_s1.pk])).status_code == 403
|
||||
|
||||
with scopes_disabled():
|
||||
sl = json.loads(u1_s1.get(reverse('api_share_link', args=[recipe_1_s1.pk])).content)
|
||||
assert share_link_valid(Recipe.objects.filter(pk=sl['pk']).get(), sl['share'])
|
||||
|
||||
space_1.allow_sharing = False
|
||||
space_1.save()
|
||||
assert u1_s1.get(reverse('api_share_link', args=[recipe_1_s1.pk])).status_code == 403
|
||||
@@ -54,7 +54,7 @@ def test_ingredient_parser():
|
||||
"3,5 l Wasser": (3.5, "l", "Wasser", ""),
|
||||
"3.5 l Wasser": (3.5, "l", "Wasser", ""),
|
||||
"400 g Karotte(n)": (400, "g", "Karotte(n)", ""),
|
||||
"400g unsalted butter": (400, "g", "butter", "unsalted"),
|
||||
"400g unsalted butter": (400, "g", "unsalted butter", ""),
|
||||
"2L Wasser": (2, "L", "Wasser", ""),
|
||||
"1 (16 ounce) package dry lentils, rinsed": (1, "package", "dry lentils, rinsed", "16 ounce"),
|
||||
"2-3 c Water": (2, "c", "Water", "2-3"),
|
||||
|
||||
@@ -170,7 +170,7 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
|
||||
'field', flat=True)])
|
||||
|
||||
if query is not None and query not in ["''", '']:
|
||||
if fuzzy:
|
||||
if fuzzy and (settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']):
|
||||
if any([self.model.__name__.lower() in x for x in
|
||||
self.request.user.searchpreference.unaccent.values_list('field', flat=True)]):
|
||||
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
|
||||
@@ -1116,16 +1116,17 @@ class CustomAuthToken(ObtainAuthToken):
|
||||
context={'request': request})
|
||||
serializer.is_valid(raise_exception=True)
|
||||
user = serializer.validated_data['user']
|
||||
if token := AccessToken.objects.filter(scope__contains='read').filter(scope__contains='write').first():
|
||||
if token := AccessToken.objects.filter(user=user, expires__gt=timezone.now(), scope__contains='read').filter(scope__contains='write').first():
|
||||
access_token = token
|
||||
else:
|
||||
access_token = AccessToken.objects.create(user=request.user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
|
||||
access_token = AccessToken.objects.create(user=user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
|
||||
return Response({
|
||||
'id': access_token.id,
|
||||
'token': access_token.token,
|
||||
'scope': access_token.scope,
|
||||
'expires': access_token.expires,
|
||||
'user_id': user.pk,
|
||||
'user_id': access_token.user.pk,
|
||||
'test': user.pk
|
||||
})
|
||||
|
||||
|
||||
@@ -1381,13 +1382,16 @@ def sync_all(request):
|
||||
|
||||
|
||||
def share_link(request, pk):
|
||||
if request.space.allow_sharing and has_group_permission(request.user, 'user'):
|
||||
recipe = get_object_or_404(Recipe, pk=pk, space=request.space)
|
||||
link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space)
|
||||
return JsonResponse({'pk': pk, 'share': link.uuid,
|
||||
'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))})
|
||||
else:
|
||||
return JsonResponse({'error': 'sharing_disabled'}, status=403)
|
||||
if request.user.is_authenticated:
|
||||
if request.space.allow_sharing and has_group_permission(request.user, ('user',)):
|
||||
recipe = get_object_or_404(Recipe, pk=pk, space=request.space)
|
||||
link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space)
|
||||
return JsonResponse({'pk': pk, 'share': link.uuid,
|
||||
'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))})
|
||||
else:
|
||||
return JsonResponse({'error': 'sharing_disabled'}, status=403)
|
||||
|
||||
return JsonResponse({'error': 'not_authenticated'}, status=403)
|
||||
|
||||
|
||||
@group_required('user')
|
||||
|
||||
@@ -438,7 +438,7 @@ def test(request):
|
||||
parser = IngredientParser(request, False)
|
||||
|
||||
data = {
|
||||
'original': '1 Porreestange(n) , ca. 200 g'
|
||||
'original': '90g golden syrup'
|
||||
}
|
||||
data['parsed'] = parser.parse(data['original'])
|
||||
|
||||
|
||||
@@ -11,8 +11,13 @@ over at [GitHub issues](https://github.com/vabene1111/recipes/issues).
|
||||
Without feedback improvement can't happen, so don't hesitate to say what you want to say.
|
||||
|
||||
## Contributing Code
|
||||
Code contributions are always welcome. There are no special rules for what you need to do,
|
||||
just do your best and we will work together to get your idea and code merged into the project.
|
||||
If you want to contribute bug fixes or small tweaks then your pull requests are always welcome!
|
||||
|
||||
!!! danger "Discuss First!"
|
||||
If you want to contribute larger features that introduce more complexity to the project please
|
||||
make sure to **first submit a technical description** outlining what and how you want to do it.
|
||||
This allows me and the community to give feedback and manage the complexity of the overall
|
||||
application. If you don't do this please don't be mad if I reject your PR
|
||||
|
||||
!!! info
|
||||
The dev setup is a little messy as this application combines the best (at least in my opinion) of both Django and Vue.js.
|
||||
|
||||
11
docs/faq.md
11
docs/faq.md
@@ -48,12 +48,21 @@ The other common issue is that the recommended nginx container is removed from t
|
||||
If removed, the nginx webserver needs to be replaced by something else that servers the /mediafiles/ directory or
|
||||
`GUNICORN_MEDIA` needs to be enabled to allow media serving by the application container itself.
|
||||
|
||||
|
||||
## Why does the Text/Markdown preview look different than the final recipe ?
|
||||
|
||||
Tandoor has always rendered the recipe instructions markdown on the server. This also allows tandoor to implement things like ingredient templating and scaling in text.
|
||||
To make editing easier a markdown editor was added to the frontend with integrated preview as a temporary solution. Since the markdown editor uses a different
|
||||
specification than the server the preview is different to the final result. It is planned to improve this in the future.
|
||||
|
||||
The markdown renderer follows this markdown specification https://daringfireball.net/projects/markdown/
|
||||
|
||||
## Why is Tandoor not working on my Raspberry Pi?
|
||||
|
||||
Please refer to [here](install/docker.md#setup-issues-on-raspberry-pi).
|
||||
|
||||
## How can I create users?
|
||||
To create a new user click on your name (top right corner) and select system. There click on invite links and create a new invite link.
|
||||
To create a new user click on your name (top right corner) and select 'space settings'. There under invites click create.
|
||||
|
||||
It is not possible to create users through the admin because users must be assigned a default group and space.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
This application features a very versatile import and export feature in order
|
||||
to offer the best experience possible and allow you to freely choose where your data goes.
|
||||
|
||||
!!! warning "WIP"
|
||||
!!! WARNING "WIP"
|
||||
The Module is relatively new. There is a known issue with [Timeouts](https://github.com/vabene1111/recipes/issues/417) on large exports.
|
||||
A fix is being developed and will likely be released with the next version.
|
||||
|
||||
@@ -13,7 +13,7 @@ if your favorite one is missing.
|
||||
|
||||
!!! info "Export"
|
||||
I strongly believe in everyone's right to use their data as they please and therefore want to give you
|
||||
the most possible flexibility with your recipes.
|
||||
the best possible flexibility with your recipes.
|
||||
That said for most of the people getting this application running with their recipes is the biggest priority.
|
||||
Because of this importing as many formats as possible is prioritized over exporting.
|
||||
Exporter for the different formats will follow over time.
|
||||
@@ -75,7 +75,7 @@ Follow these steps to import your recipes
|
||||
|
||||
You will get a `Recipes.zip` file. Simply upload the file and choose the Nextcloud Cookbook type.
|
||||
|
||||
!!! warning "Folder Structure"
|
||||
!!! WARNING "Folder Structure"
|
||||
Importing only works if the folder structure is correct. If you do not use the standard path or create the
|
||||
zip file in any other way make sure the structure is as follows
|
||||
```
|
||||
@@ -94,9 +94,9 @@ Mealie provides structured data similar to nextcloud.
|
||||
|
||||
To migrate your recipes
|
||||
|
||||
1. Go to your Mealie settings and create a new Backup
|
||||
2. Download the backup by clicking on it and pressing download (this wasn't working for me, so I had to manually pull it from the server)
|
||||
3. Upload the entire `.zip` file to the importer page and import everything
|
||||
1. Go to your Mealie settings and create a new Backup.
|
||||
2. Download the backup by clicking on it and pressing download (this wasn't working for me, so I had to manually pull it from the server).
|
||||
3. Upload the entire `.zip` file to the importer page and import everything.
|
||||
|
||||
## Chowdown
|
||||
Chowdown stores all your recipes in plain text markdown files in a directory called `_recipes`.
|
||||
@@ -158,7 +158,7 @@ As ChefTap cannot import these files anyway there won't be an exporter implement
|
||||
Meal master can be imported by uploading one or more meal master files.
|
||||
The files should either be `.txt`, `.MMF` or `.MM` files.
|
||||
|
||||
The MealMaster spec allow for many variations. Currently, only the one column format for ingredients is supported.
|
||||
The MealMaster spec allows for many variations. Currently, only the one column format for ingredients is supported.
|
||||
Second line notes to ingredients are currently also not imported as a note but simply put into the instructions.
|
||||
If you have MealMaster recipes that cannot be imported feel free to raise an issue.
|
||||
|
||||
@@ -248,4 +248,4 @@ For that to work it downloads a chromium binary of about 140 MB to your server a
|
||||
Since that is something some server administrators might not want there the PDF exporter is disabled by default and can be enabled with `ENABLE_PDF_EXPORT=1` in `.env`.
|
||||
|
||||
See [this issue](https://github.com/TandoorRecipes/recipes/pull/1211) for more discussion on this and
|
||||
[this issue](https://github.com/TandoorRecipes/recipes/issues/781) for the future plans to support server side rendering.
|
||||
[this issue](https://github.com/TandoorRecipes/recipes/issues/781) for the future plans to support server side rendering.
|
||||
|
||||
@@ -13,6 +13,8 @@ services:
|
||||
image: vabene1111/recipes
|
||||
env_file:
|
||||
- ./.env
|
||||
ports:
|
||||
- 80:8080
|
||||
volumes:
|
||||
- staticfiles:/opt/recipes/staticfiles
|
||||
- nginx_config:/opt/recipes/nginx/conf.d
|
||||
@@ -24,7 +26,6 @@ services:
|
||||
image: nginx:mainline-alpine
|
||||
restart: always
|
||||
ports:
|
||||
- 80:80
|
||||
env_file:
|
||||
- ./.env
|
||||
depends_on:
|
||||
|
||||
@@ -210,9 +210,12 @@ cd /var/www/recipes
|
||||
git pull
|
||||
# load envirtonment variables
|
||||
export $(cat /var/www/recipes/.env |grep "^[^#]" | xargs)
|
||||
#install project requirements
|
||||
bin/pip3 install -r requirements.txt
|
||||
# migrate database
|
||||
bin/python3 manage.py migrate
|
||||
# collect static files
|
||||
# if the output is not "0 static files copied" you might want to run the commands again to make sure everythig is collected
|
||||
bin/python3 manage.py collectstatic --no-input
|
||||
bin/python3 manage.py collectstatic_js_reverse
|
||||
# change to frontend directory
|
||||
|
||||
@@ -23,6 +23,7 @@ markdown_extensions:
|
||||
|
||||
plugins:
|
||||
- include-markdown
|
||||
- search
|
||||
|
||||
nav:
|
||||
- Home: 'index.md'
|
||||
|
||||
12
node_modules/.yarn-integrity
generated
vendored
Normal file
12
node_modules/.yarn-integrity
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"systemParams": "win32-x64-93",
|
||||
"modulesFolders": [
|
||||
"node_modules"
|
||||
],
|
||||
"flags": [],
|
||||
"linkedModules": [],
|
||||
"topLevelPatterns": [],
|
||||
"lockfileEntries": {},
|
||||
"files": [],
|
||||
"artifacts": {}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,11 +1,11 @@
|
||||
Django==4.0.7
|
||||
cryptography==37.0.2
|
||||
Django==4.0.8
|
||||
cryptography==38.0.3
|
||||
django-annoying==0.10.6
|
||||
django-autocomplete-light==3.9.4
|
||||
django-cleanup==6.0.0
|
||||
django-crispy-forms==1.14.0
|
||||
django-tables2==2.4.1
|
||||
djangorestframework==3.13.1
|
||||
djangorestframework==3.14.0
|
||||
drf-writable-nested==0.7.0
|
||||
django-oauth-toolkit==2.1.0
|
||||
django-debug-toolbar==3.6.0
|
||||
@@ -27,20 +27,20 @@ uritemplate==4.1.1
|
||||
beautifulsoup4==4.11.1
|
||||
microdata==0.8.0
|
||||
Jinja2==3.1.2
|
||||
django-webpack-loader==1.5.0
|
||||
django-webpack-loader==1.6.0
|
||||
git+https://github.com/ierror/django-js-reverse@7cab78c4531780ab4b32033d5104ccd5be1a246a
|
||||
django-allauth==0.51.0
|
||||
recipe-scrapers==14.14.0
|
||||
recipe-scrapers==14.23.0
|
||||
django-scopes==1.2.0.post1
|
||||
pytest==7.1.2
|
||||
pytest==7.1.3
|
||||
pytest-django==4.5.2
|
||||
django-treebeard==4.5.1
|
||||
django-cors-headers==3.13.0
|
||||
django-storages==1.12.3
|
||||
boto3==1.24.21
|
||||
django-storages==1.13.1
|
||||
boto3==1.24.84
|
||||
django-prometheus==2.2.0
|
||||
django-hCaptcha==0.2.0
|
||||
python-ldap==3.4.2
|
||||
python-ldap==3.4.3
|
||||
django-auth-ldap==4.1.0
|
||||
pytest-factoryboy==2.5.0
|
||||
pyppeteer==1.0.2
|
||||
|
||||
@@ -8,61 +8,61 @@
|
||||
"lint": "vue-cli-service lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/eslint-parser": "^7.16.0",
|
||||
"@babel/eslint-parser": "^7.19.1",
|
||||
"@kevinfaguiar/vue-twemoji-picker": "^5.7.4",
|
||||
"@popperjs/core": "^2.11.2",
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"@riophae/vue-treeselect": "^0.4.0",
|
||||
"@vue/cli": "^5.0.4",
|
||||
"@vue/cli": "^5.0.8",
|
||||
"axios": "^0.27.2",
|
||||
"babel": "^6.23.0",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-loader": "^8.2.5",
|
||||
"bootstrap-vue": "^2.21.2",
|
||||
"core-js": "^3.25.0",
|
||||
"core-js": "^3.25.3",
|
||||
"html2pdf.js": "^0.10.1",
|
||||
"lodash": "^4.17.21",
|
||||
"mavon-editor": "^2.10.4",
|
||||
"moment": "^2.29.4",
|
||||
"prismjs": "^1.27.0",
|
||||
"prismjs": "^1.29.0",
|
||||
"vue": "^2.6.14",
|
||||
"vue-class-component": "^7.2.3",
|
||||
"vue-click-outside": "^1.1.0",
|
||||
"vue-clickaway": "^2.2.2",
|
||||
"vue-clipboard2": "^0.3.3",
|
||||
"vue-cookies": "^1.8.1",
|
||||
"vue-i18n": "^8.26.8",
|
||||
"vue-i18n": "^8.27.2",
|
||||
"vue-infinite-loading": "^2.4.5",
|
||||
"vue-multiselect": "^2.1.6",
|
||||
"vue-property-decorator": "^9.1.2",
|
||||
"vue-sanitize": "^0.2.2",
|
||||
"vue-simple-calendar": "^5.0.0",
|
||||
"vue-template-compiler": "^2.6.14",
|
||||
"vue2-touch-events": "^3.2.2",
|
||||
"vuedraggable": "^2.24.3",
|
||||
"vuex": "^3.6.0",
|
||||
"workbox-webpack-plugin": "^6.3.0"
|
||||
"vue-template-compiler": "2.6.14",
|
||||
"workbox-webpack-plugin": "^6.5.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@kazupon/vue-i18n-loader": "^0.5.0",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.32.0",
|
||||
"@vue/cli-plugin-babel": "^5.0.4",
|
||||
"@vue/cli-plugin-eslint": "~5.0.4",
|
||||
"@vue/cli-plugin-pwa": "^5.0.4",
|
||||
"@vue/cli-plugin-typescript": "^5.0.4",
|
||||
"@vue/cli-service": "^5.0.4",
|
||||
"@vue/compiler-sfc": "^3.2.29",
|
||||
"@vue/cli-plugin-babel": "^5.0.8",
|
||||
"@vue/cli-plugin-eslint": "~5.0.8",
|
||||
"@vue/cli-plugin-pwa": "^5.0.8",
|
||||
"@vue/cli-plugin-typescript": "^5.0.8",
|
||||
"@vue/cli-service": "^5.0.8",
|
||||
"@vue/compiler-sfc": "^3.2.40",
|
||||
"@vue/eslint-config-typescript": "^10.0.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"eslint": "^7.28.0",
|
||||
"eslint-plugin-vue": "^8.7.1",
|
||||
"typescript": "~4.8.2",
|
||||
"typescript": "~4.8.4",
|
||||
"vue-cli-plugin-i18n": "^2.3.1",
|
||||
"webpack-bundle-tracker": "1.5.0",
|
||||
"workbox-expiration": "^6.3.0",
|
||||
"workbox-navigation-preload": "^6.0.2",
|
||||
"workbox-precaching": "^6.5.3",
|
||||
"workbox-routing": "^6.5.0",
|
||||
"webpack-bundle-tracker": "1.6.0",
|
||||
"workbox-expiration": "^6.5.4",
|
||||
"workbox-navigation-preload": "^6.5.4",
|
||||
"workbox-precaching": "^6.5.4",
|
||||
"workbox-routing": "^6.5.4",
|
||||
"workbox-strategies": "^6.2.4"
|
||||
},
|
||||
"eslintConfig": {
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
<select class="form-control" v-model="recipe_app">
|
||||
<option value="DEFAULT">Default</option>
|
||||
<option value="SAFFRON">Saffron</option>
|
||||
<option value="NEXTCLOUD">Nextcloud Cookbook</option>
|
||||
<option value="RECIPESAGE">Recipe Sage</option>
|
||||
<option value="PDF">PDF (experimental)</option>
|
||||
</select>
|
||||
|
||||
@@ -308,7 +308,7 @@
|
||||
size="sm"
|
||||
class="ml-1 mb-1 mb-md-0"
|
||||
@click="
|
||||
paste_step = step.id
|
||||
paste_step = step
|
||||
$bvModal.show('id_modal_paste_ingredients')
|
||||
"
|
||||
>
|
||||
@@ -576,6 +576,23 @@
|
||||
<i class="fas fa-code"></i>
|
||||
{{ $t("Copy_template_reference") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
@click="duplicateIngredient(step, ingredient, index + 1)">
|
||||
<i class="fas fa-copy"></i>
|
||||
{{ $t("Copy") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="index > 0"
|
||||
@click="moveIngredient(step, ingredient, index-1)">
|
||||
<i class="fas fa-arrow-up"></i>
|
||||
{{ $t("Up") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="index !== step.ingredients.length - 1"
|
||||
@click="moveIngredient(step, ingredient, index+1)">
|
||||
<i class="fas fa-arrow-down"></i>
|
||||
{{ $t("Down") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -648,7 +665,8 @@
|
||||
v-if="recipe !== undefined">
|
||||
<div class="col-3 col-md-6 mb-1 mb-md-0 pr-2 pl-2">
|
||||
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
|
||||
class="d-block d-md-none btn btn-block btn-danger shadow-none btn-sm"><i class="fa fa-trash fa-lg"></i></a>
|
||||
class="d-block d-md-none btn btn-block btn-danger shadow-none btn-sm"><i
|
||||
class="fa fa-trash fa-lg"></i></a>
|
||||
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
|
||||
class="d-none d-md-block btn btn-block btn-danger shadow-none btn-sm">{{ $t("Delete") }}</a>
|
||||
</div>
|
||||
@@ -705,7 +723,7 @@
|
||||
<b-modal
|
||||
id="id_modal_paste_ingredients"
|
||||
v-bind:title="$t('ingredient_list')"
|
||||
@ok="appendIngredients"
|
||||
@ok="appendIngredients(paste_step)"
|
||||
@cancel="paste_ingredients = paste_step = undefined"
|
||||
@close="paste_ingredients = paste_step = undefined"
|
||||
>
|
||||
@@ -1039,6 +1057,12 @@ export default {
|
||||
this.recipe.steps.splice(new_index < 0 ? 0 : new_index, 0, step)
|
||||
this.sortSteps()
|
||||
},
|
||||
moveIngredient: function (step, ingredient, new_index) {
|
||||
step.ingredients.splice(step.ingredients.indexOf(ingredient), 1)
|
||||
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
|
||||
this.sortIngredients(step)
|
||||
},
|
||||
|
||||
addFoodType: function (tag, index) {
|
||||
let [tmp, step, id] = index.split("_")
|
||||
|
||||
@@ -1188,30 +1212,38 @@ export default {
|
||||
energy: function () {
|
||||
return energyHeading()
|
||||
},
|
||||
appendIngredients: function () {
|
||||
appendIngredients: function (step) {
|
||||
let ing_list = this.paste_ingredients.split(/\r?\n/)
|
||||
let step = this.recipe.steps.findIndex((x) => x.id == this.paste_step)
|
||||
let order = Math.max(...this.recipe.steps[step].ingredients.map((x) => x.order), -1) + 1
|
||||
this.recipe.steps[step].ingredients_visible = true
|
||||
step.ingredients_visible = true
|
||||
let parsed_ing_list = []
|
||||
let promises = []
|
||||
ing_list.forEach((ing) => {
|
||||
if (ing.trim() !== "") {
|
||||
this.genericPostAPI("api_ingredient_from_string", {text: ing}).then((result) => {
|
||||
promises.push(this.genericPostAPI("api_ingredient_from_string", {text: ing}).then((result) => {
|
||||
let unit = null
|
||||
if (result.data.unit !== "" && result.data.unit !== null) {
|
||||
unit = {name: result.data.unit}
|
||||
}
|
||||
this.recipe.steps[step].ingredients.splice(order, 0, {
|
||||
parsed_ing_list.push({
|
||||
amount: result.data.amount,
|
||||
unit: unit,
|
||||
food: {name: result.data.food},
|
||||
note: result.data.note,
|
||||
original_text: ing,
|
||||
})
|
||||
})
|
||||
order++
|
||||
}))
|
||||
}
|
||||
})
|
||||
Promise.allSettled(promises).then(() => {
|
||||
ing_list.forEach(ing => {
|
||||
step.ingredients.push(parsed_ing_list.find(x => x.original_text === ing))
|
||||
})
|
||||
})
|
||||
},
|
||||
duplicateIngredient: function (step, ingredient, new_index) {
|
||||
delete ingredient.id
|
||||
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -75,7 +75,8 @@
|
||||
</div>
|
||||
|
||||
<div class="col col-md-2 col-2 mt-2 mt-md-0 text-right">
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings" :disabled_options="{print:false}"></recipe-context-menu>
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings"
|
||||
:disabled_options="{print:false}"></recipe-context-menu>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
@@ -103,13 +104,6 @@
|
||||
:style="{ 'max-height': ingredient_height }"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-top: 2vh; margin-bottom: 2vh">
|
||||
<div class="col-12">
|
||||
<Nutrition-component :recipe="recipe" id="nutrition_container"
|
||||
:ingredient_factor="ingredient_factor"></Nutrition-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -137,10 +131,19 @@
|
||||
|
||||
<div v-if="recipe.source_url !== null">
|
||||
<h6 class="d-print-none"><i class="fas fa-file-import"></i> {{ $t("Imported_From") }}</h6>
|
||||
<span class="text-muted mt-1"><a style="overflow-wrap: break-word;" :href="recipe.source_url">{{ recipe.source_url }}</a></span>
|
||||
<span class="text-muted mt-1"><a style="overflow-wrap: break-word;"
|
||||
:href="recipe.source_url">{{ recipe.source_url }}</a></span>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-top: 2vh; ">
|
||||
<div class="col-lg-6 offset-lg-3 col-12">
|
||||
<Nutrition-component :recipe="recipe" id="nutrition_container"
|
||||
:ingredient_factor="ingredient_factor"></Nutrition-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<add-recipe-to-book :recipe="recipe"></add-recipe-to-book>
|
||||
|
||||
<div class="row text-center d-print-none" style="margin-top: 3vh; margin-bottom: 3vh"
|
||||
@@ -206,10 +209,12 @@ export default {
|
||||
ingredient_count() {
|
||||
return this.recipe?.steps.map((x) => x.ingredients).flat().length
|
||||
},
|
||||
working_time: function() {
|
||||
return calculateHourMinuteSplit(this.recipe.working_time)},
|
||||
waiting_time: function() {
|
||||
return calculateHourMinuteSplit(this.recipe.waiting_time)},
|
||||
working_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.working_time)
|
||||
},
|
||||
waiting_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.waiting_time)
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<b-form-group :label="$t('Share')" :description="$t('plan_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
@change="user_preferences.plan_share = $event.val;updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.plan_share"
|
||||
label="display_name"
|
||||
@@ -57,7 +57,7 @@ export default {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
if (reload !== undefined) {
|
||||
if (reload) {
|
||||
location.reload()
|
||||
}
|
||||
}).catch(err => {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div v-if="user_preferences !== undefined">
|
||||
<b-form-group :label="$t('shopping_share')" :description="$t('shopping_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
@change="user_preferences.shopping_share = $event.val; updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.shopping_share"
|
||||
label="display_name"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<template v-if="step.name">{{ step.name }}</template>
|
||||
<template v-else>{{ $t("Step") }} {{ index + 1 }}</template>
|
||||
<small style="margin-left: 4px" class="text-muted" v-if="step.time !== 0"><i
|
||||
class="fas fa-user-clock"></i> {{ step.time }} {{ $t("min") }} </small>
|
||||
class="fas fa-user-clock"></i> {{ step_time }}</small>
|
||||
<small v-if="start_time !== ''" class="d-print-none">
|
||||
<b-link :id="`id_reactive_popover_${step.id}`" @click="openPopover" href="#">
|
||||
{{ moment(start_time).add(step.time_offset, "minutes").format("HH:mm") }}
|
||||
@@ -131,7 +131,7 @@ import CompileComponent from "@/components/CompileComponent"
|
||||
import IngredientsCard from "@/components/IngredientsCard"
|
||||
import Vue from "vue"
|
||||
import moment from "moment"
|
||||
import {ResolveUrlMixin} from "@/utils/utils"
|
||||
import {ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils"
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@@ -150,6 +150,10 @@ export default {
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
step_time: function() {
|
||||
return calculateHourMinuteSplit(this.step.time)},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
details_visible: true,
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"warning_feature_beta": "Esta función está en fase BETA de pruebas. Podrían aparecer fallos y cambios importantes en un futuro(pudiendo perder la información) cuando uses esta función.",
|
||||
"err_fetching_resource": "¡Ha habido un error al obtener el recurso!",
|
||||
"err_creating_resource": "¡Ha habido un error al crear el recurso!",
|
||||
"err_updating_resource": "¡Ha habido un error al actualizar el recurso!",
|
||||
"err_deleting_resource": "¡Ha habido un error al eliminar el recurso!",
|
||||
"warning_feature_beta": "Esta función está en fase BETA de pruebas. Podrían aparecer fallos y cambios importantes en un futuro (pudiendo perder la información) cuando uses esta función.",
|
||||
"err_fetching_resource": "¡Hubo un error al obtener el recurso!",
|
||||
"err_creating_resource": "¡Hubo un error al crear el recurso!",
|
||||
"err_updating_resource": "¡Hubo un error al actualizar el recurso!",
|
||||
"err_deleting_resource": "¡Hubo un error al eliminar el recurso!",
|
||||
"err_deleting_protected_resource": "El objeto a eliminar sigue en uso y no puede ser eliminado.",
|
||||
"err_moving_resource": "¡Ha habido un error moviendo el recurso!",
|
||||
"err_merging_resource": "¡Ha habido un error uniendo el recurso!",
|
||||
"success_fetching_resource": "¡Se ha obtenido con éxito un recurso!",
|
||||
"success_creating_resource": "¡Se ha creado con éxito un recurso!",
|
||||
"success_updating_resource": "¡Se ha actualizado con éxito un recurso!",
|
||||
"success_deleting_resource": "¡Se ha eliminado con éxito un recurso!",
|
||||
"success_moving_resource": "¡Se ha movido con éxito un recurso!",
|
||||
"success_merging_resource": "¡Se ha unido con éxito un recurso!",
|
||||
"file_upload_disabled": "La subida de archivos no está habilitada para tu espacio.",
|
||||
"err_moving_resource": "¡Hubo un error moviendo el recurso!",
|
||||
"err_merging_resource": "¡Hubo un error al fusionar un recurso!",
|
||||
"success_fetching_resource": "¡Se ha obtenido un recurso con éxito!",
|
||||
"success_creating_resource": "¡Se ha creado un recurso con éxito!",
|
||||
"success_updating_resource": "¡Se ha actualizado un recurso con éxito !",
|
||||
"success_deleting_resource": "¡Se ha eliminado un recurso con éxito!",
|
||||
"success_moving_resource": "¡Se ha movido un recurso con éxito!",
|
||||
"success_merging_resource": "¡Se ha fusionado con éxito un recurso!",
|
||||
"file_upload_disabled": "La carga de archivos no está habilitada para su espacio.",
|
||||
"step_time_minutes": "Tiempo del paso en minutos",
|
||||
"confirm_delete": "¿Estás seguro de eliminar este {object}?",
|
||||
"import_running": "Importación realizándose, ¡Espere!",
|
||||
@@ -259,7 +259,7 @@
|
||||
"Coming_Soon": "Próximamente",
|
||||
"Auto_Planner": "Planificador Automático",
|
||||
"New_Cookbook": "Nuevo libro de recetas",
|
||||
"Hide_Keyword": "Ocultar etiquetas",
|
||||
"Hide_Keyword": "Esconder Palabras Clave",
|
||||
"Clear": "Limpiar",
|
||||
"err_move_self": "No puedes mover un elemento a sí mismo",
|
||||
"nothing": "Nada que hacer",
|
||||
@@ -298,27 +298,27 @@
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "Comida",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"enable_expert": "Habilitar Modo Experto",
|
||||
"expert_mode": "Modo Experto",
|
||||
"simple_mode": "Modo Simple",
|
||||
"advanced": "Avanzado",
|
||||
"fields": "Campos",
|
||||
"show_keywords": "Mostrar palabras clave",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_books": "Mostrar Libros",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"show_units": "Mostrar Unidades",
|
||||
"show_filters": "Mostrar Filtros",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"save_filter": "Guardar Filtros",
|
||||
"filter_name": "Nombre de Filtro",
|
||||
"left_handed": "Modo Zurdo",
|
||||
"left_handed_help": "Optimizará la interfaz de usuario para su uso con la mano izquierda.",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"shared_with": "Compartido con",
|
||||
"sort_by": "Ordenar por",
|
||||
"asc": "ascendente",
|
||||
"desc": "",
|
||||
"desc": "Descendiente",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
@@ -336,7 +336,7 @@
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"filter": "Filtro",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Bookmarklet": "",
|
||||
@@ -412,7 +412,7 @@
|
||||
"New_Supermarket": "Crear nuevo supermercado",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"warning_space_delete": "Puedes borrar tu espacio incluyendo todas las recetas, listas de la compra, regímenes de comidas y cualquier otra cosa creada. ¡Esto no puede deshacerse! ¿Estás seguro de que quieres hacerlo?",
|
||||
"warning_space_delete": "Puedes eliminar tu espacio, incluyendo todas las recetas, listas de la compra, regímenes de comidas y cualquier otra cosa creada. ¡Esto no se puede deshacer! ¿Estás seguro de que quieres hacerlo?",
|
||||
"Private_Recipe": "Receta Privada",
|
||||
"Private_Recipe_Help": "La receta solo podrás verla tu y la gente con la que esta compartida.",
|
||||
"reusable_help_text": "El link de invitación podrá ser usado por mas de un usuario",
|
||||
@@ -422,5 +422,19 @@
|
||||
"facet_count_info": "Mostrar contadores de receta en los filtros de búsqueda.",
|
||||
"Copy Link": "Copiar Enlace",
|
||||
"Copy Token": "Copiar Token",
|
||||
"Create_New_Shopping_Category": "Añadir nueva Categoría de Compras"
|
||||
"Create_New_Shopping_Category": "Añadir nueva Categoría de Compras",
|
||||
"Use_Fractions": "Use fracciones",
|
||||
"Theme": "Tema",
|
||||
"Hours": "Horas",
|
||||
"Day": "Día",
|
||||
"Days": "Días",
|
||||
"Second": "Segundo",
|
||||
"Seconds": "Segundos",
|
||||
"Account": "Cuenta",
|
||||
"API": "API",
|
||||
"Decimals": "Decimales",
|
||||
"Default_Unit": "Unidad Predeterminada",
|
||||
"Language": "Lenguaje",
|
||||
"Hour": "Hora",
|
||||
"Username": "Nombre de Usuario"
|
||||
}
|
||||
|
||||
@@ -394,5 +394,13 @@
|
||||
"Copy Link": "Copier le lien",
|
||||
"Default_Unit": "Unité par défaut",
|
||||
"Hour": "Heure",
|
||||
"Day": "Jour"
|
||||
"Day": "Jour",
|
||||
"food_inherit_info": "Champs sur les ingrédients qui doivent être hérité par défaut.",
|
||||
"Invites": "Invitations",
|
||||
"paste_json": "Collez une source json ou html pour charger la recette.",
|
||||
"warning_space_delete": "Vous pouvez supprimer votre groupe ainsi que toutes les recettes, listes de courses, menus et autres choses que vous avez créés. Vous ne pourrez pas revenir sur cette suppression ! Êtes-vous sûr de vouloir le faire ?",
|
||||
"Comments_setting": "Montrer les commentaires",
|
||||
"import_duplicates": "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher la case pour tout importer.",
|
||||
"Account": "Compte",
|
||||
"Change_Password": "Modifier le mot de passe"
|
||||
}
|
||||
|
||||
462
vue/src/locales/id.json
Normal file
462
vue/src/locales/id.json
Normal file
@@ -0,0 +1,462 @@
|
||||
{
|
||||
"warning_feature_beta": "Fitur ini saat ini dalam status BETA (pengujian). Harap perkirakan bug dan kemungkinan kerusakan perubahan di masa mendatang (mungkin kehilangan data terkait fitur) saat menggunakan fitur ini.",
|
||||
"err_fetching_resource": "Terjadi kesalahan saat mengambil sumber daya!",
|
||||
"err_creating_resource": "Terjadi kesalahan saat membuat sumber daya!",
|
||||
"err_updating_resource": "Terjadi kesalahan saat mengupdate sumber daya!",
|
||||
"err_deleting_resource": "Terjadi kesalahan saat menghapus sumber daya!",
|
||||
"err_deleting_protected_resource": "Objek yang Anda coba hapus masih digunakan dan tidak dapat dihapus.",
|
||||
"err_moving_resource": "Terjadi kesalahan saat memindahkan sumber daya!",
|
||||
"err_merging_resource": "Terjadi kesalahan saat menggabungkan sumber daya!",
|
||||
"success_fetching_resource": "Berhasil mengambil sumber daya!",
|
||||
"success_creating_resource": "Berhasil membuat sumber daya!",
|
||||
"success_updating_resource": "Berhasil memperbarui sumber daya!",
|
||||
"success_deleting_resource": "Berhasil menghapus sumber daya!",
|
||||
"success_moving_resource": "Berhasil memindahkan sumber daya!",
|
||||
"success_merging_resource": "Berhasil menggabungkan sumber daya!",
|
||||
"file_upload_disabled": "Unggahan file tidak diaktifkan untuk ruang Anda.",
|
||||
"warning_space_delete": "Anda dapat menghapus ruang Anda termasuk semua resep, daftar belanja, rencana makan, dan apa pun yang telah Anda buat. Ini tidak dapat dibatalkan! Apakah Anda yakin ingin melakukan ini?",
|
||||
"food_inherit_info": "Bidang pada makanan yang harus diwarisi secara default.",
|
||||
"facet_count_info": "Tampilkan jumlah resep pada filter pencarian.",
|
||||
"step_time_minutes": "Langkah waktu dalam menit",
|
||||
"confirm_delete": "Anda yakin ingin menghapus {object} ini?",
|
||||
"import_running": "Impor berjalan, harap tunggu!",
|
||||
"all_fields_optional": "Semua bidang adalah opsional dan dapat dibiarkan kosong.",
|
||||
"convert_internal": "Ubah ke resep internal",
|
||||
"show_only_internal": "Hanya tampilkan resep internal",
|
||||
"show_split_screen": "Tampilan Terpisah",
|
||||
"Log_Recipe_Cooking": "Log Resep Memasak",
|
||||
"External_Recipe_Image": "Gambar Resep Eksternal",
|
||||
"Add_to_Shopping": "Tambahkan ke Belanja",
|
||||
"Add_to_Plan": "Tambahkan ke Rencana",
|
||||
"Step_start_time": "Langkah waktu mulai",
|
||||
"Sort_by_new": "Urutkan berdasarkan baru",
|
||||
"Table_of_Contents": "Daftar isi",
|
||||
"Recipes_per_page": "Resep per Halaman",
|
||||
"Show_as_header": "Tampilkan sebagai tajuk",
|
||||
"Hide_as_header": "Sembunyikan sebagai tajuk",
|
||||
"Add_nutrition_recipe": "Tambahkan nutrisi ke resep",
|
||||
"Remove_nutrition_recipe": "Hapus nutrisi dari resep",
|
||||
"Copy_template_reference": "Salin referensi template",
|
||||
"Save_and_View": "Simpan & Lihat",
|
||||
"Manage_Books": "Kelola Buku",
|
||||
"Meal_Plan": "rencana makan",
|
||||
"Select_Book": "Pilih Buku",
|
||||
"Select_File": "Pilih Buku",
|
||||
"Recipe_Image": "Gambar Resep",
|
||||
"Import_finished": "Impor selesai",
|
||||
"View_Recipes": "Lihat Resep",
|
||||
"Log_Cooking": "Log Memasak",
|
||||
"New_Recipe": "Resep Baru",
|
||||
"Url_Import": "Impor Url",
|
||||
"Reset_Search": "Setel Ulang Pencarian",
|
||||
"Recently_Viewed": "baru saja dilihat",
|
||||
"Load_More": "Muat lebih banyak",
|
||||
"New_Keyword": "Kata Kunci Baru",
|
||||
"Delete_Keyword": "Hapus Kata Kunci",
|
||||
"Edit_Keyword": "Rubah Kata Kunci",
|
||||
"Edit_Recipe": "Rubah Resep",
|
||||
"Move_Keyword": "Pindahkan Kata Kunci",
|
||||
"Merge_Keyword": "Gabungkan Kata Kunci",
|
||||
"Hide_Keywords": "Sembunyikan Kata Kunci",
|
||||
"Hide_Recipes": "Sembunyikan Resep",
|
||||
"Move_Up": "Pindahkan keatas",
|
||||
"Move_Down": "Pindahkan kebawah",
|
||||
"Step_Name": "Nama Langkah",
|
||||
"Step_Type": "Tipe Langkah",
|
||||
"Make_Header": "Buat Header",
|
||||
"Make_Ingredient": "Buat bahan",
|
||||
"Enable_Amount": "Aktifkan Jumlah",
|
||||
"Disable_Amount": "Nonaktifkan Jumlah",
|
||||
"Ingredient Editor": "Editor Bahan",
|
||||
"Private_Recipe": "Resep Pribadi",
|
||||
"Private_Recipe_Help": "Resep hanya diperlihatkan kepada Anda dan orang-orang yang dibagikan resep tersebut.",
|
||||
"reusable_help_text": "Haruskah tautan undangan dapat digunakan untuk lebih dari satu pengguna.",
|
||||
"Add_Step": "Tambahkan Langkah",
|
||||
"Keywords": "Kata Kunci",
|
||||
"Books": "Buku",
|
||||
"Proteins": "Protein",
|
||||
"Fats": "Lemak",
|
||||
"Carbohydrates": "Karbohidrat",
|
||||
"Calories": "Kalori",
|
||||
"Energy": "Energi",
|
||||
"Nutrition": "Nutrisi",
|
||||
"Date": "Tanggal",
|
||||
"Share": "Bagikan",
|
||||
"Automation": "Automatis",
|
||||
"Parameter": "Parameter",
|
||||
"Export": "Ekspor",
|
||||
"Copy": "Salin",
|
||||
"Rating": "Peringkat",
|
||||
"Close": "Tutup",
|
||||
"Cancel": "Batal",
|
||||
"Link": "Link",
|
||||
"Add": "Tambahkan",
|
||||
"New": "Baru",
|
||||
"Note": "Catatan",
|
||||
"Success": "Sukses",
|
||||
"Failure": "Kegagalan",
|
||||
"Protected": "Terlindung",
|
||||
"Ingredients": "bahan-bahan",
|
||||
"Supermarket": "Supermarket",
|
||||
"Categories": "Kategori",
|
||||
"Category": "Kategori",
|
||||
"Selected": "Terpilih",
|
||||
"min": "min",
|
||||
"Servings": "Porsi",
|
||||
"Waiting": "Menunggu",
|
||||
"Preparation": "Persiapan",
|
||||
"External": "Luar",
|
||||
"Size": "Ukuran",
|
||||
"Files": "File",
|
||||
"File": "Berkas",
|
||||
"Edit": "Sunting",
|
||||
"Image": "Gambar",
|
||||
"Delete": "Menghapus",
|
||||
"Open": "Membuka",
|
||||
"Ok": "Membuka",
|
||||
"Save": "Menyimpan",
|
||||
"Step": "Melangkah",
|
||||
"Search": "Mencari",
|
||||
"Import": "Impor",
|
||||
"Print": "Mencetak",
|
||||
"Settings": "Pengaturan",
|
||||
"or": "atau",
|
||||
"and": "dan",
|
||||
"Information": "Informasi",
|
||||
"Download": "Unduh",
|
||||
"Create": "Membuat",
|
||||
"Search Settings": "Pengaturan Pencarian",
|
||||
"View": "Melihat",
|
||||
"Recipes": "Resep",
|
||||
"Move": "Bergerak",
|
||||
"Merge": "Menggabungkan",
|
||||
"Parent": "Induk",
|
||||
"Copy Link": "Salin Tautan",
|
||||
"Copy Token": "Salin Token",
|
||||
"delete_confirmation": "Yakin ingin menghapus {source}?",
|
||||
"move_confirmation": "Pindahkan <i>{child}</i> ke induk<i>{parent}</i>",
|
||||
"merge_confirmation": "Ganti <i>{source}</i> dengan <i>{target}</i>",
|
||||
"create_rule": "dan buat otomatisasi",
|
||||
"move_selection": "Pilih {type} induk untuk memindahkan {source}.",
|
||||
"merge_selection": "Ganti semua kemunculan {source} dengan {type} yang dipilih.",
|
||||
"Root": "Akar",
|
||||
"Ignore_Shopping": "Abaikan Belanja",
|
||||
"Shopping_Category": "Kategori Belanja",
|
||||
"Shopping_Categories": "Kategori Belanja",
|
||||
"Edit_Food": "Sunting Makanan",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "",
|
||||
"copy_to_new": "",
|
||||
"recipe_name": "",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "",
|
||||
"Supermarkets": "",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "",
|
||||
"Last_name": "",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "",
|
||||
"Import_Error": "",
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": ""
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
"show_split_screen": "Vista divisa",
|
||||
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
|
||||
"External_Recipe_Image": "Immagine ricetta esterna",
|
||||
"Add_to_Shopping": "Aggiunti a lista della spesa",
|
||||
"Add_to_Shopping": "Aggiunti agli acquisti",
|
||||
"Add_to_Plan": "Aggiungi a Piano",
|
||||
"Step_start_time": "Ora di inizio dello Step",
|
||||
"Sort_by_new": "Prima i nuovi",
|
||||
@@ -91,18 +91,18 @@
|
||||
"Recipes": "Ricette",
|
||||
"Move": "Sposta",
|
||||
"Merge": "Unisci",
|
||||
"Parent": "Principale",
|
||||
"Parent": "Primario",
|
||||
"delete_confimation": "Sei sicuro di voler eliminare {kw} e tutti gli elementi dipendenti?",
|
||||
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
|
||||
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
|
||||
"move_selection": "Scegli un primario {type} dove spostare {source}.",
|
||||
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
|
||||
"Root": "Radice",
|
||||
"Ignore_Shopping": "Ignora lista della spesa",
|
||||
"Ignore_Shopping": "Ignora spesa",
|
||||
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
|
||||
"Description": "Descrizione",
|
||||
"Icon": "Icona",
|
||||
"Unit": "Unità",
|
||||
"Unit": "Unità di misura",
|
||||
"No_ID": "ID non trovato, non è possibile eliminare.",
|
||||
"Recipe_Book": "Libro di Ricette",
|
||||
"create_title": "Nuovo {type}",
|
||||
@@ -240,5 +240,111 @@
|
||||
"nothing": "Nulla da fare",
|
||||
"show_sql": "Mostra SQL",
|
||||
"Search Settings": "Impostazioni di ricerca",
|
||||
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato."
|
||||
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato.",
|
||||
"SupermarketName": "Nome supermercato",
|
||||
"last_cooked": "Cucinato di recente",
|
||||
"FoodNotOnHand": "Non hai {food} a disposizione.",
|
||||
"csv_delim_label": "Delimitatore CSV",
|
||||
"IgnoredFood": "{food} è impostato per ignorare la spesa.",
|
||||
"today_recipes": "Ricette di oggi",
|
||||
"left_handed": "Modalità per mancini",
|
||||
"Pin": "Pin",
|
||||
"DelayUntil": "Ritarda fino a",
|
||||
"Default_Unit": "Unità predefinita",
|
||||
"Decimals": "Decimali",
|
||||
"FoodOnHand": "Hai {food} a disposizione.",
|
||||
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
|
||||
"Language": "Lingua",
|
||||
"Theme": "Tema",
|
||||
"SupermarketCategoriesOnly": "Solo categorie supermercati",
|
||||
"CountMore": "...più +{count}",
|
||||
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
|
||||
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
|
||||
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
|
||||
"plan_share_desc": "Le nuove voci del piano alimentare saranno automaticamente condivise con gli utenti selezionati.",
|
||||
"Hour": "Ora",
|
||||
"Hours": "Ore",
|
||||
"Day": "Giorno",
|
||||
"Days": "Giorni",
|
||||
"Second": "Secondo",
|
||||
"Seconds": "Secondi",
|
||||
"csv_prefix_help": "Prefisso da aggiungere quando si copia una lista negli appunti.",
|
||||
"copy_markdown_table": "Copia come tabella Markdown",
|
||||
"in_shopping": "Nella lista della spesa",
|
||||
"Account": "Account",
|
||||
"Cosmetic": "Aspetto",
|
||||
"API": "API",
|
||||
"Copy Token": "Copia token",
|
||||
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
|
||||
"default_delay": "Ore di ritardo predefinite",
|
||||
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
|
||||
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
|
||||
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
|
||||
"filter_to_supermarket": "Filtra per supermercato",
|
||||
"filter_to_supermarket_desc": "Per impostazione predefinita, filtra la lista della spesa per includere esclusivamente le categorie del supermercato selezionato.",
|
||||
"CategoryName": "Nome categoria",
|
||||
"shopping_recent_days": "Giorni recenti",
|
||||
"download_pdf": "Scarica PDF",
|
||||
"download_csv": "Scarica CSV",
|
||||
"SuccessClipboard": "Lista della spesa copiata negli appunti",
|
||||
"Users": "Utenti",
|
||||
"Invites": "Inviti",
|
||||
"date_viewed": "Recenti",
|
||||
"copy_to_clipboard": "Copia negli appunti",
|
||||
"related_recipes": "Ricette correlate",
|
||||
"Foods": "Alimenti",
|
||||
"asc": "Crescente",
|
||||
"desc": "Decrescente",
|
||||
"Units": "Unità di misura",
|
||||
"shopping_add_onhand_desc": "Contrassegna gli alimenti come \"disponibili\" quando vengono spuntati dalla lista della spesa.",
|
||||
"shopping_add_onhand": "Auto disponibilità",
|
||||
"mark_complete": "Contrassegna come completato",
|
||||
"QuickEntry": "Inserimento rapido",
|
||||
"remember_hours": "Ore da ricordare",
|
||||
"tree_select": "Usa selezione ad albero",
|
||||
"sql_debug": "Debug SQL",
|
||||
"remember_search": "Ricorda ricerca",
|
||||
"facet_count_info": "Mostra il conteggio delle ricette nei filtri di ricerca.",
|
||||
"warning_space_delete": "Stai per eliminare la tua istanza che include tutte le ricette, liste della spesa, piani alimentari e tutto ciò che hai creato. Questa azione non può essere annullata! Sei sicuro di voler procedere?",
|
||||
"food_inherit_info": "Campi di alimenti che devono essere ereditati per impostazione predefinita.",
|
||||
"enable_expert": "Abilita modalità esperto",
|
||||
"expert_mode": "Modalità esperto",
|
||||
"simple_mode": "Modalità semplice",
|
||||
"advanced": "Avanzate",
|
||||
"fields": "Campi",
|
||||
"show_keywords": "Mostra parole chiave",
|
||||
"show_foods": "Mostra alimenti",
|
||||
"show_books": "Mostra libri",
|
||||
"show_rating": "Mostra valutazione",
|
||||
"show_filters": "Mostra filtri",
|
||||
"save_filter": "Salva filtro",
|
||||
"filter_name": "Nome filtro",
|
||||
"left_handed_help": "L'interfaccia verrà ottimizzata per l'uso con la mano sinistra.",
|
||||
"Custom Filter": "Filtro personalizzato",
|
||||
"shared_with": "Condiviso con",
|
||||
"sort_by": "Ordina per",
|
||||
"Ingredient Overview": "Panoramica Ingredienti",
|
||||
"show_units": "Mostra unità di misura",
|
||||
"select_unit": "Seleziona unità di misura",
|
||||
"Ingredient Editor": "Editor Ingredienti",
|
||||
"Private_Recipe": "Ricetta privata",
|
||||
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e a chi l'hai condivisa.",
|
||||
"Protected": "Protetto",
|
||||
"Copy Link": "Copia link",
|
||||
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
|
||||
"and_down": "& Giù",
|
||||
"OnHand": "Attualmente disponibili",
|
||||
"New_Entry": "Nuova voce",
|
||||
"Use_Fractions": "Usa frazioni",
|
||||
"FoodInherit": "Campi ereditabili dagli Alimenti",
|
||||
"one_url_per_line": "Un indirizzo per riga",
|
||||
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
|
||||
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
|
||||
"mealplan_autoinclude_related_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), includi tutte le ricette correlate.",
|
||||
"err_merge_self": "Non è possibile unire un elemento in sé stesso",
|
||||
"shopping_recent_days_desc": "Giorni di visualizzazione delle voci recenti della lista della spesa.",
|
||||
"csv_delim_help": "Delimitatore usato per le esportazioni CSV.",
|
||||
"csv_prefix_label": "Prefisso lista",
|
||||
"not": "not",
|
||||
"Keyword": "Parola chiave"
|
||||
}
|
||||
|
||||
@@ -439,7 +439,7 @@
|
||||
"Day": "Dzień",
|
||||
"Days": "Dni",
|
||||
"Second": "Sekunda",
|
||||
"Cosmetic": "Kosmetyk",
|
||||
"Cosmetic": "Kosmetyczne",
|
||||
"API": "API",
|
||||
"Sticky_Nav_Help": "Zawsze pokazuj menu nawigacyjne u góry ekranu.",
|
||||
"Nav_Color": "Kolor nawigacji",
|
||||
|
||||
462
vue/src/locales/tr.json
Normal file
462
vue/src/locales/tr.json
Normal file
@@ -0,0 +1,462 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "Kaynak alınırken bir hata oluştu!",
|
||||
"err_creating_resource": "Kaynak oluşturulurken bir hata oluştu!",
|
||||
"err_updating_resource": "Kaynak güncellenirken bir hata oluştu!",
|
||||
"err_deleting_resource": "Kaynak silinirken bir hata oluştu!",
|
||||
"err_deleting_protected_resource": "",
|
||||
"err_moving_resource": "",
|
||||
"err_merging_resource": "",
|
||||
"success_fetching_resource": "Kaynak başarıyla getirildi!",
|
||||
"success_creating_resource": "Kaynak başarıyla oluşturuldu!",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "Kaynak başarıyla silindi!",
|
||||
"success_moving_resource": "Kaynak başarıyla taşındı!",
|
||||
"success_merging_resource": "Kaynak başarıyla birleştirildi!",
|
||||
"file_upload_disabled": "Alanınız için dosya yükleme aktif değil.",
|
||||
"warning_space_delete": "Tüm tarifler, alışveriş listeleri, yemek planları ve oluşturduğunuz her şey dahil olmak üzere silinecektir. Bu geri alınamaz! Bunu yapmak istediğinizden emin misiniz?",
|
||||
"food_inherit_info": "",
|
||||
"facet_count_info": "",
|
||||
"step_time_minutes": "Dakika olarak adım süresi",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "Dahili tarif'e dönüştür",
|
||||
"show_only_internal": "Sadece dahili tarifler",
|
||||
"show_split_screen": "Bölünmüş Görünüm",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "Alışverişe Ekle",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "Yeniye göre sırala",
|
||||
"Table_of_Contents": "İçindekiler Tablosu",
|
||||
"Recipes_per_page": "Sayfa Başına Tarif",
|
||||
"Show_as_header": "Başlığı Göster",
|
||||
"Hide_as_header": "Başlığı gizle",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "Kaydet & Görüntüle",
|
||||
"Manage_Books": "Kitapları Yönet",
|
||||
"Meal_Plan": "Yemek Planı",
|
||||
"Select_Book": "Kitap Seç",
|
||||
"Select_File": "Dosya Seç",
|
||||
"Recipe_Image": "Tarif Resmi",
|
||||
"Import_finished": "İçeriye Aktarma Bitti",
|
||||
"View_Recipes": "Tarifleri Görüntüle",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "Yeni Tarif",
|
||||
"Url_Import": "Url İçeri Aktar",
|
||||
"Reset_Search": "Aramayı Sıfırla",
|
||||
"Recently_Viewed": "Son Görüntülenen",
|
||||
"Load_More": "Daha Fazla",
|
||||
"New_Keyword": "Yeni Anahtar Kelime",
|
||||
"Delete_Keyword": "Anahtar Kelimeyi Sil",
|
||||
"Edit_Keyword": "Anahtar Kelimeyi Düzenle",
|
||||
"Edit_Recipe": "Tarifi Düzenle",
|
||||
"Move_Keyword": "Anahtar Kelimeyi Taşı",
|
||||
"Merge_Keyword": "Anahtar Kelimeyi Birleştir",
|
||||
"Hide_Keywords": "Anahtar Kelimeyi Gizle",
|
||||
"Hide_Recipes": "Tarifi Gizle",
|
||||
"Move_Up": "Yukarı Taşı",
|
||||
"Move_Down": "Aşağıya Taşı",
|
||||
"Step_Name": "Adım Adı",
|
||||
"Step_Type": "Adım Tipi",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Enable_Amount": "Tutarı Etkinleştir",
|
||||
"Disable_Amount": "Tutarı Devre Dışı Bırak",
|
||||
"Ingredient Editor": "",
|
||||
"Private_Recipe": "Özel Tarif",
|
||||
"Private_Recipe_Help": "",
|
||||
"reusable_help_text": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "Anahtar Kelimeler",
|
||||
"Books": "Kitaplar",
|
||||
"Proteins": "Proteinler",
|
||||
"Fats": "Yağlar",
|
||||
"Carbohydrates": "Karbonhidratlar",
|
||||
"Calories": "Kaloriler",
|
||||
"Energy": "Enerji",
|
||||
"Nutrition": "Besin",
|
||||
"Date": "Tarih",
|
||||
"Share": "Paylaş",
|
||||
"Automation": "Otomasyon",
|
||||
"Parameter": "Parametre",
|
||||
"Export": "Dışa Aktar",
|
||||
"Copy": "Kopyala",
|
||||
"Rating": "Puanlama",
|
||||
"Close": "Kapat",
|
||||
"Cancel": "İptal",
|
||||
"Link": "Bağlantı",
|
||||
"Add": "Ekle",
|
||||
"New": "Yeni",
|
||||
"Note": "Not",
|
||||
"Success": "Başarılı",
|
||||
"Failure": "Hata",
|
||||
"Protected": "Korumalı",
|
||||
"Ingredients": "Mazemeler",
|
||||
"Supermarket": "Market",
|
||||
"Categories": "Kategoriler",
|
||||
"Category": "Kategori",
|
||||
"Selected": "Seçilen",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "Boyut",
|
||||
"Files": "Dosyalar",
|
||||
"File": "Dosya",
|
||||
"Edit": "Düzenle",
|
||||
"Image": "Resim",
|
||||
"Delete": "Sil",
|
||||
"Open": "Aç",
|
||||
"Ok": "Aç",
|
||||
"Save": "Kaydet",
|
||||
"Step": "Adım",
|
||||
"Search": "Ara",
|
||||
"Import": "İçeriye Aktar",
|
||||
"Print": "Yazdır",
|
||||
"Settings": "Ayarlar",
|
||||
"or": "veya",
|
||||
"and": "ve",
|
||||
"Information": "bilgi",
|
||||
"Download": "İndir",
|
||||
"Create": "Oluştur",
|
||||
"Search Settings": "Arama Ayarları",
|
||||
"View": "Görüntüle",
|
||||
"Recipes": "Tarifler",
|
||||
"Move": "Taşı",
|
||||
"Merge": "Birleştir",
|
||||
"Parent": "",
|
||||
"Copy Link": "",
|
||||
"Copy Token": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "Tarif Filtresi",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "Tarif Görüntüle",
|
||||
"copy_to_new": "Yeni Tarif'e Kopyala",
|
||||
"recipe_name": "Tarif Adı",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "Planlanan",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "Hızlı işlemler",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "Birimler",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "Rasgele Tarifler",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "Dosya Seç",
|
||||
"select_recipe": "Tarif Seç",
|
||||
"select_unit": "Birim Seç",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "Seç",
|
||||
"Supermarkets": "Marketler",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "İsim",
|
||||
"Last_name": "Soyisim",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "Sayfa",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "Değiştir",
|
||||
"Import_Error": "İçeri aktarma sırasında bir hata oluştu. Görüntülemek için lütfen sayfanın altındaki Ayrıntıları genişletin.",
|
||||
"Warning_Delete_Supermarket_Category": "Bir market kategorisinin silinmesi, gıdalarla olan tüm ilişkileri de silecektir. Emin misiniz?",
|
||||
"New_Supermarket": "Yeni Market",
|
||||
"New_Supermarket_Category": "Yeni Market Kategorisi",
|
||||
"Are_You_Sure": "Emin misin?",
|
||||
"Valid Until": "Geçerlilik Tarihi"
|
||||
}
|
||||
@@ -280,7 +280,7 @@ export function getUserPreference(pref = undefined) {
|
||||
export function calculateAmount(amount, factor) {
|
||||
if (getUserPreference("use_fractions")) {
|
||||
let return_string = ""
|
||||
let fraction = frac(amount * factor, 10, true)
|
||||
let fraction = frac(amount * factor, 16, true)
|
||||
|
||||
if (fraction[0] === 0 && fraction[1] === 0 && fraction[2] === 1) {
|
||||
return roundDecimals(amount * factor)
|
||||
|
||||
1164
vue/yarn.lock
1164
vue/yarn.lock
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user