From 9db5e45c26c059b14d80f78e7683d149345e220f Mon Sep 17 00:00:00 2001 From: smilerz Date: Wed, 5 Apr 2023 15:46:10 -0500 Subject: [PATCH 01/40] added keyword automation to url import --- cookbook/helper/recipe_url_import.py | 30 +++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cookbook/helper/recipe_url_import.py b/cookbook/helper/recipe_url_import.py index 6aec16b03..f9398294f 100644 --- a/cookbook/helper/recipe_url_import.py +++ b/cookbook/helper/recipe_url_import.py @@ -1,8 +1,8 @@ -import random +# import random import re from html import unescape -from unicodedata import decomposition +from django.core.cache import caches from django.utils.dateparse import parse_duration from django.utils.translation import gettext as _ from isodate import parse_duration as iso_parse_duration @@ -10,9 +10,11 @@ from isodate.isoerror import ISO8601Error from pytube import YouTube from recipe_scrapers._utils import get_host_name, get_minutes -from cookbook.helper import recipe_url_import as helper +# from cookbook.helper import recipe_url_import as helper from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.models import Keyword, Automation +from cookbook.models import Automation, Keyword + +# from unicodedata import decomposition # from recipe_scrapers._utils import get_minutes ## temporary until/unless upstream incorporates get_minutes() PR @@ -127,7 +129,7 @@ def get_from_scraper(scrape, request): try: if scrape.author(): keywords.append(scrape.author()) - except: + except Exception: pass try: @@ -367,10 +369,28 @@ def parse_time(recipe_time): def parse_keywords(keyword_json, space): keywords = [] + keyword_aliases = {} + # retrieve keyword automation cache if it exists, otherwise build from database + KEYWORD_CACHE_KEY = f'automation_keyword_alias_{space.pk}' + if c := caches['default'].get(KEYWORD_CACHE_KEY, None): + self.food_aliases = c + caches['default'].touch(KEYWORD_CACHE_KEY, 30) + else: + for a in Automation.objects.filter(space=space, disabled=False, type=Automation.KEYWORD_ALIAS).only('param_1', 'param_2').order_by('order').all(): + keyword_aliases[a.param_1] = a.param_2 + caches['default'].set(KEYWORD_CACHE_KEY, keyword_aliases, 30) + # keywords as list for kw in keyword_json: kw = normalize_string(kw) + # if alias exists use that instead + if len(kw) != 0: + if keyword_aliases: + try: + kw = keyword_aliases[kw] + except KeyError: + pass if k := Keyword.objects.filter(name=kw, space=space).first(): keywords.append({'label': str(k), 'name': k.name, 'id': k.id}) else: From d8e61a485ec9a9055cffaacb4332b4ada4ff54cb Mon Sep 17 00:00:00 2001 From: dnlmlr <34707428+dnlmlr@users.noreply.github.com> Date: Thu, 6 Apr 2023 17:43:02 +0200 Subject: [PATCH 02/40] Small fix for german language --- cookbook/locale/de/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index eb97192d2..d6fd1234d 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -1252,7 +1252,7 @@ msgstr "Ausloggen" #: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" -msgstr "Du benützt die Gratis-Version von Tandoor" +msgstr "Du benutzt die Gratis-Version von Tandoor" #: .\cookbook\templates\base.html:361 msgid "Upgrade Now" From 4a4e4719b367b410246eb055fa1956f1712edd52 Mon Sep 17 00:00:00 2001 From: noxonad <130460440+noxonad@users.noreply.github.com> Date: Tue, 11 Apr 2023 14:25:29 +0300 Subject: [PATCH 03/40] Fixed another typo --- cookbook/locale/ro/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/locale/ro/LC_MESSAGES/django.po b/cookbook/locale/ro/LC_MESSAGES/django.po index 7cd2aecef..dbc76a16d 100644 --- a/cookbook/locale/ro/LC_MESSAGES/django.po +++ b/cookbook/locale/ro/LC_MESSAGES/django.po @@ -2488,7 +2488,7 @@ msgstr "" #: .\cookbook\views\new.py:227 msgid "" -"You have send to many emails, please share the link manually or wait a few " +"You have sent too many emails, please share the link manually or wait a few " "hours." msgstr "" From cb9a90d1e71aa251cf79b91a0e0bf66a57b30526 Mon Sep 17 00:00:00 2001 From: noxonad <130460440+noxonad@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:40:16 +0300 Subject: [PATCH 04/40] Fixed typo in json --- vue/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/locales/en.json b/vue/src/locales/en.json index 2828e747f..894ce54a7 100644 --- a/vue/src/locales/en.json +++ b/vue/src/locales/en.json @@ -468,7 +468,7 @@ "New_Supermarket_Category": "Create new supermarket category", "Are_You_Sure": "Are you sure?", "Valid Until": "Valid Until", - "Split_All_Steps": "Split all rows into seperate steps.", + "Split_All_Steps": "Split all rows into separate steps.", "Combine_All_Steps": "Combine all steps into a single field.", "Plural": "Plural", "plural_short": "plural", From af71407ca64a832ebc48ed733b7c20d6e51f5383 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:07:59 +0000 Subject: [PATCH 05/40] Translated using Weblate (Catalan) Currently translated at 86.3% (416 of 482 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ca/ --- cookbook/locale/ca/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cookbook/locale/ca/LC_MESSAGES/django.po b/cookbook/locale/ca/LC_MESSAGES/django.po index e7f74547f..b928a41b3 100644 --- a/cookbook/locale/ca/LC_MESSAGES/django.po +++ b/cookbook/locale/ca/LC_MESSAGES/django.po @@ -13,8 +13,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-19 19:14+0100\n" -"PO-Revision-Date: 2022-05-22 11:20+0000\n" -"Last-Translator: Ramon Aixa Juan \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -22,7 +22,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.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\forms.py:52 msgid "Default unit" @@ -1414,7 +1414,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Cerca Recepta..." +msgstr "Cerca Recepta ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" From d8051203c11a585d86b5ca765f8ef45303a0062a Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:07:36 +0000 Subject: [PATCH 06/40] Translated using Weblate (German) Currently translated at 99.5% (487 of 489 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/ --- cookbook/locale/de/LC_MESSAGES/django.po | 25 ++++++++++-------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index d6fd1234d..0bbf61dae 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -17,8 +17,8 @@ msgstr "" "POT-Creation-Date: 2023-01-19 19:14+0100\n" "PO-Revision-Date: 2023-02-09 13:55+0000\n" "Last-Translator: Marion Kämpfer \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -298,7 +298,7 @@ msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -"Felder bei welchen Akzente ignoriert werden. Das aktivieren dieser Option " +"Felder bei welchen Akzente ignoriert werden. Das aktivieren dieser Option " "kann die Suchqualität je nach Sprache verbessern oder verschlechtern" #: .\cookbook\forms.py:448 @@ -307,7 +307,7 @@ msgid "" "'pie' and 'piece' and 'soapie')" msgstr "" "Felder welche auf partielle Treffer durchsucht werden. (z.B. eine Suche " -"nach \"Spa\" wird \"Spaghetti\", \"Spargel\" und \"Grünspargel\" liefern.)" +"nach 'Spa' wird 'Spaghetti', 'Spargel' und 'Grünspargel' liefern.)" #: .\cookbook\forms.py:450 msgid "" @@ -556,7 +556,6 @@ msgstr "Fermentieren" msgid "sous-vide" msgstr "Sous-vide" - #: .\cookbook\helper\shopping_helper.py:152 msgid "You must supply a servings size" msgstr "Sie müssen eine Portionsgröße angeben" @@ -729,13 +728,11 @@ msgstr "Stichwort Alias" #: .\cookbook\models.py:1231 #, fuzzy -#| msgid "Description" msgid "Description Replace" msgstr "Beschreibung" #: .\cookbook\models.py:1231 #, fuzzy -#| msgid "Instructions" msgid "Instruction Replace" msgstr "Anleitung" @@ -963,7 +960,7 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" -"Dieser Email-Bestätigungslink ist abgelaufen oder ungültig. Bitte \n" +"Dieser Email-Bestätigungslink ist abgelaufen oder ungültig. Bitte\n" " beantrage einen neuen Email-" "Bestätigungslink." @@ -1079,7 +1076,7 @@ msgstr "" #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" -msgstr "Passwort ändern" +msgstr "passwort ändern" #: .\cookbook\templates\account\password_reset_from_key.html:36 #: .\cookbook\templates\account\password_reset_from_key_done.html:19 @@ -1448,7 +1445,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Rezept suchen..." +msgstr "Rezept suchen ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1733,8 +1730,8 @@ msgid "" msgstr "" " \n" " Die Volltextsuche versucht Wörter in übliche Varianten zu " -"normalisieren. z.B.: \"Kürbis\", \"Kürbissuppe\", \"Kürbiskuchen\" werden " -"alle zu \"Kürbis\" normalisiert..\n" +"normalisieren. z.B.: 'Kürbis', 'Kürbissuppe', 'Kürbiskuchen' werden alle zu " +"'Kürbis' normalisiert..\n" " Es sind verschiedene Methoden verfügbar, welche weiter unten " "genau beschrieben werden. Diese beeinflussen das Suchergebnis bei einer " "Suche mit mehreren Wörtern.\n" @@ -1937,7 +1934,7 @@ msgstr "" " Die Indizes für alle Felder können auf der Admin Seite neu " "erstellt werden.'\n" " Ansonsten können die Indizes auch mit dem management command " -"\"python manage.py rebuildindex\" neu erstellt werden.\n" +"'python manage.py rebuildindex' neu erstellt werden.\n" " " #: .\cookbook\templates\settings.html:25 @@ -3075,7 +3072,6 @@ msgstr "" #~ msgstr "Erledigt" #, fuzzy -#~| msgid "You are offline, shopping list might not syncronize." #~ msgid "You are offline, shopping list might not synchronize." #~ msgstr "Du bist offline, die Einkaufsliste wird ggf. nicht synchronisiert." @@ -3500,7 +3496,6 @@ msgstr "" #~ msgstr "Datei auswählen" #, fuzzy -#~| msgid "Delete Recipe" #~ msgid "Select Recipe" #~ msgstr "Rezept löschen" From bc461997f8fdd6cb9614bb532c556ae3017abb46 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:07:43 +0000 Subject: [PATCH 07/40] Translated using Weblate (French) Currently translated at 91.9% (443 of 482 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/ --- cookbook/locale/fr/LC_MESSAGES/django.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cookbook/locale/fr/LC_MESSAGES/django.po b/cookbook/locale/fr/LC_MESSAGES/django.po index 83db28c48..883433788 100644 --- a/cookbook/locale/fr/LC_MESSAGES/django.po +++ b/cookbook/locale/fr/LC_MESSAGES/django.po @@ -14,8 +14,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-19 19:14+0100\n" -"PO-Revision-Date: 2023-03-13 06:55+0000\n" -"Last-Translator: Jin Zhang \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: French \n" "Language: fr\n" @@ -1430,7 +1430,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Rechercher une recette..." +msgstr "Rechercher une recette ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1724,14 +1724,14 @@ msgstr "" " \n" " Les recherches en texte intégral tentent de normaliser les mots " "fournis pour qu'ils correspondent aux variantes courantes. Par exemple : " -"\"forked\", \"forking\", \"forks\" seront tous normalisés en \"fork\".\n" +"'forked', 'forking', 'forks' seront tous normalisés en 'fork'.\n" " Il existe plusieurs méthodes, décrites ci-dessous, qui " "permettent de contrôler la façon dont la recherche doit réagir lorsque " "plusieurs mots sont recherchés.\n" " Des détails techniques complets sur leur fonctionnement peuvent " "être consultés sur le site Postgresql's website.\n" +"textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES>Postgresql's website." +"\n" " " #: .\cookbook\templates\search_info.html:29 @@ -1983,10 +1983,10 @@ msgstr "" "efficacement. \n" " Vous pouvez reconstruire les index de tous les champs dans la " "page d'administration des recettes, en sélectionnant toutes les recettes et " -"en exécutant la commande \"rebuild index for selected recipes\".\n" +"en exécutant la commande 'rebuild index for selected recipes'.\n" " Vous pouvez également reconstruire les index en ligne de " -"commande en exécutant la commande de gestion \"python manage.py rebuildindex" -"\".\n" +"commande en exécutant la commande de gestion 'python manage.py rebuildindex'." +"\n" " " #: .\cookbook\templates\settings.html:25 From d0a1151a33aefb402b6f6d1db35e865f7e5a3310 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:08:05 +0000 Subject: [PATCH 08/40] Translated using Weblate (Hungarian) Currently translated at 87.5% (422 of 482 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hu/ --- cookbook/locale/hu_HU/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cookbook/locale/hu_HU/LC_MESSAGES/django.po b/cookbook/locale/hu_HU/LC_MESSAGES/django.po index 63dc1906b..0d4efc29f 100644 --- a/cookbook/locale/hu_HU/LC_MESSAGES/django.po +++ b/cookbook/locale/hu_HU/LC_MESSAGES/django.po @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-19 19:14+0100\n" -"PO-Revision-Date: 2022-05-24 20:32+0000\n" -"Last-Translator: Krisztian Doka \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Hungarian \n" "Language: hu_HU\n" @@ -20,7 +20,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.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\forms.py:52 msgid "Default unit" @@ -1435,7 +1435,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Recept keresése..." +msgstr "Recept keresése ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" From ea141577d0f076b4fefd800e8f917797faee8636 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 07:55:00 +0000 Subject: [PATCH 09/40] Translated using Weblate (Italian) Currently translated at 92.1% (444 of 482 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/ --- cookbook/locale/it/LC_MESSAGES/django.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cookbook/locale/it/LC_MESSAGES/django.po b/cookbook/locale/it/LC_MESSAGES/django.po index 21eec4eb9..11ac2dc0b 100644 --- a/cookbook/locale/it/LC_MESSAGES/django.po +++ b/cookbook/locale/it/LC_MESSAGES/django.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-19 19:14+0100\n" -"PO-Revision-Date: 2023-02-05 03:55+0000\n" -"Last-Translator: Adri \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Italian \n" "Language: it\n" @@ -309,8 +309,8 @@ msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -"Campi da cercare con corrispondenza parziale. (ad esempio, cercando \"Torta" -"\" verranno mostrati \"torta\", \"tortino\" e \"contorta\")" +"Campi da cercare con corrispondenza parziale. (ad esempio, cercando 'Torta' " +"verranno mostrati 'torta', 'tortino' e 'contorta')" #: .\cookbook\forms.py:450 msgid "" @@ -326,7 +326,7 @@ msgid "" "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 " +"verrà mostrato 'ricetta'). Nota: questa opzione non è compatibile con la " "ricerca 'web' o 'raw'." #: .\cookbook\forms.py:454 @@ -1042,8 +1042,8 @@ msgid "" msgstr "" "Il link per il reset della password non è corretto, probabilmente perché è " "stato già utilizzato.\n" -" Puoi richiedere un nuovo reset della password." +" Puoi richiedere un nuovo reset della password." #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" @@ -1707,8 +1707,8 @@ msgid "" msgstr "" " \n" " Le ricerche full-text cercano di normalizzare le parole fornite " -"per abbinare varianti comuni. Ad esempio, \"separato\", \"separando\", " -"\"separa\" verranno tutti normalizzati in \"separare\".\n" +"per abbinare varianti comuni. Ad esempio, 'separato', 'separando', 'separa' " +"verranno tutti normalizzati in 'separare'.\n" " Ci sono diversi metodi disponibili, descritti di seguito, che " "controlleranno il comportamento della ricerca in caso di ricerca con più " "parole.\n" From 10f1a77c1c2c045d43f41c4bb66381a9f53a3e5b Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 10:18:26 +0000 Subject: [PATCH 10/40] Translated using Weblate (Russian) Currently translated at 71.0% (341 of 480 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/ --- vue/src/locales/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/locales/ru.json b/vue/src/locales/ru.json index fb78f035d..50ff42fc3 100644 --- a/vue/src/locales/ru.json +++ b/vue/src/locales/ru.json @@ -286,7 +286,7 @@ "expert_mode": "Экспертный режим", "enable_expert": "Включить экспертный режим", "review_shopping": "Просмотрите записи о покупках перед сохранением", - "empty_list": "Список пуст", + "empty_list": "Список пуст.", "default_delay_desc": "Число часов по умолчанию для отсрочки записи в списке покупок.", "one_url_per_line": "Один URL в строке", "mealplan_autoinclude_related": "Добавить сопутствующие рецепты", From 915d0359bfddb0c04a7c5768636b5d4bcd7fe953 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 08:49:29 +0000 Subject: [PATCH 11/40] Translated using Weblate (Russian) Currently translated at 9.4% (47 of 496 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ru/ --- cookbook/locale/ru/LC_MESSAGES/django.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cookbook/locale/ru/LC_MESSAGES/django.po b/cookbook/locale/ru/LC_MESSAGES/django.po index 31c4280d7..a81113371 100644 --- a/cookbook/locale/ru/LC_MESSAGES/django.po +++ b/cookbook/locale/ru/LC_MESSAGES/django.po @@ -8,17 +8,17 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-13 22:40+0200\n" -"PO-Revision-Date: 2022-11-30 19:09+0000\n" -"Last-Translator: Alex \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 @@ -861,7 +861,7 @@ msgstr "" #: .\cookbook\templates\base.html:220 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:224 msgid "API Browser" @@ -1937,7 +1937,7 @@ msgstr "" #: .\cookbook\templates\space.html:106 msgid "user" -msgstr "" +msgstr "пользователь" #: .\cookbook\templates\space.html:107 msgid "guest" From 82b80e60e66564a2eb624f3f3d6c6582221fafae Mon Sep 17 00:00:00 2001 From: noxonad Date: Mon, 10 Apr 2023 23:42:40 +0000 Subject: [PATCH 12/40] Translated using Weblate (Romanian) Currently translated at 100.0% (509 of 509 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ro/ --- cookbook/locale/ro/LC_MESSAGES/django.po | 1181 ++++++++++++++-------- 1 file changed, 758 insertions(+), 423 deletions(-) diff --git a/cookbook/locale/ro/LC_MESSAGES/django.po b/cookbook/locale/ro/LC_MESSAGES/django.po index 7cd2aecef..a834b22a1 100644 --- a/cookbook/locale/ro/LC_MESSAGES/django.po +++ b/cookbook/locale/ro/LC_MESSAGES/django.po @@ -8,113 +8,123 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 #: .\cookbook\templates\url_import.html:274 msgid "Ingredients" -msgstr "" +msgstr "Ingrediente" #: .\cookbook\forms.py:54 msgid "Default unit" -msgstr "" +msgstr "Unitate implicită" #: .\cookbook\forms.py:55 msgid "Use fractions" -msgstr "" +msgstr "Utilizare fracții" #: .\cookbook\forms.py:56 msgid "Use KJ" -msgstr "" +msgstr "Utilizare KJ" #: .\cookbook\forms.py:57 msgid "Theme" -msgstr "" +msgstr "Teme" #: .\cookbook\forms.py:58 msgid "Navbar color" -msgstr "" +msgstr "Culoarea barei de navigare" #: .\cookbook\forms.py:59 msgid "Sticky navbar" -msgstr "" +msgstr "Bară de navigare lipicioasă" #: .\cookbook\forms.py:60 msgid "Default page" -msgstr "" +msgstr "Pagină implicită" #: .\cookbook\forms.py:61 msgid "Show recent recipes" -msgstr "" +msgstr "Afișează rețete recente" #: .\cookbook\forms.py:62 msgid "Search style" -msgstr "" +msgstr "Căutare stil" #: .\cookbook\forms.py:63 msgid "Plan sharing" -msgstr "" +msgstr "Partajarea planurilor" #: .\cookbook\forms.py:64 msgid "Ingredient decimal places" -msgstr "" +msgstr "Zecimale ale ingredientelor" #: .\cookbook\forms.py:65 msgid "Shopping list auto sync period" -msgstr "" +msgstr "Perioada de sincronizare automată a listei de cumpărături" #: .\cookbook\forms.py:66 .\cookbook\templates\recipe_view.html:21 #: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:47 msgid "Comments" -msgstr "" +msgstr "Comentarii" #: .\cookbook\forms.py:70 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" +"Culoarea barei de navigare de sus. Nu toate culorile funcționează cu toate " +"temele, doar încercați-le!" #: .\cookbook\forms.py:72 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" +"Unitate implicită care trebuie utilizată la introducerea unui ingredient nou " +"într-o rețetă." #: .\cookbook\forms.py:74 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" +"Permite suport pentru fracții în cantități de ingrediente (de exemplu, " +"conversia zecimalelor în fracții automat)" #: .\cookbook\forms.py:76 msgid "Display nutritional energy amounts in joules instead of calories" -msgstr "" +msgstr "Afișați cantitățile de energie nutrițională în Jouli în loc de calorii" #: .\cookbook\forms.py:78 msgid "" "Users with whom newly created meal plan/shopping list entries should be " "shared by default." msgstr "" +"Utilizatorii cu care intrările din planul alimentar/lista de cumpărături nou " +"create ar trebui să fie partajate în mod implicit." #: .\cookbook\forms.py:80 msgid "Show recently viewed recipes on search page." -msgstr "" +msgstr "Afișați rețetele vizualizate recent pe pagina de căutare." #: .\cookbook\forms.py:81 msgid "Number of decimals to round ingredients." -msgstr "" +msgstr "Numărul de zecimale la ingrediente rotunde." #: .\cookbook\forms.py:82 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "Dacă doriți să puteți crea și vedea comentarii sub rețete." #: .\cookbook\forms.py:84 msgid "" @@ -123,211 +133,250 @@ msgid "" "Useful when shopping with multiple people but might use a little bit of " "mobile data. If lower than instance limit it is reset when saving." msgstr "" +"Setarea la 0 va dezactiva sincronizarea automată. Atunci când vizualizați o " +"listă de cumpărături, lista este actualizată la fiecare câteva secunde " +"setate pentru a sincroniza modificările pe care altcineva le-ar fi putut " +"face. Util atunci când faceți cumpărături cu mai multe persoane, dar ar " +"putea folosi un pic de date mobile. Dacă este mai mică decât limita " +"instanței, aceasta este resetată la salvare." #: .\cookbook\forms.py:87 msgid "Makes the navbar stick to the top of the page." -msgstr "" +msgstr "Face ca bara de navigare să se lipească în partea de sus a paginii." #: .\cookbook\forms.py:103 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" +"Ambele câmpuri sunt opționale. Dacă niciuna nu este setată, numele de " +"utilizator va fi afișată în schimb" #: .\cookbook\forms.py:124 .\cookbook\forms.py:289 #: .\cookbook\templates\url_import.html:158 msgid "Name" -msgstr "" +msgstr "Nume" #: .\cookbook\forms.py:125 .\cookbook\forms.py:290 #: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 #: .\cookbook\templates\url_import.html:192 #: .\cookbook\templates\url_import.html:578 .\cookbook\views\lists.py:112 msgid "Keywords" -msgstr "" +msgstr "Cuvinte cheie" #: .\cookbook\forms.py:126 msgid "Preparation time in minutes" -msgstr "" +msgstr "Timp de pregătire în minute" #: .\cookbook\forms.py:127 msgid "Waiting time (cooking/baking) in minutes" -msgstr "" +msgstr "Timp de așteptare (gătit/coacere) în minute" #: .\cookbook\forms.py:128 .\cookbook\forms.py:259 .\cookbook\forms.py:291 msgid "Path" -msgstr "" +msgstr "Drum" #: .\cookbook\forms.py:129 msgid "Storage UID" -msgstr "" +msgstr "UID de stocare" #: .\cookbook\forms.py:157 msgid "Default" -msgstr "" +msgstr "Standard" #: .\cookbook\forms.py:168 .\cookbook\templates\url_import.html:94 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" +"Pentru a preveni duplicatele, rețetele cu același nume ca și cele existente " +"sunt ignorate. Bifați această casetă pentru a importa totul." #: .\cookbook\forms.py:190 msgid "Add your comment: " -msgstr "" +msgstr "Adaugă comentariul tău: " #: .\cookbook\forms.py:205 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" +"Lăsați gol pentru dropbox și introduceți parola aplicației pentru nextcloud." #: .\cookbook\forms.py:212 msgid "Leave empty for nextcloud and enter api token for dropbox." -msgstr "" +msgstr "Lăsați gol pentru nextcloud și introduceți token-ul API pentru dropbox." #: .\cookbook\forms.py:221 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" +"Lăsați gol pentru dropbox și introduceți numai URL-ul de bază pentru " +"nextcloud (/remote.php/webdav/ este adăugat automat)" #: .\cookbook\forms.py:258 .\cookbook\views\edit.py:166 msgid "Storage" -msgstr "" +msgstr "Stocare" #: .\cookbook\forms.py:260 msgid "Active" -msgstr "" +msgstr "Activ" #: .\cookbook\forms.py:265 msgid "Search String" -msgstr "" +msgstr "Șir de căutare" #: .\cookbook\forms.py:292 msgid "File ID" -msgstr "" +msgstr "ID-ul fișierului" #: .\cookbook\forms.py:313 msgid "You must provide at least a recipe or a title." -msgstr "" +msgstr "Trebuie să furnizați cel puțin o rețetă sau un titlu." #: .\cookbook\forms.py:326 msgid "You can list default users to share recipes with in the settings." msgstr "" +"Puteți lista utilizatorii impliciți cu care să partajați rețete în setări." #: .\cookbook\forms.py:327 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" +"Puteți utiliza markdown pentru a formata acest câmp. Vezi documentația aici" #: .\cookbook\forms.py:353 msgid "Maximum number of users for this space reached." -msgstr "" +msgstr "Numărul maxim de utilizatori pentru acest spațiu atins." #: .\cookbook\forms.py:359 msgid "Email address already taken!" -msgstr "" +msgstr "Adresa de e-mail deja în uz!" #: .\cookbook\forms.py:367 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" +"Nu este necesară o adresă de e-mail, dar dacă este prezentă, linkul de " +"invitație va fi trimis utilizatorului." #: .\cookbook\forms.py:382 msgid "Name already taken." -msgstr "" +msgstr "Nume deja în uz." #: .\cookbook\forms.py:393 msgid "Accept Terms and Privacy" -msgstr "" +msgstr "Acceptă condițiile și politicile de confidențialitate" #: .\cookbook\forms.py:425 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" +"Determină cât de vagă este o căutare dacă utilizează potrivirea " +"similitudinii trigramelor (de exemplu, valorile scăzute înseamnă că mai " +"multe greșeli de scriere sunt ignorate)." #: .\cookbook\forms.py:435 msgid "" "Select type method of search. Click here for " "full desciption of choices." msgstr "" +"Selectează metoda de căutare. Apasă aici " +"pentru descrierea completă a alegerilor." #: .\cookbook\forms.py:436 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" +"Utilizați potrivirea vagă pe unități, cuvinte cheie și ingrediente atunci " +"când editați și importați rețete." #: .\cookbook\forms.py:438 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" +"Câmpuri pentru a căuta ignorând accente. Selectarea acestei opțiuni poate " +"îmbunătăți sau degrada calitatea căutării în funcție de limbă" #: .\cookbook\forms.py:440 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" +"Câmpuri pentru a căuta potriviri parțiale. (de exemplu, căutarea " +"'Plăcintei' va returna 'plăcintă' și 'plăci' și 'simplă')" #: .\cookbook\forms.py:442 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" +"Câmpuri pentru a căuta începutul potrivirilor de cuvinte. (ex. căutarea 'sa' " +"va returna 'salată' și 'sandwich')" #: .\cookbook\forms.py:444 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 "" +"Câmpuri pentru căutarea 'vagă'. (ex., căutarea 'rețetă' va găsi 'rețetă'. " +"Notă: această opțiune va intra în conflict cu metodele de căutare 'web' și " +"'raw'." #: .\cookbook\forms.py:446 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" +"Câmpuri pentru căutarea completă a textului. Notă: metodele de căutare " +"'web', 'frază' și 'raw' funcționează numai cu câmpuri full-text." #: .\cookbook\forms.py:450 msgid "Search Method" -msgstr "" +msgstr "Metodă de căutare" #: .\cookbook\forms.py:451 msgid "Fuzzy Lookups" -msgstr "" +msgstr "Căutare vagă" #: .\cookbook\forms.py:452 msgid "Ignore Accent" -msgstr "" +msgstr "Ignoră accent" #: .\cookbook\forms.py:453 msgid "Partial Match" -msgstr "" +msgstr "Potrivire parțială" #: .\cookbook\forms.py:454 msgid "Starts Wtih" -msgstr "" +msgstr "Începe cu" #: .\cookbook\forms.py:455 msgid "Fuzzy Search" -msgstr "" +msgstr "Căutare vagă" #: .\cookbook\forms.py:456 msgid "Full Text" -msgstr "" +msgstr "Text complet" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" +"Pentru a preveni spam-ul, e-mailul solicitat nu a fost trimis. Vă rugăm să " +"așteptați câteva minute și încercați din nou." #: .\cookbook\helper\permission_helper.py:136 #: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:149 msgid "You are not logged in and therefore cannot view this page!" msgstr "" +"Nu sunteți conectat și, prin urmare, nu puteți vizualiza această pagină!" #: .\cookbook\helper\permission_helper.py:140 #: .\cookbook\helper\permission_helper.py:146 @@ -339,18 +388,18 @@ msgstr "" #: .\cookbook\views\views.py:160 .\cookbook\views\views.py:167 #: .\cookbook\views\views.py:233 msgid "You do not have the required permissions to view this page!" -msgstr "" +msgstr "Nu aveți permisiunile necesare pentru a vizualiza această pagină!" #: .\cookbook\helper\permission_helper.py:164 #: .\cookbook\helper\permission_helper.py:187 #: .\cookbook\helper\permission_helper.py:202 msgid "You cannot interact with this object as it is not owned by you!" -msgstr "" +msgstr "Nu poți interacționa cu acest obiect, deoarece nu este deținut de tine!" #: .\cookbook\helper\template_helper.py:61 #: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." -msgstr "" +msgstr "Nu s-a putut analiza codul șablonului." #: .\cookbook\integration\integration.py:126 #: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 @@ -363,191 +412,199 @@ msgstr "" #: .\cookbook\templates\url_import.html:609 .\cookbook\views\delete.py:89 #: .\cookbook\views\edit.py:200 msgid "Import" -msgstr "" +msgstr "Importă" #: .\cookbook\integration\integration.py:208 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" +"Importatorul se aștepta la un fișier.zip. Ați ales tipul corect de " +"importator pentru datele dvs.?" #: .\cookbook\integration\integration.py:211 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" +"A apărut o eroare neașteptată în timpul importului. Asigurați-vă că ați " +"încărcat un fișier valid." #: .\cookbook\integration\integration.py:216 msgid "The following recipes were ignored because they already existed:" -msgstr "" +msgstr "Următoarele rețete au fost ignorate pentru că existau deja:" #: .\cookbook\integration\integration.py:220 #, python-format msgid "Imported %s recipes." -msgstr "" +msgstr "%s rețete importate." #: .\cookbook\integration\paprika.py:46 msgid "Notes" -msgstr "" +msgstr "Note" #: .\cookbook\integration\paprika.py:49 msgid "Nutritional Information" -msgstr "" +msgstr "Informații nutriționale" #: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:40 msgid "Source" -msgstr "" +msgstr "Sursă" #: .\cookbook\integration\safron.py:23 #: .\cookbook\templates\include\log_cooking.html:16 #: .\cookbook\templates\url_import.html:228 #: .\cookbook\templates\url_import.html:459 msgid "Servings" -msgstr "" +msgstr "Porţii" #: .\cookbook\integration\safron.py:25 msgid "Waiting time" -msgstr "" +msgstr "Timp de așteptare" #: .\cookbook\integration\safron.py:27 msgid "Preparation Time" -msgstr "" +msgstr "Timp de pregătire" #: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" -msgstr "" +msgstr "Bucate" #: .\cookbook\integration\safron.py:31 msgid "Section" -msgstr "" +msgstr "Secțiune" #: .\cookbook\management\commands\rebuildindex.py:14 msgid "Rebuilds full text search index on Recipe" -msgstr "" +msgstr "Reconstruiește indexul de căutare text complet pe rețetă" #: .\cookbook\management\commands\rebuildindex.py:18 msgid "Only Postgress databases use full text search, no index to rebuild" msgstr "" +"Numai bazele de date Postgress utilizează căutare text complet, nici un " +"index de reconstruit" #: .\cookbook\management\commands\rebuildindex.py:29 msgid "Recipe index rebuild complete." -msgstr "" +msgstr "Index rețetă reconstruit complet." #: .\cookbook\management\commands\rebuildindex.py:31 msgid "Recipe index rebuild failed." -msgstr "" +msgstr "Reconstruirea index-ului rețetă nu a reușit." #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" -msgstr "" +msgstr "Mic dejun" #: .\cookbook\migrations\0047_auto_20200602_1133.py:19 msgid "Lunch" -msgstr "" +msgstr "Prânz" #: .\cookbook\migrations\0047_auto_20200602_1133.py:24 msgid "Dinner" -msgstr "" +msgstr "Cină" #: .\cookbook\migrations\0047_auto_20200602_1133.py:29 msgid "Other" -msgstr "" +msgstr "Altele" #: .\cookbook\models.py:150 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" +"Spațiu maxim de stocare a fișierelor pentru spațiu în MB. 0 pentru " +"nelimitat, -1 pentru a dezactiva încărcarea fișierelor." #: .\cookbook\models.py:202 .\cookbook\templates\search.html:7 #: .\cookbook\templates\shopping_list.html:59 msgid "Search" -msgstr "" +msgstr "Căutare" #: .\cookbook\models.py:203 .\cookbook\templates\base.html:82 #: .\cookbook\templates\meal_plan.html:7 #: .\cookbook\templates\meal_plan_new.html:7 .\cookbook\views\delete.py:181 #: .\cookbook\views\edit.py:220 .\cookbook\views\new.py:184 msgid "Meal-Plan" -msgstr "" +msgstr "Plan de alimentare" #: .\cookbook\models.py:204 .\cookbook\templates\base.html:90 msgid "Books" -msgstr "" +msgstr "Cărţi" #: .\cookbook\models.py:212 msgid "Small" -msgstr "" +msgstr "Mic" #: .\cookbook\models.py:212 msgid "Large" -msgstr "" +msgstr "Mare" #: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 msgid "New" -msgstr "" +msgstr "Nou" #: .\cookbook\models.py:396 msgid " is part of a recipe step and cannot be deleted" -msgstr "" +msgstr " face parte dintr-un pas de rețetă și nu poate fi șters" #: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:42 msgid "Text" -msgstr "" +msgstr "Text" #: .\cookbook\models.py:441 msgid "Time" -msgstr "" +msgstr "Timp" #: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:44 msgid "File" -msgstr "" +msgstr "Fișier" #: .\cookbook\models.py:441 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 #: .\cookbook\views\new.py:53 msgid "Recipe" -msgstr "" +msgstr "Rețetă" #: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 msgid "Simple" -msgstr "" +msgstr "Simplu" #: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 msgid "Phrase" -msgstr "" +msgstr "Frază" #: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 msgid "Web" -msgstr "" +msgstr "Web" #: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 msgid "Raw" -msgstr "" +msgstr "Crud" #: .\cookbook\models.py:912 msgid "Food Alias" -msgstr "" +msgstr "Pseudonim produse alimentare" #: .\cookbook\models.py:912 msgid "Unit Alias" -msgstr "" +msgstr "Pseudonim unități" #: .\cookbook\models.py:912 msgid "Keyword Alias" -msgstr "" +msgstr "Pseudonim cuvânt cheie" #: .\cookbook\serializer.py:157 msgid "File uploads are not enabled for this Space." -msgstr "" +msgstr "Încărcările de fișiere nu sunt permise pentru acest spațiu." #: .\cookbook\serializer.py:168 msgid "You have reached your file upload limit." -msgstr "" +msgstr "Ați atins limita de încărcare a fișierelor." #: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 @@ -555,7 +612,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:40 #: .\cookbook\templates\space.html:90 msgid "Edit" -msgstr "" +msgstr "Editare" #: .\cookbook\tables.py:115 .\cookbook\tables.py:138 #: .\cookbook\templates\generic\delete_template.html:7 @@ -563,28 +620,28 @@ msgstr "" #: .\cookbook\templates\generic\edit_template.html:28 #: .\cookbook\templates\recipes_table.html:90 msgid "Delete" -msgstr "" +msgstr "Ștergere" #: .\cookbook\templates\404.html:5 msgid "404 Error" -msgstr "" +msgstr "Eroare 404" #: .\cookbook\templates\404.html:18 msgid "The page you are looking for could not be found." -msgstr "" +msgstr "Pagina pe care o căutați nu a putut fi găsită." #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "" +msgstr "Du-ma acasă" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" -msgstr "" +msgstr "Raportați o eroare" #: .\cookbook\templates\account\email.html:6 #: .\cookbook\templates\account\email.html:17 msgid "E-mail Addresses" -msgstr "" +msgstr "Adrese e-mail" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 @@ -593,68 +650,71 @@ msgstr "" #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" -msgstr "" +msgstr "Setări" #: .\cookbook\templates\account\email.html:13 msgid "Email" -msgstr "" +msgstr "E-mail" #: .\cookbook\templates\account\email.html:19 msgid "The following e-mail addresses are associated with your account:" -msgstr "" +msgstr "Următoarele adrese de e-mail sunt asociate contului dvs.:" #: .\cookbook\templates\account\email.html:36 msgid "Verified" -msgstr "" +msgstr "Verificat" #: .\cookbook\templates\account\email.html:38 msgid "Unverified" -msgstr "" +msgstr "Neverificat" #: .\cookbook\templates\account\email.html:40 msgid "Primary" -msgstr "" +msgstr "Principal" #: .\cookbook\templates\account\email.html:47 msgid "Make Primary" -msgstr "" +msgstr "Setează ca principal" #: .\cookbook\templates\account\email.html:49 msgid "Re-send Verification" -msgstr "" +msgstr "Retrimite verificare" #: .\cookbook\templates\account\email.html:50 #: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" -msgstr "" +msgstr "Elimină" #: .\cookbook\templates\account\email.html:58 msgid "Warning:" -msgstr "" +msgstr "Atenție:" #: .\cookbook\templates\account\email.html:58 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" +"În prezent, nu aveți nicio adresă de e-mail configurată. Ar trebui să " +"adăugați într-adevăr o adresă de e-mail, astfel încât să puteți primi " +"notificări, resetați parola etc." #: .\cookbook\templates\account\email.html:64 msgid "Add E-mail Address" -msgstr "" +msgstr "Adăugă adresa de E-mail" #: .\cookbook\templates\account\email.html:69 msgid "Add E-mail" -msgstr "" +msgstr "Adaugă E-mail" #: .\cookbook\templates\account\email.html:79 msgid "Do you really want to remove the selected e-mail address?" -msgstr "" +msgstr "Chiar doriți să eliminați adresa de e-mail selectată?" #: .\cookbook\templates\account\email_confirm.html:6 #: .\cookbook\templates\account\email_confirm.html:10 msgid "Confirm E-mail Address" -msgstr "" +msgstr "Confirmarea adresei E-mail" #: .\cookbook\templates\account\email_confirm.html:16 #, python-format @@ -664,11 +724,15 @@ msgid "" "for user %(user_display)s\n" " ." msgstr "" +"Vă rugăm să confirmați că:\n" +" %(email)s este adresa de e-mail " +"a utilizatorului %(user_display)s\n" +" ." #: .\cookbook\templates\account\email_confirm.html:22 #: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" -msgstr "" +msgstr "Confirmă" #: .\cookbook\templates\account\email_confirm.html:29 #, python-format @@ -677,51 +741,54 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" +"Acest link de confirmare prin e-mail a expirat sau nu este valid. Vă rugăm\n" +" să emiteți o nouă solicitare de " +"confirmare prin e-mail." #: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" -msgstr "" +msgstr "Conectare" #: .\cookbook\templates\account\login.html:15 #: .\cookbook\templates\account\login.html:31 #: .\cookbook\templates\account\signup.html:69 #: .\cookbook\templates\account\signup_closed.html:15 msgid "Sign In" -msgstr "" +msgstr "Autentificare" #: .\cookbook\templates\account\login.html:32 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\account\login.html:36 #: .\cookbook\templates\account\login.html:37 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" -msgstr "" +msgstr "Resetarea parolei mele" #: .\cookbook\templates\account\login.html:37 msgid "Lost your password?" -msgstr "" +msgstr "V-ați pierdut parola?" #: .\cookbook\templates\account\login.html:48 msgid "Social Login" -msgstr "" +msgstr "Autentificare utilizând rețeaua socială" #: .\cookbook\templates\account\login.html:49 msgid "You can use any of the following providers to sign in." -msgstr "" +msgstr "Puteți utiliza oricare dintre următorii furnizori pentru a vă conecta." #: .\cookbook\templates\account\logout.html:5 #: .\cookbook\templates\account\logout.html:9 #: .\cookbook\templates\account\logout.html:18 msgid "Sign Out" -msgstr "" +msgstr "Deconectare" #: .\cookbook\templates\account\logout.html:11 msgid "Are you sure you want to sign out?" -msgstr "" +msgstr "Sunteți sigur că doriți să vă deconectați?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 @@ -731,44 +798,48 @@ msgstr "" #: .\cookbook\templates\account\password_reset_from_key_done.html:7 #: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" -msgstr "" +msgstr "Schimbare parolă" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 #: .\cookbook\templates\settings.html:69 msgid "Password" -msgstr "" +msgstr "Parola" #: .\cookbook\templates\account\password_change.html:22 msgid "Forgot Password?" -msgstr "" +msgstr "Ai uitat parola?" #: .\cookbook\templates\account\password_reset.html:7 #: .\cookbook\templates\account\password_reset.html:13 #: .\cookbook\templates\account\password_reset_done.html:7 #: .\cookbook\templates\account\password_reset_done.html:10 msgid "Password Reset" -msgstr "" +msgstr "Resetare parolă" #: .\cookbook\templates\account\password_reset.html:24 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" +"V-ați uitat parola? Introduceți adresa de e-mail de mai jos și vă vom " +"trimite un e-mail care vă permite să o resetați." #: .\cookbook\templates\account\password_reset.html:32 msgid "Password reset is disabled on this instance." -msgstr "" +msgstr "Resetarea parolei este dezactivată în această instanță." #: .\cookbook\templates\account\password_reset_done.html:16 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" +"V-am trimis un e-mail. Vă rugăm să ne contactați dacă nu îl primiți în " +"câteva minute." #: .\cookbook\templates\account\password_reset_from_key.html:13 msgid "Bad Token" -msgstr "" +msgstr "Token invalid" #: .\cookbook\templates\account\password_reset_from_key.html:25 #, python-format @@ -778,199 +849,206 @@ msgid "" " Please request a new " "password reset." msgstr "" +"Linkul de resetare a parolei nu a fost valid, posibil pentru că a fost deja " +"utilizat.\n" +" Vă rugam să cereți o " +"nouă resetare a parolei." #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" -msgstr "" +msgstr "schimbare parolă" #: .\cookbook\templates\account\password_reset_from_key.html:36 #: .\cookbook\templates\account\password_reset_from_key_done.html:19 msgid "Your password is now changed." -msgstr "" +msgstr "Parola este acum schimbată." #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 msgid "Set Password" -msgstr "" +msgstr "Setare parolă" #: .\cookbook\templates\account\signup.html:6 msgid "Register" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\account\signup.html:12 msgid "Create an Account" -msgstr "" +msgstr "Create cont" #: .\cookbook\templates\account\signup.html:42 #: .\cookbook\templates\socialaccount\signup.html:33 msgid "I accept the follwoing" -msgstr "" +msgstr "Accept următoarele" #: .\cookbook\templates\account\signup.html:45 #: .\cookbook\templates\socialaccount\signup.html:36 msgid "Terms and Conditions" -msgstr "" +msgstr "Termeni și condiții" #: .\cookbook\templates\account\signup.html:48 #: .\cookbook\templates\socialaccount\signup.html:39 msgid "and" -msgstr "" +msgstr "și" #: .\cookbook\templates\account\signup.html:52 #: .\cookbook\templates\socialaccount\signup.html:43 msgid "Privacy Policy" -msgstr "" +msgstr "Politica de confidențialitate" #: .\cookbook\templates\account\signup.html:65 msgid "Create User" -msgstr "" +msgstr "Creare utilizator" #: .\cookbook\templates\account\signup.html:69 msgid "Already have an account?" -msgstr "" +msgstr "Aveți deja un cont?" #: .\cookbook\templates\account\signup_closed.html:5 #: .\cookbook\templates\account\signup_closed.html:11 msgid "Sign Up Closed" -msgstr "" +msgstr "Înscrierea închisă" #: .\cookbook\templates\account\signup_closed.html:13 msgid "We are sorry, but the sign up is currently closed." -msgstr "" +msgstr "Ne pare rău, dar înscrierea este în prezent închisă." #: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" -msgstr "" +msgstr "Documentare API" #: .\cookbook\templates\base.html:86 msgid "Shopping" -msgstr "" +msgstr "Cumpărături" #: .\cookbook\templates\base.html:113 msgid "Keyword" -msgstr "" +msgstr "Cuvânt cheie" #: .\cookbook\templates\base.html:137 #: .\cookbook\templates\forms\ingredients.html:24 #: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 #: .\cookbook\views\lists.py:146 msgid "Units" -msgstr "" +msgstr "Unități" #: .\cookbook\templates\base.html:151 #: .\cookbook\templates\shopping_list.html:237 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" -msgstr "" +msgstr "Supermarket" #: .\cookbook\templates\base.html:163 msgid "Supermarket Category" -msgstr "" +msgstr "Categorie supermarket" #: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 msgid "Automations" -msgstr "" +msgstr "Automatizări" #: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 msgid "Files" -msgstr "" +msgstr "Fișiere" #: .\cookbook\templates\base.html:201 msgid "Batch Edit" -msgstr "" +msgstr "Editare în mod batch" #: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" -msgstr "" +msgstr "Istoric" #: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 #: .\cookbook\templates\export.html:20 #: .\cookbook\templates\shopping_list.html:358 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" -msgstr "" +msgstr "Exportă" #: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 msgid "Import Recipe" -msgstr "" +msgstr "Importă rețeta" #: .\cookbook\templates\base.html:246 #: .\cookbook\templates\shopping_list.html:195 #: .\cookbook\templates\shopping_list.html:217 msgid "Create" -msgstr "" +msgstr "Creează" #: .\cookbook\templates\base.html:259 #: .\cookbook\templates\generic\list_template.html:14 #: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 msgid "External Recipes" -msgstr "" +msgstr "Rețete externe" #: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:7 #: .\cookbook\templates\space.html:19 msgid "Space Settings" -msgstr "" +msgstr "Setări spațiu" #: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" -msgstr "" +msgstr "Sistem" #: .\cookbook\templates\base.html:269 msgid "Admin" -msgstr "" +msgstr "Admin" #: .\cookbook\templates\base.html:273 msgid "Markdown Guide" -msgstr "" +msgstr "Ghid Markdown" #: .\cookbook\templates\base.html:275 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:277 msgid "Translate Tandoor" -msgstr "" +msgstr "Traducere Tandoor" #: .\cookbook\templates\base.html:281 msgid "API Browser" -msgstr "" +msgstr "Browser API" #: .\cookbook\templates\base.html:284 msgid "Log out" -msgstr "" +msgstr "Deconectare" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "" +msgstr "Editează categoria in mod batch" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "" +msgstr "Editează rețetele in mod batch" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" msgstr "" +"Adăugați cuvintele cheie specificate la toate rețetele care conțin un cuvânt" #: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" -msgstr "" +msgstr "Sincronizare" #: .\cookbook\templates\batch\monitor.html:10 msgid "Manage watched Folders" -msgstr "" +msgstr "Gestionarea folderelor urmărite" #: .\cookbook\templates\batch\monitor.html:14 msgid "" "On this Page you can manage all storage folder locations that should be " "monitored and synced." msgstr "" +"Pe această Pagină puteți gestiona toate locațiile folderului de stocare care " +"ar trebui monitorizate și sincronizate." #: .\cookbook\templates\batch\monitor.html:16 msgid "The path must be in the following format" -msgstr "" +msgstr "Calea trebuie să fie în următorul format" #: .\cookbook\templates\batch\monitor.html:20 #: .\cookbook\templates\forms\edit_import_recipe.html:14 @@ -982,55 +1060,57 @@ msgstr "" #: .\cookbook\templates\settings.html:195 #: .\cookbook\templates\shopping_list.html:360 msgid "Save" -msgstr "" +msgstr "Salvare" #: .\cookbook\templates\batch\monitor.html:21 msgid "Manage External Storage" -msgstr "" +msgstr "Gestionarea spațiului de stocare extern" #: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" -msgstr "" +msgstr "Sincronizează acum!" #: .\cookbook\templates\batch\monitor.html:29 msgid "Show Recipes" -msgstr "" +msgstr "Afișare rețete" #: .\cookbook\templates\batch\monitor.html:30 msgid "Show Log" -msgstr "" +msgstr "Afișare jurnal" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "" +msgstr "Importă rețete" #: .\cookbook\templates\batch\waiting.html:28 msgid "" "This can take a few minutes, depending on the number of recipes in sync, " "please wait." msgstr "" +"Acest lucru poate dura câteva minute, în funcție de numărul de rețete " +"sincronizate, vă rugăm să așteptați." #: .\cookbook\templates\books.html:7 msgid "Recipe Books" -msgstr "" +msgstr "Cărți de rețete" #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "" +msgstr "Exportă rețete" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" -msgstr "" +msgstr "Importă rețetă nouă" #: .\cookbook\templates\forms\edit_internal_recipe.html:7 msgid "Edit Recipe" -msgstr "" +msgstr "Editează rețetă" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "" +msgstr "Editează ingrediente" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -1042,104 +1122,112 @@ msgid "" "them.\n" " " msgstr "" +"\n" +" Următorul formular poate fi utilizat dacă, accidental, două (sau mai " +"multe) unități sau ingrediente în cazul în care au fost create care ar " +"trebui să fie\n" +" la fel.\n" +" Îmbină două unități sau ingrediente și actualizează toate rețetele " +"folosindu-le.\n" +" " #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" -msgstr "" +msgstr "Sunteți sigur că doriți să uniți aceste două unități?" #: .\cookbook\templates\forms\ingredients.html:31 #: .\cookbook\templates\forms\ingredients.html:40 msgid "Merge" -msgstr "" +msgstr "Unire" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" +msgstr "Sunteți sigur că doriți să uniți aceste două ingrediente?" #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " -msgstr "" +msgstr "Sunteți sigur că doriți să ștergeți %(title)s: %(object)s " #: .\cookbook\templates\generic\delete_template.html:26 msgid "Protected" -msgstr "" +msgstr "Protejat" #: .\cookbook\templates\generic\delete_template.html:41 msgid "Cascade" -msgstr "" +msgstr "Cascadă" #: .\cookbook\templates\generic\delete_template.html:72 msgid "Cancel" -msgstr "" +msgstr "Anulare" #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" -msgstr "" +msgstr "Vizualizare" #: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" -msgstr "" +msgstr "Ștergerea fișierului original" #: .\cookbook\templates\generic\list_template.html:6 #: .\cookbook\templates\generic\list_template.html:21 msgid "List" -msgstr "" +msgstr "Listă" #: .\cookbook\templates\generic\list_template.html:34 msgid "Filter" -msgstr "" +msgstr "Filtru" #: .\cookbook\templates\generic\list_template.html:39 msgid "Import all" -msgstr "" +msgstr "Importare toate" #: .\cookbook\templates\generic\table_template.html:76 #: .\cookbook\templates\recipes_table.html:121 msgid "previous" -msgstr "" +msgstr "precedent" #: .\cookbook\templates\generic\table_template.html:98 #: .\cookbook\templates\recipes_table.html:143 msgid "next" -msgstr "" +msgstr "următor" #: .\cookbook\templates\history.html:20 msgid "View Log" -msgstr "" +msgstr "Vizionare jurnal" #: .\cookbook\templates\history.html:24 msgid "Cook Log" -msgstr "" +msgstr "Jurnal de pregătire" #: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 msgid "Import Recipes" -msgstr "" +msgstr "Importă rețete" #: .\cookbook\templates\include\log_cooking.html:7 msgid "Log Recipe Cooking" -msgstr "" +msgstr "Jurnal rețetă de gătire" #: .\cookbook\templates\include\log_cooking.html:13 msgid "All fields are optional and can be left empty." -msgstr "" +msgstr "Toate câmpurile sunt opționale și pot fi lăsate goale." #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" -msgstr "" +msgstr "Evaluare" #: .\cookbook\templates\include\log_cooking.html:27 #: .\cookbook\templates\include\recipe_open_modal.html:18 msgid "Close" -msgstr "" +msgstr "Închide" #: .\cookbook\templates\include\recipe_open_modal.html:32 msgid "Open Recipe" -msgstr "" +msgstr "Deschide rețetă" #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" -msgstr "" +msgstr "Avertizare de securitate" #: .\cookbook\templates\include\storage_backend_warning.html:5 msgid "" @@ -1153,40 +1241,49 @@ msgid "" "can be used.\n" " " msgstr "" +"\n" +" Câmpurile de Parolă și Token sunt stocate ca text simplu în interiorul bazei de date.\n" +" Acest lucru este necesar deoarece acestea sunt necesare pentru a " +"face cereri API, dar, de asemenea, crește riscul de\n" +" furt.
\n" +" Limitarea posibilelor deteriorări ale token-urilor sau conturilor cu " +"acces limitat ce pot fi utilizate.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "" +msgstr "Căutare rețetă ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "Rețetă nouă" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "Căutare avansată" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "Resetarea căutării" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "Ultima vizualizare" #: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:35 #: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "Rețete" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "Conectați-vă pentru a vizualiza rețetele" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Informații Markdown" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -1203,54 +1300,70 @@ msgid "" "below.\n" " " msgstr "" +"\n" +" Markdown este un limbaj de marcare ușor, care poate fi folosit " +"pentru formatarea textul simplu cu ușurință.\n" +" Acest site utilizează biblioteca Python Markdown pentru a\n" +" converti textului într-un document HTML frumos stilizat. " +"Documentația completă Markdown poate fi găsită\n" +" aici.\n" +" O documentație incompletă, dar cel mai probabil suficientă poate fi " +"găsită mai jos.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "Anteturi" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "Formatare" #: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:72 msgid "Line breaks are inserted by adding two spaces after the end of a line" msgstr "" +"Sfârșiturile de linie sunt inserate prin adăugarea a două spații după " +"sfârșitul unei linii" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." -msgstr "" +msgstr "sau lăsând o linie goală între ele." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "Acest text este îngroșat" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "Acest text este cursiv" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "Ghilimelele bloc sunt, de asemenea, posibile" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "Liste" #: .\cookbook\templates\markdown_info.html:85 msgid "" "Lists can ordered or unorderd. It is important to leave a blank line " "before the list!" msgstr "" +"Listele pot fi ordonate sau neordonate. Este important să lăsați o linie " +"goală înainte de listă!" #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 msgid "Ordered List" -msgstr "" +msgstr "Listă ordonată" #: .\cookbook\templates\markdown_info.html:89 #: .\cookbook\templates\markdown_info.html:90 @@ -1259,12 +1372,12 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:111 #: .\cookbook\templates\markdown_info.html:112 msgid "unordered list item" -msgstr "" +msgstr "element a listei neordonate" #: .\cookbook\templates\markdown_info.html:93 #: .\cookbook\templates\markdown_info.html:114 msgid "Unordered List" -msgstr "" +msgstr "Listă neordonată" #: .\cookbook\templates\markdown_info.html:95 #: .\cookbook\templates\markdown_info.html:96 @@ -1273,26 +1386,29 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:117 #: .\cookbook\templates\markdown_info.html:118 msgid "ordered list item" -msgstr "" +msgstr "element a listei ordonate" #: .\cookbook\templates\markdown_info.html:125 msgid "Images & Links" -msgstr "" +msgstr "Imagini și link-uri" #: .\cookbook\templates\markdown_info.html:126 msgid "" "Links can be formatted with Markdown. This application also allows to paste " "links directly into markdown fields without any formatting." msgstr "" +"Link-urile pot fi formatate cu Markdown. Această aplicație permite, de " +"asemenea, să lipiți linkuri direct în câmpurile de marcare fără nicio " +"formatare." #: .\cookbook\templates\markdown_info.html:132 #: .\cookbook\templates\markdown_info.html:145 msgid "This will become an image" -msgstr "" +msgstr "Aceasta va deveni o imagine" #: .\cookbook\templates\markdown_info.html:152 msgid "Tables" -msgstr "" +msgstr "Tabele" #: .\cookbook\templates\markdown_info.html:153 msgid "" @@ -1300,175 +1416,190 @@ msgid "" "editor like this one." msgstr "" +"Tabelele Markdown sunt cu greu create de mână. Este recomandat folosirea " +"unor editoare de tabele precum acesta." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:171 #: .\cookbook\templates\markdown_info.html:177 msgid "Table" -msgstr "" +msgstr "Tabel" #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:172 msgid "Header" -msgstr "" +msgstr "Antet" #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:178 msgid "Cell" -msgstr "" +msgstr "Celulă" #: .\cookbook\templates\meal_plan_entry.html:6 msgid "Meal Plan View" -msgstr "" +msgstr "Vizualizarea planului de alimentare" #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" -msgstr "" +msgstr "Creat de" #: .\cookbook\templates\meal_plan_entry.html:20 #: .\cookbook\templates\shopping_list.html:261 msgid "Shared with" -msgstr "" +msgstr "Partajat cu" #: .\cookbook\templates\meal_plan_entry.html:48 #: .\cookbook\templates\recipes_table.html:64 msgid "Last cooked" -msgstr "" +msgstr "Ultima gătită" #: .\cookbook\templates\meal_plan_entry.html:50 msgid "Never cooked before." -msgstr "" +msgstr "Niciodată gătită înainte." #: .\cookbook\templates\meal_plan_entry.html:76 msgid "Other meals on this day" -msgstr "" +msgstr "Alte mese în această zi" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "" +msgstr "Fără permisiuni" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." msgstr "" +"Nu aveți nici un grup și de aceea nu se poate utiliza această aplicație." #: .\cookbook\templates\no_groups_info.html:18 #: .\cookbook\templates\no_perm_info.html:15 msgid "Please contact your administrator." -msgstr "" +msgstr "Vă rugăm să contactați administratorul." #: .\cookbook\templates\no_perm_info.html:5 #: .\cookbook\templates\no_perm_info.html:12 msgid "No Permission" -msgstr "" +msgstr "Fără permisiune" #: .\cookbook\templates\no_perm_info.html:15 msgid "" "You do not have the required permissions to view this page or perform this " "action." msgstr "" +"Nu aveți permisiunile necesare pentru a vizualiza această pagină sau pentru " +"a efectua această acțiune." #: .\cookbook\templates\no_space_info.html:6 #: .\cookbook\templates\no_space_info.html:13 msgid "No Space" -msgstr "" +msgstr "Fără spațiu" #: .\cookbook\templates\no_space_info.html:17 msgid "" "Recipes, foods, shopping lists and more are organized in spaces of one or " "more people." msgstr "" +"Rețetele, alimentele, listele de cumpărături și multe altele sunt organizate " +"în spațiile uneia sau mai multor persoane." #: .\cookbook\templates\no_space_info.html:18 msgid "" "You can either be invited into an existing space or create your own one." msgstr "" +"Puteți fi invitat într-un spațiu existent sau puteți crea propriul spațiu." #: .\cookbook\templates\no_space_info.html:31 #: .\cookbook\templates\no_space_info.html:40 msgid "Join Space" -msgstr "" +msgstr "Alăturați-vă spațiului" #: .\cookbook\templates\no_space_info.html:34 msgid "Join an existing space." -msgstr "" +msgstr "Alăturați-vă unui spațiu existent." #: .\cookbook\templates\no_space_info.html:35 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" +"Pentru a vă alătura unui spațiu existent, introduceți simbolul de invitație " +"sau faceți clic pe linkul de invitație pe care vi-l trimite proprietarul " +"spațiului." #: .\cookbook\templates\no_space_info.html:48 #: .\cookbook\templates\no_space_info.html:56 msgid "Create Space" -msgstr "" +msgstr "Creare spațiu" #: .\cookbook\templates\no_space_info.html:51 msgid "Create your own recipe space." -msgstr "" +msgstr "Creați-vă propriul spațiu de rețete." #: .\cookbook\templates\no_space_info.html:52 msgid "Start your own recipe space and invite other users to it." msgstr "" +"Începeți propriul spațiu de rețete și invitați alți utilizatori la acesta." #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "" +msgstr "Offline" #: .\cookbook\templates\offline.html:19 msgid "You are currently offline!" -msgstr "" +msgstr "Sunteți în prezent offline!" #: .\cookbook\templates\offline.html:20 msgid "" "The recipes listed below are available for offline viewing because you have " "recently viewed them. Keep in mind that data might be outdated." msgstr "" +"Rețetele enumerate mai jos sunt disponibile pentru vizualizare offline, " +"deoarece le-ați vizualizat recent. Rețineți că datele pot fi învechite." #: .\cookbook\templates\recipe_view.html:26 msgid "by" -msgstr "" +msgstr "de" #: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 #: .\cookbook\views\edit.py:180 msgid "Comment" -msgstr "" +msgstr "Comentariu" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 #: .\cookbook\templates\url_import.html:444 msgid "Recipe Image" -msgstr "" +msgstr "Imagine rețetă" #: .\cookbook\templates\recipes_table.html:51 #: .\cookbook\templates\url_import.html:449 msgid "Preparation time ca." -msgstr "" +msgstr "Timp de pregătire cca." #: .\cookbook\templates\recipes_table.html:57 #: .\cookbook\templates\url_import.html:454 msgid "Waiting time ca." -msgstr "" +msgstr "Timp de așteptare cca." #: .\cookbook\templates\recipes_table.html:60 msgid "External" -msgstr "" +msgstr "Extern" #: .\cookbook\templates\recipes_table.html:86 msgid "Log Cooking" -msgstr "" +msgstr "Jurnal de pregătire" #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" -msgstr "" +msgstr "Rețetă acasă" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 #: .\cookbook\templates\settings.html:165 msgid "Search Settings" -msgstr "" +msgstr "Setări de căutare" #: .\cookbook\templates\search_info.html:10 msgid "" @@ -1481,10 +1612,18 @@ msgid "" "only available if you are using Postgres for your database.\n" " " msgstr "" +"\n" +" Crearea celei mai bune experiențe de căutare este complicată și " +"cântărește foarte mult asupra configurației personale. \n" +" Modificarea oricăreia dintre setările de căutare poate avea un " +"impact semnificativ asupra vitezei și calității rezultatelor.\n" +" Configurațiile metode de căutare, trigrame și căutare text complet " +"sunt disponibile numai dacă utilizați Postgres pentru baza de date.\n" +" " #: .\cookbook\templates\search_info.html:19 msgid "Search Methods" -msgstr "" +msgstr "Metode de căutare" #: .\cookbook\templates\search_info.html:23 msgid "" @@ -1500,6 +1639,18 @@ msgid "" "html#TEXTSEARCH-PARSING-QUERIES>Postgresql's website.\n" " " msgstr "" +" \n" +" Căutările de text complet încearcă să normalizeze cuvintele " +"furnizate pentru a se potrivi variantelor comune. De exemplu: 'bifurcat', " +"'furcă', 'furculițe' se vor normaliza la 'furculiță'.\n" +" Există mai multe metode disponibile, descrise mai jos, care vor " +"controla modul în care comportamentul de căutare ar trebui să reacționeze " +"atunci când sunt căutate mai multe cuvinte.\n" +" Detalii tehnice complete cu privire la modul în care acestea " +"funcționează pot fi vizualizate pe website-ul " +"Postgresql.\n" +" " #: .\cookbook\templates\search_info.html:29 msgid "" @@ -1511,6 +1662,14 @@ msgid "" "selected for a full text search.\n" " " msgstr "" +" \n" +" Căutările simple ignoră semnele de punctuație și cuvintele " +"comune, cum ar fi 'de', 'și', 'a', și va trata cuvinte separate după cum " +"este necesar.\n" +" Căutarea 'măr sau făină' va returna orice rețetă care include " +"atât 'măr', cât și 'făină' oriunde în câmpurile care au fost selectate " +"pentru o căutare completă de text.\n" +" " #: .\cookbook\templates\search_info.html:34 msgid "" @@ -1522,6 +1681,13 @@ msgid "" "been selected for a full text search.\n" " " msgstr "" +" \n" +" Căutările de expresii ignoră semnele de punctuație, dar vor " +"căuta toate cuvintele în ordinea exactă furnizată.\n" +" Căutarea 'măr sau făină' va returna doar o rețetă care include " +"expresia exactă 'măr sau făină' în oricare dintre câmpurile care au fost " +"selectate pentru o căutare completă a textului.\n" +" " #: .\cookbook\templates\search_info.html:39 msgid "" @@ -1541,6 +1707,21 @@ msgid "" "recipe that has the word 'butter' in any field included.\n" " " msgstr "" +" \n" +" Căutările web simulează funcționalitatea găsită pe multe site-" +"uri de căutare web care acceptă sintaxa specială.\n" +" Plasarea ghilimelelor în jurul mai multor cuvinte va converti " +"aceste cuvinte într-o frază.\n" +" 'sau' este recunoscut pentru căutarea pentru cuvântul (sau fraza)" +" imediat înainte de 'sau' SAU cuvântul (sau fraza) direct după.\n" +" '-' este recunoscut pentru căutarea rețetelor care nu includ " +"cuvântul (sau fraza) care vine imediat după. \n" +" De exemplu, căutarea 'plăcintei cu mere' sau a untului de cireșe " +"va returna orice rețetă care include expresia 'plăcintă cu mere' sau " +"cuvântul 'cireș' \n" +" în orice câmp inclus în căutarea completă a textului, dar " +"exclude orice rețetă care are cuvântul 'unt' în orice câmp inclus.\n" +" " #: .\cookbook\templates\search_info.html:48 msgid "" @@ -1549,6 +1730,10 @@ msgid "" "operators such as '|', '&' and '()'\n" " " msgstr "" +" \n" +" Căutarea brută este similară cu web-ul, cu excepția caracterelor " +"speciale, cum ar fi '|', '&' și '()'\n" +" " #: .\cookbook\templates\search_info.html:59 msgid "" @@ -1564,10 +1749,21 @@ msgid "" "methods.\n" " " msgstr "" +" \n" +" O altă abordare a căutării care, de asemenea, necesită " +"Postgresql este căutarea vagă, sau similitudinea trigramelor. O trigramă " +"este un grup de trei caractere consecutive.\n" +" De exemplu, căutarea 'mărului' va crea x trigrame 'măr', 'ăru', " +"'rul' și va crea un scor al cât de strâns se potrivesc cuvintele cu " +"trigramele generate.\n" +" Un beneficiu de căutare a trigramelor este că o căutare pentru " +"'plăcintă' va găsi cuvinte scrise greșit, cum ar fi \"plăcine\", care ar fi " +"ratat de alte metode.\n" +" " #: .\cookbook\templates\search_info.html:69 msgid "Search Fields" -msgstr "" +msgstr "Câmpuri de căutare" #: .\cookbook\templates\search_info.html:73 msgid "" @@ -1603,10 +1799,43 @@ msgid "" "full text results, it does match the trigram results.\n" " " msgstr "" +" \n" +" Unaccent este un caz special prin faptul că permite căutarea " +"unui câmp 'neaccentuat' pentru fiecare stil de căutare care încearcă să " +"ignore valorile accentuate. \n" +" De exemplu, atunci când activați unaccent pentru 'Nume', orice " +"căutare (începe cu, conține, trigramă) va încerca căutarea ignorând " +"caracterele accentuate.\n" +" \n" +" Pentru celelalte opțiuni, puteți activa căutarea pe oricare sau " +"pe toate câmpurile și acestea vor fi combinate împreună cu un presupus 'SAU'." +"\n" +" De exemplu, activarea 'Nume' pentru începe cu, 'Nume' și " +"'Descriere' pentru potrivire parțială și 'Ingrediente' și 'Cuvinte cheie' " +"pentru căutare completă\n" +" și căutarea de 'mărului' va genera o căutare care va returna " +"rețete care au:\n" +" - Un nume de rețetă care începe cu 'măr'\n" +" - SAU un nume de rețetă care conține 'măr''\n" +" - SAU o descriere a rețetei care conține 'măr'\n" +" - SAU o rețetă care va avea o potrivire completă de căutare text " +"('măr' sau 'mere') în ingrediente\n" +" - SAU o rețetă care va avea un text complet de căutare se " +"potrivesc în cuvinte cheie\n" +"\n" +" Combinarea prea multor câmpuri în prea multe tipuri de căutare " +"poate avea un impact negativ asupra performanței, poate crea rezultate " +"dublate sau poate returna rezultate neașteptate.\n" +" De exemplu, activarea căutării vage sau a potrivirilor parțiale " +"va interfera cu metodele de căutare pe web. \n" +" Căutarea 'plăcinte -mere' cu căutare vagă și căutare text " +"complet va returna rețeta plăcintelor cu mere. Deși nu este inclus în " +"rezultatele textului complet, se potrivește cu rezultatele trigramei.\n" +" " #: .\cookbook\templates\search_info.html:95 msgid "Search Index" -msgstr "" +msgstr "Index de căutare" #: .\cookbook\templates\search_info.html:99 msgid "" @@ -1620,89 +1849,108 @@ msgid "" "the management command 'python manage.py rebuildindex'\n" " " msgstr "" +" \n" +" Trigrama de căutare și full text search ambele se bazează pe " +"indexurile bazei de date pentru a efectua în mod eficient. \n" +" Puteți reconstrui indexurile pe toate câmpurile din pagina Admin " +"pentru rețete și selectând toate rețetele și rulând 'reconstrui index pentru " +"rețetele selectate'\n" +" De asemenea, puteți reconstrui indexurile la linia de comandă " +"executând comanda de gestionare 'python manage.py rebuildindex'\n" +" " #: .\cookbook\templates\settings.html:28 msgid "Account" -msgstr "" +msgstr "Cont" #: .\cookbook\templates\settings.html:35 msgid "Preferences" -msgstr "" +msgstr "Preferințe" #: .\cookbook\templates\settings.html:42 msgid "API-Settings" -msgstr "" +msgstr "Setări API" #: .\cookbook\templates\settings.html:49 msgid "Search-Settings" -msgstr "" +msgstr "Setări de căutare" #: .\cookbook\templates\settings.html:58 msgid "Name Settings" -msgstr "" +msgstr "Setări de nume" #: .\cookbook\templates\settings.html:66 msgid "Account Settings" -msgstr "" +msgstr "Setpri cont" #: .\cookbook\templates\settings.html:68 msgid "Emails" -msgstr "" +msgstr "E-mailuri" #: .\cookbook\templates\settings.html:71 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" -msgstr "" +msgstr "Social" #: .\cookbook\templates\settings.html:84 msgid "Language" -msgstr "" +msgstr "Limbă" #: .\cookbook\templates\settings.html:114 msgid "Style" -msgstr "" +msgstr "Stil" #: .\cookbook\templates\settings.html:135 msgid "API Token" -msgstr "" +msgstr "API Token" #: .\cookbook\templates\settings.html:136 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." msgstr "" +"Puteți utiliza atât autentificarea de bază, cât și autentificarea bazată pe " +"token pentru a accesa REST API." #: .\cookbook\templates\settings.html:153 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" msgstr "" +"Utilizați token-ul ca antet de autorizare prefixat de token-ul cuvântului, " +"așa cum se arată în următoarele exemple:" #: .\cookbook\templates\settings.html:155 msgid "or" -msgstr "" +msgstr "sau" #: .\cookbook\templates\settings.html:166 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" +"Există multe opțiuni pentru a configura căutarea în funcție de preferințele " +"personale." #: .\cookbook\templates\settings.html:167 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" +"De obicei, nu aveți nevoie să configurați niciuna dintre ele și poate " +"rămâne doar cu implicit sau una dintre următoarele presetări." #: .\cookbook\templates\settings.html:168 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" +"Dacă doriți să configurați căutarea, puteți citi despre diferitele opțiuni " +"aici." #: .\cookbook\templates\settings.html:173 msgid "Fuzzy" -msgstr "" +msgstr "Vag" #: .\cookbook\templates\settings.html:174 msgid "" @@ -1710,84 +1958,91 @@ msgid "" "return more results than needed to make sure you find what you are looking " "for." msgstr "" +"Găsiți ceea ce aveți nevoie, chiar dacă căutarea sau rețeta conține greșeli " +"de scriere. S-ar putea returna mai multe rezultate decât este necesar pentru " +"a vă asigura că găsiți ceea ce căutați." #: .\cookbook\templates\settings.html:175 msgid "This is the default behavior" -msgstr "" +msgstr "Acesta este comportamentul implicit" #: .\cookbook\templates\settings.html:176 #: .\cookbook\templates\settings.html:184 msgid "Apply" -msgstr "" +msgstr "Aplică" #: .\cookbook\templates\settings.html:181 msgid "Precise" -msgstr "" +msgstr "Precis" #: .\cookbook\templates\settings.html:182 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" +"Permite un control fin asupra rezultatelor căutării, dar este posibil să nu " +"returneze rezultate dacă se fac prea multe greșeli de ortografie." #: .\cookbook\templates\settings.html:183 msgid "Perfect for large Databases" -msgstr "" +msgstr "Perfect pentru bazele de date mari" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" -msgstr "" +msgstr "Setarea cărții de bucate" #: .\cookbook\templates\setup.html:14 msgid "Setup" -msgstr "" +msgstr "Setare" #: .\cookbook\templates\setup.html:15 msgid "" "To start using this application you must first create a superuser account." msgstr "" +"Pentru a începe să utilizați această aplicație, trebuie mai întâi să creați " +"un cont superuser." #: .\cookbook\templates\setup.html:20 msgid "Create Superuser account" -msgstr "" +msgstr "Creează cont superuser" #: .\cookbook\templates\shopping_list.html:7 #: .\cookbook\templates\shopping_list.html:29 #: .\cookbook\templates\shopping_list.html:721 msgid "Shopping List" -msgstr "" +msgstr "Listă de cumpărături" #: .\cookbook\templates\shopping_list.html:34 msgid "Try the new shopping list" -msgstr "" +msgstr "Încercați noua listă de cumpărături" #: .\cookbook\templates\shopping_list.html:63 msgid "Search Recipe" -msgstr "" +msgstr "Căutare rețetă" #: .\cookbook\templates\shopping_list.html:86 msgid "Shopping Recipes" -msgstr "" +msgstr "Rețete de cumpărături" #: .\cookbook\templates\shopping_list.html:90 msgid "No recipes selected" -msgstr "" +msgstr "Nici o rețetă selectată" #: .\cookbook\templates\shopping_list.html:157 msgid "Entry Mode" -msgstr "" +msgstr "Mod de intrare" #: .\cookbook\templates\shopping_list.html:165 msgid "Add Entry" -msgstr "" +msgstr "Adăugare intrare" #: .\cookbook\templates\shopping_list.html:181 msgid "Amount" -msgstr "" +msgstr "Cantitate" #: .\cookbook\templates\shopping_list.html:194 msgid "Select Unit" -msgstr "" +msgstr "Selectare unitate" #: .\cookbook\templates\shopping_list.html:196 #: .\cookbook\templates\shopping_list.html:218 @@ -1796,59 +2051,62 @@ msgstr "" #: .\cookbook\templates\url_import.html:500 #: .\cookbook\templates\url_import.html:532 msgid "Select" -msgstr "" +msgstr "Selectare" #: .\cookbook\templates\shopping_list.html:216 msgid "Select Food" -msgstr "" +msgstr "Selectare mâncare" #: .\cookbook\templates\shopping_list.html:247 msgid "Select Supermarket" -msgstr "" +msgstr "Selectare supermarket" #: .\cookbook\templates\shopping_list.html:271 msgid "Select User" -msgstr "" +msgstr "Selectare utilizator" #: .\cookbook\templates\shopping_list.html:290 msgid "Finished" -msgstr "" +msgstr "Finisat" #: .\cookbook\templates\shopping_list.html:303 msgid "You are offline, shopping list might not syncronize." msgstr "" +"Sunteți offline, este posibil ca lista de cumpărături să nu se sincronizeze." #: .\cookbook\templates\shopping_list.html:368 msgid "Copy/Export" -msgstr "" +msgstr "Copiere/Exportare" #: .\cookbook\templates\shopping_list.html:372 msgid "List Prefix" -msgstr "" +msgstr "Prefix listă" #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" -msgstr "" +msgstr "Conexiuni de cont" #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" +"Vă puteți conecta la cont utilizând oricare dintre următoarele terțe părți\n" +" de conturi:" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" "You currently have no social network accounts connected to this account." -msgstr "" +msgstr "În prezent, nu aveți conturi de rețea socială conectate la acest cont." #: .\cookbook\templates\socialaccount\connections.html:55 msgid "Add a 3rd Party Account" -msgstr "" +msgstr "Adăugarea unui cont a părților terțe" #: .\cookbook\templates\socialaccount\signup.html:5 msgid "Signup" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1857,6 +2115,10 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" +"Sunteți pe cale de a utiliza\n" +" contul %(provider_name)s pentru a vă conecta la \n" +" %(site_name)s. Ca un pas final, vă rugăm să completați următorul " +"formular:" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 @@ -1873,100 +2135,100 @@ msgstr "" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 msgid "Sign in using" -msgstr "" +msgstr "Conectați-vă utilizând" #: .\cookbook\templates\space.html:23 msgid "Space:" -msgstr "" +msgstr "Spațiu:" #: .\cookbook\templates\space.html:24 msgid "Manage Subscription" -msgstr "" +msgstr "Gestionarea abonamentului" #: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 msgid "Number of objects" -msgstr "" +msgstr "Numărul de obiecte" #: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" -msgstr "" +msgstr "Importuri de rețete" #: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 msgid "Objects stats" -msgstr "" +msgstr "Statistici obiecte" #: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" -msgstr "" +msgstr "Rețete fără cuvinte cheie" #: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" -msgstr "" +msgstr "Rețete interne" #: .\cookbook\templates\space.html:73 msgid "Members" -msgstr "" +msgstr "Membri" #: .\cookbook\templates\space.html:77 msgid "Invite User" -msgstr "" +msgstr "Invită utilizator" #: .\cookbook\templates\space.html:88 msgid "User" -msgstr "" +msgstr "Utilizator" #: .\cookbook\templates\space.html:89 msgid "Groups" -msgstr "" +msgstr "Grupe" #: .\cookbook\templates\space.html:105 msgid "admin" -msgstr "" +msgstr "admin" #: .\cookbook\templates\space.html:106 msgid "user" -msgstr "" +msgstr "utilizator" #: .\cookbook\templates\space.html:107 msgid "guest" -msgstr "" +msgstr "oaspete" #: .\cookbook\templates\space.html:108 msgid "remove" -msgstr "" +msgstr "eliminare" #: .\cookbook\templates\space.html:112 msgid "Update" -msgstr "" +msgstr "Actualizare" #: .\cookbook\templates\space.html:116 msgid "You cannot edit yourself." -msgstr "" +msgstr "Nu te poți edita singur pe tine." #: .\cookbook\templates\space.html:123 msgid "There are no members in your space yet!" -msgstr "" +msgstr "Încă nu există membri în spațiul dumneavoastră!" #: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 #: .\cookbook\views\lists.py:100 msgid "Invite Links" -msgstr "" +msgstr "Link-uri de invitație" #: .\cookbook\templates\stats.html:4 msgid "Stats" -msgstr "" +msgstr "Atribute" #: .\cookbook\templates\stats.html:10 msgid "Statistics" -msgstr "" +msgstr "Statistici" #: .\cookbook\templates\system.html:22 msgid "Show Links" -msgstr "" +msgstr "Afișează link-uri" #: .\cookbook\templates\system.html:32 msgid "System Information" -msgstr "" +msgstr "Informații despre sistem" #: .\cookbook\templates\system.html:34 msgid "" @@ -1978,20 +2240,27 @@ msgid "" "recipes/releases\">here.\n" " " msgstr "" +"\n" +" Django Recipes este o aplicație software gratuită open source. " +"Acesta poate fi găsită pe\n" +" GitHub.\n" +" Istoricul modificării poate fi găsit aici.\n" +" " #: .\cookbook\templates\system.html:48 msgid "Media Serving" -msgstr "" +msgstr "Livrare conținut media" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 msgid "Warning" -msgstr "" +msgstr "Atenționare" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 msgid "Ok" -msgstr "" +msgstr "Ok" #: .\cookbook\templates\system.html:51 msgid "" @@ -2002,15 +2271,22 @@ msgid "" " your installation.\n" " " msgstr "" +"Servirea fișierelor media direct folosind gunicorn/python nu este " +"recomandată !\n" +" Vă rugăm să urmați pașii descriși\n" +" aici pentru a actualiza\n" +" instalarea dvs..\n" +" " #: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 #: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 msgid "Everything is fine!" -msgstr "" +msgstr "Totul este bine!" #: .\cookbook\templates\system.html:62 msgid "Secret Key" -msgstr "" +msgstr "Cheie secretă" #: .\cookbook\templates\system.html:66 msgid "" @@ -2024,10 +2300,19 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" Nu aveți un SECRET_KEY configurat în fișierul " +".env. Django utilizează implicit\n" +" cheia standard\n" +" prevazuta cu instalația care este cunoscuta public si nesigura! " +"Vă rugăm să setați\n" +" SECRET_KEY în fișierul de configurare ." +"env.\n" +" " #: .\cookbook\templates\system.html:78 msgid "Debug Mode" -msgstr "" +msgstr "Mod de depanare" #: .\cookbook\templates\system.html:82 msgid "" @@ -2039,14 +2324,21 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" Această aplicație se execută încă în modul de depanare. Acest " +"lucru nu este cel mai probabil necesar. Rândul său, modul de depanare prin\n" +" setarea\n" +" DEBUG=0 in zona .env a fișierului de " +"configurare.\n" +" " #: .\cookbook\templates\system.html:93 msgid "Database" -msgstr "" +msgstr "Bază de date" #: .\cookbook\templates\system.html:95 msgid "Info" -msgstr "" +msgstr "Informație" #: .\cookbook\templates\system.html:97 msgid "" @@ -2056,46 +2348,52 @@ msgid "" " features only work with postgres databases.\n" " " msgstr "" +"\n" +" Această aplicație nu se execută cu un backend de bază de date " +"Postgres. Acest lucru este ok, dar nu este recomandat deoarece unele\n" +" caracteristicile funcționează numai cu baze de date Postgres.\n" +" " #: .\cookbook\templates\url_import.html:6 msgid "URL Import" -msgstr "" +msgstr "Importare URL" #: .\cookbook\templates\url_import.html:31 msgid "Drag me to your bookmarks to import recipes from anywhere" -msgstr "" +msgstr "Trageți-mă în marcajele dvs., pentru a importa rețete de oriunde" #: .\cookbook\templates\url_import.html:32 msgid "Bookmark Me!" -msgstr "" +msgstr "Marcaj-mă!" #: .\cookbook\templates\url_import.html:36 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:38 msgid "App" -msgstr "" +msgstr "Aplicație" #: .\cookbook\templates\url_import.html:62 msgid "Enter website URL" -msgstr "" +msgstr "Introduceți adresa URL a site-ului web" #: .\cookbook\templates\url_import.html:101 msgid "Select recipe files to import or drop them here..." -msgstr "" +msgstr "Selectați fișierele de rețetă pentru a le importa sau a le fixa aici..." #: .\cookbook\templates\url_import.html:122 msgid "Paste json or html source here to load recipe." -msgstr "" +msgstr "Plasează sursa JSON sau HTML aici pentru a încărca rețeta." #: .\cookbook\templates\url_import.html:150 msgid "Preview Recipe Data" -msgstr "" +msgstr "Previzualizați datele rețetei" #: .\cookbook\templates\url_import.html:151 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" +"Trageți atributele rețetei din dreapta în caseta corespunzătoare de mai jos." #: .\cookbook\templates\url_import.html:160 #: .\cookbook\templates\url_import.html:177 @@ -2108,113 +2406,116 @@ msgstr "" #: .\cookbook\templates\url_import.html:304 #: .\cookbook\templates\url_import.html:355 msgid "Clear Contents" -msgstr "" +msgstr "Curățare conținut" #: .\cookbook\templates\url_import.html:162 msgid "Text dragged here will be appended to the name." -msgstr "" +msgstr "Textul tras aici va fi adăugat la nume." #: .\cookbook\templates\url_import.html:175 msgid "Description" -msgstr "" +msgstr "Descriere" #: .\cookbook\templates\url_import.html:179 msgid "Text dragged here will be appended to the description." -msgstr "" +msgstr "Textul tras aici va fi adăugat la descriere." #: .\cookbook\templates\url_import.html:196 msgid "Keywords dragged here will be appended to current list" -msgstr "" +msgstr "Cuvintele cheie trase aici vor fi anexate la lista curentă" #: .\cookbook\templates\url_import.html:211 msgid "Image" -msgstr "" +msgstr "Imagine" #: .\cookbook\templates\url_import.html:243 msgid "Prep Time" -msgstr "" +msgstr "Timp de pregătire" #: .\cookbook\templates\url_import.html:258 msgid "Cook Time" -msgstr "" +msgstr "Timp de gătire" #: .\cookbook\templates\url_import.html:279 msgid "Ingredients dragged here will be appended to current list." -msgstr "" +msgstr "Ingredientele trase aici vor fi anexate la lista curentă." #: .\cookbook\templates\url_import.html:301 #: .\cookbook\templates\url_import.html:572 msgid "Instructions" -msgstr "" +msgstr "Instrucțiuni" #: .\cookbook\templates\url_import.html:306 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" +"Instrucțiunile de rețetă trase aici vor fi anexate la instrucțiunile curente." #: .\cookbook\templates\url_import.html:329 msgid "Discovered Attributes" -msgstr "" +msgstr "Atribute descoperite" #: .\cookbook\templates\url_import.html:331 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" +"Trageți atributele rețetei de mai jos în caseta corespunzătoare din stânga. " +"Faceți clic pe orice nod pentru a afișa proprietățile sale complete." #: .\cookbook\templates\url_import.html:348 msgid "Show Blank Field" -msgstr "" +msgstr "Afișare câmp gol" #: .\cookbook\templates\url_import.html:353 msgid "Blank Field" -msgstr "" +msgstr "Câmp gol" #: .\cookbook\templates\url_import.html:357 msgid "Items dragged to Blank Field will be appended." -msgstr "" +msgstr "Elementele trase în câmpul gol vor fi adăugate." #: .\cookbook\templates\url_import.html:404 msgid "Delete Text" -msgstr "" +msgstr "Ștergere text" #: .\cookbook\templates\url_import.html:417 msgid "Delete image" -msgstr "" +msgstr "Ștergere imagine" #: .\cookbook\templates\url_import.html:433 msgid "Recipe Name" -msgstr "" +msgstr "Nume rețetă" #: .\cookbook\templates\url_import.html:437 msgid "Recipe Description" -msgstr "" +msgstr "Descriere rețetă" #: .\cookbook\templates\url_import.html:499 #: .\cookbook\templates\url_import.html:531 #: .\cookbook\templates\url_import.html:587 msgid "Select one" -msgstr "" +msgstr "Selectați una" #: .\cookbook\templates\url_import.html:547 msgid "Note" -msgstr "" +msgstr "Notă" #: .\cookbook\templates\url_import.html:588 msgid "Add Keyword" -msgstr "" +msgstr "Adaugă cuvânt cheie" #: .\cookbook\templates\url_import.html:601 msgid "All Keywords" -msgstr "" +msgstr "Toate cuvintele cheie" #: .\cookbook\templates\url_import.html:604 msgid "Import all keywords, not only the ones already existing." -msgstr "" +msgstr "Importă toate cuvintele cheie, nu numai cele deja existente." #: .\cookbook\templates\url_import.html:631 msgid "Information" -msgstr "" +msgstr "Informație" #: .\cookbook\templates\url_import.html:633 msgid "" @@ -2226,307 +2527,332 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" +" Numai site-urile web care conțin informații despre ld+json sau informații " +"microdata în prezent\n" +" pot fi importate. Majoritatea pagini " +"importante de rețete au suport pentru acest lucru. Dacă site-ul nu poate fi " +"importat, dar\n" +" crezi că\n" +" acesta are, probabil, un fel de date " +"structurate nu ezitați să posta un exemplu în\n" +" github probleme." #: .\cookbook\templates\url_import.html:641 msgid "Google ld+json Info" -msgstr "" +msgstr "Informații Google ld+json" #: .\cookbook\templates\url_import.html:644 msgid "GitHub Issues" -msgstr "" +msgstr "GitHub Probleme" #: .\cookbook\templates\url_import.html:646 msgid "Recipe Markup Specification" -msgstr "" +msgstr "Specificații a Markup-ului de rețetă" #: .\cookbook\views\api.py:83 .\cookbook\views\api.py:132 msgid "Parameter updated_at incorrectly formatted" -msgstr "" +msgstr "Parametrul updated_at formatat incorect" #: .\cookbook\views\api.py:152 #, python-brace-format msgid "No {self.basename} with id {pk} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {pk}" #: .\cookbook\views\api.py:156 msgid "Cannot merge with the same object!" -msgstr "" +msgstr "Nu se poate uni cu același obiect!" #: .\cookbook\views\api.py:163 #, python-brace-format msgid "No {self.basename} with id {target} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {target}" #: .\cookbook\views\api.py:168 msgid "Cannot merge with child object!" -msgstr "" +msgstr "Nu se poate uni cu obiect copil!" #: .\cookbook\views\api.py:201 #, python-brace-format msgid "{source.name} was merged successfully with {target.name}" -msgstr "" +msgstr "{source.name} a fost unit cu succes cu {target.name}" #: .\cookbook\views\api.py:205 #, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" -msgstr "" +msgstr "A apărut o eroare la încercarea de a uni {source.name} cu {target.name}" #: .\cookbook\views\api.py:249 #, python-brace-format msgid "No {self.basename} with id {child} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {child}" #: .\cookbook\views\api.py:258 #, python-brace-format msgid "{child.name} was moved successfully to the root." -msgstr "" +msgstr "{child.name} a fost mutat cu succes la rădăcină." #: .\cookbook\views\api.py:261 .\cookbook\views\api.py:279 msgid "An error occurred attempting to move " -msgstr "" +msgstr "A apărut o eroare la încercarea de a muta " #: .\cookbook\views\api.py:264 msgid "Cannot move an object to itself!" -msgstr "" +msgstr "Nu se poate muta un obiect la sine!" #: .\cookbook\views\api.py:270 #, python-brace-format msgid "No {self.basename} with id {parent} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {parent}" #: .\cookbook\views\api.py:276 #, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" -msgstr "" +msgstr "{child.name} a fost mutat cu succes la părintele {parent.name}" #: .\cookbook\views\api.py:723 .\cookbook\views\data.py:42 #: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" +"Această funcție nu este încă disponibilă în versiunea găzduită a tandoor!" #: .\cookbook\views\api.py:745 msgid "Sync successful!" -msgstr "" +msgstr "Sincronizare de succes!" #: .\cookbook\views\api.py:750 msgid "Error synchronizing with Storage" -msgstr "" +msgstr "Eroare la sincronizarea cu stocarea" #: .\cookbook\views\api.py:828 msgid "Nothing to do." -msgstr "" +msgstr "Nimic de făcut." #: .\cookbook\views\api.py:843 msgid "The requested site provided malformed data and cannot be read." -msgstr "" +msgstr "Site-ul solicitat a furnizat date eronate și nu poate fi citit." #: .\cookbook\views\api.py:850 msgid "The requested page could not be found." -msgstr "" +msgstr "Pagina solicitată nu a putut fi găsită." #: .\cookbook\views\api.py:859 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" +"Site-ul solicitat nu oferă niciun format de date recunoscut din care să " +"importați rețeta." #: .\cookbook\views\api.py:873 msgid "No useable data could be found." -msgstr "" +msgstr "Nu au putut fi găsite date utilizabile." #: .\cookbook\views\api.py:889 msgid "I couldn't find anything to do." -msgstr "" +msgstr "Nu am putut găsi nimic de făcut." #: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 #: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:73 #: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." -msgstr "" +msgstr "Ai ajuns la numărul maxim de rețete pentru spațiul dvs." #: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 #: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:77 #: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." -msgstr "" +msgstr "Aveți mai mulți utilizatori decât este permis în spațiul dvs." #: .\cookbook\views\data.py:111 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Editarea de tip batch completă. %(count)d rețetă a fost actualizată." +msgstr[1] "Editarea de tip batch completă. %(count)d rețete au fost actualizate." +msgstr[2] "Editarea de tip batch completă. %(count)d rețete au fost actualizate." #: .\cookbook\views\delete.py:101 msgid "Monitor" -msgstr "" +msgstr "Monitorizare" #: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:86 #: .\cookbook\views\new.py:101 msgid "Storage Backend" -msgstr "" +msgstr "Backend de stocare" #: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" +"Nu s-a putut șterge acest backend de stocare, deoarece este utilizat în cel " +"puțin un supervizor." #: .\cookbook\views\delete.py:158 msgid "Recipe Book" -msgstr "" +msgstr "Carte de rețete" #: .\cookbook\views\delete.py:170 msgid "Bookmarks" -msgstr "" +msgstr "Marcaje" #: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:235 msgid "Invite Link" -msgstr "" +msgstr "Link de invitare" #: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" -msgstr "" +msgstr "Nu puteți edita acest spațiu de stocare!" #: .\cookbook\views\edit.py:149 msgid "Storage saved!" -msgstr "" +msgstr "Spațiu de stocare salvat!" #: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" -msgstr "" +msgstr "A existat o eroare la actualizarea acestui backend de stocare!" #: .\cookbook\views\edit.py:248 msgid "Changes saved!" -msgstr "" +msgstr "Modificări salvate!" #: .\cookbook\views\edit.py:252 msgid "Error saving changes!" -msgstr "" +msgstr "Eroare la salvarea modificărilor!" #: .\cookbook\views\import_export.py:99 msgid "Importing is not implemented for this provider" -msgstr "" +msgstr "Importul nu este implementat pentru acest furnizor" #: .\cookbook\views\import_export.py:121 msgid "Exporting is not implemented for this provider" -msgstr "" +msgstr "Exportul nu este implementat pentru acest furnizor" #: .\cookbook\views\lists.py:26 msgid "Import Log" -msgstr "" +msgstr "Jurnal de import" #: .\cookbook\views\lists.py:39 msgid "Discovery" -msgstr "" +msgstr "Descoperă" #: .\cookbook\views\lists.py:69 msgid "Shopping Lists" -msgstr "" +msgstr "Liste de cumpărături" #: .\cookbook\views\lists.py:129 msgid "Foods" -msgstr "" +msgstr "Alimente" #: .\cookbook\views\lists.py:163 msgid "Supermarkets" -msgstr "" +msgstr "Supermarketuri" #: .\cookbook\views\lists.py:179 msgid "Shopping Categories" -msgstr "" +msgstr "Categorii de cumpărături" #: .\cookbook\views\lists.py:232 msgid "New Shopping List" -msgstr "" +msgstr "Listă de cumpărături nouă" #: .\cookbook\views\new.py:126 msgid "Imported new recipe!" -msgstr "" +msgstr "Rețetă nouă importată!" #: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" -msgstr "" +msgstr "A existat o eroare la importul acestei rețete!" #: .\cookbook\views\new.py:209 msgid "Hello" -msgstr "" +msgstr "Bună" #: .\cookbook\views\new.py:209 msgid "You have been invited by " -msgstr "" +msgstr "Ați fost invitat de " #: .\cookbook\views\new.py:210 msgid " to join their Tandoor Recipes space " -msgstr "" +msgstr " pentru a vă alătura la spațiul lor de rețete Tandoor " #: .\cookbook\views\new.py:211 msgid "Click the following link to activate your account: " -msgstr "" +msgstr "Faceți clic pe următorul link pentru a vă activa contul: " #: .\cookbook\views\new.py:212 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" +"Dacă linkul nu funcționează, utilizați următorul cod pentru a vă alătura " +"manual spațiului: " #: .\cookbook\views\new.py:213 msgid "The invitation is valid until " -msgstr "" +msgstr "Invitația este valabilă până la " #: .\cookbook\views\new.py:214 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" +"Tandoor Recipes este un manager de rețete Open Source. Priviți pe GitHub " #: .\cookbook\views\new.py:217 msgid "Tandoor Recipes Invite" -msgstr "" +msgstr "Invitație Tandoor Recipes" #: .\cookbook\views\new.py:224 msgid "Invite link successfully send to user." -msgstr "" +msgstr "Link-ul invita cu succes trimite la utilizator." #: .\cookbook\views\new.py:227 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" +"Ați trimis prea multe e-mailuri, vă rugăm să partajați manual linkul sau să " +"așteptați câteva ore." #: .\cookbook\views\new.py:229 msgid "Email could not be sent to user. Please share the link manually." msgstr "" +"E-mailul nu a putut fi trimis utilizatorului. Vă rugăm să partajați link-ul " +"manual." #: .\cookbook\views\views.py:127 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" +"V-ați creat cu succes propriul spațiu de rețete. Începeți prin a adăuga " +"câteva rețete sau invitați alte persoane să vi se alăture." #: .\cookbook\views\views.py:175 msgid "You do not have the required permissions to perform this action!" -msgstr "" +msgstr "Nu aveți permisiunile necesare pentru a efectua această acțiune!" #: .\cookbook\views\views.py:186 msgid "Comment saved!" -msgstr "" +msgstr "Comentariu salvat!" #: .\cookbook\views\views.py:277 msgid "This feature is not available in the demo version!" -msgstr "" +msgstr "Această funcție nu este disponibilă în versiunea demo!" #: .\cookbook\views\views.py:340 msgid "You must select at least one field to search!" -msgstr "" +msgstr "Trebuie să selectați cel puțin un câmp pentru a căuta!" #: .\cookbook\views\views.py:345 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" +"Pentru a utiliza această metodă de căutare, trebuie să selectați cel puțin " +"un câmp de căutare text complet!" #: .\cookbook\views\views.py:349 msgid "Fuzzy search is not compatible with this search method!" -msgstr "" +msgstr "Căutarea vagă nu este compatibilă cu această metodă de căutare!" #: .\cookbook\views\views.py:452 msgid "" @@ -2534,39 +2860,48 @@ msgid "" "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" +"Pagina de inițializare poate fi utilizată numai pentru a crea primul " +"utilizator! Dacă ați uitat datele superutilizatorului, vă rugăm să " +"consultați documentația Django despre cum să resetați parolele." #: .\cookbook\views\views.py:459 msgid "Passwords dont match!" -msgstr "" +msgstr "Parolele nu se potrivesc!" #: .\cookbook\views\views.py:475 msgid "User has been created, please login!" -msgstr "" +msgstr "Utilizatorul a fost creat, vă rugăm să vă autentificați!" #: .\cookbook\views\views.py:491 msgid "Malformed Invite Link supplied!" -msgstr "" +msgstr "Link-ul de invitație este furnizat malformat!" #: .\cookbook\views\views.py:498 msgid "You are already member of a space and therefore cannot join this one." msgstr "" +"Sunteți deja membru al unui spațiu și, prin urmare, nu vă puteți alătura " +"acestuia." #: .\cookbook\views\views.py:509 msgid "Successfully joined space." -msgstr "" +msgstr "Spațiu alăturat cu succes." #: .\cookbook\views\views.py:515 msgid "Invite Link not valid or already used!" -msgstr "" +msgstr "Link-ul de invitație nu este valid sau deja utilizat!" #: .\cookbook\views\views.py:579 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" +"Raportarea linkurilor de partajare nu este activată pentru această instanță. " +"Vă rugăm să anunțați administratorul paginii pentru a raporta probleme." #: .\cookbook\views\views.py:585 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +"Partajare link-urilor de rețete a fost dezactivată! Pentru informații " +"suplimentare, vă rugăm să contactați administratorul paginii." From 60a4a63f568e9617e3cada2893941a217327c407 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 13:23:07 +0000 Subject: [PATCH 13/40] Translated using Weblate (Romanian) Currently translated at 100.0% (480 of 480 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ro/ --- vue/src/locales/ro.json | 660 ++++++++++++++++++++++++++++------------ 1 file changed, 463 insertions(+), 197 deletions(-) diff --git a/vue/src/locales/ro.json b/vue/src/locales/ro.json index 9c2cc6ab6..291e47e27 100644 --- a/vue/src/locales/ro.json +++ b/vue/src/locales/ro.json @@ -16,202 +16,468 @@ "convert_internal": "Transformați în rețetă internă", "show_only_internal": "Arătați doar rețetele interne", "show_split_screen": "Vedere divizată", - "Log_Recipe_Cooking": "", - "External_Recipe_Image": "", - "Add_to_Shopping": "", - "Add_to_Plan": "", - "Step_start_time": "", - "Sort_by_new": "", - "Table_of_Contents": "", - "Recipes_per_page": "", - "Show_as_header": "", - "Hide_as_header": "", - "Add_nutrition_recipe": "", - "Remove_nutrition_recipe": "", - "Copy_template_reference": "", - "Save_and_View": "", - "Manage_Books": "", - "Meal_Plan": "", - "Select_Book": "", - "Select_File": "", - "Recipe_Image": "", - "Import_finished": "", - "View_Recipes": "", - "Log_Cooking": "", - "New_Recipe": "", - "Url_Import": "", - "Reset_Search": "", - "Recently_Viewed": "", - "Load_More": "", - "New_Keyword": "", - "Delete_Keyword": "", - "Edit_Keyword": "", - "Edit_Recipe": "", - "Move_Keyword": "", - "Merge_Keyword": "", - "Hide_Keywords": "", - "Hide_Recipes": "", - "Move_Up": "", - "Move_Down": "", - "Step_Name": "", - "Step_Type": "", - "Make_Header": "", - "Make_Ingredient": "", - "Enable_Amount": "", - "Disable_Amount": "", - "Add_Step": "", - "Keywords": "", - "Books": "", - "Proteins": "", - "Fats": "", - "Carbohydrates": "", - "Calories": "", - "Energy": "", - "Nutrition": "", - "Date": "", - "Share": "", - "Automation": "", - "Parameter": "", - "Export": "", - "Copy": "", - "Rating": "", - "Close": "", - "Cancel": "", - "Link": "", - "Add": "", - "New": "", - "Note": "", - "Success": "", - "Failure": "", - "Ingredients": "", - "Supermarket": "", - "Categories": "", - "Category": "", - "Selected": "", - "min": "", - "Servings": "", - "Waiting": "", - "Preparation": "", - "External": "", - "Size": "", - "Files": "", - "File": "", - "Edit": "", - "Image": "", - "Delete": "", - "Open": "", - "Ok": "", - "Save": "", - "Step": "", - "Search": "", - "Import": "", - "Print": "", - "Settings": "", - "or": "", - "and": "", - "Information": "", - "Download": "", - "Create": "", + "Log_Recipe_Cooking": "Jurnalul rețetelor de pregătire", + "External_Recipe_Image": "Imagine rețetă externă", + "Add_to_Shopping": "Adaugare la cumpărături", + "Add_to_Plan": "Adăugare la plan", + "Step_start_time": "Pasule de începere a orei", + "Sort_by_new": "Sortare după nou", + "Table_of_Contents": "Cuprins", + "Recipes_per_page": "Rețete pe pagină", + "Show_as_header": "Afișare ca antet", + "Hide_as_header": "Ascunderea ca antet", + "Add_nutrition_recipe": "Adăugare a nutriției la rețetă", + "Remove_nutrition_recipe": "Ștergere a nutriției din rețetă", + "Copy_template_reference": "Copie referința șablonului", + "Save_and_View": "Salvare și vizionare", + "Manage_Books": "Gestionarea cărților", + "Meal_Plan": "Plan de alimentare", + "Select_Book": "Selectare carte", + "Select_File": "Selectare fișier", + "Recipe_Image": "Imagine a rețetei", + "Import_finished": "Importare finalizată", + "View_Recipes": "Vizionare rețete", + "Log_Cooking": "Jurnal de pregătire", + "New_Recipe": "Rețetă nouă", + "Url_Import": "Importă URL", + "Reset_Search": "Resetarea căutării", + "Recently_Viewed": "Vizualizate recent", + "Load_More": "Încărcați mai mult", + "New_Keyword": "Cuvânt cheie nou", + "Delete_Keyword": "Ștergere cuvânt cheie", + "Edit_Keyword": "Editează cuvânt cheie", + "Edit_Recipe": "Editează rețeta", + "Move_Keyword": "Mută cuvânt cheie", + "Merge_Keyword": "Unește cuvânt cheie", + "Hide_Keywords": "Ascunde cuvânt cheie", + "Hide_Recipes": "Ascunde rețetele", + "Move_Up": "Deplasați-vă în sus", + "Move_Down": "Deplasați-vă în jos", + "Step_Name": "Nume pas", + "Step_Type": "Tip pas", + "Make_Header": "Creare antet", + "Make_Ingredient": "Create ingredient", + "Enable_Amount": "Activare cantitate", + "Disable_Amount": "Dezactivare cantitate", + "Add_Step": "Adaugă pas", + "Keywords": "Cuvinte cheie", + "Books": "Cărți", + "Proteins": "Proteine", + "Fats": "Grăsimi", + "Carbohydrates": "Carbohidrați", + "Calories": "Calorii", + "Energy": "Energie", + "Nutrition": "Nutriție", + "Date": "Dată", + "Share": "Împărtășire", + "Automation": "Automatizare", + "Parameter": "Parametru", + "Export": "Exportă", + "Copy": "Copie", + "Rating": "Evaluare", + "Close": "Închide", + "Cancel": "Anulează", + "Link": "Link", + "Add": "Adaugă", + "New": "Nou", + "Note": "Notă", + "Success": "Succes", + "Failure": "Eșec", + "Ingredients": "Ingrediente", + "Supermarket": "Supermarket", + "Categories": "Categorii", + "Category": "Categorie", + "Selected": "Selectat", + "min": "min", + "Servings": "Porții", + "Waiting": "Așteptare", + "Preparation": "Pregătire", + "External": "Extern", + "Size": "Marime", + "Files": "Fișiere", + "File": "Fișier", + "Edit": "Editează", + "Image": "Imagine", + "Delete": "Șterge", + "Open": "Deschide", + "Ok": "Ok", + "Save": "Salvare", + "Step": "Pas", + "Search": "Căutare", + "Import": "Importă", + "Print": "Tipărește", + "Settings": "Setări", + "or": "sau", + "and": "și", + "Information": "Informație", + "Download": "Descarcă", + "Create": "Creare", "Advanced Search Settings": "", - "View": "", - "Recipes": "", - "Move": "", - "Merge": "", - "Parent": "", - "delete_confirmation": "", - "move_confirmation": "", - "merge_confirmation": "", - "create_rule": "", - "move_selection": "", - "merge_selection": "", - "Root": "", - "Ignore_Shopping": "", - "Shopping_Category": "", - "Edit_Food": "", - "Move_Food": "", - "New_Food": "", - "Hide_Food": "", - "Food_Alias": "", - "Unit_Alias": "", - "Keyword_Alias": "", - "Delete_Food": "", - "No_ID": "", - "Meal_Plan_Days": "", - "merge_title": "", - "move_title": "", - "Food": "", - "Recipe_Book": "", - "del_confirmation_tree": "", - "delete_title": "", - "create_title": "", - "edit_title": "", - "Name": "", - "Type": "", - "Description": "", - "Recipe": "", - "tree_root": "", - "Icon": "", - "Unit": "", - "No_Results": "", - "New_Unit": "", - "Create_New_Shopping Category": "", - "Create_New_Food": "", - "Create_New_Keyword": "", - "Create_New_Unit": "", - "Create_New_Meal_Type": "", - "and_up": "", - "Instructions": "", - "Unrated": "", - "Automate": "", - "Empty": "", - "Key_Ctrl": "", - "Key_Shift": "", - "Time": "", - "Text": "", - "Shopping_list": "", - "Create_Meal_Plan_Entry": "", - "Edit_Meal_Plan_Entry": "", - "Title": "", - "Week": "", - "Month": "", - "Year": "", - "Planner": "", - "Planner_Settings": "", - "Period": "", - "Plan_Period_To_Show": "", - "Periods": "", - "Plan_Show_How_Many_Periods": "", - "Starting_Day": "", - "Meal_Types": "", - "Meal_Type": "", - "Clone": "", - "Drag_Here_To_Delete": "", - "Meal_Type_Required": "", - "Title_or_Recipe_Required": "", - "Color": "", - "New_Meal_Type": "", - "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": "", - "Coming_Soon": "", - "Auto_Planner": "", - "New_Cookbook": "", - "Hide_Keyword": "", - "Clear": "", - "Plural": "", - "plural_short": "", - "Use_Plural_Unit_Always": "", - "Use_Plural_Unit_Simple": "", - "Use_Plural_Food_Always": "", - "Use_Plural_Food_Simple": "", - "plural_usage_info": "" + "View": "Vizualizare", + "Recipes": "Rețete", + "Move": "Mută", + "Merge": "Unire", + "Parent": "Părinte", + "delete_confirmation": "Sunteți sigur că doriți să ștergeți {source}?", + "move_confirmation": "Mutare {copil} la părinte {părinte}", + "merge_confirmation": "Înlocuiți {source} cu {target}", + "create_rule": "și crearea automatizării", + "move_selection": "Selectați un părinte {type} pentru a muta {source} în.", + "merge_selection": "Înlocuiți toate aparițiile {source} cu {type} selectat.", + "Root": "Rădăcină", + "Ignore_Shopping": "Ignoră cumpărăturile", + "Shopping_Category": "Categorie de cumpărături", + "Edit_Food": "Editare mâncare", + "Move_Food": "Mutare mâncare", + "New_Food": "Mâncare nouă", + "Hide_Food": "Ascunde mâncare", + "Food_Alias": "Pseudonim mâncare", + "Unit_Alias": "Pseudonim unitate", + "Keyword_Alias": "Pseudonim cuvânt cheie", + "Delete_Food": "Ștergere mâncare", + "No_ID": "ID-ul nu a fost găsit, nu se poate șterge.", + "Meal_Plan_Days": "Planuri de alimentație pe viitor", + "merge_title": "Unire {type}", + "move_title": "Mutare {type}", + "Food": "Mâncare", + "Recipe_Book": "Carte de rețete", + "del_confirmation_tree": "Sunteți sigur că doriți să ștergeți {sursa} și toți copiii săi?", + "delete_title": "Ștergere {type}", + "create_title": "{type} nou", + "edit_title": "Editare {type}", + "Name": "Nume", + "Type": "Tip", + "Description": "Descriere", + "Recipe": "Rețetă", + "tree_root": "Rădăcina copacului", + "Icon": "Iconiță", + "Unit": "Unitate", + "No_Results": "Fără rezultate", + "New_Unit": "Unitate nouă", + "Create_New_Shopping Category": "Creați o nouă categorie de cumpărături", + "Create_New_Food": "Adaugă mâncare nouă", + "Create_New_Keyword": "Adaugă cuvânt cheie nou", + "Create_New_Unit": "Adaugă unitate nouă", + "Create_New_Meal_Type": "Adaugă tip mâncare nou", + "and_up": "& Sus", + "Instructions": "Instrucțiuni", + "Unrated": "Neevaluat", + "Automate": "Automatizat", + "Empty": "Gol", + "Key_Ctrl": "Ctrl", + "Key_Shift": "Shift", + "Time": "Timp", + "Text": "Text", + "Shopping_list": "Lisă de cumpărături", + "Create_Meal_Plan_Entry": "Crearea înregistrării în planul de alimentare", + "Edit_Meal_Plan_Entry": "Editarea înregistrării în planul de alimentare", + "Title": "Titlu", + "Week": "Săptămână", + "Month": "Lună", + "Year": "An", + "Planner": "Planificator", + "Planner_Settings": "Setări planificator", + "Period": "Perioadă", + "Plan_Period_To_Show": "Afișați săptămâni, luni sau ani", + "Periods": "Perioade", + "Plan_Show_How_Many_Periods": "Câte perioade să afișezi", + "Starting_Day": "Ziua de început a săptămânii", + "Meal_Types": "Tipuri de mese", + "Meal_Type": "Tipul mesei", + "Clone": "Clonă", + "Drag_Here_To_Delete": "Mută aici pentru a șterge", + "Meal_Type_Required": "Tipul mesei este necesar", + "Title_or_Recipe_Required": "Titlul sau selecția rețetei necesare", + "Color": "Culoare", + "New_Meal_Type": "Tip de masă nou", + "Week_Numbers": "Numerele săptămânii", + "Show_Week_Numbers": "Afișați numerele săptămânii?", + "Export_As_ICal": "Exportul perioadei curente în format iCal", + "Export_To_ICal": "Exportă .ics", + "Cannot_Add_Notes_To_Shopping": "Notele nu pot fi adăugate la lista de cumpărături", + "Added_To_Shopping_List": "Adăugat la lista de cumpărături", + "Shopping_List_Empty": "Lista de cumpărături este în prezent goală, puteți adăuga articole prin meniul contextual al unei intrări în planul de alimentație (faceți click dreapta pe card sau faceți click stânga pe iconița meniului)", + "Next_Period": "Perioada următoare", + "Previous_Period": "Perioada precedentă", + "Current_Period": "Perioada curentă", + "Next_Day": "Ziua următoare", + "Previous_Day": "Ziua precedentă", + "Coming_Soon": "În curând", + "Auto_Planner": "Planificator automat", + "New_Cookbook": "Nouă carte de bucate", + "Hide_Keyword": "Ascunde cuvintele cheie", + "Clear": "Curățare", + "Plural": "Plural", + "plural_short": "plural", + "Use_Plural_Unit_Always": "Utilizarea formei plurale pentru unitate întotdeauna", + "Use_Plural_Unit_Simple": "Utilizarea dinamică a formei plurale pentru unitate", + "Use_Plural_Food_Always": "Utilizarea formei plurale pentru alimente întotdeauna", + "Use_Plural_Food_Simple": "Utilizarea dinamica a formei plurale pentru alimente", + "plural_usage_info": "Utilizarea formei plurale pentru unități și alimente în interiorul acestui spațiu.", + "last_viewed": "Ultima vizualizare", + "created_on": "Creat la data de", + "updatedon": "Actualizat la data de", + "Imported_From": "Importat din", + "and_down": "& Jos", + "Warning": "Atenționare", + "ShowDelayed": "Afișarea elementelor întârziate", + "shopping_share_desc": "Utilizatorii vor vedea toate articolele pe care le adăugați în lista de cumpărături. Ei trebuie să vă adauge pentru a vedea elementele din lista lor.", + "mealplan_autoinclude_related_desc": "Atunci când adăugați un plan de alimentare în lista de cumpărături (manual sau automat), includeți toate rețetele asociate.", + "SuccessClipboard": "Lista de cumpărături copiată în clipboard", + "in_shopping": "În lista de cumpărături", + "not": "nu", + "Pin": "Fixează", + "Create Recipe": "Crearea rețetei", + "Import Recipe": "Importă rețeta", + "csv_prefix_label": "Prefix a listei", + "Click_To_Edit": "Faceți click pentru a edita", + "Ingredient Editor": "Editor de ingrediente", + "FoodOnHand": "Aveți {food} la îndemână.", + "AddFoodToShopping": "Adăugă {food} în lista de cumpărături", + "New_Entry": "Înregistrare nouă", + "GroupBy": "Grupat de", + "CountMore": "...+{count} mai mult", + "IgnoreThis": "Nu adăugați niciodată automat {food} la cumpărături", + "InheritWarning": "{food} este setat să moștenească, este posibil ca modificările să nu persiste.", + "err_move_self": "Nu se poate muta elementul în sine", + "CategoryName": "Nume categorie", + "Foods": "Mâncare", + "copy_to_new": "Copiere in rețetă nouă", + "reset_children": "Resetarea moștenirii copilului", + "err_moving_resource": "A existat o eroare în mutarea unei resurse!", + "err_merging_resource": "A existat o eroare la fuzionarea unei resurse!", + "success_moving_resource": "Resursă mutată cu succes!", + "success_merging_resource": "A fuzionat cu succes o resursă!", + "Decimals": "Zecimale", + "Default_Unit": "Unitate standard", + "Use_Fractions": "Folosire fracțiuni", + "Use_Fractions_Help": "Convertiți automat zecimalele în fracții atunci când vizualizați o rețetă.", + "RemoveFoodFromShopping": "Șterge {food} din lista de cumpărături", + "IgnoredFood": "{food} este setat să ignore cumpărăturile.", + "Add_Servings_to_Shopping": "Adăugă {servings} porții la cumpărături", + "InheritFields": "Moștenirea valorilor câmpurilor", + "Language": "Limba", + "Theme": "Tema", + "NoCategory": "Nicio categorie selectată.", + "OfflineAlert": "Sunteți offline, este posibil ca lista de cumpărături să nu se sincronizeze.", + "mealplan_autoinclude_related": "Adăugați rețete asociate", + "shopping_auto_sync": "Sincronizare automată", + "mealplan_autoadd_shopping": "Adăugare automată a planului de alimentare", + "default_delay": "Ore de întârziere implicite", + "plan_share_desc": "Noile intrări din Planul de alimentare vor fi partajate automat cu utilizatorii selectați.", + "shopping_auto_sync_desc": "Setarea la 0 va dezactiva sincronizarea automată. Atunci când vizualizați o listă de cumpărături, lista este actualizată la fiecare câteva secunde setate pentru a sincroniza modificările pe care altcineva le-ar fi putut face. Util atunci când faceți cumpărături cu mai multe persoane, dar va folosi mai multe date mobile.", + "mealplan_autoexclude_onhand_desc": "Atunci când adăugați un plan de alimentare în lista de cumpărături (manual sau automat), excludeți ingredientele care sunt în prezent la îndemână.", + "default_delay_desc": "Numărul implicit de ore pentru a întârzia o intrare în lista de cumpărături.", + "Hour": "Oră", + "Hours": "Ore", + "Day": "Zi", + "Days": "Zile", + "Second": "Secundă", + "Seconds": "Secunde", + "Users": "Utilizatori", + "Invites": "Invită", + "nothing": "Nimic de făcut", + "err_merge_self": "Nu se poate uni elementul cu el însuși", + "download_csv": "Descarcă CSV", + "Account": "Cont", + "Cosmetic": "Cosmetice", + "API": "API", + "left_handed_help": "Va optimiza interfața de utilizare pentru utilizare cu mâna stângă.", + "Custom Filter": "Filtru personalizat", + "recipe_name": "Nume rețetă", + "paste_ingredients": "Inserați ingredientele", + "Website": "Site web", + "Nav_Color_Help": "Modificare culoare navigare.", + "Use_Kj": "Utilizare kJ în loc de kcal", + "Username": "Nume utilizator", + "First_name": "Prenume", + "Last_name": "Nume de familie", + "Keyword": "Cuvânt cheie", + "Advanced": "Avansat", + "Page": "Pagină", + "User": "Utilizator", + "Shopping_Categories": "Categorii de cumpărături", + "Single": "Singur", + "Multiple": "Multiplu", + "Reset": "Resetare", + "Disabled": "Dezactivat", + "Disable": "Dezactivare", + "Importer_Help": "Mai multe informații și ajutor cu privire la acest importator:", + "Documentation": "Documentație", + "Import_Error": "A apărut o eroare în timpul importului. Vă rugăm să extindeți detaliile din partea de jos a paginii pentru a le vizualiza.", + "Warning_Delete_Supermarket_Category": "Ștergerea unei categorii de supermarketuri va șterge, de asemenea, toate relațiile cu alimentele. Sunteți sigur?", + "one_url_per_line": "O adresă URL pe linie", + "mealplan_autoexclude_onhand": "Excludeți alimentele la îndemână", + "shopping_recent_days": "Zilele recente", + "download_pdf": "Descarcă PDF", + "filter": "Filtru", + "Search Settings": "Setări de căutare", + "err_deleting_protected_resource": "Obiectul pe care încercați să îl ștergeți este încă utilizat și nu poate fi șters.", + "csv_delim_help": "Delimitatorul utilizat pentru exporturile CSV.", + "csv_delim_label": "Delimitatorul CSV", + "SupermarketCategoriesOnly": "Numai categorii de supermarket-uri", + "shopping_category_help": "Supermarket-urile pot fi ordonate și filtrate în funcție de categoria de cumpărături în conformitate cu aspectul culoarului.", + "food_recipe_help": "Legarea unei rețete aici va include rețeta legată în orice altă rețetă care utilizează acest aliment", + "Private_Recipe": "Rețetă privată", + "DelayUntil": "Amână până la", + "shared_with": "Împărtășit cu", + "asc": "Crescător", + "desc": "Descrescător", + "date_viewed": "Ultimul vizionat", + "show_sortby": "Afișează sortat de", + "Quick actions": "Acțiuni rapide", + "Internal": "Intern", + "parameter_count": "Parametru {count}", + "Ratings": "Evaluări", + "warning_space_delete": "Puteți șterge spațiul, inclusiv toate rețetele, listele de cumpărături, planurile de alimentare și orice altceva ați creat. Acest lucru nu poate fi anulat! Sunteți sigur că doriți să faceți acest lucru?", + "remember_hours": "Ore de reținut", + "tree_select": "Utilizarea selecției arborilor", + "last_cooked": "Ultimul pregătit", + "Auto_Sort": "Sortare automatizată", + "Private_Recipe_Help": "Rețeta este arătată doar ție și oamenilor cu care este împărtășită.", + "save_filter": "Salvare filtru", + "Nav_Color": "Culoare navigare", + "Comments_setting": "Afișează comentarii", + "search_no_recipes": "Nu a putut găsi nici o rețetă!", + "Supermarkets": "Supermarket-uri", + "Undefined": "Nedefinit", + "Select": "Selectare", + "food_inherit_info": "Câmpuri pe alimente care ar trebui să fie moștenite în mod implicit.", + "facet_count_info": "Afișarea numărului de rețete pe filtrele de căutare.", + "Amount": "Cantitate", + "Auto_Sort_Help": "Mutați toate ingredientele la cel mai potrivit pas.", + "search_create_help_text": "Creați o rețetă nouă direct în Tandoor.", + "reusable_help_text": "Ar trebui link-ul de invitație să poată fi utilizat de mai mulți utilizatori.", + "Copy Link": "Copiere link", + "AddToShopping": "Adaugă la lista de cumpărături", + "FoodNotOnHand": "Nu aveți {food} la îndemână.", + "DeleteShoppingConfirm": "Sunteți sigur că doriți să eliminați toate {food} din lista de cumpărături?", + "mealplan_autoadd_shopping_desc": "Adăugați automat ingredientele planului de alimentare în lista de cumpărături.", + "filter_to_supermarket_desc": "În mod implicit, filtrați lista de cumpărături pentru a include numai categoriile pentru supermarketul selectat.", + "CategoryInstruction": "Trageți categoriile pentru a schimba categoriile de comenzi care apar în lista de cumpărături.", + "copy_markdown_table": "Copiere ca tabel Markdown", + "sql_debug": "Depanare SQL", + "remember_search": "Rețineți căutarea", + "OnHand_help": "Alimentele sunt în inventar și nu vor fi adăugate automat la o listă de cumpărături. Starea la îndemână este partajată cu utilizatorii de cumpărături.", + "show_rating": "Afișează evaluarea", + "search_rank": "Rang de căutare", + "book_filter_help": "Includeți rețete din filtrul de rețete în plus față de cele atribuite manual.", + "Sticky_Nav_Help": "Afișați întotdeauna meniul de navigare din partea de sus a ecranului.", + "import_duplicates": "Pentru a preveni duplicatele, rețetele cu același nume ca și cele existente sunt ignorate. Bifați această casetă pentru a importa totul.", + "warning_duplicate_filter": "Atenționare: Din cauza limitărilor tehnice care au mai multe filtre de aceeași combinație (și/sau/nu) ar putea da rezultate neașteptate.", + "substitute_help": "Înlocuitorii sunt luați în considerare atunci când căutați rețete care pot fi făcute cu ingrediente la îndemână.", + "substitute_children": "Înlocuire copii", + "SubstituteOnHand": "Ai un înlocuitor la îndemână.", + "InheritFields_help": "Valorile acestor câmpuri vor fi moștenite de la părinte (Excepție: categoriile de cumpărături necompletate nu sunt moștenite)", + "Social_Authentication": "Autentificare socială", + "empty_list": "Lista este goală.", + "Select_App_To_Import": "Selectați o aplicație din care să importați", + "Recipes_In_Import": "Rețete în fișierul de import", + "Split_All_Steps": "Împărțiți toate rândurile în pași separați.", + "Description_Replace": "Înlocuire descripție", + "Instruction_Replace": "Înlocuire instrucții", + "Copy Token": "Copiere token", + "ShowUncategorizedFood": "Afișează nedefinit", + "MoveCategory": "Mută la: ", + "DelayFor": "Întârziere pentru {hours} ore", + "Completed": "Completat", + "shopping_share": "Partajați lista de cumpărături", + "filter_to_supermarket": "Filtrați la supermarket", + "show_sql": "Afișează SQL", + "SupermarketName": "Numele supermarketului", + "FoodInherit": "Câmpuri moștenite de alimente", + "mark_complete": "Marcare completată", + "shopping_add_onhand_desc": "Marcați mâncarea 'La îndemână' atunci când este bifată de pe lista de cumpărături.", + "shopping_add_onhand": "La îndemână automat", + "related_recipes": "Rețete înrudite", + "ignore_shopping_help": "Nu adăugați niciodată alimente pe lista de cumpărături (ex. apă)", + "today_recipes": "Rețete de astăzi", + "enable_expert": "Activarea modului Expert", + "expert_mode": "Modul Expert", + "simple_mode": "Modul Simplu", + "advanced": "Avansat", + "Unpin": "Anularea fixării", + "Protected": "Protejat", + "Original_Text": "Text original", + "Create_New_Shopping_Category": "Adaugă categorie de cumpărături nouă", + "Added_by": "Adăugat de", + "Added_on": "Adăugat la", + "IngredientInShopping": "Acest ingredient se află în lista de cumpărături.", + "NotInShopping": "{food} nu se află în lista de cumpărături.", + "OnHand": "În prezent, la îndemână", + "Inherit": "Moștenire", + "shopping_recent_days_desc": "Zile de intrări recente lista de cumpărături pentru a afișa.", + "copy_to_clipboard": "Copierea în Clipboard", + "csv_prefix_help": "Prefix de adăugat la copierea listei în clipboard.", + "PinnedConfirmation": "{recipe} a fost fixată.", + "UnpinnedConfirmation": "Fixarea {recipe} a fost anulată.", + "QuickEntry": "Înscriere rapidă", + "fields": "Câmpuri", + "show_keywords": "Afișează cuvinte cheie", + "show_foods": "Afișează mâncări", + "show_books": "Afișează cărți", + "show_units": "Afișează unitățile", + "show_filters": "Afișează filtrele", + "filter_name": "Nume filtru", + "left_handed": "Modul stângaci", + "sort_by": "Sortat de", + "times_cooked": "Ori pregătite", + "date_created": "Data creării", + "make_now": "Creează acum", + "recipe_filter": "Filtru rețete", + "review_shopping": "Examinați intrările de cumpărături înainte de a salva", + "view_recipe": "Vizionează rețeta", + "paste_ingredients_placeholder": "Inserați lista de ingrediente aici...", + "ingredient_list": "Lista de ingrediente", + "explain": "Explicație", + "App": "Aplicație", + "Message": "Mesaj", + "Sticky_Nav": "Navigare lipicioasă", + "click_image_import": "Faceți click pe imaginea pe care doriți să o importați pentru această rețetă", + "no_more_images_found": "Nu există imagini suplimentare găsite pe site-ul web.", + "paste_json": "Inserați sursă JSON sau HTML aici pentru a încărca rețetă.", + "search_import_help_text": "Importați o rețetă de pe un site web sau o aplicație externă.", + "reset_children_help": "Suprascrieți toți copiii cu valori din câmpurile moștenite. Câmpurile moștenite ale copiilor vor fi setate la câmpuri standard, cu excepția cazului în care sunt setate câmpurile moștenite de copii.", + "reset_food_inheritance": "Resetați moștenirea", + "reset_food_inheritance_info": "Resetați toate alimentele la câmpurile moștenite implicit și la valorile părinte ale acestora.", + "substitute_siblings_help": "Toate alimentele care împărtășesc un părinte al acestui aliment sunt considerate înlocuitori.", + "substitute_children_help": "Toate alimentele care sunt copii ai acestui aliment sunt considerate înlocuitori.", + "substitute_siblings": "Înlocuire frați", + "Bookmarklet": "Marcaj", + "ChildInheritFields": "Copiii moștenesc câmpurile", + "ChildInheritFields_help": "Copiii vor moșteni aceste câmpuri în mod implicit.", + "show_ingredient_overview": "Afișați o listă cu toate ingredientele la începutul rețetei.", + "Ingredient Overview": "Prezentare generală a ingredientelor", + "advanced_search_settings": "Setări avansate de căutare", + "nothing_planned_today": "Nu ai nimic planificat pentru ziua de azi!", + "no_pinned_recipes": "Nu ai rețete fixate!", + "Planned": "Planificate", + "Pinned": "Fixate", + "Imported": "Importate", + "Units": "Unităţi", + "Manage_Emails": "Gestionarea e-mailurilor", + "Change_Password": "Schimbați parola", + "Random Recipes": "Rețete aleatoare", + "select_keyword": "Selectați cuvânt cheie", + "add_keyword": "Adăugare cuvânt cheie", + "select_file": "Selectare fișier", + "select_recipe": "Selectare rețetă", + "select_unit": "Selectare unitate", + "select_food": "Selectare mâncare", + "remove_selection": "Deselectare", + "Options": "Opțiuni", + "Create Food": "Creare mâncare", + "create_food_desc": "Creați un aliment și conectați-l la această rețetă.", + "additional_options": "Opțiuni suplimentare", + "Import_Supported": "Import compatibil", + "Export_Supported": "Export compatibil", + "Import_Not_Yet_Supported": "Importul încă nu este compatibil", + "Export_Not_Yet_Supported": "Exportul încă nu este compatibil", + "Import_Result_Info": "{imported} din {total} rețete au fost importate", + "Toggle": "Comutare", + "New_Supermarket": "Creați un supermarket nou", + "New_Supermarket_Category": "Creați o nouă categorie de supermarket-uri", + "Are_You_Sure": "Sunteți sigur?", + "Valid Until": "Valabil până la", + "Combine_All_Steps": "Combinați toți pașii într-un singur câmp." } From 80eee255f74a17975f569943d1bc4bb495529c70 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 10:33:29 +0000 Subject: [PATCH 14/40] Translated using Weblate (Slovenian) Currently translated at 15.5% (79 of 509 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/ --- cookbook/locale/sl/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cookbook/locale/sl/LC_MESSAGES/django.po b/cookbook/locale/sl/LC_MESSAGES/django.po index cb96c830e..3ef3f5f09 100644 --- a/cookbook/locale/sl/LC_MESSAGES/django.po +++ b/cookbook/locale/sl/LC_MESSAGES/django.po @@ -8,17 +8,17 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: 2022-02-02 15:31+0000\n" -"Last-Translator: Mario Dvorsek \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.10.1\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 @@ -2107,7 +2107,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:36 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:38 msgid "App" From b7e4e535193d15d361fb9991b6987e837ab43e83 Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 10:33:20 +0000 Subject: [PATCH 15/40] Translated using Weblate (Portuguese (Brazil)) Currently translated at 5.8% (33 of 562 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/pt_BR/ --- cookbook/locale/pt_BR/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/locale/pt_BR/LC_MESSAGES/django.po b/cookbook/locale/pt_BR/LC_MESSAGES/django.po index 2c96227d7..c3eff99e4 100644 --- a/cookbook/locale/pt_BR/LC_MESSAGES/django.po +++ b/cookbook/locale/pt_BR/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-02-11 08:52+0100\n" -"PO-Revision-Date: 2023-02-18 10:55+0000\n" -"Last-Translator: Joachim Weber \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -2208,7 +2208,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:38 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:40 msgid "App" From 8b6f2c1e70f7d4c2398c5c6676667a284a458c5c Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:33:05 +0000 Subject: [PATCH 16/40] Translated using Weblate (Danish) Currently translated at 100.0% (528 of 528 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/da/ --- cookbook/locale/da/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/locale/da/LC_MESSAGES/django.po b/cookbook/locale/da/LC_MESSAGES/django.po index 7ab8150be..8d3738735 100644 --- a/cookbook/locale/da/LC_MESSAGES/django.po +++ b/cookbook/locale/da/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-29 18:42+0200\n" -"PO-Revision-Date: 2023-03-06 10:55+0000\n" -"Last-Translator: Anders Obro \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Danish \n" "Language: da\n" @@ -1806,7 +1806,7 @@ msgid "" msgstr "" " \n" " Heltekstsøgning forsøger at normalisere de givne ord så de " -"matcher stammevarianter. F.eks: 'skeen', 'skeer' og 'sket' vil alt " +"matcher stammevarianter. F.eks: 'skeen', 'skeer' og 'sket' vil alt " "normaliseres til 'ske'.\n" " Der er flere metoder tilgængelige, beskrevet herunder, som vil " "bestemme hvordan søgningen skal opfører sig når flere søgeord er angivet.\n" From e2905eb9995001c8206bb942ec69713f46a8297d Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 09:07:51 +0000 Subject: [PATCH 17/40] Translated using Weblate (Bulgarian) Currently translated at 100.0% (528 of 528 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/bg/ --- cookbook/locale/bg/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cookbook/locale/bg/LC_MESSAGES/django.po b/cookbook/locale/bg/LC_MESSAGES/django.po index 8d8bf04f9..37e359a09 100644 --- a/cookbook/locale/bg/LC_MESSAGES/django.po +++ b/cookbook/locale/bg/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-29 18:42+0200\n" -"PO-Revision-Date: 2022-05-10 15:32+0000\n" -"Last-Translator: zeon \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Bulgarian \n" "Language: bg\n" @@ -17,7 +17,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.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:49 .\cookbook\templates\stats.html:28 @@ -1433,7 +1433,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Търсете рецепта..." +msgstr "Търсете рецепта ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1818,7 +1818,7 @@ msgid "" msgstr "" " \n" " Пълнотекстови търсения се опитват да нормализират предоставените " -"думи, за да съответстват на често срещани варианти. Например: 'вили, " +"думи, за да съответстват на често срещани варианти. Например: 'вили, " "'вилица', 'вилици' всички ще се нормализират до 'вилиц'.\n" " Има няколко налични метода, описани по-долу, които ще " "контролират как поведението при търсене трябва да реагира, когато се търсят " From e0a1189430f8cca000a582ea60e041e96ec244cb Mon Sep 17 00:00:00 2001 From: noxonad Date: Tue, 11 Apr 2023 08:49:36 +0000 Subject: [PATCH 18/40] Translated using Weblate (Ukrainian) Currently translated at 0.3% (2 of 528 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/ --- cookbook/locale/uk/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/locale/uk/LC_MESSAGES/django.po b/cookbook/locale/uk/LC_MESSAGES/django.po index 94991156d..b48ed6a51 100644 --- a/cookbook/locale/uk/LC_MESSAGES/django.po +++ b/cookbook/locale/uk/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-29 18:42+0200\n" -"PO-Revision-Date: 2023-02-09 13:55+0000\n" -"Last-Translator: vertilo \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -1091,7 +1091,7 @@ msgstr "" #: .\cookbook\templates\base.html:311 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:313 msgid "Translate Tandoor" From 93f7da3ed957435bf21468dfded9a0ff88808e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Espen=20Sellev=C3=A5g?= Date: Fri, 14 Apr 2023 21:40:57 +0000 Subject: [PATCH 19/40] =?UTF-8?q?Added=20translation=20using=20Weblate=20(?= =?UTF-8?q?Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vue/src/locales/nb_NO.json | 482 +++++++++++++++++++++++++++++++++++++ 1 file changed, 482 insertions(+) create mode 100644 vue/src/locales/nb_NO.json diff --git a/vue/src/locales/nb_NO.json b/vue/src/locales/nb_NO.json new file mode 100644 index 000000000..0ff8bafd9 --- /dev/null +++ b/vue/src/locales/nb_NO.json @@ -0,0 +1,482 @@ +{ + "warning_feature_beta": "", + "err_fetching_resource": "", + "err_creating_resource": "", + "err_updating_resource": "", + "err_deleting_resource": "", + "err_deleting_protected_resource": "", + "err_moving_resource": "", + "err_merging_resource": "", + "success_fetching_resource": "", + "success_creating_resource": "", + "success_updating_resource": "", + "success_deleting_resource": "", + "success_moving_resource": "", + "success_merging_resource": "", + "file_upload_disabled": "", + "warning_space_delete": "", + "food_inherit_info": "", + "facet_count_info": "", + "step_time_minutes": "", + "confirm_delete": "", + "import_running": "", + "all_fields_optional": "", + "convert_internal": "", + "show_only_internal": "", + "show_split_screen": "", + "Log_Recipe_Cooking": "", + "External_Recipe_Image": "", + "Add_to_Shopping": "", + "Add_to_Plan": "", + "Step_start_time": "", + "Sort_by_new": "", + "Table_of_Contents": "", + "Recipes_per_page": "", + "Show_as_header": "", + "Hide_as_header": "", + "Add_nutrition_recipe": "", + "Remove_nutrition_recipe": "", + "Copy_template_reference": "", + "Save_and_View": "", + "Manage_Books": "", + "Meal_Plan": "", + "Select_Book": "", + "Select_File": "", + "Recipe_Image": "", + "Import_finished": "", + "View_Recipes": "", + "Log_Cooking": "", + "New_Recipe": "", + "Url_Import": "", + "Reset_Search": "", + "Recently_Viewed": "", + "Load_More": "", + "New_Keyword": "", + "Delete_Keyword": "", + "Edit_Keyword": "", + "Edit_Recipe": "", + "Move_Keyword": "", + "Merge_Keyword": "", + "Hide_Keywords": "", + "Hide_Recipes": "", + "Move_Up": "", + "Move_Down": "", + "Step_Name": "", + "Step_Type": "", + "Make_Header": "", + "Make_Ingredient": "", + "Amount": "", + "Enable_Amount": "", + "Disable_Amount": "", + "Ingredient Editor": "", + "Description_Replace": "", + "Instruction_Replace": "", + "Auto_Sort": "", + "Auto_Sort_Help": "", + "Private_Recipe": "", + "Private_Recipe_Help": "", + "reusable_help_text": "", + "Add_Step": "", + "Keywords": "", + "Books": "", + "Proteins": "", + "Fats": "", + "Carbohydrates": "", + "Calories": "", + "Energy": "", + "Nutrition": "", + "Date": "", + "Share": "", + "Automation": "", + "Parameter": "", + "Export": "", + "Copy": "", + "Rating": "", + "Close": "", + "Cancel": "", + "Link": "", + "Add": "", + "New": "", + "Note": "", + "Success": "", + "Failure": "", + "Protected": "", + "Ingredients": "", + "Supermarket": "", + "Categories": "", + "Category": "", + "Selected": "", + "min": "", + "Servings": "", + "Waiting": "", + "Preparation": "", + "External": "", + "Size": "", + "Files": "", + "File": "", + "Edit": "", + "Image": "", + "Delete": "", + "Open": "", + "Ok": "", + "Save": "", + "Step": "", + "Search": "", + "Import": "", + "Print": "", + "Settings": "", + "or": "", + "and": "", + "Information": "", + "Download": "", + "Create": "", + "Search Settings": "", + "View": "", + "Recipes": "", + "Move": "", + "Merge": "", + "Parent": "", + "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": "", + "Original_Text": "", + "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": "", + "Unpin": "", + "PinnedConfirmation": "", + "UnpinnedConfirmation": "", + "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": "", + "Split_All_Steps": "", + "Combine_All_Steps": "", + "Plural": "", + "plural_short": "", + "Use_Plural_Unit_Always": "", + "Use_Plural_Unit_Simple": "", + "Use_Plural_Food_Always": "", + "Use_Plural_Food_Simple": "", + "plural_usage_info": "", + "Create Recipe": "", + "Import Recipe": "" +} From 668ccf89fd89347164bbaf22c6c156a8ae2b46ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Espen=20Sellev=C3=A5g?= Date: Fri, 14 Apr 2023 21:57:05 +0000 Subject: [PATCH 20/40] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 28.8% (107 of 371 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nb_NO/ --- cookbook/locale/nb_NO/LC_MESSAGES/django.po | 52 +++++++++++---------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/cookbook/locale/nb_NO/LC_MESSAGES/django.po b/cookbook/locale/nb_NO/LC_MESSAGES/django.po index 07179da11..36c03aea5 100644 --- a/cookbook/locale/nb_NO/LC_MESSAGES/django.po +++ b/cookbook/locale/nb_NO/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-11 15:09+0200\n" -"PO-Revision-Date: 2021-04-11 15:23+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2023-04-15 22:55+0000\n" +"Last-Translator: Espen Sellevåg \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" @@ -17,7 +17,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.5.3\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:91 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -34,19 +34,23 @@ msgstr "" #: .\cookbook\forms.py:46 msgid "Default Unit to be used when inserting a new ingredient into a recipe." -msgstr "" +msgstr "Standard enhet når ny ingrediens legges til en oppskrift." #: .\cookbook\forms.py:47 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" +"Aktiverer støtte for deler av ingrediensmengde (konverterer feks. desimaler " +"til deler automatisk)" #: .\cookbook\forms.py:48 msgid "" "Users with whom newly created meal plan/shopping list entries should be " "shared by default." msgstr "" +"Brukere som oppretter nye måltidsplaner/handlelister, deler disse " +"oppføringene som standard." #: .\cookbook\forms.py:49 msgid "Show recently viewed recipes on search page." @@ -58,7 +62,7 @@ msgstr "Antall desimaler ingredienser skal avrundes til." #: .\cookbook\forms.py:51 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "Hvis du ønsker å opprette og se kommentarer under oppskrifter." #: .\cookbook\forms.py:53 msgid "" @@ -67,6 +71,11 @@ msgid "" "Useful when shopping with multiple people but might use a little bit of " "mobile data. If lower than instance limit it is reset when saving." msgstr "" +"0 vil deaktivere automatisk synkronisering. Når en handleliste vises, " +"oppdateres listen med oppgitt antall sekunders mellomrom for å synkronisere " +"endringer fra andre brukere. Nyttig dersom flere brukere handler samtidig. " +"Datatrafikk oppstår når aktiv. Hvis verdien er lavere enn grensen, " +"tilbakestilles den ved lagring." #: .\cookbook\forms.py:56 msgid "Makes the navbar stick to the top of the page." @@ -100,11 +109,11 @@ msgstr "" #: .\cookbook\forms.py:97 .\cookbook\forms.py:317 msgid "Path" -msgstr "" +msgstr "Sti" #: .\cookbook\forms.py:98 msgid "Storage UID" -msgstr "" +msgstr "Lagring UID" #: .\cookbook\forms.py:121 msgid "Default" @@ -129,7 +138,6 @@ msgid "Old Unit" msgstr "Gammel enhet" #: .\cookbook\forms.py:156 -#, fuzzy msgid "Unit that should be replaced." msgstr "Enhet som skal erstattes." @@ -204,12 +212,11 @@ msgstr "" #: .\cookbook\views\views.py:112 .\cookbook\views\views.py:116 #: .\cookbook\views\views.py:184 msgid "You do not have the required permissions to view this page!" -msgstr "Du har ikke påkrevd tilgang for å vise denne siden." +msgstr "Du har ikke påkrevd tilgang for å vise denne siden!" #: .\cookbook\helper\permission_helper.py:141 -#, fuzzy msgid "You are not logged in and therefore cannot view this page!" -msgstr "Du er ikke innlogget og kan derfor ikke vise siden." +msgstr "Du er ikke innlogget og kan derfor ikke vise siden!" #: .\cookbook\helper\permission_helper.py:145 #: .\cookbook\helper\permission_helper.py:167 @@ -456,7 +463,7 @@ msgstr "Nøkkelord" #: .\cookbook\templates\base.html:104 msgid "Batch Edit" -msgstr "" +msgstr "Oppdatere flere" #: .\cookbook\templates\base.html:109 msgid "Storage Data" @@ -521,7 +528,6 @@ msgid "API Browser" msgstr "API-utforsker" #: .\cookbook\templates\base.html:165 -#, fuzzy msgid "Logout" msgstr "Logg ut" @@ -773,7 +779,6 @@ msgstr "Instruksjoner" #: .\cookbook\templates\forms\edit_internal_recipe.html:387 #: .\cookbook\templates\forms\edit_internal_recipe.html:418 -#, fuzzy msgid "Save & View" msgstr "Lagre og vis" @@ -907,7 +912,7 @@ msgstr "" #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" -msgstr "Vurdering" +msgstr "Karakter" #: .\cookbook\templates\include\log_cooking.html:27 #: .\cookbook\templates\include\recipe_open_modal.html:18 @@ -1264,7 +1269,7 @@ msgstr "" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "Ingen tilganger." +msgstr "Ingen tilgang" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." @@ -1298,12 +1303,11 @@ msgstr "" #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "Frakoblet." +msgstr "Frakoblet" #: .\cookbook\templates\offline.html:19 -#, fuzzy msgid "You are currently offline!" -msgstr "Du er ikke tilkoblet Internett." +msgstr "Du er ikke tilkoblet!" #: .\cookbook\templates\offline.html:20 msgid "" @@ -1366,7 +1370,7 @@ msgstr "Stil" #: .\cookbook\templates\settings.html:79 msgid "API Token" -msgstr "API-symbol" +msgstr "API nøkkel" #: .\cookbook\templates\settings.html:80 msgid "" @@ -1389,9 +1393,8 @@ msgid "Cookbook Setup" msgstr "Kokeboksoppsett" #: .\cookbook\templates\setup.html:14 -#, fuzzy msgid "Setup" -msgstr "Sett opp" +msgstr "Installering" #: .\cookbook\templates\setup.html:15 msgid "" @@ -1424,11 +1427,11 @@ msgstr "Mengde" #: .\cookbook\templates\shopping_list.html:226 msgid "Supermarket" -msgstr "Matbutikk" +msgstr "Butikk" #: .\cookbook\templates\shopping_list.html:236 msgid "Select Supermarket" -msgstr "Velg matbutikk" +msgstr "Velg butikk" #: .\cookbook\templates\shopping_list.html:260 msgid "Select User" @@ -1540,7 +1543,6 @@ msgstr "" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 -#, fuzzy msgid "Ok" msgstr "OK" From 980e83b23c5aae9a0fbaf53e73439f83e2819338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Espen=20Sellev=C3=A5g?= Date: Fri, 14 Apr 2023 21:44:50 +0000 Subject: [PATCH 21/40] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 7.9% (38 of 480 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/ --- vue/src/locales/nb_NO.json | 76 +++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/vue/src/locales/nb_NO.json b/vue/src/locales/nb_NO.json index 0ff8bafd9..324ed8ed5 100644 --- a/vue/src/locales/nb_NO.json +++ b/vue/src/locales/nb_NO.json @@ -1,33 +1,33 @@ { - "warning_feature_beta": "", - "err_fetching_resource": "", - "err_creating_resource": "", - "err_updating_resource": "", - "err_deleting_resource": "", - "err_deleting_protected_resource": "", - "err_moving_resource": "", - "err_merging_resource": "", - "success_fetching_resource": "", - "success_creating_resource": "", - "success_updating_resource": "", - "success_deleting_resource": "", - "success_moving_resource": "", - "success_merging_resource": "", - "file_upload_disabled": "", - "warning_space_delete": "", - "food_inherit_info": "", - "facet_count_info": "", - "step_time_minutes": "", - "confirm_delete": "", - "import_running": "", - "all_fields_optional": "", - "convert_internal": "", - "show_only_internal": "", - "show_split_screen": "", - "Log_Recipe_Cooking": "", - "External_Recipe_Image": "", - "Add_to_Shopping": "", - "Add_to_Plan": "", + "warning_feature_beta": "Denne funksjonen er foreløpig i BETA-versjon (testing). Regn med feil og at det i fremtidige oppdateringer kan komme endringer som gjør funksjonen ubrukelig.", + "err_fetching_resource": "Feil ved henting av ressurs!", + "err_creating_resource": "Feil ved oppretting av ressurs!", + "err_updating_resource": "Feil ved oppdatering av ressurs!", + "err_deleting_resource": "Feil ved sletting av ressurs!", + "err_deleting_protected_resource": "Objektet du prøver å slette er fortsatt i bruk, og kan ikke slettes.", + "err_moving_resource": "Feil ved flytting av ressurs!", + "err_merging_resource": "Feil ved sammenslåing av ressurs!", + "success_fetching_resource": "Vellykket henting av ressurs!", + "success_creating_resource": "Vellykket oppretting av ressurs!", + "success_updating_resource": "Vellykket oppdatering av ressurs!", + "success_deleting_resource": "Vellykket sletting av ressurs!", + "success_moving_resource": "Vellykket flytting av ressurs!", + "success_merging_resource": "Vellykket sammenslåing av ressurs!", + "file_upload_disabled": "Opplasting av filer er ikke aktivert i området ditt.", + "warning_space_delete": "Du kan slette området, inkludert alle oppskrifter, handlelister, måltidsplaner og alt annet du har opprettet. Dette kan ikke angres! Er du sikker på at du vil gjøre dette?", + "food_inherit_info": "Felter på matvarer som skal arves som standard.", + "facet_count_info": "Vis oppskriftsantall i søkefilter.", + "step_time_minutes": "Tid for trinn, i minutter", + "confirm_delete": "Er du sikker på at du vil slette dette {object}?", + "import_running": "Importering pågår. Vennligst vent!", + "all_fields_optional": "Alle felt er valgfri, og kan stå tomme.", + "convert_internal": "Konverter til intern oppskrift", + "show_only_internal": "Vis bare interne oppskrifter", + "show_split_screen": "Delt visning", + "Log_Recipe_Cooking": "Logg oppskriftsbruk", + "External_Recipe_Image": "Bilde av ekstern oppskrift", + "Add_to_Shopping": "Legg til i handleliste", + "Add_to_Plan": "Legg til i Plan", "Step_start_time": "", "Sort_by_new": "", "Table_of_Contents": "", @@ -78,10 +78,10 @@ "reusable_help_text": "", "Add_Step": "", "Keywords": "", - "Books": "", + "Books": "Bøker", "Proteins": "", "Fats": "", - "Carbohydrates": "", + "Carbohydrates": "Karbohydrater", "Calories": "", "Energy": "", "Nutrition": "", @@ -91,18 +91,18 @@ "Parameter": "", "Export": "", "Copy": "", - "Rating": "", - "Close": "", + "Rating": "Karakter", + "Close": "Lukk", "Cancel": "", - "Link": "", + "Link": "Lenke", "Add": "", "New": "", "Note": "", "Success": "", "Failure": "", "Protected": "", - "Ingredients": "", - "Supermarket": "", + "Ingredients": "Ingredienser", + "Supermarket": "Butikk", "Categories": "", "Category": "", "Selected": "", @@ -124,12 +124,12 @@ "Search": "", "Import": "", "Print": "", - "Settings": "", + "Settings": "Innstillinger", "or": "", "and": "", "Information": "", "Download": "", - "Create": "", + "Create": "Opprett", "Search Settings": "", "View": "", "Recipes": "", From 29f13d687c7f4cc7baf552a57d1a72df7be9b5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Espen=20Sellev=C3=A5g?= Date: Sun, 16 Apr 2023 18:39:14 +0000 Subject: [PATCH 22/40] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 52.8% (196 of 371 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nb_NO/ --- cookbook/locale/nb_NO/LC_MESSAGES/django.po | 207 ++++++++++++-------- 1 file changed, 120 insertions(+), 87 deletions(-) diff --git a/cookbook/locale/nb_NO/LC_MESSAGES/django.po b/cookbook/locale/nb_NO/LC_MESSAGES/django.po index 36c03aea5..af5ff9807 100644 --- a/cookbook/locale/nb_NO/LC_MESSAGES/django.po +++ b/cookbook/locale/nb_NO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-11 15:09+0200\n" -"PO-Revision-Date: 2023-04-15 22:55+0000\n" +"PO-Revision-Date: 2023-04-17 20:55+0000\n" "Last-Translator: Espen Sellevåg \n" "Language-Team: Norwegian Bokmål \n" @@ -386,7 +386,7 @@ msgstr "Finner ikke siden du leter etter." #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "" +msgstr "Tilbake til Startsiden" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" @@ -395,12 +395,12 @@ msgstr "Rapporter en feil" #: .\cookbook\templates\account\login.html:7 #: .\cookbook\templates\base.html:170 msgid "Login" -msgstr "" +msgstr "Logg inn" #: .\cookbook\templates\account\login.html:13 #: .\cookbook\templates\account\login.html:28 msgid "Sign In" -msgstr "" +msgstr "Opprett bruker" #: .\cookbook\templates\account\login.html:38 msgid "Social Login" @@ -408,7 +408,7 @@ msgstr "Sosial innlogging" #: .\cookbook\templates\account\login.html:39 msgid "You can use any of the following providers to sign in." -msgstr "" +msgstr "Velg en av følgende leverandører for å logge på." #: .\cookbook\templates\account\logout.html:5 #: .\cookbook\templates\account\logout.html:9 @@ -423,20 +423,20 @@ msgstr "Er du sikker på at du vil logge ut?" #: .\cookbook\templates\account\password_reset.html:5 #: .\cookbook\templates\account\password_reset_done.html:5 msgid "Password Reset" -msgstr "" +msgstr "Nullstill passord" #: .\cookbook\templates\account\password_reset.html:9 #: .\cookbook\templates\account\password_reset_done.html:9 msgid "Password reset is not implemented for the time being!" -msgstr "" +msgstr "Det er foreløpig ikke implementert funksjon for å nullstille passord!" #: .\cookbook\templates\account\signup.html:5 msgid "Register" -msgstr "" +msgstr "Registrer" #: .\cookbook\templates\account\signup.html:9 msgid "Create your Account" -msgstr "Opprett din konto" +msgstr "Opprett konto" #: .\cookbook\templates\account\signup.html:14 msgid "Create User" @@ -449,11 +449,11 @@ msgstr "API-dokumentasjon" #: .\cookbook\templates\base.html:78 msgid "Utensils" -msgstr "" +msgstr "Redskaper" #: .\cookbook\templates\base.html:88 msgid "Shopping" -msgstr "" +msgstr "Handle" #: .\cookbook\templates\base.html:102 .\cookbook\views\delete.py:84 #: .\cookbook\views\edit.py:93 .\cookbook\views\lists.py:26 @@ -467,23 +467,23 @@ msgstr "Oppdatere flere" #: .\cookbook\templates\base.html:109 msgid "Storage Data" -msgstr "" +msgstr "Datalagring" #: .\cookbook\templates\base.html:113 msgid "Storage Backends" -msgstr "" +msgstr "Lagringsplasser" #: .\cookbook\templates\base.html:115 msgid "Configure Sync" -msgstr "" +msgstr "Konfigurer synkronisering" #: .\cookbook\templates\base.html:117 msgid "Discovered Recipes" -msgstr "" +msgstr "Oppdagede oppskrifter" #: .\cookbook\templates\base.html:119 msgid "Discovery Log" -msgstr "" +msgstr "Logg Oppdagelser" #: .\cookbook\templates\base.html:121 .\cookbook\templates\stats.html:10 msgid "Statistics" @@ -491,7 +491,7 @@ msgstr "Statistikk" #: .\cookbook\templates\base.html:123 msgid "Units & Ingredients" -msgstr "" +msgstr "Enheter & Ingredienser" #: .\cookbook\templates\base.html:125 msgid "Import Recipe" @@ -533,52 +533,56 @@ msgstr "Logg ut" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "" +msgstr "Oppdater flere kategorier" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "" +msgstr "Oppdater flere oppskrifter" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" -msgstr "" +msgstr "Legg til spesifikt nøkkelord til alle oppskrifter som inneholder et ord" #: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:76 msgid "Sync" -msgstr "" +msgstr "Synkronisering" #: .\cookbook\templates\batch\monitor.html:10 msgid "Manage watched Folders" -msgstr "" +msgstr "Behandle overvåkede mapper" #: .\cookbook\templates\batch\monitor.html:14 msgid "" "On this Page you can manage all storage folder locations that should be " "monitored and synced." msgstr "" +"Her kan du behandle alle lagringsmapper og plasseringer for monitorering og " +"synkronisering." #: .\cookbook\templates\batch\monitor.html:16 msgid "The path must be in the following format" -msgstr "" +msgstr "Stien må være i følgende format" #: .\cookbook\templates\batch\monitor.html:27 msgid "Sync Now!" -msgstr "" +msgstr "Synkroniser nå!" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "" +msgstr "Importerer oppskrifter" #: .\cookbook\templates\batch\waiting.html:23 msgid "" "This can take a few minutes, depending on the number of recipes in sync, " "please wait." msgstr "" +"Dette kan ta noen minutter, avhenging av antall oppskrifter som skal " +"synkroniseres. Vennligst vent." #: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 msgid "Recipe Books" -msgstr "" +msgstr "Oppskriftsbøker" #: .\cookbook\templates\books.html:15 msgid "New Book" @@ -590,32 +594,32 @@ msgstr "av" #: .\cookbook\templates\books.html:34 msgid "Toggle Recipes" -msgstr "" +msgstr "Veksle oppskrifter" #: .\cookbook\templates\books.html:54 #: .\cookbook\templates\meal_plan_entry.html:48 #: .\cookbook\templates\recipes_table.html:64 msgid "Last cooked" -msgstr "" +msgstr "Forrige tilbereding" #: .\cookbook\templates\books.html:71 msgid "There are no recipes in this book yet." -msgstr "" +msgstr "Det er foreløpig ingen oppskrifter i denne boken." #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "" +msgstr "Eksporter oppskrifter" #: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 #: .\cookbook\templates\shopping_list.html:347 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" -msgstr "" +msgstr "Eksporter" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" -msgstr "" +msgstr "Importer ny oppskrift" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\forms\edit_internal_recipe.html:389 @@ -641,29 +645,29 @@ msgstr "Beskrivelse" #: .\cookbook\templates\forms\edit_internal_recipe.html:72 msgid "Waiting Time" -msgstr "" +msgstr "Ventetid" #: .\cookbook\templates\forms\edit_internal_recipe.html:78 msgid "Servings Text" -msgstr "" +msgstr "Porsjon beskrivelse" #: .\cookbook\templates\forms\edit_internal_recipe.html:89 msgid "Select Keywords" -msgstr "" +msgstr "Velg nøkkelord" #: .\cookbook\templates\forms\edit_internal_recipe.html:90 #: .\cookbook\templates\url_import.html:212 msgid "Add Keyword" -msgstr "" +msgstr "Legg til nøkkelord" #: .\cookbook\templates\forms\edit_internal_recipe.html:108 msgid "Nutrition" -msgstr "" +msgstr "Næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:112 #: .\cookbook\templates\forms\edit_internal_recipe.html:162 msgid "Delete Step" -msgstr "" +msgstr "Fjern trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:116 msgid "Calories" @@ -684,15 +688,15 @@ msgstr "Proteiner" #: .\cookbook\templates\forms\edit_internal_recipe.html:146 #: .\cookbook\templates\forms\edit_internal_recipe.html:454 msgid "Step" -msgstr "" +msgstr "Trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:167 msgid "Show as header" -msgstr "" +msgstr "Vis som overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:173 msgid "Hide as header" -msgstr "" +msgstr "Skjul overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:178 msgid "Move Up" @@ -704,15 +708,15 @@ msgstr "Flytt nedover" #: .\cookbook\templates\forms\edit_internal_recipe.html:192 msgid "Step Name" -msgstr "" +msgstr "Trinn navn" #: .\cookbook\templates\forms\edit_internal_recipe.html:196 msgid "Step Type" -msgstr "" +msgstr "Trinn type" #: .\cookbook\templates\forms\edit_internal_recipe.html:207 msgid "Step time in Minutes" -msgstr "" +msgstr "Trinn tid i minutter" #: .\cookbook\templates\forms\edit_internal_recipe.html:261 #: .\cookbook\templates\shopping_list.html:183 @@ -746,7 +750,7 @@ msgstr "Velg mat" #: .\cookbook\templates\meal_plan.html:256 #: .\cookbook\templates\url_import.html:171 msgid "Note" -msgstr "" +msgstr "Notis" #: .\cookbook\templates\forms\edit_internal_recipe.html:319 msgid "Delete Ingredient" @@ -754,7 +758,7 @@ msgstr "Slett ingrediens" #: .\cookbook\templates\forms\edit_internal_recipe.html:325 msgid "Make Header" -msgstr "" +msgstr "Bruk som overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:331 msgid "Make Ingredient" @@ -762,15 +766,15 @@ msgstr "Opprett ingrediens" #: .\cookbook\templates\forms\edit_internal_recipe.html:337 msgid "Disable Amount" -msgstr "" +msgstr "Deaktiver mengde" #: .\cookbook\templates\forms\edit_internal_recipe.html:343 msgid "Enable Amount" -msgstr "" +msgstr "Aktiver mengde" #: .\cookbook\templates\forms\edit_internal_recipe.html:348 msgid "Copy Template Reference" -msgstr "" +msgstr "Kopier mal-referanse" #: .\cookbook\templates\forms\edit_internal_recipe.html:374 #: .\cookbook\templates\url_import.html:196 @@ -785,22 +789,22 @@ msgstr "Lagre og vis" #: .\cookbook\templates\forms\edit_internal_recipe.html:391 #: .\cookbook\templates\forms\edit_internal_recipe.html:424 msgid "Add Step" -msgstr "" +msgstr "Legg til trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:394 #: .\cookbook\templates\forms\edit_internal_recipe.html:428 msgid "Add Nutrition" -msgstr "" +msgstr "Legg til næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:396 #: .\cookbook\templates\forms\edit_internal_recipe.html:430 msgid "Remove Nutrition" -msgstr "" +msgstr "Fjern næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:398 #: .\cookbook\templates\forms\edit_internal_recipe.html:433 msgid "View Recipe" -msgstr "" +msgstr "Vis oppskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:400 #: .\cookbook\templates\forms\edit_internal_recipe.html:435 @@ -809,11 +813,11 @@ msgstr "Slett oppskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:441 msgid "Steps" -msgstr "" +msgstr "Trinn" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "" +msgstr "Rediger ingrediens" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -825,54 +829,61 @@ msgid "" "them.\n" " " msgstr "" +"\n" +" Følgende skjema kan brukes dersom, tilfeldigvis, to eller flere " +"enheter eller ingredienser er opprettet,\n" +" og burde være identiske.\n" +" Det slår sammen to enheter eller ingredienser og oppdaterer alle " +"oppskrifter som inneholder disse.\n" +" " #: .\cookbook\templates\forms\ingredients.html:24 #: .\cookbook\templates\stats.html:26 msgid "Units" -msgstr "" +msgstr "Enheter" #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" -msgstr "" +msgstr "Er du sikker på at du vil slå sammen disse enhetene?" #: .\cookbook\templates\forms\ingredients.html:31 #: .\cookbook\templates\forms\ingredients.html:40 msgid "Merge" -msgstr "Flett" +msgstr "Slå sammen" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" +msgstr "Er du sikker på at du vil slå sammen disse ingrediensene?" #: .\cookbook\templates\generic\delete_template.html:18 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " -msgstr "" +msgstr "Er du sikker på at du vil slette %(title)s: %(object)s " #: .\cookbook\templates\generic\delete_template.html:21 msgid "Confirm" -msgstr "" +msgstr "Bekreft" #: .\cookbook\templates\generic\edit_template.html:30 msgid "View" -msgstr "" +msgstr "Vis" #: .\cookbook\templates\generic\edit_template.html:34 msgid "Delete original file" -msgstr "" +msgstr "Slett opprinnelig fil" #: .\cookbook\templates\generic\list_template.html:6 #: .\cookbook\templates\generic\list_template.html:12 msgid "List" -msgstr "" +msgstr "Liste" #: .\cookbook\templates\generic\list_template.html:25 msgid "Filter" -msgstr "" +msgstr "Filtrer" #: .\cookbook\templates\generic\list_template.html:30 msgid "Import all" -msgstr "" +msgstr "Importer alle" #: .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 @@ -896,23 +907,23 @@ msgstr "Vis logg" #: .\cookbook\templates\history.html:24 msgid "Cook Log" -msgstr "" +msgstr "Tilberedingslogg" #: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 msgid "Import Recipes" -msgstr "" +msgstr "Importer oppskrifter" #: .\cookbook\templates\include\log_cooking.html:7 msgid "Log Recipe Cooking" -msgstr "" +msgstr "Loggfør tilberedt oppskrift" #: .\cookbook\templates\include\log_cooking.html:13 msgid "All fields are optional and can be left empty." -msgstr "" +msgstr "Alle felt er valgfri og kan stå tomme." #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" -msgstr "Karakter" +msgstr "Vurdering" #: .\cookbook\templates\include\log_cooking.html:27 #: .\cookbook\templates\include\recipe_open_modal.html:18 @@ -948,44 +959,53 @@ msgid "" "can be used.\n" " " msgstr "" +"\n" +" Passord og nøkkelfeltene er lagret som ren tekst i " +"databasen.\n" +" Dette er nødvendig for å kunne utføre API-forespørsler, men det øker " +"samtidig risiko for\n" +" uønsket tilgang til dem.
\n" +" For å begrense kosekvensene av uønsket tilgang, kan nøkler eller " +"kontoer med begrenset tilgang benyttes.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "" +msgstr "Søk etter oppskrift..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "Ny oppskrift" #: .\cookbook\templates\index.html:47 msgid "Website Import" -msgstr "" +msgstr "Importer fra nettside" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "Avansert søk" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "Nullstill søk" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "Sist sett" #: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 #: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "Oppskrifter" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "Logg inn for å se oppskrifter" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Markdown informasjon" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -1002,43 +1022,56 @@ msgid "" "below.\n" " " msgstr "" +"\n" +" Markdown er et lettvekts markup språk som benyttes for å formatere " +"ren tekst.\n" +" Denne siden bruker biblioteket Python Markdown for\n" +" å konvertere teksten din til velformatert HTML. Fullstendig " +"dokumentasjon for markdown finner du\n" +" her.\n" +" En ufullstendig, men sannsynligvis tilstrekkelig dokumentasjon " +"finner du under her.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "Overskrifter" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "Formatering" #: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:72 msgid "Line breaks are inserted by adding two spaces after the end of a line" msgstr "" +"Linjeskift er satt inn ved å sette inn to mellomrom på slutten av en linje" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." -msgstr "" +msgstr "eller ved å sette inn en tom linje mellom." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "Denne teksten er Fet" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "Denne teksten er Kursiv" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "Det er også mulig å sitere avsnitt" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "Lister" #: .\cookbook\templates\markdown_info.html:85 msgid "" From ec68da051d6c69c972c6a50f58666cf4823e8699 Mon Sep 17 00:00:00 2001 From: axeron2036 Date: Mon, 17 Apr 2023 16:04:29 +0000 Subject: [PATCH 23/40] Translated using Weblate (Russian) Currently translated at 71.6% (344 of 480 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/ --- vue/src/locales/ru.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/ru.json b/vue/src/locales/ru.json index 50ff42fc3..8a8f75f29 100644 --- a/vue/src/locales/ru.json +++ b/vue/src/locales/ru.json @@ -343,5 +343,8 @@ "DelayFor": "Отложить на {hours} часов", "New_Entry": "Новая запись", "GroupBy": "Сгруппировать по", - "facet_count_info": "Показывать количество рецептов в фильтрах поиска." + "facet_count_info": "Показывать количество рецептов в фильтрах поиска.", + "food_inherit_info": "Поля для продуктов питания, которые должны наследоваться по умолчанию.", + "warning_space_delete": "Вы можете удалить свое пространство, включая все рецепты, списки покупок, планы питания и все остальное, что вы создали. Этого нельзя отменить! Ты уверен, что хочешь это сделать?", + "Description_Replace": "Изменить описание" } From 8a8be7fb2d46b63b161fb80203e471d9ca383995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Espen=20Sellev=C3=A5g?= Date: Mon, 17 Apr 2023 15:09:23 +0000 Subject: [PATCH 24/40] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 16.6% (80 of 480 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nb_NO/ --- vue/src/locales/nb_NO.json | 84 +++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/vue/src/locales/nb_NO.json b/vue/src/locales/nb_NO.json index 324ed8ed5..aac578f9d 100644 --- a/vue/src/locales/nb_NO.json +++ b/vue/src/locales/nb_NO.json @@ -28,46 +28,46 @@ "External_Recipe_Image": "Bilde av ekstern oppskrift", "Add_to_Shopping": "Legg til i handleliste", "Add_to_Plan": "Legg til i Plan", - "Step_start_time": "", - "Sort_by_new": "", - "Table_of_Contents": "", - "Recipes_per_page": "", - "Show_as_header": "", - "Hide_as_header": "", - "Add_nutrition_recipe": "", - "Remove_nutrition_recipe": "", - "Copy_template_reference": "", - "Save_and_View": "", - "Manage_Books": "", - "Meal_Plan": "", - "Select_Book": "", - "Select_File": "", - "Recipe_Image": "", - "Import_finished": "", - "View_Recipes": "", - "Log_Cooking": "", - "New_Recipe": "", - "Url_Import": "", - "Reset_Search": "", - "Recently_Viewed": "", - "Load_More": "", - "New_Keyword": "", - "Delete_Keyword": "", - "Edit_Keyword": "", - "Edit_Recipe": "", - "Move_Keyword": "", - "Merge_Keyword": "", - "Hide_Keywords": "", - "Hide_Recipes": "", - "Move_Up": "", - "Move_Down": "", - "Step_Name": "", - "Step_Type": "", - "Make_Header": "", - "Make_Ingredient": "", - "Amount": "", - "Enable_Amount": "", - "Disable_Amount": "", + "Step_start_time": "Trinn starttid", + "Sort_by_new": "Sorter etter nyest", + "Table_of_Contents": "Innholdsfortegnelse", + "Recipes_per_page": "Oppskrifter per side", + "Show_as_header": "Vis som overskrift", + "Hide_as_header": "Skjul overskrift", + "Add_nutrition_recipe": "Legg til næringsinnhold til oppskrift", + "Remove_nutrition_recipe": "Fjern næringsinnhold fra oppskrift", + "Copy_template_reference": "Kopier mal-referanse", + "Save_and_View": "Lagre og vis", + "Manage_Books": "Administrer bøker", + "Meal_Plan": "Måltidsplan", + "Select_Book": "Velg bok", + "Select_File": "Velg fil", + "Recipe_Image": "Oppskriftsbilde", + "Import_finished": "Importering fullført", + "View_Recipes": "Vis oppskrifter", + "Log_Cooking": "Loggfør tilbereding", + "New_Recipe": "Ny oppskrift", + "Url_Import": "Importer lenke", + "Reset_Search": "Nullstill søk", + "Recently_Viewed": "Nylig vist", + "Load_More": "Last inn flere", + "New_Keyword": "Nytt nøkkelord", + "Delete_Keyword": "Slett nøkkelord", + "Edit_Keyword": "Rediger nøkkelord", + "Edit_Recipe": "Rediger oppskrift", + "Move_Keyword": "Flytt nøkkelord", + "Merge_Keyword": "Slå sammen nøkkelord", + "Hide_Keywords": "Skjul nøkkelord", + "Hide_Recipes": "Skjul oppskrifter", + "Move_Up": "Flytt opp", + "Move_Down": "Flytt ned", + "Step_Name": "Trinn navn", + "Step_Type": "Trinn type", + "Make_Header": "Bruk som overskrift", + "Make_Ingredient": "Bruk som ingrediens", + "Amount": "Mengde", + "Enable_Amount": "Aktiver mengde", + "Disable_Amount": "Deaktiver mengde", "Ingredient Editor": "", "Description_Replace": "", "Instruction_Replace": "", @@ -434,13 +434,13 @@ "select_food": "", "remove_selection": "", "empty_list": "", - "Select": "", + "Select": "Velg", "Supermarkets": "", "User": "", "Username": "", "First_name": "", "Last_name": "", - "Keyword": "", + "Keyword": "Nøkkelord", "Advanced": "", "Page": "", "Single": "", From 8c3195937b8d94a9a1c711c30e4cbac673aca872 Mon Sep 17 00:00:00 2001 From: smilerz Date: Fri, 21 Apr 2023 13:14:23 -0500 Subject: [PATCH 25/40] fix food tests --- cookbook/tests/api/test_api_food.py | 126 +++++++++----- .../tests/api/test_api_shopping_recipe.py | 107 +++++++----- cookbook/tests/factories/__init__.py | 155 +++++++++++------- .../other/test_recipe_full_text_search.py | 112 ++++++------- requirements.txt | 10 +- vue/src/components/IngredientComponent.vue | 41 ++--- 6 files changed, 328 insertions(+), 223 deletions(-) diff --git a/cookbook/tests/api/test_api_food.py b/cookbook/tests/api/test_api_food.py index 98376280f..050600349 100644 --- a/cookbook/tests/api/test_api_food.py +++ b/cookbook/tests/api/test_api_food.py @@ -56,23 +56,32 @@ def obj_tree_1(request, space_1): params = request.param # request.param is a magic variable except AttributeError: params = {} - objs = [] inherit = params.pop('inherit', False) - objs.extend(FoodFactory.create_batch(3, space=space_1, **params)) + FoodFactory.create_batch(3, space=space_1, **params) + objs = Food.objects.values_list('id', flat=True) + obj_id = objs[1] + child_id = objs[0] + parent_id = objs[2] # set all foods to inherit everything if inherit: inherit = Food.inheritable_fields - Through = Food.objects.filter(space=space_1).first().inherit_fields.through + Through = Food.objects.filter( + space=space_1).first().inherit_fields.through for i in inherit: Through.objects.bulk_create([ Through(food_id=x, foodinheritfield_id=i.id) for x in Food.objects.filter(space=space_1).values_list('id', flat=True) ]) - objs[0].move(objs[1], node_location) - objs[1].move(objs[2], node_location) - return Food.objects.get(id=objs[1].id) # whenever you move/merge a tree it's safest to re-get the object + Food.objects.get(id=child_id).move( + Food.objects.get(id=obj_id), node_location) + + Food.objects.get(id=obj_id).move( + Food.objects.get(id=parent_id), node_location) + + # whenever you move/merge a tree it's safest to re-get the object + return Food.objects.get(id=obj_id) @pytest.mark.parametrize("arg", [ @@ -107,19 +116,23 @@ def test_list_filter(obj_1, obj_2, u1_s1): assert obj_2.name in [x['name'] for x in response['results']] assert response['results'][0]['name'] < response['results'][1]['name'] - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?page_size=1').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?page_size=1').content) assert len(response['results']) == 1 response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?limit=1').content) assert len(response['results']) == 1 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query=''&limit=1').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query=''&limit=1').content) assert len(response['results']) == 1 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query=chicken').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query=chicken').content) assert response['count'] == 0 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query={obj_1.name[:-4]}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query={obj_1.name[:-4]}').content) assert response['count'] == 1 @@ -262,8 +275,9 @@ def test_integrity(u1_s1, recipe_1_s1): def test_move(u1_s1, obj_tree_1, obj_2, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] assert parent.get_num_children() == 1 assert parent.get_descendant_count() == 2 assert Food.get_root_nodes().filter(space=space_1).count() == 2 @@ -295,8 +309,9 @@ def test_move(u1_s1, obj_tree_1, obj_2, obj_3, space_1): def test_move_errors(u1_s1, obj_tree_1, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # move child to root r = u1_s1.put(reverse(MOVE_URL, args=[obj_tree_1.id, 0])) assert r.status_code == 200 @@ -351,7 +366,7 @@ def test_merge_shopping_entries(obj_tree_1, u1_s1, space_1): with scope(space=space_1): parent = obj_tree_1.get_parent() child = obj_tree_1.get_descendants()[0] - ShoppingListEntryFactory.create(food=parent, space=space_1) + ShoppingListEntryFactory.create(food=parent, space=space_1) ShoppingListEntryFactory.create(food=child, space=space_1) assert parent.get_num_children() == 1 assert parent.get_descendant_count() == 2 @@ -371,8 +386,10 @@ def test_merge_shopping_entries(obj_tree_1, u1_s1, space_1): assert obj_tree_1.shopping_entries.count() == 1 # now has child's ingredient -def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): +def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() child = obj_tree_1.get_descendants()[0] assert parent.get_num_children() == 1 @@ -417,7 +434,6 @@ def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): def test_merge_errors(u1_s1, obj_tree_1, obj_3, space_1): with scope(space=space_1): parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # attempt to merge with non-existent parent r = u1_s1.put( @@ -451,8 +467,9 @@ def test_merge_errors(u1_s1, obj_tree_1, obj_3, space_1): def test_root_filter(obj_tree_1, obj_2, obj_3, u1_s1): with scope(space=obj_tree_1.space): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # should return root objects in the space (obj_1, obj_2), ignoring query filters response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root=0').content) @@ -461,34 +478,46 @@ def test_root_filter(obj_tree_1, obj_2, obj_3, u1_s1): with scopes_disabled(): obj_2.move(parent, node_location) # should return direct children of parent (obj_tree_1, obj_2), ignoring query filters - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}').content) assert response['count'] == 2 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}&query={obj_2.name[4:]}').content) + response = json.loads(u1_s1.get( + f'{reverse(LIST_URL)}?root={parent.id}&query={obj_2.name[4:]}').content) assert response['count'] == 2 def test_tree_filter(obj_tree_1, obj_2, obj_3, u1_s1): with scope(space=obj_tree_1.space): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] obj_2.move(parent, node_location) # should return full tree starting at parent (obj_tree_1, obj_2), ignoring query filters - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}').content) assert response['count'] == 4 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}&query={obj_2.name[4:]}').content) + response = json.loads(u1_s1.get( + f'{reverse(LIST_URL)}?tree={parent.id}&query={obj_2.name[4:]}').content) assert response['count'] == 4 # This is more about the model than the API - should this be moved to a different test? @pytest.mark.parametrize("obj_tree_1, field, inherit, new_val", [ - ({'has_category': True, 'inherit': True}, 'supermarket_category', True, 'cat_1'), - ({'has_category': True, 'inherit': False}, 'supermarket_category', False, 'cat_1'), + ({'has_category': True, 'inherit': True}, + 'supermarket_category', True, 'cat_1'), + ({'has_category': True, 'inherit': False}, + 'supermarket_category', False, 'cat_1'), ({'ignore_shopping': True, 'inherit': True}, 'ignore_shopping', True, 'false'), - ({'ignore_shopping': True, 'inherit': False}, 'ignore_shopping', False, 'false'), - ({'substitute_children': True, 'inherit': True}, 'substitute_children', True, 'false'), - ({'substitute_children': True, 'inherit': False}, 'substitute_children', False, 'false'), - ({'substitute_siblings': True, 'inherit': True}, 'substitute_siblings', True, 'false'), - ({'substitute_siblings': True, 'inherit': False}, 'substitute_siblings', False, 'false'), + ({'ignore_shopping': True, 'inherit': False}, + 'ignore_shopping', False, 'false'), + ({'substitute_children': True, 'inherit': True}, + 'substitute_children', True, 'false'), + ({'substitute_children': True, 'inherit': False}, + 'substitute_children', False, 'false'), + ({'substitute_siblings': True, 'inherit': True}, + 'substitute_siblings', True, 'false'), + ({'substitute_siblings': True, 'inherit': False}, + 'substitute_siblings', False, 'false'), ], indirect=['obj_tree_1']) # indirect=True populates magic variable request.param of obj_tree_1 with the parameter def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): with scope(space=obj_tree_1.space): @@ -498,8 +527,10 @@ def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): new_val = request.getfixturevalue(new_val) # if this test passes it demonstrates that inheritance works # when moving to a parent as each food is created with a different category - assert (getattr(parent, field) == getattr(obj_tree_1, field)) in [inherit, True] - assert (getattr(obj_tree_1, field) == getattr(child, field)) in [inherit, True] + assert (getattr(parent, field) == getattr( + obj_tree_1, field)) in [inherit, True] + assert (getattr(obj_tree_1, field) == getattr( + child, field)) in [inherit, True] # change parent to a new value setattr(parent, field, new_val) with scope(space=parent.space): @@ -515,7 +546,8 @@ def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): @pytest.mark.parametrize("obj_tree_1", [ - ({'has_category': True, 'inherit': False, 'ignore_shopping': True, 'substitute_children': True, 'substitute_siblings': True}), + ({'has_category': True, 'inherit': False, 'ignore_shopping': True, + 'substitute_children': True, 'substitute_siblings': True}), ], indirect=['obj_tree_1']) @pytest.mark.parametrize("global_reset", [True, False]) @pytest.mark.parametrize("field", ['ignore_shopping', 'substitute_children', 'substitute_siblings', 'supermarket_category']) @@ -534,10 +566,13 @@ def test_reset_inherit_space_fields(obj_tree_1, space_1, global_reset, field): assert getattr(parent, field) != getattr(obj_tree_1, field) if global_reset: - space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields + # set default inherit fields + space_1.food_inherit.add( + *Food.inheritable_fields.values_list('id', flat=True)) parent.reset_inheritance(space=space_1) else: - obj_tree_1.child_inherit_fields.set(Food.inheritable_fields.values_list('id', flat=True)) + obj_tree_1.child_inherit_fields.set( + Food.inheritable_fields.values_list('id', flat=True)) obj_tree_1.save() parent.reset_inheritance(space=space_1, food=obj_tree_1) # djangotree bypasses ORM and need to be retrieved again @@ -545,12 +580,14 @@ def test_reset_inherit_space_fields(obj_tree_1, space_1, global_reset, field): parent = Food.objects.get(id=parent.id) child = Food.objects.get(id=child.id) - assert (getattr(parent, field) == getattr(obj_tree_1, field)) == global_reset + assert (getattr(parent, field) == getattr( + obj_tree_1, field)) == global_reset assert getattr(obj_tree_1, field) == getattr(child, field) @pytest.mark.parametrize("obj_tree_1", [ - ({'has_category': True, 'inherit': False, 'ignore_shopping': True, 'substitute_children': True, 'substitute_siblings': True}), + ({'has_category': True, 'inherit': False, 'ignore_shopping': True, + 'substitute_children': True, 'substitute_siblings': True}), ], indirect=['obj_tree_1']) @pytest.mark.parametrize("field", ['ignore_shopping', 'substitute_children', 'substitute_siblings', 'supermarket_category']) def test_reset_inherit_no_food_instances(obj_tree_1, space_1, field): @@ -558,13 +595,17 @@ def test_reset_inherit_no_food_instances(obj_tree_1, space_1, field): parent = obj_tree_1.get_parent() Food.objects.all().delete() - space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields + # set default inherit fields + space_1.food_inherit.add( + *Food.inheritable_fields.values_list('id', flat=True)) parent.reset_inheritance(space=space_1) def test_onhand(obj_1, u1_s1, u2_s1): - assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False + assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False u1_s1.patch( reverse( @@ -574,10 +615,13 @@ def test_onhand(obj_1, u1_s1, u2_s1): {'food_onhand': True}, content_type='application/json' ) - assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == True - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False + assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == True + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False user1 = auth.get_user(u1_s1) user2 = auth.get_user(u2_s1) user1.userpreference.shopping_share.add(user2) - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == True + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == True diff --git a/cookbook/tests/api/test_api_shopping_recipe.py b/cookbook/tests/api/test_api_shopping_recipe.py index 376f5fef7..56f35683a 100644 --- a/cookbook/tests/api/test_api_shopping_recipe.py +++ b/cookbook/tests/api/test_api_shopping_recipe.py @@ -1,20 +1,14 @@ import json -from datetime import timedelta -import factory import pytest # work around for bug described here https://stackoverflow.com/a/70312265/15762829 from django.conf import settings from django.contrib import auth -from django.forms import model_to_dict from django.urls import reverse -from django.utils import timezone -from django_scopes import scope, scopes_disabled -from pytest_factoryboy import LazyFixture, register +from django_scopes import scopes_disabled -from cookbook.models import Food, Ingredient, ShoppingListEntry, Step -from cookbook.tests.factories import (IngredientFactory, MealPlanFactory, RecipeFactory, - StepFactory, UserFactory) +from cookbook.models import Food, Ingredient +from cookbook.tests.factories import MealPlanFactory, RecipeFactory, StepFactory, UserFactory if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: @@ -32,9 +26,12 @@ def user2(request, u1_s1): except AttributeError: params = {} user = auth.get_user(u1_s1) - user.userpreference.mealplan_autoadd_shopping = params.get('mealplan_autoadd_shopping', True) - user.userpreference.mealplan_autoinclude_related = params.get('mealplan_autoinclude_related', True) - user.userpreference.mealplan_autoexclude_onhand = params.get('mealplan_autoexclude_onhand', True) + user.userpreference.mealplan_autoadd_shopping = params.get( + 'mealplan_autoadd_shopping', True) + user.userpreference.mealplan_autoinclude_related = params.get( + 'mealplan_autoinclude_related', True) + user.userpreference.mealplan_autoexclude_onhand = params.get( + 'mealplan_autoexclude_onhand', True) user.userpreference.save() return u1_s1 @@ -50,7 +47,6 @@ def recipe(request, space_1, u1_s1): return RecipeFactory(**params) - @pytest.mark.parametrize("arg", [ ['g1_s1', 204], ['u1_s1', 204], @@ -59,11 +55,14 @@ def recipe(request, space_1, u1_s1): ]) @pytest.mark.parametrize("recipe, sle_count", [ ({}, 10), - ({'steps__recipe_count': 1}, 20), # shopping list from recipe with StepRecipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), # shopping list from recipe with food recipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), # shopping list from recipe with StepRecipe and food recipe + # shopping list from recipe with StepRecipe + ({'steps__recipe_count': 1}, 20), + # shopping list from recipe with food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), + # shopping list from recipe with StepRecipe and food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), ], indirect=['recipe']) -def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): +def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): c = request.getfixturevalue(arg[0]) user = auth.get_user(c) user.userpreference.mealplan_autoadd_shopping = True @@ -78,16 +77,20 @@ def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): if r.status_code == 204: # skip anonymous user r = json.loads(c.get(reverse(SHOPPING_LIST_URL)).content) - assert len(r) == sle_count # recipe factory creates 10 ingredients by default + # recipe factory creates 10 ingredients by default + assert len(r) == sle_count assert [x['created_by']['id'] for x in r].count(user.id) == sle_count # user in space can't see shopping list - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 user.userpreference.shopping_share.add(auth.get_user(u2_s1)) # after share, user in space can see shopping list - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # confirm that the author of the recipe doesn't have access to shopping list if c != u1_s1: - assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 r = c.get(url) assert r.status_code == 405 @@ -99,9 +102,12 @@ def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): @pytest.mark.parametrize("recipe, sle_count", [ ({}, 10), - ({'steps__recipe_count': 1}, 20), # shopping list from recipe with StepRecipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), # shopping list from recipe with food recipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), # shopping list from recipe with StepRecipe and food recipe + # shopping list from recipe with StepRecipe + ({'steps__recipe_count': 1}, 20), + # shopping list from recipe with food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), + # shopping list from recipe with StepRecipe and food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), ], indirect=['recipe']) @pytest.mark.parametrize("use_mealplan", [(False), (True), ]) def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u2_s1): @@ -115,31 +121,33 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u user.userpreference.save() if use_mealplan: - mealplan = MealPlanFactory(space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) + mealplan = MealPlanFactory( + space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) else: u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert [x['created_by']['id'] for x in r].count(user.id) == sle_count all_ing = [x['ingredient'] for x in r] keep_ing = all_ing[1:-1] # remove first and last element - del keep_ing[int(len(keep_ing)/2)] # remove a middle element + del keep_ing[int(len(keep_ing) / 2)] # remove a middle element list_recipe = r[0]['list_recipe'] amount_sum = sum([x['amount'] for x in r]) # test modifying shopping list as different user # test increasing servings size of recipe shopping list if use_mealplan: - mealplan.servings = 2*recipe.servings + mealplan.servings = 2 * recipe.servings mealplan.save() else: u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), - {'list_recipe': list_recipe, 'servings': 2*recipe.servings}, + {'list_recipe': list_recipe, 'servings': 2 * recipe.servings}, content_type='application/json' ) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * 2 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # testing decreasing servings size of recipe shopping list if use_mealplan: @@ -153,7 +161,8 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * .5 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # test removing 3 items from shopping list u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), @@ -162,7 +171,8 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u ) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert len(r) == sle_count - 3 - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count - 3 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count - 3 # add all ingredients to existing shopping list - don't change serving size u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), @@ -172,14 +182,16 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * .5 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count @pytest.mark.parametrize("user2, sle_count", [ ({'mealplan_autoadd_shopping': False}, (0, 18)), ({'mealplan_autoinclude_related': False}, (9, 9)), ({'mealplan_autoexclude_onhand': False}, (20, 20)), - ({'mealplan_autoexclude_onhand': False, 'mealplan_autoinclude_related': False}, (10, 10)), + ({'mealplan_autoexclude_onhand': False, + 'mealplan_autoinclude_related': False}, (10, 10)), ], indirect=['user2']) @pytest.mark.parametrize("use_mealplan", [(False), (True), ]) @pytest.mark.parametrize("recipe", [({'steps__recipe_count': 1})], indirect=['recipe']) @@ -191,20 +203,24 @@ def test_shopping_recipe_userpreference(recipe, sle_count, use_mealplan, user2): food = Food.objects.get(id=ingredients[2].food.id) food.onhand_users.add(user) food.save() - food = recipe.steps.exclude(step_recipe=None).first().step_recipe.steps.first().ingredients.first().food + food = recipe.steps.exclude(step_recipe=None).first( + ).step_recipe.steps.first().ingredients.first().food food = Food.objects.get(id=food.id) food.onhand_users.add(user) food.save() if use_mealplan: - mealplan = MealPlanFactory(space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) - assert len(json.loads(user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[0] + MealPlanFactory( + space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) + assert len(json.loads( + user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[0] else: user2.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) - assert len(json.loads(user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[1] + assert len(json.loads( + user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[1] -def test_shopping_recipe_mixed_authors(u1_s1, u2_s1,space_1): +def test_shopping_recipe_mixed_authors(u1_s1, u2_s1, space_1): with scopes_disabled(): user1 = auth.get_user(u1_s1) user2 = auth.get_user(u2_s1) @@ -213,15 +229,19 @@ def test_shopping_recipe_mixed_authors(u1_s1, u2_s1,space_1): recipe1 = RecipeFactory(created_by=user1, space=space) recipe2 = RecipeFactory(created_by=user2, space=space) recipe3 = RecipeFactory(created_by=user3, space=space) - food = Food.objects.get(id=recipe1.steps.first().ingredients.first().food.id) + food = Food.objects.get( + id=recipe1.steps.first().ingredients.first().food.id) food.recipe = recipe2 food.save() - recipe1.steps.add(StepFactory(step_recipe=recipe3, ingredients__count=0, space=space)) + recipe1.steps.add(StepFactory(step_recipe=recipe3, + ingredients__count=0, space=space)) recipe1.save() u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe1.id})) - assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 29 - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 29 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 @pytest.mark.parametrize("recipe", [{'steps__ingredients__header': 1}], indirect=['recipe']) @@ -230,4 +250,5 @@ def test_shopping_with_header_ingredient(u1_s1, recipe): # recipe.step_set.first().ingredient_set.add(IngredientFactory(ingredients__header=1)) u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 10 - assert len(json.loads(u1_s1.get(reverse('api:ingredient-list')).content)['results']) == 11 + assert len(json.loads( + u1_s1.get(reverse('api:ingredient-list')).content)['results']) == 11 diff --git a/cookbook/tests/factories/__init__.py b/cookbook/tests/factories/__init__.py index c4b70e771..1b514b4f7 100644 --- a/cookbook/tests/factories/__init__.py +++ b/cookbook/tests/factories/__init__.py @@ -4,13 +4,12 @@ from decimal import Decimal import factory import pytest -from django.contrib import auth from django.contrib.auth.models import Group, User from django_scopes import scopes_disabled from faker import Factory as FakerFactory from pytest_factoryboy import register -from cookbook.models import Recipe, Step, UserSpace +from cookbook.models import UserSpace # this code will run immediately prior to creating the model object useful when you want a reverse relationship # log = factory.RelatedFactory( @@ -53,7 +52,8 @@ class SpaceFactory(factory.django.DjangoModelFactory): class UserFactory(factory.django.DjangoModelFactory): """User factory.""" - username = factory.LazyAttribute(lambda x: faker.simple_profile()['username']) + username = factory.LazyAttribute( + lambda x: faker.simple_profile()['username']) first_name = factory.LazyAttribute(lambda x: faker.first_name()) last_name = factory.LazyAttribute(lambda x: faker.last_name()) email = factory.LazyAttribute(lambda x: faker.email()) @@ -65,7 +65,8 @@ class UserFactory(factory.django.DjangoModelFactory): return if extracted: - us = UserSpace.objects.create(space=self.space, user=self, active=True) + us = UserSpace.objects.create( + space=self.space, user=self, active=True) us.groups.add(Group.objects.get(name=extracted)) @factory.post_generation @@ -75,7 +76,8 @@ class UserFactory(factory.django.DjangoModelFactory): if extracted: for prefs in extracted: - self.userpreference[prefs] = extracted[prefs]/0 # intentionally break so it can be debugged later + # intentionally break so it can be debugged later + self.userpreference[prefs] = extracted[prefs]/0 class Meta: model = User @@ -98,18 +100,22 @@ class SupermarketCategoryFactory(factory.django.DjangoModelFactory): class FoodFactory(factory.django.DjangoModelFactory): """Food factory.""" name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)[:128]) - plural_name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) + plural_name = factory.LazyAttribute( + lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) supermarket_category = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_category), - yes_declaration=factory.SubFactory(SupermarketCategoryFactory, space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_category), + yes_declaration=factory.SubFactory( + SupermarketCategoryFactory, space=factory.SelfAttribute('..space')), no_declaration=None ) recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_recipe), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) + path = None space = factory.SubFactory(SpaceFactory) @factory.post_generation @@ -127,17 +133,19 @@ class FoodFactory(factory.django.DjangoModelFactory): class Meta: model = 'cookbook.Food' - django_get_or_create = ('name', 'plural_name', 'space',) + django_get_or_create = ('name', 'plural_name', 'path', 'space',) @register class RecipeBookFactory(factory.django.DjangoModelFactory): """RecipeBook factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) + name = factory.LazyAttribute(lambda x: faker.sentence( + nb_words=3, variable_nb_words=False)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) icon = None # shared = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) filter = None space = factory.SubFactory(SpaceFactory) @@ -149,7 +157,8 @@ class RecipeBookFactory(factory.django.DjangoModelFactory): @register class RecipeBookEntryFactory(factory.django.DjangoModelFactory): """RecipeBookEntry factory.""" - book = factory.SubFactory(RecipeBookFactory, space=factory.SelfAttribute('..recipe.space')) + book = factory.SubFactory( + RecipeBookFactory, space=factory.SelfAttribute('..recipe.space')) recipe = None class Meta: @@ -173,7 +182,8 @@ class UnitFactory(factory.django.DjangoModelFactory): @register class KeywordFactory(factory.django.DjangoModelFactory): """Keyword factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=2, variable_nb_words=False)) + name = factory.LazyAttribute(lambda x: faker.sentence( + nb_words=2, variable_nb_words=False)) # icon = models.CharField(max_length=16, blank=True, null=True) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) space = factory.SubFactory(SpaceFactory) @@ -184,15 +194,17 @@ class KeywordFactory(factory.django.DjangoModelFactory): class Meta: model = 'cookbook.Keyword' - django_get_or_create = ('name', 'space',) + django_get_or_create = ('name', 'space') exclude = ('num') @register class IngredientFactory(factory.django.DjangoModelFactory): """Ingredient factory.""" - food = factory.SubFactory(FoodFactory, space=factory.SelfAttribute('..space')) - unit = factory.SubFactory(UnitFactory, space=factory.SelfAttribute('..space')) + food = factory.SubFactory( + FoodFactory, space=factory.SelfAttribute('..space')) + unit = factory.SubFactory( + UnitFactory, space=factory.SelfAttribute('..space')) amount = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=10)) note = factory.LazyAttribute(lambda x: faker.sentence(nb_words=8)) is_header = False @@ -210,7 +222,8 @@ class MealTypeFactory(factory.django.DjangoModelFactory): # icon = color = factory.LazyAttribute(lambda x: faker.safe_hex_color()) default = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) space = factory.SubFactory(SpaceFactory) class Meta: @@ -221,13 +234,17 @@ class MealTypeFactory(factory.django.DjangoModelFactory): class MealPlanFactory(factory.django.DjangoModelFactory): recipe = factory.Maybe( factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) - servings = factory.LazyAttribute(lambda x: Decimal(faker.random_int(min=1, max=1000)/100)) + servings = factory.LazyAttribute( + lambda x: Decimal(faker.random_int(min=1, max=1000) / 100)) title = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - meal_type = factory.SubFactory(MealTypeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + meal_type = factory.SubFactory( + MealTypeFactory, space=factory.SelfAttribute('..space')) note = factory.LazyAttribute(lambda x: faker.paragraph()) date = factory.LazyAttribute(lambda x: faker.future_date()) space = factory.SubFactory(SpaceFactory) @@ -243,12 +260,14 @@ class MealPlanFactory(factory.django.DjangoModelFactory): class ShoppingListRecipeFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_recipe), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=10)) - mealplan = factory.SubFactory(MealPlanFactory, space=factory.SelfAttribute('..space')) + mealplan = factory.SubFactory( + MealPlanFactory, space=factory.SelfAttribute('..space')) space = factory.SubFactory(SpaceFactory) class Params: @@ -263,26 +282,33 @@ class ShoppingListEntryFactory(factory.django.DjangoModelFactory): """ShoppingListEntry factory.""" list_recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_mealplan), - yes_declaration=factory.SubFactory(ShoppingListRecipeFactory, space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_mealplan), + yes_declaration=factory.SubFactory( + ShoppingListRecipeFactory, space=factory.SelfAttribute('..space')), no_declaration=None ) - food = factory.SubFactory(FoodFactory, space=factory.SelfAttribute('..space')) - unit = factory.SubFactory(UnitFactory, space=factory.SelfAttribute('..space')) + food = factory.SubFactory( + FoodFactory, space=factory.SelfAttribute('..space')) + unit = factory.SubFactory( + UnitFactory, space=factory.SelfAttribute('..space')) # # ingredient = factory.SubFactory(IngredientFactory) - amount = factory.LazyAttribute(lambda x: Decimal(faker.random_int(min=1, max=100))/10) + amount = factory.LazyAttribute( + lambda x: Decimal(faker.random_int(min=1, max=100)) / 10) order = factory.Sequence(int) checked = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) created_at = factory.LazyAttribute(lambda x: faker.past_date()) completed_at = None delay_until = None space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) - obj = super(ShoppingListEntryFactory, cls)._create(target_class, *args, **kwargs) + obj = super(ShoppingListEntryFactory, cls)._create( + target_class, *args, **kwargs) if created_at is not None: obj.created_at = created_at obj.save() @@ -298,7 +324,8 @@ class ShoppingListEntryFactory(factory.django.DjangoModelFactory): @register class StepFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) - instruction = factory.LazyAttribute(lambda x: ''.join(faker.paragraphs(nb=5))) + instruction = factory.LazyAttribute( + lambda x: ''.join(faker.paragraphs(nb=5))) # TODO add optional recipe food, make dependent on recipe, make number of recipes a Params ingredients__count = 10 # default number of ingredients to add ingredients__header = 0 @@ -330,14 +357,16 @@ class StepFactory(factory.django.DjangoModelFactory): for i in range(num_ing): if num_food_recipe > 0: has_recipe = True - num_food_recipe = num_food_recipe-1 + num_food_recipe = num_food_recipe - 1 else: has_recipe = False - self.ingredients.add(IngredientFactory(space=self.space, food__has_recipe=has_recipe)) + self.ingredients.add(IngredientFactory( + space=self.space, food__has_recipe=has_recipe)) num_header = kwargs.get('header', 0) if num_header > 0: for i in range(num_header): - self.ingredients.add(IngredientFactory(food=None, unit=None, amount=0, is_header=True, space=self.space)) + self.ingredients.add(IngredientFactory( + food=None, unit=None, amount=0, is_header=True, space=self.space)) elif extracted: for ing in extracted: self.ingredients.add(ing) @@ -351,20 +380,27 @@ class RecipeFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=7)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=20)) - servings_text = factory.LazyAttribute(lambda x: faker.sentence(nb_words=1)) # TODO generate list of expected servings text that can be iterated through + # TODO generate list of expected servings text that can be iterated through + servings_text = factory.LazyAttribute(lambda x: faker.sentence(nb_words=1)) keywords__count = 5 # default number of keywords to generate steps__count = 1 # default number of steps to create steps__recipe_count = 0 # default number of step recipes to create - steps__food_recipe_count = {} # by default, don't create food recipes, to override {'steps__food_recipe_count': {'step': 0, 'count': 1}} - working_time = factory.LazyAttribute(lambda x: faker.random_int(min=0, max=360)) - waiting_time = factory.LazyAttribute(lambda x: faker.random_int(min=0, max=360)) + # by default, don't create food recipes, to override {'steps__food_recipe_count': {'step': 0, 'count': 1}} + steps__food_recipe_count = {} + working_time = factory.LazyAttribute( + lambda x: faker.random_int(min=0, max=360)) + waiting_time = factory.LazyAttribute( + lambda x: faker.random_int(min=0, max=360)) internal = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_at = factory.LazyAttribute(lambda x: faker.date_between_dates(date_start=date(2000, 1, 1), date_end=date(2020, 12, 31))) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + created_at = factory.LazyAttribute(lambda x: faker.date_between_dates( + date_start=date(2000, 1, 1), date_end=date(2020, 12, 31))) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) # updated_at = kwargs.pop('updated_at', None) obj = super(RecipeFactory, cls)._create(target_class, *args, **kwargs) @@ -401,11 +437,13 @@ class RecipeFactory(factory.django.DjangoModelFactory): ing_recipe_count = 0 if food_recipe_count.get('step', None) == i: ing_recipe_count = food_recipe_count.get('count', 0) - self.steps.add(StepFactory(space=self.space, ingredients__food_recipe_count=ing_recipe_count, ingredients__header=num_ing_headers)) - num_ing_headers+-1 + self.steps.add(StepFactory( + space=self.space, ingredients__food_recipe_count=ing_recipe_count, ingredients__header=num_ing_headers)) + num_ing_headers + - 1 if num_recipe_steps > 0: for j in range(num_recipe_steps): - self.steps.add(StepFactory(space=self.space, step_recipe__has_recipe=True, ingredients__count=0)) + self.steps.add(StepFactory( + space=self.space, step_recipe__has_recipe=True, ingredients__count=0)) if extracted and (num_steps + num_recipe_steps == 0): for step in extracted: self.steps.add(step) @@ -428,15 +466,18 @@ class RecipeFactory(factory.django.DjangoModelFactory): @register class CookLogFactory(factory.django.DjangoModelFactory): """CookLog factory.""" - recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + recipe = factory.SubFactory( + RecipeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) created_at = factory.LazyAttribute(lambda x: faker.date_this_decade()) rating = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=5)) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=32)) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) obj = super(CookLogFactory, cls)._create(target_class, *args, **kwargs) if created_at is not None: @@ -451,13 +492,17 @@ class CookLogFactory(factory.django.DjangoModelFactory): @register class ViewLogFactory(factory.django.DjangoModelFactory): """ViewLog factory.""" - recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_at = factory.LazyAttribute(lambda x: faker.past_datetime(start_date='-365d')) + recipe = factory.SubFactory( + RecipeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + created_at = factory.LazyAttribute( + lambda x: faker.past_datetime(start_date='-365d')) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) obj = super(ViewLogFactory, cls)._create(target_class, *args, **kwargs) if created_at is not None: diff --git a/cookbook/tests/other/test_recipe_full_text_search.py b/cookbook/tests/other/test_recipe_full_text_search.py index d2159720b..60ca6162b 100644 --- a/cookbook/tests/other/test_recipe_full_text_search.py +++ b/cookbook/tests/other/test_recipe_full_text_search.py @@ -259,33 +259,35 @@ def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1): # commenting this out for general use - it is really slow # it should be run on occasion to ensure everything still works -# @pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL") -# @pytest.mark.parametrize("user1", itertools.product( -# [ -# ('fuzzy_search', True), ('fuzzy_search', False), -# ('fulltext', True), ('fulltext', False), -# ('icontains', True), ('icontains', False), -# ('istartswith', True), ('istartswith', False), -# ], -# [('unaccent', True), ('unaccent', False)] -# ), indirect=['user1']) -# @pytest.mark.parametrize("found_recipe", [ -# ({'name': True}), -# ({'description': True}), -# ({'instruction': True}), -# ({'keyword': True}), -# ({'food': True}), -# ], indirect=['found_recipe']) -# def test_search_string(found_recipe, recipes, user1, space_1): -# with scope(space=space_1): -# param1 = f"query={user1[3]}" -# param2 = f"query={user1[4]}" -# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content) -# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[1] -# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content) -# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[2] +@pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL") +@pytest.mark.parametrize("user1", itertools.product( + [ + ('fuzzy_search', True), ('fuzzy_search', False), + ('fulltext', True), ('fulltext', False), + ('icontains', True), ('icontains', False), + ('istartswith', True), ('istartswith', False), + ], + [('unaccent', True), ('unaccent', False)] +), indirect=['user1']) +@pytest.mark.parametrize("found_recipe", [ + ({'name': True}), + ({'description': True}), + ({'instruction': True}), + ({'keyword': True}), + ({'food': True}), +], indirect=['found_recipe']) +def test_search_string(found_recipe, recipes, user1, space_1): + with scope(space=space_1): + param1 = f"query={user1[3]}" + param2 = f"query={user1[4]}" + + r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content) + assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[1] + + r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content) + assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[2] @pytest.mark.parametrize("found_recipe, param_type, result", [ @@ -322,33 +324,33 @@ def test_search_date(found_recipe, recipes, param_type, result, u1_s1, u2_s1, sp # TODO this is somehow screwed, probably the search itself, dont want to fix it for now -# @pytest.mark.parametrize("found_recipe, param_type", [ -# ({'rating': True}, 'rating'), -# ({'timescooked': True}, 'timescooked'), -# ], indirect=['found_recipe']) -# def test_search_count(found_recipe, recipes, param_type, u1_s1, u2_s1, space_1): -# param1 = f'?{param_type}=3' -# param2 = f'?{param_type}=-3' -# param3 = f'?{param_type}=0' -# -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param1).content) -# assert r['count'] == 1 -# assert found_recipe[0].id in [x['id'] for x in r['results']] -# -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param2).content) -# assert r['count'] == 1 -# assert found_recipe[1].id in [x['id'] for x in r['results']] -# -# # test search for not rated/cooked -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param3).content) -# assert r['count'] == 11 -# assert (found_recipe[0].id or found_recipe[1].id) not in [x['id'] for x in r['results']] -# -# # test matched returns for lte and gte searches -# r = json.loads(u2_s1.get(reverse(LIST_URL) + param1).content) -# assert r['count'] == 1 -# assert found_recipe[2].id in [x['id'] for x in r['results']] -# -# r = json.loads(u2_s1.get(reverse(LIST_URL) + param2).content) -# assert r['count'] == 1 -# assert found_recipe[2].id in [x['id'] for x in r['results']] +@pytest.mark.parametrize("found_recipe, param_type", [ + ({'rating': True}, 'rating'), + ({'timescooked': True}, 'timescooked'), +], indirect=['found_recipe']) +def test_search_count(found_recipe, recipes, param_type, u1_s1, u2_s1, space_1): + param1 = f'?{param_type}=3' + param2 = f'?{param_type}=-3' + param3 = f'?{param_type}=0' + + r = json.loads(u1_s1.get(reverse(LIST_URL) + param1).content) + assert r['count'] == 1 + assert found_recipe[0].id in [x['id'] for x in r['results']] + + r = json.loads(u1_s1.get(reverse(LIST_URL) + param2).content) + assert r['count'] == 1 + assert found_recipe[1].id in [x['id'] for x in r['results']] + + # test search for not rated/cooked + r = json.loads(u1_s1.get(reverse(LIST_URL) + param3).content) + assert r['count'] == 11 + assert (found_recipe[0].id or found_recipe[1].id) not in [x['id'] for x in r['results']] + + # test matched returns for lte and gte searches + r = json.loads(u2_s1.get(reverse(LIST_URL) + param1).content) + assert r['count'] == 1 + assert found_recipe[2].id in [x['id'] for x in r['results']] + + r = json.loads(u2_s1.get(reverse(LIST_URL) + param2).content) + assert r['count'] == 1 + assert found_recipe[2].id in [x['id'] for x in r['results']] diff --git a/requirements.txt b/requirements.txt index 8500be061..6f27ed804 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,11 +30,11 @@ Jinja2==3.1.2 django-webpack-loader==1.8.1 git+https://github.com/BITSOLVER/django-js-reverse@071e304fd600107bc64bbde6f2491f1fe049ec82 django-allauth==0.52.0 -recipe-scrapers==14.35.0 +recipe-scrapers==14.36.1 django-scopes==1.2.0.post1 -pytest==7.2.2 +pytest==7.3.1 pytest-django==4.5.2 -django-treebeard==4.5.1 +django-treebeard==4.7 django-cors-headers==3.13.0 django-storages==1.13.2 boto3==1.26.41 @@ -42,7 +42,7 @@ django-prometheus==2.2.0 django-hCaptcha==0.2.0 python-ldap==3.4.3 django-auth-ldap==4.2.0 -pytest-factoryboy==2.5.0 +pytest-factoryboy==2.5.1 pyppeteer==1.0.2 validators==0.20.0 -pytube==12.1.0 \ No newline at end of file +pytube==12.1.0 diff --git a/vue/src/components/IngredientComponent.vue b/vue/src/components/IngredientComponent.vue index 7749c9de3..1998ceab9 100644 --- a/vue/src/components/IngredientComponent.vue +++ b/vue/src/components/IngredientComponent.vue @@ -12,18 +12,17 @@ - +