mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-30 21:49:50 -05:00
Compare commits
55 Commits
feature/co
...
1.4.5
| 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 | ||
|
|
89a5f92ace | ||
|
|
33e5bb7d0a | ||
|
|
16c0189b80 | ||
|
|
fd325c1797 | ||
|
|
2902262503 | ||
|
|
12ad6af8c3 | ||
|
|
cf24e1014a |
@@ -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
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
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
|
||||
@@ -96,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()
|
||||
|
||||
@@ -58,6 +58,13 @@ class RecipeKeeper(Integration):
|
||||
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
|
||||
|
||||
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
BIN
cookbook/locale/id/LC_MESSAGES/django.mo
Normal file
BIN
cookbook/locale/id/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
@@ -8,7 +8,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-10-01 16:38+0000\n"
|
||||
"PO-Revision-Date: 2022-10-12 08:33+0000\n"
|
||||
"Last-Translator: wella <wella.design@gmail.com>\n"
|
||||
"Language-Team: Indonesian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/id/>\n"
|
||||
@@ -155,154 +155,180 @@ msgstr "Kecualikan bahan-bahan yang ada."
|
||||
|
||||
#: .\cookbook\forms.py:90
|
||||
msgid "Will optimize the UI for use with your left hand."
|
||||
msgstr ""
|
||||
msgstr "Akan mengoptimalkan UI untuk digunakan dengan tangan kiri Anda."
|
||||
|
||||
#: .\cookbook\forms.py:107
|
||||
msgid ""
|
||||
"Both fields are optional. If none are given the username will be displayed "
|
||||
"instead"
|
||||
msgstr ""
|
||||
"Kedua bidang ini opsional. Jika tidak ada yang diberikan nama pengguna akan "
|
||||
"ditampilkan sebagai gantinya"
|
||||
|
||||
#: .\cookbook\forms.py:128 .\cookbook\forms.py:301
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
msgstr "Nama"
|
||||
|
||||
#: .\cookbook\forms.py:129 .\cookbook\forms.py:302
|
||||
#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88
|
||||
msgid "Keywords"
|
||||
msgstr ""
|
||||
msgstr "Kata Kunci"
|
||||
|
||||
#: .\cookbook\forms.py:130
|
||||
msgid "Preparation time in minutes"
|
||||
msgstr ""
|
||||
msgstr "Waktu persiapan dalam hitungan menit"
|
||||
|
||||
#: .\cookbook\forms.py:131
|
||||
msgid "Waiting time (cooking/baking) in minutes"
|
||||
msgstr ""
|
||||
msgstr "Waktu tunggu (memasak/memanggang) dalam hitungan menit"
|
||||
|
||||
#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303
|
||||
msgid "Path"
|
||||
msgstr ""
|
||||
msgstr "Jalur"
|
||||
|
||||
#: .\cookbook\forms.py:133
|
||||
msgid "Storage UID"
|
||||
msgstr ""
|
||||
msgstr "UID penyimpanan"
|
||||
|
||||
#: .\cookbook\forms.py:165
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
msgstr "Bawaan"
|
||||
|
||||
#: .\cookbook\forms.py:177
|
||||
msgid ""
|
||||
"To prevent duplicates recipes with the same name as existing ones are "
|
||||
"ignored. Check this box to import everything."
|
||||
msgstr ""
|
||||
"Untuk mencegah duplikat resep dengan nama yang sama dengan yang sudah ada "
|
||||
"diabaikan. Centang kotak ini untuk mengimpor semuanya."
|
||||
|
||||
#: .\cookbook\forms.py:200
|
||||
msgid "Add your comment: "
|
||||
msgstr ""
|
||||
msgstr "Tambahkan komentar Anda: "
|
||||
|
||||
#: .\cookbook\forms.py:215
|
||||
msgid "Leave empty for dropbox and enter app password for nextcloud."
|
||||
msgstr ""
|
||||
"Biarkan kosong untuk dropbox dan masukkan kata sandi aplikasi untuk "
|
||||
"nextcloud."
|
||||
|
||||
#: .\cookbook\forms.py:222
|
||||
msgid "Leave empty for nextcloud and enter api token for dropbox."
|
||||
msgstr ""
|
||||
msgstr "Biarkan kosong untuk nextcloud dan masukkan token api untuk dropbox."
|
||||
|
||||
#: .\cookbook\forms.py:231
|
||||
msgid ""
|
||||
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
|
||||
"php/webdav/</code> is added automatically)"
|
||||
msgstr ""
|
||||
"Biarkan kosong untuk dropbox dan masukkan hanya url dasar untuk cloud "
|
||||
"berikutnya (<code>/remote.php/webdav/</code> ditambahkan secara otomatis)"
|
||||
|
||||
#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157
|
||||
msgid "Storage"
|
||||
msgstr ""
|
||||
msgstr "Penyimpanan"
|
||||
|
||||
#: .\cookbook\forms.py:271
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
msgstr "Aktif"
|
||||
|
||||
#: .\cookbook\forms.py:277
|
||||
msgid "Search String"
|
||||
msgstr ""
|
||||
msgstr "Cari String"
|
||||
|
||||
#: .\cookbook\forms.py:304
|
||||
msgid "File ID"
|
||||
msgstr ""
|
||||
msgstr "ID Berkas"
|
||||
|
||||
#: .\cookbook\forms.py:326
|
||||
msgid "You must provide at least a recipe or a title."
|
||||
msgstr ""
|
||||
msgstr "Anda harus memberikan setidaknya resep atau judul."
|
||||
|
||||
#: .\cookbook\forms.py:339
|
||||
msgid "You can list default users to share recipes with in the settings."
|
||||
msgstr ""
|
||||
"Anda dapat membuat daftar pengguna default untuk berbagi resep di pengaturan."
|
||||
|
||||
#: .\cookbook\forms.py:340
|
||||
msgid ""
|
||||
"You can use markdown to format this field. See the <a href=\"/docs/markdown/"
|
||||
"\">docs here</a>"
|
||||
msgstr ""
|
||||
"Anda dapat menggunakan penurunan harga untuk memformat bidang ini. Lihat <a "
|
||||
"href=\"/docs/markdown/\">dokumen di sini</a>"
|
||||
|
||||
#: .\cookbook\forms.py:366
|
||||
msgid "Maximum number of users for this space reached."
|
||||
msgstr ""
|
||||
msgstr "Jumlah maksimum pengguna untuk ruang ini tercapai."
|
||||
|
||||
#: .\cookbook\forms.py:372
|
||||
msgid "Email address already taken!"
|
||||
msgstr ""
|
||||
msgstr "Alamat email sudah terpakai!"
|
||||
|
||||
#: .\cookbook\forms.py:380
|
||||
msgid ""
|
||||
"An email address is not required but if present the invite link will be sent "
|
||||
"to the user."
|
||||
msgstr ""
|
||||
"Alamat email tidak diperlukan tetapi jika ada, tautan undangan akan dikirim "
|
||||
"ke pengguna."
|
||||
|
||||
#: .\cookbook\forms.py:395
|
||||
msgid "Name already taken."
|
||||
msgstr ""
|
||||
msgstr "Nama sudah terpakai."
|
||||
|
||||
#: .\cookbook\forms.py:406
|
||||
msgid "Accept Terms and Privacy"
|
||||
msgstr ""
|
||||
msgstr "Terima Persyaratan dan Privasi"
|
||||
|
||||
#: .\cookbook\forms.py:438
|
||||
msgid ""
|
||||
"Determines how fuzzy a search is if it uses trigram similarity matching (e."
|
||||
"g. low values mean more typos are ignored)."
|
||||
msgstr ""
|
||||
"Menentukan seberapa kabur pencarian jika menggunakan pencocokan kesamaan "
|
||||
"trigram (misalnya nilai rendah berarti lebih banyak kesalahan ketik yang "
|
||||
"diabaikan)."
|
||||
|
||||
#: .\cookbook\forms.py:448
|
||||
msgid ""
|
||||
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
|
||||
"full description of choices."
|
||||
msgstr ""
|
||||
"Pilih jenis metode pencarian. Klik <a href=\"/docs/search/\">di sini</a> "
|
||||
"untuk deskripsi lengkap pilihan."
|
||||
|
||||
#: .\cookbook\forms.py:449
|
||||
msgid ""
|
||||
"Use fuzzy matching on units, keywords and ingredients when editing and "
|
||||
"importing recipes."
|
||||
msgstr ""
|
||||
"Gunakan fuzzy pencocokan pada unit, kata kunci, dan bahan saat mengedit dan "
|
||||
"mengimpor resep."
|
||||
|
||||
#: .\cookbook\forms.py:451
|
||||
msgid ""
|
||||
"Fields to search ignoring accents. Selecting this option can improve or "
|
||||
"degrade search quality depending on language"
|
||||
msgstr ""
|
||||
"Bidang untuk mencari mengabaikan aksen. Memilih opsi ini dapat meningkatkan "
|
||||
"atau menurunkan kualitas pencarian tergantung pada bahasa"
|
||||
|
||||
#: .\cookbook\forms.py:453
|
||||
msgid ""
|
||||
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
|
||||
"'pie' and 'piece' and 'soapie')"
|
||||
msgstr ""
|
||||
"Bidang untuk mencari kecocokan sebagian. (mis. mencari 'Pie' akan "
|
||||
"mengembalikan 'pie' dan 'piece' dan 'soapie')"
|
||||
|
||||
#: .\cookbook\forms.py:455
|
||||
msgid ""
|
||||
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
|
||||
"will return 'salad' and 'sandwich')"
|
||||
msgstr ""
|
||||
"Bidang untuk mencari awal kata yang cocok. (misalnya mencari 'sa' akan "
|
||||
"mengembalikan 'salad' dan 'sandwich')"
|
||||
|
||||
#: .\cookbook\forms.py:457
|
||||
msgid ""
|
||||
|
||||
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-09-25 12:33+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"
|
||||
@@ -350,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 ""
|
||||
@@ -1750,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"
|
||||
@@ -2151,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
|
||||
@@ -2227,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
|
||||
@@ -2475,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.
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -1382,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'])
|
||||
|
||||
|
||||
@@ -48,6 +48,15 @@ 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).
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Django==4.0.7
|
||||
cryptography==38.0.1
|
||||
Django==4.0.8
|
||||
cryptography==38.0.3
|
||||
django-annoying==0.10.6
|
||||
django-autocomplete-light==3.9.4
|
||||
django-cleanup==6.0.0
|
||||
@@ -30,7 +30,7 @@ Jinja2==3.1.2
|
||||
django-webpack-loader==1.6.0
|
||||
git+https://github.com/ierror/django-js-reverse@7cab78c4531780ab4b32033d5104ccd5be1a246a
|
||||
django-allauth==0.51.0
|
||||
recipe-scrapers==14.14.1
|
||||
recipe-scrapers==14.23.0
|
||||
django-scopes==1.2.0.post1
|
||||
pytest==7.1.3
|
||||
pytest-django==4.5.2
|
||||
|
||||
@@ -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')
|
||||
"
|
||||
>
|
||||
@@ -581,12 +581,14 @@
|
||||
<i class="fas fa-copy"></i>
|
||||
{{ $t("Copy") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item" v-if="index > 0"
|
||||
<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"
|
||||
<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") }}
|
||||
@@ -721,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"
|
||||
>
|
||||
@@ -1210,29 +1212,33 @@ 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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -104,46 +104,46 @@
|
||||
"min": "min",
|
||||
"Servings": "Porsi",
|
||||
"Waiting": "Menunggu",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
"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",
|
||||
"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",
|
||||
@@ -328,7 +328,7 @@
|
||||
"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 chi l'hai condivisa.",
|
||||
"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",
|
||||
@@ -345,5 +345,6 @@
|
||||
"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"
|
||||
"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)
|
||||
|
||||
@@ -7297,9 +7297,9 @@ loader-runner@^4.1.0, loader-runner@^4.2.0:
|
||||
integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
|
||||
|
||||
loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
|
||||
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.1.tgz#278ad7006660bccc4d2c0c1578e17c5c78d5c0e0"
|
||||
integrity sha512-1Qo97Y2oKaU+Ro2xnDMR26g1BwMT29jNbem1EvcujW2jqt+j5COXyscjM7bLQkM9HaxI7pkWeW7gnI072yMI9Q==
|
||||
dependencies:
|
||||
big.js "^5.2.2"
|
||||
emojis-list "^3.0.0"
|
||||
@@ -7745,7 +7745,12 @@ minimatch@^5.0.1:
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
|
||||
minimist@^1.2.0:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
|
||||
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
|
||||
|
||||
minimist@^1.2.5, minimist@^1.2.6:
|
||||
version "1.2.6"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
||||
|
||||
Reference in New Issue
Block a user