Compare commits

..

11 Commits
1.4.0 ... 1.4.2

Author SHA1 Message Date
vabene1111
16c0189b80 Merge branch 'develop' 2022-09-23 17:00:11 +02:00
vabene1111
36c30f9e11 fixed print from card when recipe is not open 2022-09-23 16:55:25 +02:00
vabene1111
12a8582a9a fixed importer and copy recipe 2022-09-23 16:43:22 +02:00
vabene1111
13b91e5b91 improved swiping behavior on shopping list 2022-09-23 16:27:16 +02:00
vabene1111
d02b253242 fixed search settings not working with sqlite DB 2022-09-23 16:16:44 +02:00
henrique roberto lino
16528c4c89 Translated using Weblate (Portuguese)
Currently translated at 10.4% (48 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt/
2022-09-23 02:33:11 +00:00
henrique roberto lino
6442e174b3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 35.0% (161 of 460 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2022-09-23 02:33:11 +00:00
vabene1111
fd325c1797 Merge branch 'develop' 2022-09-21 20:17:08 +02:00
vabene1111
12491d1302 changed gunicorn default settings 2022-09-21 20:17:00 +02:00
vabene1111
b7a4613310 Merge pull request #2052 from Szeraax/patch-1
Update boot.sh
2022-09-21 20:16:25 +02:00
Szeraax
39f5fca89b Update boot.sh
Set default value to 1 if null or unset for gunicorn workers/threads.
2022-09-21 11:06:55 -06:00
11 changed files with 225 additions and 206 deletions

View File

@@ -2,8 +2,8 @@
source venv/bin/activate
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
GUNICORN_WORKERS="${GUNICORN_WORKERS}"
GUNICORN_THREADS="${GUNICORN_THREADS}"
GUNICORN_WORKERS="${GUNICORN_WORKERS:-3}"
GUNICORN_THREADS="${GUNICORN_THREADS:-2}"
NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf
display_warning() {

View File

@@ -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']:

View File

@@ -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

View File

@@ -67,6 +67,7 @@
function applyPreset(preset) {
$('#id_search-preset').val(preset);
$('#id_search-search').val('plain');
$('#search_form_button').click();
}
</script>

View File

@@ -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,

View File

@@ -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/>

View File

@@ -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 {

View File

@@ -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

View File

@@ -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] }} &ensp;
@@ -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">

View File

@@ -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."
}

View File

@@ -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."
}