mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-25 03:13:13 -05:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89a5f92ace | ||
|
|
7be705f6a1 | ||
|
|
8e60566311 | ||
|
|
33e5bb7d0a | ||
|
|
0cf63cd715 | ||
|
|
5dc7bf5b0e | ||
|
|
c4c66aa640 | ||
|
|
f64be72a98 | ||
|
|
a3ed2bdcac | ||
|
|
996b8bedac | ||
|
|
a05a785e22 | ||
|
|
b470602317 | ||
|
|
cf8ab02d0e | ||
|
|
60043fff59 | ||
|
|
16c0189b80 | ||
|
|
36c30f9e11 | ||
|
|
12a8582a9a | ||
|
|
13b91e5b91 | ||
|
|
d02b253242 | ||
|
|
16528c4c89 | ||
|
|
6442e174b3 | ||
|
|
fd325c1797 | ||
|
|
2902262503 |
@@ -71,8 +71,7 @@ Because of that there are several ways you can support us
|
||||
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
|
||||
|
||||
## Contributing
|
||||
|
||||
You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. We are always welcoming new pull requests containing bug fixes, refactors and new features. We have a list of tasks and bugs on our issue tracker on Github. Please comment on issues if you want to contribute with, to avoid duplicating effort.
|
||||
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/#contributing-code) **BEFORE** contributing anything!
|
||||
|
||||
## Your Feedback
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ def get_from_scraper(scrape, request):
|
||||
# converting the scrape_me object to the existing json format based on ld+json
|
||||
recipe_json = {}
|
||||
try:
|
||||
recipe_json['name'] = parse_name(scrape.title() or None)
|
||||
recipe_json['name'] = parse_name(scrape.title()[:128] or None)
|
||||
except Exception:
|
||||
recipe_json['name'] = None
|
||||
if not recipe_json['name']:
|
||||
|
||||
@@ -41,7 +41,7 @@ class RecipeKeeper(Integration):
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
step = Step.objects.create(instruction='', space=self.request.space,)
|
||||
step = Step.objects.create(instruction='', space=self.request.space, )
|
||||
|
||||
ingredient_parser = IngredientParser(self.request, True)
|
||||
for ingredient in file.find("div", {"itemprop": "recipeIngredients"}).findChildren("p"):
|
||||
@@ -51,7 +51,7 @@ class RecipeKeeper(Integration):
|
||||
f = ingredient_parser.get_food(food)
|
||||
u = ingredient_parser.get_unit(unit)
|
||||
step.ingredients.add(Ingredient.objects.create(
|
||||
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
|
||||
food=f, unit=u, amount=amount, note=note, original_text=str(ingredient).replace('<p>', '').replace('</p>', ''), space=self.request.space,
|
||||
))
|
||||
|
||||
for s in file.find("div", {"itemprop": "recipeDirections"}).find_all("p"):
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,10 +14,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2022-02-09 01:31+0000\n"
|
||||
"Last-Translator: Marion Kämpfer <marion@murphyslantech.de>\n"
|
||||
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/fr/>\n"
|
||||
"PO-Revision-Date: 2022-09-26 16:33+0000\n"
|
||||
"Last-Translator: Noé Feutry <noe.feutry@free.fr>\n"
|
||||
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/fr/>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -85,7 +85,7 @@ msgstr "Commentaires"
|
||||
|
||||
#: .\cookbook\forms.py:66
|
||||
msgid "Left-handed mode"
|
||||
msgstr ""
|
||||
msgstr "Mode gaucher"
|
||||
|
||||
#: .\cookbook\forms.py:70
|
||||
msgid ""
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-12 19:20+0200\n"
|
||||
"PO-Revision-Date: 2022-08-04 11:32+0000\n"
|
||||
"PO-Revision-Date: 2022-09-25 12:33+0000\n"
|
||||
"Last-Translator: Oliver Cervera <olivercervera@yahoo.it>\n"
|
||||
"Language-Team: Italian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/it/>\n"
|
||||
@@ -122,10 +122,8 @@ msgstr ""
|
||||
"devono essere condivise per impostazione predefinita."
|
||||
|
||||
#: .\cookbook\forms.py:78
|
||||
#, fuzzy
|
||||
#| msgid "Try the new shopping list"
|
||||
msgid "Users with whom to share shopping lists."
|
||||
msgstr "Prova la nuova lista della spesa"
|
||||
msgstr "Utenti con i quali condividere le liste della spesa."
|
||||
|
||||
#: .\cookbook\forms.py:80
|
||||
msgid "Show recently viewed recipes on search page."
|
||||
@@ -502,10 +500,8 @@ msgid "Fields on food that should be inherited by default."
|
||||
msgstr "Alimento che dovrebbe essere rimpiazzato."
|
||||
|
||||
#: .\cookbook\forms.py:545
|
||||
#, fuzzy
|
||||
#| msgid "Show recently viewed recipes on search page."
|
||||
msgid "Show recipe counts on search filters"
|
||||
msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca."
|
||||
msgstr "Mostra il conteggio delle ricette nei filtri di ricerca"
|
||||
|
||||
#: .\cookbook\helper\AllAuthCustomAdapter.py:36
|
||||
msgid ""
|
||||
@@ -552,10 +548,8 @@ msgid "One of queryset or hash_key must be provided"
|
||||
msgstr ""
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:152
|
||||
#, fuzzy
|
||||
#| msgid "You must provide at least a recipe or a title."
|
||||
msgid "You must supply a servings size"
|
||||
msgstr "Devi fornire almeno una ricetta o un titolo."
|
||||
msgstr "Devi fornire le dimensione delle porzioni"
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:64
|
||||
#: .\cookbook\helper\template_helper.py:66
|
||||
@@ -744,10 +738,8 @@ msgid "Recipe"
|
||||
msgstr "Ricetta"
|
||||
|
||||
#: .\cookbook\models.py:1228
|
||||
#, fuzzy
|
||||
#| msgid "Foods"
|
||||
msgid "Food"
|
||||
msgstr "Alimenti"
|
||||
msgstr "Alimento"
|
||||
|
||||
#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138
|
||||
msgid "Keyword"
|
||||
@@ -910,7 +902,7 @@ msgstr "Rimuovi"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid "Warning:"
|
||||
msgstr "Avviso:"
|
||||
msgstr "Attenzione:"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid ""
|
||||
@@ -1169,7 +1161,7 @@ msgstr "Supermercato"
|
||||
|
||||
#: .\cookbook\templates\base.html:188
|
||||
msgid "Supermarket Category"
|
||||
msgstr "Categoria Supermercato"
|
||||
msgstr "Categoria supermercato"
|
||||
|
||||
#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171
|
||||
msgid "Automations"
|
||||
@@ -1191,10 +1183,8 @@ msgstr "Cronologia"
|
||||
#: .\cookbook\templates\base.html:252
|
||||
#: .\cookbook\templates\ingredient_editor.html:7
|
||||
#: .\cookbook\templates\ingredient_editor.html:13
|
||||
#, fuzzy
|
||||
#| msgid "Ingredients"
|
||||
msgid "Ingredient Editor"
|
||||
msgstr "Ingredienti"
|
||||
msgstr "Editor Ingredienti"
|
||||
|
||||
#: .\cookbook\templates\base.html:264
|
||||
#: .\cookbook\templates\export_response.html:7
|
||||
@@ -1377,10 +1367,11 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Questo modulo può essere utilizzato se, accidentalmente, sono stati "
|
||||
"creati due (o più) unità di misura o ingredienti che dovrebbero essere lo "
|
||||
"stesso. \n"
|
||||
"Unisce due unità di misura o ingredienti e aggiorna tutte le ricette che li "
|
||||
"utilizzano."
|
||||
"creati due (o più) unità di misura o ingredienti che\n"
|
||||
" dovrebbero essere lo stesso.\n"
|
||||
" Unisce due unità di misura o ingredienti e aggiorna tutte le ricette "
|
||||
"che li utilizzano.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\forms\ingredients.html:26
|
||||
msgid "Are you sure that you want to merge these two units?"
|
||||
@@ -1398,7 +1389,7 @@ msgstr "Sei sicuro di volere unire questi due ingredienti?"
|
||||
#: .\cookbook\templates\generic\delete_template.html:21
|
||||
#, python-format
|
||||
msgid "Are you sure you want to delete the %(title)s: <b>%(object)s</b> "
|
||||
msgstr "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b>"
|
||||
msgstr "Sei sicuro di volere eliminare %(title)s: <b>%(object)s</b> "
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:22
|
||||
msgid "This cannot be undone!"
|
||||
@@ -1490,11 +1481,14 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel database.\n"
|
||||
"È necessario perché servono per fare richieste API, ma questo aumenta il "
|
||||
"rischio che\n"
|
||||
"qualcuno possa impossessarsene.<br/>\n"
|
||||
"Per liminare il danno puoi usare account con accesso limitato o i token."
|
||||
" I campi <b>Password e Token</b> sono salvati <b>in chiaro</b> nel "
|
||||
"database.\n"
|
||||
" È necessario perché sono usati per fare richieste API, ma ciò "
|
||||
"aumenta il rischio che\n"
|
||||
" qualcuno possa impossessarsene.<br/>\n"
|
||||
" Per liminare i possibili danni puoi usare account con accesso "
|
||||
"limitato o i token.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\index.html:29
|
||||
msgid "Search recipe ..."
|
||||
@@ -1541,16 +1535,17 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Markdown è un linguaggio di markup molto leggero che può essere "
|
||||
" Markdown è un linguaggio di markup molto leggero che può essere "
|
||||
"utilizzato per formattare facilmente del testo.\n"
|
||||
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
|
||||
" Questo sito utilizza la libreria <a href=\"https://python-markdown."
|
||||
"github.io/\" target=\"_blank\">Python Markdown</a> per\n"
|
||||
" convertire il tuo testo in HTML formattato. È possibile trovare la "
|
||||
" convertire il tuo testo in HTML formattato. È possibile trovare la "
|
||||
"documentazione completa del markdown\n"
|
||||
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" target="
|
||||
"\"_blank\">qui</a>.\n"
|
||||
" Di seguito è possibile trovare una documentazione incompleta ma molto "
|
||||
"probabilmente sufficiente."
|
||||
" <a href=\"https://daringfireball.net/projects/markdown/syntax\" "
|
||||
"target=\"_blank\">qui</a>.\n"
|
||||
" Di seguito è possibile trovare una documentazione incompleta ma "
|
||||
"probabilmente sufficiente.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\markdown_info.html:25
|
||||
msgid "Headers"
|
||||
@@ -1697,7 +1692,7 @@ msgstr "Condiviso con"
|
||||
#: .\cookbook\templates\meal_plan_entry.html:48
|
||||
#: .\cookbook\templates\recipes_table.html:64
|
||||
msgid "Last cooked"
|
||||
msgstr "Cucinato ultimamente"
|
||||
msgstr "Cucinato di recente"
|
||||
|
||||
#: .\cookbook\templates\meal_plan_entry.html:50
|
||||
msgid "Never cooked before."
|
||||
@@ -2136,7 +2131,8 @@ msgid ""
|
||||
"You can sign in to your account using any of the following third party\n"
|
||||
" accounts:"
|
||||
msgstr ""
|
||||
"Puoi accedere al tuo account usando uno dei seguenti account di terze parti:"
|
||||
"Puoi accedere al tuo account usando uno di questi \n"
|
||||
" account di terze parti:"
|
||||
|
||||
#: .\cookbook\templates\socialaccount\connections.html:52
|
||||
msgid ""
|
||||
@@ -2213,10 +2209,8 @@ msgid "Manage Subscription"
|
||||
msgstr "Gestisci iscrizione"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216
|
||||
#, fuzzy
|
||||
#| msgid "Space:"
|
||||
msgid "Space"
|
||||
msgstr "Istanza:"
|
||||
msgstr "Istanza"
|
||||
|
||||
#: .\cookbook\templates\space_overview.html:17
|
||||
msgid ""
|
||||
@@ -2315,10 +2309,12 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Django Recipes è una applicazione gratuita e open source. È disponibile su "
|
||||
"<a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
|
||||
"Le ultime novità sono disponibili <a href=\"https://github.com/vabene1111/"
|
||||
"recipes/releases\">qui</a>."
|
||||
" Django Recipes è una applicazione gratuita e open source. È "
|
||||
"disponibile su\n"
|
||||
" <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
|
||||
" Puoi consultare le ultime novità <a href=\"https://github.com/"
|
||||
"vabene1111/recipes/releases\">qui</a>.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:36
|
||||
msgid "Media Serving"
|
||||
@@ -2327,7 +2323,7 @@ msgstr "File multimediali"
|
||||
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
|
||||
#: .\cookbook\templates\system.html:68
|
||||
msgid "Warning"
|
||||
msgstr "Avviso"
|
||||
msgstr "Attenzione"
|
||||
|
||||
#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52
|
||||
#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83
|
||||
@@ -2343,11 +2339,12 @@ msgid ""
|
||||
" your installation.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Erogare i file multimediali usando gunicorn/python <b>non è raccomandato</"
|
||||
"b>!\n"
|
||||
"Segui i passi descritti\n"
|
||||
"<a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8.1\">qui</a> "
|
||||
"per aggiornare la tua installazione."
|
||||
"<b>Non è raccomandato</b> erogare i file multimediali con gunicorn/pyton!\n"
|
||||
" Segui i passi descritti\n"
|
||||
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
|
||||
"1\">qui</a> per aggiornare\n"
|
||||
" la tua installazione.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61
|
||||
#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90
|
||||
@@ -2371,10 +2368,13 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Non hai inserito una <code>SECRET_KEY</code> nel file <code>.env</code>. "
|
||||
"Django ha dovuto usare la chiave standard\n"
|
||||
"dell'installazione che è pubblica e insicura! Sei pregato di aggiungere una\n"
|
||||
"<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>."
|
||||
" Non hai inserito una <code>SECRET_KEY</code> nel file <code>."
|
||||
"env</code>. Django ha dovuto usare la\n"
|
||||
" chiave standard\n"
|
||||
" dell'installazione che è pubblica e insicura! Sei pregato di "
|
||||
"aggiungere una\n"
|
||||
"\t\t\t<code>SECRET_KEY</code> nel file di configurazione <code>.env</code>.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:66
|
||||
msgid "Debug Mode"
|
||||
@@ -2391,10 +2391,12 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Questa applicazione è in esecuzione in modalità di debug. Probabilmente non "
|
||||
"è necessario, spegni la modalità di debug \n"
|
||||
"configurando\n"
|
||||
"<code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
|
||||
" Questa applicazione è in esecuzione in modalità di debug. "
|
||||
"Probabilmente non è necessario, spegni la modalità di debug\n"
|
||||
" configurando\n"
|
||||
" <code>DEBUG=0</code> nel file di configurazione<code>.env</code>."
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:81
|
||||
msgid "Database"
|
||||
@@ -2413,9 +2415,10 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Questa applicazione non sta girando su un database Postgres. Non è "
|
||||
"raccomandato perché alcune\n"
|
||||
"funzionalità sono disponibili solo con un database Posgres."
|
||||
" Questa applicazione non sta girando su un database Postgres. Non "
|
||||
"è raccomandato perché alcune\n"
|
||||
" funzionalità sono disponibili solo con un database Posgres.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\url_import.html:8
|
||||
msgid "URL Import"
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -709,7 +709,7 @@ class RecipeOverviewSerializer(RecipeBaseSerializer):
|
||||
class Meta:
|
||||
model = Recipe
|
||||
fields = (
|
||||
'id', 'name', 'description', 'image', 'keywords', 'working_time',
|
||||
'id', 'name', 'description', 'image', 'keywords', 'working_time',
|
||||
'waiting_time', 'created_by', 'created_at', 'updated_at',
|
||||
'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new', 'recent'
|
||||
)
|
||||
@@ -721,8 +721,8 @@ class RecipeSerializer(RecipeBaseSerializer):
|
||||
steps = StepSerializer(many=True)
|
||||
keywords = KeywordSerializer(many=True)
|
||||
shared = UserSerializer(many=True, required=False)
|
||||
rating = CustomDecimalField(required=False, allow_null=True)
|
||||
last_cooked = serializers.DateTimeField(required=False, allow_null=True)
|
||||
rating = CustomDecimalField(required=False, allow_null=True, read_only=True)
|
||||
last_cooked = serializers.DateTimeField(required=False, allow_null=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Recipe
|
||||
@@ -1124,14 +1124,14 @@ class AccessTokenSerializer(serializers.ModelSerializer):
|
||||
token = serializers.SerializerMethodField('get_token')
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data['token'] = f'tda_{str(uuid.uuid4()).replace("-","_")}'
|
||||
validated_data['token'] = f'tda_{str(uuid.uuid4()).replace("-", "_")}'
|
||||
validated_data['user'] = self.context['request'].user
|
||||
return super().create(validated_data)
|
||||
|
||||
def get_token(self, obj):
|
||||
if (timezone.now() - obj.created).seconds < 15:
|
||||
return obj.token
|
||||
return f'tda_************_******_***********{obj.token[len(obj.token)-4:]}'
|
||||
return f'tda_************_******_***********{obj.token[len(obj.token) - 4:]}'
|
||||
|
||||
class Meta:
|
||||
model = AccessToken
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
|
||||
function applyPreset(preset) {
|
||||
$('#id_search-preset').val(preset);
|
||||
$('#id_search-search').val('plain');
|
||||
$('#search_form_button').click();
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -170,7 +170,7 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
|
||||
'field', flat=True)])
|
||||
|
||||
if query is not None and query not in ["''", '']:
|
||||
if fuzzy:
|
||||
if fuzzy and (settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']):
|
||||
if any([self.model.__name__.lower() in x for x in
|
||||
self.request.user.searchpreference.unaccent.values_list('field', flat=True)]):
|
||||
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
|
||||
@@ -1116,16 +1116,17 @@ class CustomAuthToken(ObtainAuthToken):
|
||||
context={'request': request})
|
||||
serializer.is_valid(raise_exception=True)
|
||||
user = serializer.validated_data['user']
|
||||
if token := AccessToken.objects.filter(scope__contains='read').filter(scope__contains='write').first():
|
||||
if token := AccessToken.objects.filter(user=user, expires__gt=timezone.now(), scope__contains='read').filter(scope__contains='write').first():
|
||||
access_token = token
|
||||
else:
|
||||
access_token = AccessToken.objects.create(user=request.user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
|
||||
access_token = AccessToken.objects.create(user=user, token=f'tda_{str(uuid.uuid4()).replace("-", "_")}', expires=(timezone.now() + timezone.timedelta(days=365 * 5)), scope='read write app')
|
||||
return Response({
|
||||
'id': access_token.id,
|
||||
'token': access_token.token,
|
||||
'scope': access_token.scope,
|
||||
'expires': access_token.expires,
|
||||
'user_id': user.pk,
|
||||
'user_id': access_token.user.pk,
|
||||
'test': user.pk
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -215,7 +215,6 @@ def shopping_settings(request):
|
||||
|
||||
if request.method == "POST":
|
||||
if 'search_form' in request.POST:
|
||||
active_tab = 'search'
|
||||
search_form = SearchPreferenceForm(request.POST, prefix='search')
|
||||
if search_form.is_valid():
|
||||
if not sp:
|
||||
@@ -226,7 +225,28 @@ def shopping_settings(request):
|
||||
+ len(search_form.cleaned_data['trigram'])
|
||||
+ len(search_form.cleaned_data['fulltext'])
|
||||
)
|
||||
if fields_searched == 0:
|
||||
if search_form.cleaned_data['preset'] == 'fuzzy':
|
||||
sp.search = SearchPreference.SIMPLE
|
||||
sp.lookup = True
|
||||
sp.unaccent.set([SearchFields.objects.get(name='Name')])
|
||||
sp.icontains.set([SearchFields.objects.get(name='Name')])
|
||||
sp.istartswith.clear()
|
||||
sp.trigram.set([SearchFields.objects.get(name='Name')])
|
||||
sp.fulltext.clear()
|
||||
sp.trigram_threshold = 0.2
|
||||
sp.save()
|
||||
elif search_form.cleaned_data['preset'] == 'precise':
|
||||
sp.search = SearchPreference.WEB
|
||||
sp.lookup = True
|
||||
sp.unaccent.set(SearchFields.objects.all())
|
||||
# full text on food is very slow, add search_vector field and index it (including Admin functions and postsave signal to rebuild index)
|
||||
sp.icontains.set([SearchFields.objects.get(name='Name')])
|
||||
sp.istartswith.set([SearchFields.objects.get(name='Name')])
|
||||
sp.trigram.clear()
|
||||
sp.fulltext.set(SearchFields.objects.filter(name__in=['Ingredients']))
|
||||
sp.trigram_threshold = 0.2
|
||||
sp.save()
|
||||
elif fields_searched == 0:
|
||||
search_form.add_error(None, _('You must select at least one field to search!'))
|
||||
search_error = True
|
||||
elif search_form.cleaned_data['search'] in ['websearch', 'raw'] and len(
|
||||
@@ -247,29 +267,9 @@ def shopping_settings(request):
|
||||
sp.trigram.set(search_form.cleaned_data['trigram'])
|
||||
sp.fulltext.set(search_form.cleaned_data['fulltext'])
|
||||
sp.trigram_threshold = search_form.cleaned_data['trigram_threshold']
|
||||
|
||||
if search_form.cleaned_data['preset'] == 'fuzzy':
|
||||
sp.search = SearchPreference.SIMPLE
|
||||
sp.lookup = True
|
||||
sp.unaccent.set([SearchFields.objects.get(name='Name')])
|
||||
sp.icontains.set([SearchFields.objects.get(name='Name')])
|
||||
sp.istartswith.clear()
|
||||
sp.trigram.set([SearchFields.objects.get(name='Name')])
|
||||
sp.fulltext.clear()
|
||||
sp.trigram_threshold = 0.2
|
||||
|
||||
if search_form.cleaned_data['preset'] == 'precise':
|
||||
sp.search = SearchPreference.WEB
|
||||
sp.lookup = True
|
||||
sp.unaccent.set(SearchFields.objects.all())
|
||||
# full text on food is very slow, add search_vector field and index it (including Admin functions and postsave signal to rebuild index)
|
||||
sp.icontains.set([SearchFields.objects.get(name='Name')])
|
||||
sp.istartswith.set([SearchFields.objects.get(name='Name')])
|
||||
sp.trigram.clear()
|
||||
sp.fulltext.set(SearchFields.objects.filter(name__in=['Ingredients']))
|
||||
sp.trigram_threshold = 0.2
|
||||
|
||||
sp.save()
|
||||
else:
|
||||
search_error = True
|
||||
|
||||
fields_searched = len(sp.icontains.all()) + len(sp.istartswith.all()) + len(sp.trigram.all()) + len(
|
||||
sp.fulltext.all())
|
||||
@@ -281,10 +281,10 @@ def shopping_settings(request):
|
||||
# these fields require postgresql - just disable them if postgresql isn't available
|
||||
if not settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2',
|
||||
'django.db.backends.postgresql']:
|
||||
search_form.fields['search'].disabled = True
|
||||
search_form.fields['lookup'].disabled = True
|
||||
search_form.fields['trigram'].disabled = True
|
||||
search_form.fields['fulltext'].disabled = True
|
||||
sp.search = SearchPreference.SIMPLE
|
||||
sp.trigram.clear()
|
||||
sp.fulltext.clear()
|
||||
sp.save()
|
||||
|
||||
return render(request, 'settings.html', {
|
||||
'search_form': search_form,
|
||||
|
||||
@@ -11,8 +11,13 @@ over at [GitHub issues](https://github.com/vabene1111/recipes/issues).
|
||||
Without feedback improvement can't happen, so don't hesitate to say what you want to say.
|
||||
|
||||
## Contributing Code
|
||||
Code contributions are always welcome. There are no special rules for what you need to do,
|
||||
just do your best and we will work together to get your idea and code merged into the project.
|
||||
If you want to contribute bug fixes or small tweaks then your pull requests are always welcome!
|
||||
|
||||
!!! danger "Discuss First!"
|
||||
If you want to contribute larger features that introduce more complexity to the project please
|
||||
make sure to **first submit a technical description** outlining what and how you want to do it.
|
||||
This allows me and the community to give feedback and manage the complexity of the overall
|
||||
application. If you don't do this please don't be mad if I reject your PR
|
||||
|
||||
!!! info
|
||||
The dev setup is a little messy as this application combines the best (at least in my opinion) of both Django and Vue.js.
|
||||
|
||||
@@ -53,7 +53,7 @@ If removed, the nginx webserver needs to be replaced by something else that serv
|
||||
Please refer to [here](install/docker.md#setup-issues-on-raspberry-pi).
|
||||
|
||||
## How can I create users?
|
||||
To create a new user click on your name (top right corner) and select system. There click on invite links and create a new invite link.
|
||||
To create a new user click on your name (top right corner) and select 'space settings'. There under invites click create.
|
||||
|
||||
It is not possible to create users through the admin because users must be assigned a default group and space.
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -75,7 +75,7 @@
|
||||
</div>
|
||||
|
||||
<div class="col col-md-2 col-2 mt-2 mt-md-0 text-right">
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings"></recipe-context-menu>
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings" :disabled_options="{print:false}"></recipe-context-menu>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
<template v-if="recipe && recipe.loading">
|
||||
<b-card no-body v-hover>
|
||||
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="placeholder_image"
|
||||
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
|
||||
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
|
||||
|
||||
<b-card-body class="p-4">
|
||||
<b-card-body class="p-4">
|
||||
<h6>
|
||||
<b-skeleton width="95%"></b-skeleton>
|
||||
</h6>
|
||||
|
||||
<b-card-text>
|
||||
<b-skeleton height="12px" :width="(45 + Math.random() * 45).toString() + '%'"></b-skeleton>
|
||||
<b-skeleton height="12px" :width="(45 + Math.random() * 45).toString() + '%'"></b-skeleton>
|
||||
<b-skeleton height="12px" :width="(20 + Math.random() * 25).toString() + '%'"></b-skeleton>
|
||||
<b-skeleton height="12px" :width="(30 + Math.random() * 35).toString() + '%'"></b-skeleton>
|
||||
</b-card-text>
|
||||
@@ -28,7 +28,7 @@
|
||||
class="card-img-overlay h-100 d-flex flex-column justify-content-right float-right text-right pt-2 pr-1"
|
||||
v-if="show_context_menu">
|
||||
<a>
|
||||
<recipe-context-menu :recipe="recipe" class="float-right"
|
||||
<recipe-context-menu :recipe="recipe" class="float-right" :disabled_options="context_disabled_options"
|
||||
v-if="recipe !== null"></recipe-context-menu>
|
||||
</a>
|
||||
</div>
|
||||
@@ -124,7 +124,8 @@ export default {
|
||||
footer_text: String,
|
||||
footer_icon: String,
|
||||
detailed: {type: Boolean, default: true},
|
||||
show_context_menu: {type: Boolean, default: true}
|
||||
show_context_menu: {type: Boolean, default: true},
|
||||
context_disabled_options: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@@ -7,54 +7,54 @@
|
||||
</a>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink">
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)"><i
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)" v-if="!disabled_options.edit"><i
|
||||
class="fas fa-pencil-alt fa-fw"></i> {{ $t("Edit") }}</a>
|
||||
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('edit_convert_recipe', recipe.id)"
|
||||
v-if="!recipe.internal"><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a>
|
||||
v-if="!recipe.internal && !disabled_options.convert"><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)"><i
|
||||
<button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)" v-if="!disabled_options.books"><i
|
||||
class="fas fa-bookmark fa-fw"></i> {{ $t("Manage_Books") }}
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<a class="dropdown-item" v-if="recipe.internal" @click="addToShopping" href="#"> <i
|
||||
<a class="dropdown-item" v-if="recipe.internal && !disabled_options.shopping" @click="addToShopping" href="#" > <i
|
||||
class="fas fa-shopping-cart fa-fw"></i> {{ $t("Add_to_Shopping") }} </a>
|
||||
|
||||
<a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);"><i
|
||||
<a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);" v-if="!disabled_options.plan"><i
|
||||
class="fas fa-calendar fa-fw"></i> {{ $t("Add_to_Plan") }} </a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)"><i
|
||||
<button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)" v-if="!disabled_options.log"><i
|
||||
class="fas fa-clipboard-list fa-fw"></i> {{ $t("Log_Cooking") }}
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" onclick="window.print()">
|
||||
<button class="dropdown-item" onclick="window.print()" v-if="!disabled_options.print">
|
||||
<i class="fas fa-print fa-fw"></i>
|
||||
{{ $t("Print") }}
|
||||
</button>
|
||||
</a>
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="copyToNew"><i class="fas fa-copy fa-fw"></i>
|
||||
<button class="dropdown-item" @click="copyToNew" v-if="!disabled_options.copy"><i class="fas fa-copy fa-fw"></i>
|
||||
{{ $t("copy_to_new") }}
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('view_export') + '?r=' + recipe.id" target="_blank"
|
||||
rel="noopener noreferrer"><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a>
|
||||
rel="noopener noreferrer" v-if="!disabled_options.export"><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="pinRecipe()">
|
||||
<button class="dropdown-item" @click="pinRecipe()" v-if="!disabled_options.pin">
|
||||
<i class="fas fa-thumbtack fa-fw"></i>
|
||||
{{ $t("Pin") }}
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal"><i
|
||||
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal && !disabled_options.share" ><i
|
||||
class="fas fa-share-alt fa-fw"></i> {{ $t("Share") }}
|
||||
</button>
|
||||
</a>
|
||||
@@ -147,6 +147,10 @@ export default {
|
||||
type: Number,
|
||||
default: -1,
|
||||
},
|
||||
disabled_options: {
|
||||
type: Object,
|
||||
default: () => ({print:true}),
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.servings_value = this.servings === -1 ? this.recipe.servings : this.servings
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
</b-col>
|
||||
<b-col cols="8">
|
||||
<b-row class="d-flex h-100">
|
||||
<b-col cols="6" md="3" class="d-flex align-items-center"
|
||||
<b-col cols="6" md="3" class="d-flex align-items-center" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
|
||||
v-if="Object.entries(formatAmount).length == 1">
|
||||
<strong class="mr-1">{{ Object.entries(formatAmount)[0][1] }}</strong>
|
||||
{{ Object.entries(formatAmount)[0][0] }}
|
||||
</b-col>
|
||||
<b-col cols="6" md="3" class="d-flex flex-column"
|
||||
<b-col cols="6" md="3" class="d-flex flex-column" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
|
||||
v-if="Object.entries(formatAmount).length != 1">
|
||||
<div class="small" v-for="(x, i) in Object.entries(formatAmount)" :key="i">
|
||||
{{ x[1] }}  
|
||||
@@ -44,11 +44,10 @@
|
||||
</div>
|
||||
</b-col>
|
||||
|
||||
<b-col cols="6" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2"
|
||||
v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler">
|
||||
<b-col cols="6" md="6" class="align-items-center d-flex pl-0 pr-0 pl-md-2 pr-md-2">
|
||||
{{ formatFood }}
|
||||
</b-col>
|
||||
<b-col cols="3" data-html2canvas-ignore="true"
|
||||
<b-col cols="3" data-html2canvas-ignore="true" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
|
||||
class="align-items-center d-none d-md-flex justify-content-end">
|
||||
<b-button size="sm" @click="showDetails = !showDetails"
|
||||
class="p-0 mr-0 mr-md-2 p-md-2 text-decoration-none" variant="link">
|
||||
@@ -62,7 +61,7 @@
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-col>
|
||||
<b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0"
|
||||
<b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0" v-touch:start="startHandler" v-touch:moving="moveHandler" v-touch:end="endHandler"
|
||||
v-if="!settings.left_handed">
|
||||
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0"
|
||||
variant="link">
|
||||
|
||||
@@ -394,5 +394,13 @@
|
||||
"Copy Link": "Copier le lien",
|
||||
"Default_Unit": "Unité par défaut",
|
||||
"Hour": "Heure",
|
||||
"Day": "Jour"
|
||||
"Day": "Jour",
|
||||
"food_inherit_info": "Champs sur les ingrédients qui doivent être hérité par défaut.",
|
||||
"Invites": "Invitations",
|
||||
"paste_json": "Collez une source json ou html pour charger la recette.",
|
||||
"warning_space_delete": "Vous pouvez supprimer votre groupe ainsi que toutes les recettes, listes de courses, menus et autres choses que vous avez créés. Vous ne pourrez pas revenir sur cette suppression ! Êtes-vous sûr de vouloir le faire ?",
|
||||
"Comments_setting": "Montrer les commentaires",
|
||||
"import_duplicates": "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher la case pour tout importer.",
|
||||
"Account": "Compte",
|
||||
"Change_Password": "Modifier le mot de passe"
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"show_split_screen": "Vista divisa",
|
||||
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
|
||||
"External_Recipe_Image": "Immagine ricetta esterna",
|
||||
"Add_to_Shopping": "Aggiunti a lista della spesa",
|
||||
"Add_to_Shopping": "Aggiunti agli acquisti",
|
||||
"Add_to_Plan": "Aggiungi a Piano",
|
||||
"Step_start_time": "Ora di inizio dello Step",
|
||||
"Sort_by_new": "Prima i nuovi",
|
||||
@@ -91,18 +91,18 @@
|
||||
"Recipes": "Ricette",
|
||||
"Move": "Sposta",
|
||||
"Merge": "Unisci",
|
||||
"Parent": "Principale",
|
||||
"Parent": "Primario",
|
||||
"delete_confimation": "Sei sicuro di voler eliminare {kw} e tutti gli elementi dipendenti?",
|
||||
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
|
||||
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
|
||||
"move_selection": "Scegli un primario {type} dove spostare {source}.",
|
||||
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
|
||||
"Root": "Radice",
|
||||
"Ignore_Shopping": "Ignora lista della spesa",
|
||||
"Ignore_Shopping": "Ignora spesa",
|
||||
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
|
||||
"Description": "Descrizione",
|
||||
"Icon": "Icona",
|
||||
"Unit": "Unità",
|
||||
"Unit": "Unità di misura",
|
||||
"No_ID": "ID non trovato, non è possibile eliminare.",
|
||||
"Recipe_Book": "Libro di Ricette",
|
||||
"create_title": "Nuovo {type}",
|
||||
@@ -240,5 +240,110 @@
|
||||
"nothing": "Nulla da fare",
|
||||
"show_sql": "Mostra SQL",
|
||||
"Search Settings": "Impostazioni di ricerca",
|
||||
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato."
|
||||
"err_deleting_protected_resource": "L'elemento che stai cercando di eliminare è ancora in uso e non può essere eliminato.",
|
||||
"SupermarketName": "Nome supermercato",
|
||||
"last_cooked": "Cucinato di recente",
|
||||
"FoodNotOnHand": "Non hai {food} a disposizione.",
|
||||
"csv_delim_label": "Delimitatore CSV",
|
||||
"IgnoredFood": "{food} è impostato per ignorare la spesa.",
|
||||
"today_recipes": "Ricette di oggi",
|
||||
"left_handed": "Modalità per mancini",
|
||||
"Pin": "Pin",
|
||||
"DelayUntil": "Ritarda fino a",
|
||||
"Default_Unit": "Unità predefinita",
|
||||
"Decimals": "Decimali",
|
||||
"FoodOnHand": "Hai {food} a disposizione.",
|
||||
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
|
||||
"Language": "Lingua",
|
||||
"Theme": "Tema",
|
||||
"SupermarketCategoriesOnly": "Solo categorie supermercati",
|
||||
"CountMore": "...più +{count}",
|
||||
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
|
||||
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
|
||||
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
|
||||
"plan_share_desc": "Le nuove voci del piano alimentare saranno automaticamente condivise con gli utenti selezionati.",
|
||||
"Hour": "Ora",
|
||||
"Hours": "Ore",
|
||||
"Day": "Giorno",
|
||||
"Days": "Giorni",
|
||||
"Second": "Secondo",
|
||||
"Seconds": "Secondi",
|
||||
"csv_prefix_help": "Prefisso da aggiungere quando si copia una lista negli appunti.",
|
||||
"copy_markdown_table": "Copia come tabella Markdown",
|
||||
"in_shopping": "Nella lista della spesa",
|
||||
"Account": "Account",
|
||||
"Cosmetic": "Aspetto",
|
||||
"API": "API",
|
||||
"Copy Token": "Copia token",
|
||||
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
|
||||
"default_delay": "Ore di ritardo predefinite",
|
||||
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
|
||||
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
|
||||
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
|
||||
"filter_to_supermarket": "Filtra per supermercato",
|
||||
"filter_to_supermarket_desc": "Per impostazione predefinita, filtra la lista della spesa per includere esclusivamente le categorie del supermercato selezionato.",
|
||||
"CategoryName": "Nome categoria",
|
||||
"shopping_recent_days": "Giorni recenti",
|
||||
"download_pdf": "Scarica PDF",
|
||||
"download_csv": "Scarica CSV",
|
||||
"SuccessClipboard": "Lista della spesa copiata negli appunti",
|
||||
"Users": "Utenti",
|
||||
"Invites": "Inviti",
|
||||
"date_viewed": "Recenti",
|
||||
"copy_to_clipboard": "Copia negli appunti",
|
||||
"related_recipes": "Ricette correlate",
|
||||
"Foods": "Alimenti",
|
||||
"asc": "Crescente",
|
||||
"desc": "Decrescente",
|
||||
"Units": "Unità di misura",
|
||||
"shopping_add_onhand_desc": "Contrassegna gli alimenti come \"disponibili\" quando vengono spuntati dalla lista della spesa.",
|
||||
"shopping_add_onhand": "Auto disponibilità",
|
||||
"mark_complete": "Contrassegna come completato",
|
||||
"QuickEntry": "Inserimento rapido",
|
||||
"remember_hours": "Ore da ricordare",
|
||||
"tree_select": "Usa selezione ad albero",
|
||||
"sql_debug": "Debug SQL",
|
||||
"remember_search": "Ricorda ricerca",
|
||||
"facet_count_info": "Mostra il conteggio delle ricette nei filtri di ricerca",
|
||||
"warning_space_delete": "Stai per eliminare la tua istanza che include tutte le ricette, liste della spesa, piani alimentari e tutto ciò che hai creato. Questa azione non può essere annullata! Sei sicuro di voler procedere?",
|
||||
"food_inherit_info": "Campi di alimenti che devono essere ereditati per impostazione predefinita.",
|
||||
"enable_expert": "Abilita modalità esperto",
|
||||
"expert_mode": "Modalità esperto",
|
||||
"simple_mode": "Modalità semplice",
|
||||
"advanced": "Avanzate",
|
||||
"fields": "Campi",
|
||||
"show_keywords": "Mostra parole chiave",
|
||||
"show_foods": "Mostra alimenti",
|
||||
"show_books": "Mostra libri",
|
||||
"show_rating": "Mostra valutazione",
|
||||
"show_filters": "Mostra filtri",
|
||||
"save_filter": "Salva filtro",
|
||||
"filter_name": "Nome filtro",
|
||||
"left_handed_help": "L'interfaccia verrà ottimizzata per l'uso con la mano sinistra.",
|
||||
"Custom Filter": "Filtro personalizzato",
|
||||
"shared_with": "Condiviso con",
|
||||
"sort_by": "Ordina per",
|
||||
"Ingredient Overview": "Panoramica Ingredienti",
|
||||
"show_units": "Mostra unità di misura",
|
||||
"select_unit": "Seleziona unità di misura",
|
||||
"Ingredient Editor": "Editor Ingredienti",
|
||||
"Private_Recipe": "Ricetta privata",
|
||||
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e chi l'hai condivisa.",
|
||||
"Protected": "Protetto",
|
||||
"Copy Link": "Copia link",
|
||||
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
|
||||
"and_down": "& Giù",
|
||||
"OnHand": "Attualmente disponibili",
|
||||
"New_Entry": "Nuova voce",
|
||||
"Use_Fractions": "Usa frazioni",
|
||||
"FoodInherit": "Campi ereditabili dagli Alimenti",
|
||||
"one_url_per_line": "Un indirizzo per riga",
|
||||
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
|
||||
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
|
||||
"mealplan_autoinclude_related_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), includi tutte le ricette correlate.",
|
||||
"err_merge_self": "Non è possibile unire un elemento in sé stesso",
|
||||
"shopping_recent_days_desc": "Giorni di visualizzazione delle voci recenti della lista della spesa.",
|
||||
"csv_delim_help": "Delimitatore usato per le esportazioni CSV.",
|
||||
"csv_prefix_label": "Prefisso lista",
|
||||
"not": "not"
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "",
|
||||
"err_creating_resource": "",
|
||||
"err_updating_resource": "",
|
||||
"err_deleting_resource": "",
|
||||
"err_moving_resource": "",
|
||||
"err_merging_resource": "",
|
||||
"success_fetching_resource": "",
|
||||
"success_creating_resource": "",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "",
|
||||
"success_moving_resource": "",
|
||||
"success_merging_resource": "",
|
||||
"file_upload_disabled": "",
|
||||
"warning_feature_beta": "Este recurso está atualmente em BETA (sendo testado). Tenha em mente que podem existir bugs atualmente e haja mudanças drásticas no futuro (que podem causar perda de dados) quando utilizar este recurso.",
|
||||
"err_fetching_resource": "Ocorreu um erro buscando um recurso!",
|
||||
"err_creating_resource": "Ocorreu um erro criando um recurso!",
|
||||
"err_updating_resource": "Ocorreu um erro atualizando um recurso!",
|
||||
"err_deleting_resource": "Ocorreu um erro deletando um recurso!",
|
||||
"err_moving_resource": "Ocorreu um erro movendo o recurso!",
|
||||
"err_merging_resource": "Ocorreu um erro mesclando os recursos!",
|
||||
"success_fetching_resource": "Recurso carregado com sucesso!",
|
||||
"success_creating_resource": "Recurso criado com sucesso!",
|
||||
"success_updating_resource": "Recurso atualizado com sucesso!",
|
||||
"success_deleting_resource": "Recurso deletado com sucesso!",
|
||||
"success_moving_resource": "Recurso movido com sucesso!",
|
||||
"success_merging_resource": "Recurso mesclado com sucesso!",
|
||||
"file_upload_disabled": "Upload de arquivos não está habilitado para seu espaço.",
|
||||
"step_time_minutes": "",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
@@ -378,5 +378,9 @@
|
||||
"Page": "Página",
|
||||
"Reset": "Reiniciar",
|
||||
"Create Food": "Criar Comida",
|
||||
"create_food_desc": "Criar a comida e ligar a esta receita."
|
||||
"create_food_desc": "Criar a comida e ligar a esta receita.",
|
||||
"err_deleting_protected_resource": "O objeto que você está tentando deletar ainda está sendo utilizado, portanto não pode ser deletado.",
|
||||
"food_inherit_info": "Campos no alimento que devem ser herdados por padrão.",
|
||||
"warning_space_delete": "Você pode deletar seu espaço, inclusive todas as receitas, listas de mercado, planos de comida e tudo mais que você criou. Esta ação não poderá ser desfeita! Você tem certeza que quer fazer isto?",
|
||||
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca."
|
||||
}
|
||||
|
||||
@@ -18,137 +18,137 @@
|
||||
"import_running": "Importação em execução, aguarde!",
|
||||
"all_fields_optional": "Todos os campos são opcionais e podem ser deixados em branco.",
|
||||
"convert_internal": "Converter para receita interna",
|
||||
"show_only_internal": "",
|
||||
"show_split_screen": "",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "",
|
||||
"Manage_Books": "",
|
||||
"Meal_Plan": "",
|
||||
"Select_Book": "",
|
||||
"Select_File": "",
|
||||
"Recipe_Image": "",
|
||||
"Import_finished": "",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"New_Keyword": "",
|
||||
"Delete_Keyword": "",
|
||||
"Edit_Keyword": "",
|
||||
"Edit_Recipe": "",
|
||||
"Move_Keyword": "",
|
||||
"Merge_Keyword": "",
|
||||
"Hide_Keywords": "",
|
||||
"Hide_Recipes": "",
|
||||
"Move_Up": "",
|
||||
"Move_Down": "",
|
||||
"Step_Name": "",
|
||||
"Step_Type": "",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Enable_Amount": "",
|
||||
"Disable_Amount": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Cancel": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"show_only_internal": "Mostrar apenas receitas internas",
|
||||
"show_split_screen": "Visão dividida",
|
||||
"Log_Recipe_Cooking": "Registrar receitas feitas",
|
||||
"External_Recipe_Image": "Imagem externa da receita",
|
||||
"Add_to_Shopping": "Adicionar ao carrinho",
|
||||
"Add_to_Plan": "Adicionar ao Plano",
|
||||
"Step_start_time": "Hora de início",
|
||||
"Sort_by_new": "Ordenar por novos",
|
||||
"Table_of_Contents": "Índice",
|
||||
"Recipes_per_page": "Receitas por página",
|
||||
"Show_as_header": "Mostrar como título",
|
||||
"Hide_as_header": "Esconder cabeçalho",
|
||||
"Add_nutrition_recipe": "Adicionar dados nutricionais à receita",
|
||||
"Remove_nutrition_recipe": "Deletar dados nutricionais da receita",
|
||||
"Copy_template_reference": "Copiar template de referência",
|
||||
"Save_and_View": "Salvar e Visualizar",
|
||||
"Manage_Books": "Gerenciar Livros",
|
||||
"Meal_Plan": "Cardápio",
|
||||
"Select_Book": "Selecionar Livro",
|
||||
"Select_File": "Selecionar Arquivo",
|
||||
"Recipe_Image": "Imagem da receita",
|
||||
"Import_finished": "Importação finalizada",
|
||||
"View_Recipes": "Ver Receitas",
|
||||
"Log_Cooking": "Registro de Cozinha",
|
||||
"New_Recipe": "Nova Receita",
|
||||
"Url_Import": "Importar de URL",
|
||||
"Reset_Search": "Resetar Busca",
|
||||
"Recently_Viewed": "Visto recentemente",
|
||||
"Load_More": "Carregar mais",
|
||||
"New_Keyword": "Nova palavra-chave",
|
||||
"Delete_Keyword": "Deletar palavra-chave",
|
||||
"Edit_Keyword": "Editar palavra-chave",
|
||||
"Edit_Recipe": "Editar Receita",
|
||||
"Move_Keyword": "Mover palavra-chave",
|
||||
"Merge_Keyword": "Mesclar palavra-chave",
|
||||
"Hide_Keywords": "Esconder palavra-chave",
|
||||
"Hide_Recipes": "Esconder Receitas",
|
||||
"Move_Up": "Mover para cima",
|
||||
"Move_Down": "Mover para baixo",
|
||||
"Step_Name": "Nome da etapa",
|
||||
"Step_Type": "Tipo de etapa",
|
||||
"Make_Header": "Criar cabeçalho",
|
||||
"Make_Ingredient": "Criar Ingrediente",
|
||||
"Enable_Amount": "Habilitar Quantidade",
|
||||
"Disable_Amount": "Desabilitar Quantidade",
|
||||
"Add_Step": "Adicionar Etapa",
|
||||
"Keywords": "Palavras-chave",
|
||||
"Books": "Livros",
|
||||
"Proteins": "Proteínas",
|
||||
"Fats": "Gorduras",
|
||||
"Carbohydrates": "Carboidratos",
|
||||
"Calories": "Calorias",
|
||||
"Energy": "Energia",
|
||||
"Nutrition": "Nutrição",
|
||||
"Date": "Data",
|
||||
"Share": "Compartilhar",
|
||||
"Automation": "Automação",
|
||||
"Parameter": "Parâmetro",
|
||||
"Export": "Exportar",
|
||||
"Copy": "Copiar",
|
||||
"Rating": "Nota",
|
||||
"Close": "Fechar",
|
||||
"Cancel": "Cancelar",
|
||||
"Link": "Link",
|
||||
"Add": "Adicionar",
|
||||
"New": "Novo",
|
||||
"Note": "Nota",
|
||||
"Success": "Sucesso",
|
||||
"Failure": "Falha",
|
||||
"Ingredients": "Ingredientes",
|
||||
"Supermarket": "Supermercado",
|
||||
"Categories": "Categorias",
|
||||
"Category": "Categoria",
|
||||
"Selected": "Selecionado",
|
||||
"min": "min",
|
||||
"Servings": "Porções",
|
||||
"Waiting": "Espera",
|
||||
"Preparation": "Preparação",
|
||||
"External": "Externo",
|
||||
"Size": "Tamanho",
|
||||
"Files": "Arquivos",
|
||||
"File": "Arquivo",
|
||||
"Edit": "Editar",
|
||||
"Image": "Imagem",
|
||||
"Delete": "Deletar",
|
||||
"Open": "Abrir",
|
||||
"Ok": "Abrir",
|
||||
"Save": "Salvar",
|
||||
"Step": "Etapa",
|
||||
"Search": "Buscar",
|
||||
"Import": "Importar",
|
||||
"Print": "Imprimir",
|
||||
"Settings": "Configurações",
|
||||
"or": "ou",
|
||||
"and": "e",
|
||||
"Information": "Informação",
|
||||
"Download": "Baixar",
|
||||
"Create": "Criar",
|
||||
"Search Settings": "Buscar Configuração",
|
||||
"View": "Visualizar",
|
||||
"Recipes": "Receitas",
|
||||
"Move": "Mover",
|
||||
"Merge": "Mesclar",
|
||||
"Parent": "Pai",
|
||||
"delete_confirmation": "Tem certeza que deseja deletar {source}?",
|
||||
"move_confirmation": "Movido <i>{child}</i> para <i>{parent}</i>",
|
||||
"merge_confirmation": "Trocado <i>{source}</i> com <i>{target}</i>",
|
||||
"create_rule": "e criar automação",
|
||||
"move_selection": "Selecione um pai {type} para mover para {source}.",
|
||||
"merge_selection": "Trocar todas as ocorrências de {source} com {type}.",
|
||||
"Root": "Raiz",
|
||||
"Ignore_Shopping": "Ignorar Mercado",
|
||||
"Shopping_Category": "Categoria de Mercado",
|
||||
"Shopping_Categories": "Categorias de Mercado",
|
||||
"Edit_Food": "Editar Comida",
|
||||
"Move_Food": "Mover Comida",
|
||||
"New_Food": "Nova Comida",
|
||||
"Hide_Food": "Esconder Comida",
|
||||
"Food_Alias": "Apelido da Comida",
|
||||
"Unit_Alias": "Apelido da Unidade",
|
||||
"Keyword_Alias": "Apelido da palavra-chave",
|
||||
"Delete_Food": "Deletar Comida",
|
||||
"No_ID": "ID não encontrado, impossível deletar.",
|
||||
"Meal_Plan_Days": "Planejamento de Cardápio",
|
||||
"merge_title": "Mesclar {type}",
|
||||
"move_title": "Mover {type}",
|
||||
"Food": "Comida",
|
||||
"Recipe_Book": "Livro de Receitas",
|
||||
"del_confirmation_tree": "Tem certeza que deseja deletar {source} e todos seus filhos?",
|
||||
"delete_title": "Deletar {type}",
|
||||
"create_title": "Novo {type}",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
@@ -377,5 +377,15 @@
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Reset": "",
|
||||
"err_deleting_protected_resource": "O objeto que você está tentando excluir ainda é usado e não pode ser excluído."
|
||||
"err_deleting_protected_resource": "O objeto que você está tentando excluir ainda é usado e não pode ser excluído.",
|
||||
"Copy Link": "Copiar Link",
|
||||
"Ingredient Editor": "Editor de Ingrediente",
|
||||
"Protected": "Protegido",
|
||||
"reusable_help_text": "O convite pode ser utilizado para mais de um usuário.",
|
||||
"Private_Recipe": "Receita privada",
|
||||
"Private_Recipe_Help": "Receita é visível somente para você e para pessoas compartilhadas.",
|
||||
"Copy Token": "Copiar Token",
|
||||
"warning_space_delete": "Você pode deletar seu espaço, inclusive todas as receitas, listas de mercado, planos de comida e tudo mais que você criou. Esta ação não poderá ser desfeita! Você tem certeza que quer fazer isto?",
|
||||
"food_inherit_info": "Campos no alimento que devem ser herdados por padrão.",
|
||||
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user