Merge branch 'TandoorRecipes:develop' into Auto-Planner
This commit is contained in:
@ -8,6 +8,7 @@
|
||||
<select class="form-control" v-model="recipe_app">
|
||||
<option value="DEFAULT">Default</option>
|
||||
<option value="SAFFRON">Saffron</option>
|
||||
<option value="NEXTCLOUD">Nextcloud Cookbook</option>
|
||||
<option value="RECIPESAGE">Recipe Sage</option>
|
||||
<option value="PDF">PDF (experimental)</option>
|
||||
</select>
|
||||
|
@ -204,7 +204,7 @@
|
||||
v-if="!import_multiple">
|
||||
|
||||
<recipe-card :recipe="recipe_json" :detailed="false"
|
||||
:show_context_menu="false"
|
||||
:show_context_menu="false" :use_plural="use_plural"
|
||||
></recipe-card>
|
||||
</b-col>
|
||||
<b-col>
|
||||
@ -461,6 +461,7 @@ export default {
|
||||
recent_urls: [],
|
||||
source_data: '',
|
||||
recipe_json: undefined,
|
||||
use_plural: false,
|
||||
// recipe_html: undefined,
|
||||
// recipe_tree: undefined,
|
||||
recipe_images: [],
|
||||
@ -490,6 +491,10 @@ export default {
|
||||
this.INTEGRATIONS.forEach((int) => {
|
||||
int.icon = this.getRandomFoodIcon()
|
||||
})
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
|
@ -1,148 +1,182 @@
|
||||
<template>
|
||||
<div v-if="recipe_json !== undefined" class="mt-2 mt-md-0">
|
||||
<h5>Steps</h5>
|
||||
<div class="row">
|
||||
<div class="col col-md-12 text-center">
|
||||
<b-button @click="splitAllSteps('\n')" variant="secondary" v-b-tooltip.hover :title="$t('Split_All_Steps')"><i
|
||||
class="fas fa-expand-arrows-alt"></i> {{ $t('All') }}
|
||||
</b-button>
|
||||
<b-button @click="mergeAllSteps()" variant="primary" class="ml-1" v-b-tooltip.hover :title="$t('Combine_All_Steps')"><i
|
||||
class="fas fa-compress-arrows-alt"></i> {{ $t('All') }}
|
||||
</b-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2" v-for="(s, index) in recipe_json.steps"
|
||||
v-bind:key="index">
|
||||
<div class="col col-md-4 d-none d-md-block">
|
||||
<draggable :list="s.ingredients" group="ingredients"
|
||||
:empty-insert-threshold="10">
|
||||
<b-list-group-item v-for="i in s.ingredients"
|
||||
v-bind:key="i.original_text"><i
|
||||
class="fas fa-arrows-alt"></i> {{ i.original_text }}
|
||||
</b-list-group-item>
|
||||
</draggable>
|
||||
</div>
|
||||
<div class="col col-md-8 col-12">
|
||||
<b-input-group>
|
||||
<b-textarea
|
||||
style="white-space: pre-wrap" v-model="s.instruction"
|
||||
max-rows="10"></b-textarea>
|
||||
<b-input-group-append>
|
||||
<b-button variant="secondary" @click="splitStep(s,'\n')"><i
|
||||
class="fas fa-expand-arrows-alt"></i></b-button>
|
||||
<b-button variant="danger"
|
||||
@click="recipe_json.steps.splice(recipe_json.steps.findIndex(x => x === s),1)">
|
||||
<i class="fas fa-trash-alt"></i>
|
||||
</b-button>
|
||||
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
|
||||
<div class="text-center mt-1">
|
||||
<b-button @click="mergeStep(s)" variant="primary"
|
||||
v-if="index + 1 < recipe_json.steps.length"><i
|
||||
class="fas fa-compress-arrows-alt"></i>
|
||||
</b-button>
|
||||
|
||||
<b-button variant="success"
|
||||
@click="recipe_json.steps.splice(recipe_json.steps.findIndex(x => x === s) +1,0,{ingredients:[], instruction: ''})">
|
||||
<i class="fas fa-plus"></i>
|
||||
</b-button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="recipe_json !== undefined" class="mt-2 mt-md-0">
|
||||
<h5>Steps</h5>
|
||||
<div class="row">
|
||||
<div class="col col-md-12 text-center">
|
||||
<b-button @click="autoSortIngredients()" variant="secondary" v-b-tooltip.hover v-if="recipe_json.steps.length > 1"
|
||||
:title="$t('Auto_Sort_Help')"><i class="fas fa-random"></i> {{ $t('Auto_Sort') }}
|
||||
</b-button>
|
||||
<b-button @click="splitAllSteps('\n')" variant="secondary" class="ml-1" v-b-tooltip.hover
|
||||
:title="$t('Split_All_Steps')"><i
|
||||
class="fas fa-expand-arrows-alt"></i> {{ $t('All') }}
|
||||
</b-button>
|
||||
<b-button @click="mergeAllSteps()" variant="primary" class="ml-1" v-b-tooltip.hover
|
||||
:title="$t('Combine_All_Steps')"><i
|
||||
class="fas fa-compress-arrows-alt"></i> {{ $t('All') }}
|
||||
</b-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2" v-for="(s, index) in recipe_json.steps"
|
||||
v-bind:key="index">
|
||||
<div class="col col-md-4 d-none d-md-block">
|
||||
<draggable :list="s.ingredients" group="ingredients"
|
||||
:empty-insert-threshold="10">
|
||||
<b-list-group-item v-for="i in s.ingredients"
|
||||
v-bind:key="i.original_text"><i
|
||||
class="fas fa-arrows-alt"></i> {{ i.original_text }}
|
||||
</b-list-group-item>
|
||||
</draggable>
|
||||
</div>
|
||||
<div class="col col-md-8 col-12">
|
||||
<b-input-group>
|
||||
<b-textarea
|
||||
style="white-space: pre-wrap" v-model="s.instruction"
|
||||
max-rows="10"></b-textarea>
|
||||
<b-input-group-append>
|
||||
<b-button variant="secondary" @click="splitStep(s,'\n')"><i
|
||||
class="fas fa-expand-arrows-alt"></i></b-button>
|
||||
<b-button variant="danger"
|
||||
@click="recipe_json.steps.splice(recipe_json.steps.findIndex(x => x === s),1)">
|
||||
<i class="fas fa-trash-alt"></i>
|
||||
</b-button>
|
||||
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
|
||||
<div class="text-center mt-1">
|
||||
<b-button @click="mergeStep(s)" variant="primary"
|
||||
v-if="index + 1 < recipe_json.steps.length"><i
|
||||
class="fas fa-compress-arrows-alt"></i>
|
||||
</b-button>
|
||||
|
||||
<b-button variant="success"
|
||||
@click="recipe_json.steps.splice(recipe_json.steps.findIndex(x => x === s) +1,0,{ingredients:[], instruction: ''})">
|
||||
<i class="fas fa-plus"></i>
|
||||
</b-button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
import draggable from "vuedraggable";
|
||||
import stringSimilarity from "string-similarity"
|
||||
|
||||
export default {
|
||||
name: "ImportViewStepEditor",
|
||||
components: {
|
||||
draggable
|
||||
},
|
||||
props: {
|
||||
recipe: undefined
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
recipe_json: undefined
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
recipe_json: function () {
|
||||
this.$emit('change', this.recipe_json)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.recipe_json = this.recipe
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* utility function used by splitAllSteps and splitStep to split a single step object into multiple step objects
|
||||
* @param step: single step
|
||||
* @param split_character: character to split steps at
|
||||
* @return array of step objects
|
||||
*/
|
||||
splitStepObject: function (step, split_character) {
|
||||
let steps = []
|
||||
step.instruction.split(split_character).forEach(part => {
|
||||
if (part.trim() !== '') {
|
||||
steps.push({'instruction': part, 'ingredients': []})
|
||||
}
|
||||
})
|
||||
steps[0].ingredients = step.ingredients // put all ingredients from the original step in the ingredients of the first step of the split step list
|
||||
return steps
|
||||
},
|
||||
/**
|
||||
* Splits all steps of a given recipe_json at the split character (e.g. \n or \n\n)
|
||||
* @param split_character: character to split steps at
|
||||
*/
|
||||
splitAllSteps: function (split_character) {
|
||||
let steps = []
|
||||
this.recipe_json.steps.forEach(step => {
|
||||
steps = steps.concat(this.splitStepObject(step, split_character))
|
||||
})
|
||||
this.recipe_json.steps = steps
|
||||
},
|
||||
/**
|
||||
* Splits the given step at the split character (e.g. \n or \n\n)
|
||||
* @param step: step ingredients to split
|
||||
* @param split_character: character to split steps at
|
||||
*/
|
||||
splitStep: function (step, split_character) {
|
||||
let old_index = this.recipe_json.steps.findIndex(x => x === step)
|
||||
let new_steps = this.splitStepObject(step, split_character)
|
||||
this.recipe_json.steps.splice(old_index, 1, ...new_steps)
|
||||
},
|
||||
/**
|
||||
* Merge all steps of a given recipe_json into one
|
||||
*/
|
||||
mergeAllSteps: function () {
|
||||
let step = {'instruction': '', 'ingredients': []}
|
||||
this.recipe_json.steps.forEach(s => {
|
||||
step.instruction += s.instruction + '\n'
|
||||
step.ingredients = step.ingredients.concat(s.ingredients)
|
||||
})
|
||||
this.recipe_json.steps = [step]
|
||||
},
|
||||
/**
|
||||
* Merge two steps (the given and next one)
|
||||
*/
|
||||
mergeStep: function (step) {
|
||||
let step_index = this.recipe_json.steps.findIndex(x => x === step)
|
||||
let removed_steps = this.recipe_json.steps.splice(step_index, 2)
|
||||
|
||||
this.recipe_json.steps.splice(step_index, 0, {
|
||||
'instruction': removed_steps.flatMap(x => x.instruction).join('\n'),
|
||||
'ingredients': removed_steps.flatMap(x => x.ingredients)
|
||||
})
|
||||
},
|
||||
name: "ImportViewStepEditor",
|
||||
components: {
|
||||
draggable
|
||||
},
|
||||
props: {
|
||||
recipe: undefined
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
recipe_json: undefined
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
recipe_json: function () {
|
||||
this.$emit('change', this.recipe_json)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.recipe_json = this.recipe
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* utility function used by splitAllSteps and splitStep to split a single step object into multiple step objects
|
||||
* @param step: single step
|
||||
* @param split_character: character to split steps at
|
||||
* @return array of step objects
|
||||
*/
|
||||
splitStepObject: function (step, split_character) {
|
||||
let steps = []
|
||||
step.instruction.split(split_character).forEach(part => {
|
||||
if (part.trim() !== '') {
|
||||
steps.push({'instruction': part, 'ingredients': []})
|
||||
}
|
||||
})
|
||||
steps[0].ingredients = step.ingredients // put all ingredients from the original step in the ingredients of the first step of the split step list
|
||||
return steps
|
||||
},
|
||||
/**
|
||||
* Splits all steps of a given recipe_json at the split character (e.g. \n or \n\n)
|
||||
* @param split_character: character to split steps at
|
||||
*/
|
||||
splitAllSteps: function (split_character) {
|
||||
let steps = []
|
||||
this.recipe_json.steps.forEach(step => {
|
||||
steps = steps.concat(this.splitStepObject(step, split_character))
|
||||
})
|
||||
this.recipe_json.steps = steps
|
||||
},
|
||||
/**
|
||||
* Splits the given step at the split character (e.g. \n or \n\n)
|
||||
* @param step: step ingredients to split
|
||||
* @param split_character: character to split steps at
|
||||
*/
|
||||
splitStep: function (step, split_character) {
|
||||
let old_index = this.recipe_json.steps.findIndex(x => x === step)
|
||||
let new_steps = this.splitStepObject(step, split_character)
|
||||
this.recipe_json.steps.splice(old_index, 1, ...new_steps)
|
||||
},
|
||||
/**
|
||||
* Merge all steps of a given recipe_json into one
|
||||
*/
|
||||
mergeAllSteps: function () {
|
||||
let step = {'instruction': '', 'ingredients': []}
|
||||
this.recipe_json.steps.forEach(s => {
|
||||
step.instruction += s.instruction + '\n'
|
||||
step.ingredients = step.ingredients.concat(s.ingredients)
|
||||
})
|
||||
this.recipe_json.steps = [step]
|
||||
},
|
||||
/**
|
||||
* Merge two steps (the given and next one)
|
||||
*/
|
||||
mergeStep: function (step) {
|
||||
let step_index = this.recipe_json.steps.findIndex(x => x === step)
|
||||
let removed_steps = this.recipe_json.steps.splice(step_index, 2)
|
||||
|
||||
this.recipe_json.steps.splice(step_index, 0, {
|
||||
'instruction': removed_steps.flatMap(x => x.instruction).join('\n'),
|
||||
'ingredients': removed_steps.flatMap(x => x.ingredients)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* automatically assign ingredients to steps based on text matching
|
||||
*/
|
||||
autoSortIngredients: function () {
|
||||
let ingredients = this.recipe_json.steps.flatMap(s => s.ingredients)
|
||||
this.recipe_json.steps.forEach(s => s.ingredients = [])
|
||||
|
||||
ingredients.forEach(i => {
|
||||
let found = false
|
||||
this.recipe_json.steps.forEach(s => {
|
||||
if (s.instruction.includes(i.food.name.trim()) && !found) {
|
||||
found = true
|
||||
s.ingredients.push(i)
|
||||
}
|
||||
})
|
||||
if (!found) {
|
||||
let best_match = {rating: 0, step: this.recipe_json.steps[0]}
|
||||
this.recipe_json.steps.forEach(s => {
|
||||
let match = stringSimilarity.findBestMatch(i.food.name.trim(), s.instruction.split(' '))
|
||||
if (match.bestMatch.rating > best_match.rating) {
|
||||
best_match = {rating: match.bestMatch.rating, step: s}
|
||||
}
|
||||
})
|
||||
best_match.step.ingredients.push(i)
|
||||
found = true
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
@ -23,8 +23,7 @@
|
||||
<span v-if="apiName !== 'Step' && apiName !== 'CustomFilter'">
|
||||
<b-button variant="link" @click="startAction({ action: 'new' })">
|
||||
<i class="fas fa-plus-circle fa-2x"></i>
|
||||
</b-button> </span
|
||||
>
|
||||
</b-button> </span >
|
||||
<!-- TODO add proper field to model config to determine if create should be available or not -->
|
||||
</h3>
|
||||
</div>
|
||||
@ -42,6 +41,7 @@
|
||||
<!-- model isn't paginated and loads in one API call -->
|
||||
<div v-if="!paginated">
|
||||
<generic-horizontal-card v-for="i in items_left" v-bind:key="i.id" :item="i"
|
||||
:use_plural="use_plural"
|
||||
:model="this_model" @item-action="startAction($event, 'left')"
|
||||
@finish-action="finishAction"/>
|
||||
</div>
|
||||
@ -51,6 +51,7 @@
|
||||
<template v-slot:cards>
|
||||
<generic-horizontal-card v-for="i in items_left" v-bind:key="i.id" :item="i"
|
||||
:model="this_model"
|
||||
:use_plural="use_plural"
|
||||
@item-action="startAction($event, 'left')"
|
||||
@finish-action="finishAction"/>
|
||||
</template>
|
||||
@ -62,6 +63,7 @@
|
||||
<template v-slot:cards>
|
||||
<generic-horizontal-card v-for="i in items_right" v-bind:key="i.id" :item="i"
|
||||
:model="this_model"
|
||||
:use_plural="use_plural"
|
||||
@item-action="startAction($event, 'right')"
|
||||
@finish-action="finishAction"/>
|
||||
</template>
|
||||
@ -120,6 +122,7 @@ export default {
|
||||
show_split: false,
|
||||
paginated: false,
|
||||
header_component_name: undefined,
|
||||
use_plural: false,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -145,6 +148,17 @@ export default {
|
||||
}
|
||||
})
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
if (!this.use_plural && this.this_model !== null && this.this_model.create.params[0] !== null && this.this_model.create.params[0].includes('plural_name')) {
|
||||
let index = this.this_model.create.params[0].indexOf('plural_name')
|
||||
if (index > -1){
|
||||
this.this_model.create.params[0].splice(index, 1)
|
||||
}
|
||||
delete this.this_model.create.form.plural_name
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// this.genericAPI inherited from ApiMixin
|
||||
|
@ -308,7 +308,7 @@
|
||||
size="sm"
|
||||
class="ml-1 mb-1 mb-md-0"
|
||||
@click="
|
||||
paste_step = step.id
|
||||
paste_step = step
|
||||
$bvModal.show('id_modal_paste_ingredients')
|
||||
"
|
||||
>
|
||||
@ -546,7 +546,7 @@
|
||||
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="!ingredient.is_header"
|
||||
@click="ingredient.is_header = true">
|
||||
@click="ingredient.is_header = true; ingredient.food=null; ingredient.amount=0; ingredient.unit=null">
|
||||
<i class="fas fa-heading fa-fw"></i>
|
||||
{{ $t("Make_Header") }}
|
||||
</button>
|
||||
@ -571,11 +571,59 @@
|
||||
<i class="fas fa-balance-scale-right fa-fw"></i>
|
||||
{{ $t("Enable_Amount") }}
|
||||
</button>
|
||||
|
||||
<template v-if="use_plural">
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="!ingredient.always_use_plural_unit"
|
||||
@click="ingredient.always_use_plural_unit = true">
|
||||
<i class="fas fa-filter fa-fw"></i>
|
||||
{{ $t("Use_Plural_Unit_Always") }}
|
||||
</button>
|
||||
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="ingredient.always_use_plural_unit"
|
||||
@click="ingredient.always_use_plural_unit = false">
|
||||
<i class="fas fa-filter fa-fw"></i>
|
||||
{{ $t("Use_Plural_Unit_Simple") }}
|
||||
</button>
|
||||
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="!ingredient.always_use_plural_food"
|
||||
@click="ingredient.always_use_plural_food = true">
|
||||
<i class="fas fa-filter fa-fw"></i>
|
||||
{{ $t("Use_Plural_Food_Always") }}
|
||||
</button>
|
||||
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="ingredient.always_use_plural_food"
|
||||
@click="ingredient.always_use_plural_food = false">
|
||||
<i class="fas fa-filter fa-fw"></i>
|
||||
{{ $t("Use_Plural_Food_Simple") }}
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<button type="button" class="dropdown-item"
|
||||
@click="copyTemplateReference(index, ingredient)">
|
||||
<i class="fas fa-code"></i>
|
||||
{{ $t("Copy_template_reference") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
@click="duplicateIngredient(step, ingredient, index + 1)">
|
||||
<i class="fas fa-copy"></i>
|
||||
{{ $t("Copy") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="index > 0"
|
||||
@click="moveIngredient(step, ingredient, index-1)">
|
||||
<i class="fas fa-arrow-up"></i>
|
||||
{{ $t("Up") }}
|
||||
</button>
|
||||
<button type="button" class="dropdown-item"
|
||||
v-if="index !== step.ingredients.length - 1"
|
||||
@click="moveIngredient(step, ingredient, index+1)">
|
||||
<i class="fas fa-arrow-down"></i>
|
||||
{{ $t("Down") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -648,17 +696,18 @@
|
||||
v-if="recipe !== undefined">
|
||||
<div class="col-3 col-md-6 mb-1 mb-md-0 pr-2 pl-2">
|
||||
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
|
||||
class="d-block d-md-none btn btn-block btn-danger shadow-none"><i class="fa fa-trash fa-lg"></i></a>
|
||||
class="d-block d-md-none btn btn-block btn-danger shadow-none btn-sm"><i
|
||||
class="fa fa-trash fa-lg"></i></a>
|
||||
<a :href="resolveDjangoUrl('delete_recipe', recipe.id)"
|
||||
class="d-none d-md-block btn btn-block btn-danger shadow-none">{{ $t("Delete") }}</a>
|
||||
class="d-none d-md-block btn btn-block btn-danger shadow-none btn-sm">{{ $t("Delete") }}</a>
|
||||
</div>
|
||||
<div class="col-3 col-md-6 mb-1 mb-md-0 pr-2 pl-2">
|
||||
<a :href="resolveDjangoUrl('view_recipe', recipe.id)"
|
||||
class="d-block d-md-none btn btn-block btn-primary shadow-none">
|
||||
class="d-block d-md-none btn btn-block btn-primary shadow-none btn-sm">
|
||||
<i class="fa fa-eye fa-lg"></i>
|
||||
</a>
|
||||
<a :href="resolveDjangoUrl('view_recipe', recipe.id)"
|
||||
class="d-none d-md-block btn btn-block btn-primary shadow-none">
|
||||
class="d-none d-md-block btn btn-block btn-primary shadow-none btn-sm">
|
||||
{{ $t("View") }}
|
||||
</a>
|
||||
</div>
|
||||
@ -705,7 +754,7 @@
|
||||
<b-modal
|
||||
id="id_modal_paste_ingredients"
|
||||
v-bind:title="$t('ingredient_list')"
|
||||
@ok="appendIngredients"
|
||||
@ok="appendIngredients(paste_step)"
|
||||
@cancel="paste_ingredients = paste_step = undefined"
|
||||
@close="paste_ingredients = paste_step = undefined"
|
||||
>
|
||||
@ -775,6 +824,7 @@ export default {
|
||||
paste_step: undefined,
|
||||
show_file_create: false,
|
||||
step_for_file_create: undefined,
|
||||
use_plural: false,
|
||||
additional_visible: false,
|
||||
create_food: undefined,
|
||||
md_editor_toolbars: {
|
||||
@ -822,6 +872,10 @@ export default {
|
||||
this.searchRecipes("")
|
||||
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
},
|
||||
created() {
|
||||
window.addEventListener("keydown", this.keyboardListener)
|
||||
@ -1019,6 +1073,8 @@ export default {
|
||||
order: 0,
|
||||
is_header: false,
|
||||
no_amount: false,
|
||||
always_use_plural_unit: false,
|
||||
always_use_plural_food: false,
|
||||
original_text: null,
|
||||
})
|
||||
this.sortIngredients(step)
|
||||
@ -1039,6 +1095,12 @@ export default {
|
||||
this.recipe.steps.splice(new_index < 0 ? 0 : new_index, 0, step)
|
||||
this.sortSteps()
|
||||
},
|
||||
moveIngredient: function (step, ingredient, new_index) {
|
||||
step.ingredients.splice(step.ingredients.indexOf(ingredient), 1)
|
||||
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
|
||||
this.sortIngredients(step)
|
||||
},
|
||||
|
||||
addFoodType: function (tag, index) {
|
||||
let [tmp, step, id] = index.split("_")
|
||||
|
||||
@ -1188,30 +1250,38 @@ export default {
|
||||
energy: function () {
|
||||
return energyHeading()
|
||||
},
|
||||
appendIngredients: function () {
|
||||
appendIngredients: function (step) {
|
||||
let ing_list = this.paste_ingredients.split(/\r?\n/)
|
||||
let step = this.recipe.steps.findIndex((x) => x.id == this.paste_step)
|
||||
let order = Math.max(...this.recipe.steps[step].ingredients.map((x) => x.order), -1) + 1
|
||||
this.recipe.steps[step].ingredients_visible = true
|
||||
step.ingredients_visible = true
|
||||
let parsed_ing_list = []
|
||||
let promises = []
|
||||
ing_list.forEach((ing) => {
|
||||
if (ing.trim() !== "") {
|
||||
this.genericPostAPI("api_ingredient_from_string", {text: ing}).then((result) => {
|
||||
promises.push(this.genericPostAPI("api_ingredient_from_string", {text: ing}).then((result) => {
|
||||
let unit = null
|
||||
if (result.data.unit !== "" && result.data.unit !== null) {
|
||||
unit = {name: result.data.unit}
|
||||
}
|
||||
this.recipe.steps[step].ingredients.splice(order, 0, {
|
||||
parsed_ing_list.push({
|
||||
amount: result.data.amount,
|
||||
unit: unit,
|
||||
food: {name: result.data.food},
|
||||
note: result.data.note,
|
||||
original_text: ing,
|
||||
})
|
||||
})
|
||||
order++
|
||||
}))
|
||||
}
|
||||
})
|
||||
Promise.allSettled(promises).then(() => {
|
||||
ing_list.forEach(ing => {
|
||||
step.ingredients.push(parsed_ing_list.find(x => x.original_text === ing))
|
||||
})
|
||||
})
|
||||
},
|
||||
duplicateIngredient: function (step, ingredient, new_index) {
|
||||
delete ingredient.id
|
||||
step.ingredients.splice(new_index < 0 ? 0 : new_index, 0, ingredient)
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
@ -2,11 +2,11 @@
|
||||
<div id="app" style="margin-bottom: 4vh">
|
||||
<RecipeSwitcher ref="ref_recipe_switcher"/>
|
||||
<div class="row">
|
||||
<div class="col-12 col-xl-8 col-lg-10 offset-xl-2 offset-lg-1">
|
||||
<div class="col-12 col-xl-10 col-lg-10 offset-xl-1 offset-lg-1">
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-lg-10 col-xl-8 mt-3 mb-3">
|
||||
<div class="col-12 col-lg-10 col-xl-10 mt-2">
|
||||
<b-input-group>
|
||||
<b-input
|
||||
class="form-control form-control-lg form-control-borderless form-control-search"
|
||||
@ -16,16 +16,10 @@
|
||||
v-if="debug && ui.sql_debug">
|
||||
<i class="fas fa-bug" style="font-size: 1.5em"></i>
|
||||
</b-button>
|
||||
<b-button variant="light" v-b-tooltip.hover :title="$t('Random Recipes')"
|
||||
@click="openRandom()">
|
||||
<i class="fas fa-dice-five" style="font-size: 1.5em"></i>
|
||||
</b-button>
|
||||
<b-button v-b-toggle.collapse_advanced_search v-b-tooltip.hover
|
||||
:title="$t('advanced_search_settings')"
|
||||
v-bind:variant="searchFiltered(true) ? 'danger' : 'primary'">
|
||||
<!-- TODO consider changing this icon to a filter -->
|
||||
<i class="fas fa-caret-down" v-if="!search.advanced_search_visible"></i>
|
||||
<i class="fas fa-caret-up" v-if="search.advanced_search_visible"></i>
|
||||
<i class="fas fa-sliders-h"></i>
|
||||
</b-button>
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
@ -799,50 +793,62 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row align-content-center">
|
||||
<div class="col col-md-6" style="margin-top: 2vh">
|
||||
<b-dropdown id="sortby" :text="sortByLabel" variant="link" toggle-class="text-decoration-none "
|
||||
class="m-0 p-0">
|
||||
<div v-for="o in sortOptions" :key="o.id">
|
||||
<b-dropdown-item
|
||||
v-on:click="
|
||||
<div class="row mt-2">
|
||||
<div class="col-12 col-xl-10 col-lg-10 offset-xl-1 offset-lg-1">
|
||||
<div style="overflow-x:visible; overflow-y: hidden;white-space: nowrap;">
|
||||
|
||||
<b-dropdown id="sortby" :text="sortByLabel" variant="outline-primary" size="sm" style="overflow-y: visible; overflow-x: visible; position: static"
|
||||
class="shadow-none" toggle-class="text-decoration-none" >
|
||||
<div v-for="o in sortOptions" :key="o.id">
|
||||
<b-dropdown-item
|
||||
v-on:click="
|
||||
search.sort_order = [o]
|
||||
refreshData(false)
|
||||
"
|
||||
>
|
||||
<span>{{ o.text }}</span>
|
||||
</b-dropdown-item>
|
||||
</div>
|
||||
</b-dropdown>
|
||||
</div>
|
||||
<div class="col col-md-6 text-right" style="margin-top: 2vh">
|
||||
<span class="text-muted">
|
||||
{{ $t("Page") }} {{
|
||||
>
|
||||
<span>{{ o.text }}</span>
|
||||
</b-dropdown-item>
|
||||
</div>
|
||||
</b-dropdown>
|
||||
|
||||
<b-button variant="outline-primary" size="sm" class="shadow-none ml-1"
|
||||
@click="resetSearch()"><i class="fas fa-file-alt"></i> {{
|
||||
search.pagination_page
|
||||
}}/{{ Math.ceil(pagination_count / ui.page_size) }}
|
||||
<a href="#" @click="resetSearch()"><i class="fas fa-times-circle"></i> {{ $t("Reset") }}</a>
|
||||
</span>
|
||||
}}/{{ Math.ceil(pagination_count / ui.page_size) }} {{ $t("Reset") }} <i
|
||||
class="fas fa-times-circle"></i>
|
||||
</b-button>
|
||||
|
||||
<b-button variant="outline-primary" size="sm" class="shadow-none ml-1"
|
||||
@click="openRandom()"><i class="fas fa-dice-five"></i> {{ $t("Random") }}
|
||||
</b-button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="recipes.length > 0">
|
||||
<div v-if="recipes.length > 0" class="mt-4">
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<div
|
||||
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-gap: 0.8rem">
|
||||
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-gap: 0.4rem">
|
||||
<template v-if="!searchFiltered()">
|
||||
<recipe-card
|
||||
v-bind:key="`mp_${m.id}`"
|
||||
v-for="m in meal_plans"
|
||||
:recipe="m.recipe"
|
||||
:meal_plan="m"
|
||||
:use_plural="use_plural"
|
||||
:footer_text="m.meal_type_name"
|
||||
footer_icon="far fa-calendar-alt"
|
||||
></recipe-card>
|
||||
</template>
|
||||
<recipe-card v-for="r in recipes" v-bind:key="r.id" :recipe="r"
|
||||
:footer_text="isRecentOrNew(r)[0]"
|
||||
:footer_icon="isRecentOrNew(r)[1]"></recipe-card>
|
||||
:footer_icon="isRecentOrNew(r)[1]"
|
||||
:use_plural="use_plural">
|
||||
</recipe-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -910,6 +916,7 @@ import LoadingSpinner from "@/components/LoadingSpinner" // TODO: is this deprec
|
||||
import RecipeCard from "@/components/RecipeCard"
|
||||
import GenericMultiselect from "@/components/GenericMultiselect"
|
||||
import RecipeSwitcher from "@/components/Buttons/RecipeSwitcher"
|
||||
import { ApiApiFactory } from "@/utils/openapi/api"
|
||||
|
||||
Vue.use(VueCookies)
|
||||
Vue.use(BootstrapVue)
|
||||
@ -930,7 +937,7 @@ export default {
|
||||
meal_plans: [],
|
||||
last_viewed_recipes: [],
|
||||
sortMenu: false,
|
||||
|
||||
use_plural: false,
|
||||
search: {
|
||||
advanced_search_visible: false,
|
||||
explain_visible: false,
|
||||
@ -1115,6 +1122,9 @@ export default {
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
|
||||
this.recipes = Array(this.ui.page_size).fill({loading: true})
|
||||
|
||||
this.$nextTick(function () {
|
||||
if (this.$cookies.isKey(UI_COOKIE_NAME)) {
|
||||
this.ui = Object.assign({}, this.ui, this.$cookies.get(UI_COOKIE_NAME))
|
||||
@ -1154,6 +1164,10 @@ export default {
|
||||
this.loadMealPlan()
|
||||
this.refreshData(false)
|
||||
})
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
this.debug = localStorage.getItem("DEBUG") == "True" || false
|
||||
},
|
||||
@ -1213,6 +1227,7 @@ export default {
|
||||
// this.genericAPI inherited from ApiMixin
|
||||
refreshData: _debounce(function (random) {
|
||||
this.recipes_loading = true
|
||||
this.recipes = Array(this.ui.page_size).fill({loading: true})
|
||||
let params = this.buildParams(random)
|
||||
this.genericAPI(this.Models.RECIPE, this.Actions.LIST, params)
|
||||
.then((result) => {
|
||||
@ -1500,10 +1515,10 @@ export default {
|
||||
this.genericAPI(this.Models.CUSTOM_FILTER, this.Actions.CREATE, params)
|
||||
.then((result) => {
|
||||
this.search.search_filter = result.data
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_CREATE)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_CREATE, err)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
},
|
||||
addField: function (field, count) {
|
||||
@ -1563,4 +1578,5 @@ export default {
|
||||
.vue-treeselect__control-arrow-container {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -38,7 +38,7 @@
|
||||
</div>
|
||||
<div class="my-auto mr-1">
|
||||
<span class="text-primary"><b>{{ $t("Preparation") }}</b></span><br/>
|
||||
{{ recipe.working_time }} {{ $t("min") }}
|
||||
{{ working_time }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -50,7 +50,7 @@
|
||||
</div>
|
||||
<div class="my-auto mr-1">
|
||||
<span class="text-primary"><b>{{ $t("Waiting") }}</b></span><br/>
|
||||
{{ recipe.waiting_time }} {{ $t("min") }}
|
||||
{{ waiting_time }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -75,7 +75,8 @@
|
||||
</div>
|
||||
|
||||
<div class="col col-md-2 col-2 mt-2 mt-md-0 text-right">
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings"></recipe-context-menu>
|
||||
<recipe-context-menu v-bind:recipe="recipe" :servings="servings"
|
||||
:disabled_options="{print:false}"></recipe-context-menu>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
@ -89,6 +90,7 @@
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:servings="servings"
|
||||
:header="true"
|
||||
:use_plural="use_plural"
|
||||
id="ingredient_container"
|
||||
@checked-state-changed="updateIngredientCheckedState"
|
||||
@change-servings="servings = $event"
|
||||
@ -103,13 +105,6 @@
|
||||
:style="{ 'max-height': ingredient_height }"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-top: 2vh; margin-bottom: 2vh">
|
||||
<div class="col-12">
|
||||
<Nutrition-component :recipe="recipe" id="nutrition_container"
|
||||
:ingredient_factor="ingredient_factor"></Nutrition-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -129,6 +124,7 @@
|
||||
:step="s"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:index="index"
|
||||
:use_plural="use_plural"
|
||||
:start_time="start_time"
|
||||
@update-start-time="updateStartTime"
|
||||
@checked-state-changed="updateIngredientCheckedState"
|
||||
@ -137,10 +133,19 @@
|
||||
|
||||
<div v-if="recipe.source_url !== null">
|
||||
<h6 class="d-print-none"><i class="fas fa-file-import"></i> {{ $t("Imported_From") }}</h6>
|
||||
<span class="text-muted mt-1"><a style="overflow-wrap: break-word;" :href="recipe.source_url">{{ recipe.source_url }}</a></span>
|
||||
<span class="text-muted mt-1"><a style="overflow-wrap: break-word;"
|
||||
:href="recipe.source_url">{{ recipe.source_url }}</a></span>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-top: 2vh; ">
|
||||
<div class="col-lg-6 offset-lg-3 col-12">
|
||||
<Nutrition-component :recipe="recipe" id="nutrition_container"
|
||||
:ingredient_factor="ingredient_factor"></Nutrition-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<add-recipe-to-book :recipe="recipe"></add-recipe-to-book>
|
||||
|
||||
<div class="row text-center d-print-none" style="margin-top: 3vh; margin-bottom: 3vh"
|
||||
@ -160,7 +165,7 @@ import "bootstrap-vue/dist/bootstrap-vue.css"
|
||||
import {apiLoadRecipe} from "@/utils/api"
|
||||
|
||||
import RecipeContextMenu from "@/components/RecipeContextMenu"
|
||||
import {ResolveUrlMixin, ToastMixin} from "@/utils/utils"
|
||||
import {ResolveUrlMixin, ToastMixin, calculateHourMinuteSplit} from "@/utils/utils"
|
||||
|
||||
import PdfViewer from "@/components/PdfViewer"
|
||||
import ImageViewer from "@/components/ImageViewer"
|
||||
@ -176,6 +181,7 @@ import KeywordsComponent from "@/components/KeywordsComponent"
|
||||
import NutritionComponent from "@/components/NutritionComponent"
|
||||
import RecipeSwitcher from "@/components/Buttons/RecipeSwitcher"
|
||||
import CustomInputSpinButton from "@/components/CustomInputSpinButton"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@ -206,9 +212,16 @@ export default {
|
||||
ingredient_count() {
|
||||
return this.recipe?.steps.map((x) => x.ingredients).flat().length
|
||||
},
|
||||
working_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.working_time)
|
||||
},
|
||||
waiting_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.waiting_time)
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
use_plural: false,
|
||||
loading: true,
|
||||
recipe: undefined,
|
||||
rootrecipe: undefined,
|
||||
@ -217,7 +230,7 @@ export default {
|
||||
start_time: "",
|
||||
share_uid: window.SHARE_UID,
|
||||
wake_lock: null,
|
||||
ingredient_height: '250'
|
||||
ingredient_height: '250',
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@ -230,6 +243,11 @@ export default {
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
this.requestWakeLock()
|
||||
window.addEventListener('resize', this.handleResize);
|
||||
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.destroyWakeLock()
|
||||
|
@ -151,6 +151,9 @@
|
||||
<b-form-checkbox v-model="space.show_facet_count"> Facet Count</b-form-checkbox>
|
||||
<span class="text-muted small">{{ $t('facet_count_info') }}</span><br/>
|
||||
|
||||
<b-form-checkbox v-model="space.use_plural">Use Plural form</b-form-checkbox>
|
||||
<span class="text-muted small">{{ $t('plural_usage_info') }}</span><br/>
|
||||
|
||||
<label>{{ $t('FoodInherit') }}</label>
|
||||
<generic-multiselect :initial_selection="space.food_inherit"
|
||||
:model="Models.FOOD_INHERIT_FIELDS"
|
||||
@ -204,7 +207,7 @@ Vue.use(VueClipboard)
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
export default {
|
||||
name: "SupermarketView",
|
||||
name: "SpaceManageView",
|
||||
mixins: [ResolveUrlMixin, ToastMixin, ApiMixin],
|
||||
components: {GenericMultiselect, GenericModalForm},
|
||||
data() {
|
||||
@ -225,7 +228,7 @@ export default {
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.retrieveSpace(this.ACTIVE_SPACE_ID).then(r => {
|
||||
apiFactory.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.space = r.data
|
||||
})
|
||||
apiFactory.listUserSpaces().then(r => {
|
||||
@ -249,7 +252,7 @@ export default {
|
||||
},
|
||||
updateSpace: function () {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.partialUpdateSpace(this.ACTIVE_SPACE_ID, this.space).then(r => {
|
||||
apiFactory.partialUpdateSpace(window.ACTIVE_SPACE_ID, this.space).then(r => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
|
@ -12,7 +12,7 @@
|
||||
<cookbook-edit-card :book="book" v-if="current_page === 1" v-on:editing="cookbook_editing = $event" v-on:refresh="$emit('refresh')" @reload="$emit('reload')"></cookbook-edit-card>
|
||||
</transition>
|
||||
<transition name="flip" mode="out-in">
|
||||
<recipe-card :recipe="display_recipes[0].recipe_content" v-if="current_page > 1" :key="display_recipes[0].recipe"></recipe-card>
|
||||
<recipe-card :recipe="display_recipes[0].recipe_content" v-if="current_page > 1" :key="display_recipes[0].recipe" :use_plural="use_plural"></recipe-card>
|
||||
</transition>
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
@ -20,7 +20,7 @@
|
||||
<cookbook-toc :recipes="recipes" v-if="current_page === 1" v-on:switchRecipe="switchRecipe($event)"></cookbook-toc>
|
||||
</transition>
|
||||
<transition name="flip" mode="out-in">
|
||||
<recipe-card :recipe="display_recipes[1].recipe_content" v-if="current_page > 1 && display_recipes.length === 2" :key="display_recipes[1].recipe"></recipe-card>
|
||||
<recipe-card :recipe="display_recipes[1].recipe_content" v-if="current_page > 1 && display_recipes.length === 2" :key="display_recipes[1].recipe" :use_plural="use_plural"></recipe-card>
|
||||
</transition>
|
||||
</div>
|
||||
<div class="col-md-1" @click="swipeLeft" style="cursor: pointer"></div>
|
||||
@ -34,7 +34,7 @@ import CookbookEditCard from "./CookbookEditCard"
|
||||
import CookbookToc from "./CookbookToc"
|
||||
import Vue2TouchEvents from "vue2-touch-events"
|
||||
import Vue from "vue"
|
||||
import { ApiApiFactory } from "../utils/openapi/api"
|
||||
import { ApiApiFactory } from "@/utils/openapi/api"
|
||||
|
||||
Vue.use(Vue2TouchEvents)
|
||||
|
||||
@ -56,6 +56,12 @@ export default {
|
||||
return this.recipes.slice((this.current_page - 1 - 1) * 2, (this.current_page - 1) * 2)
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
current_page: 1,
|
||||
@ -63,6 +69,7 @@ export default {
|
||||
bounce_left: false,
|
||||
bounce_right: false,
|
||||
cookbook_editing: false,
|
||||
use_plural: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
@ -23,6 +23,9 @@
|
||||
<b-card-body class="m-0 py-0">
|
||||
<b-card-text class="h-100 my-0 d-flex flex-column" style="text-overflow: ellipsis">
|
||||
<h5 class="m-0 mt-1 text-truncate">{{ item[title] }}</h5>
|
||||
<template v-if="use_plural">
|
||||
<div v-if="item[plural] !== '' && item[plural] !== null" class="m-0 text-truncate">({{ $t("plural_short") }}: {{ item[plural] }})</div>
|
||||
</template>
|
||||
<div class="m-0 text-truncate">{{ item[subtitle] }}</div>
|
||||
<div class="m-0 text-truncate small text-muted" v-if="getFullname">{{ getFullname }}</div>
|
||||
|
||||
@ -71,7 +74,11 @@
|
||||
<!-- recursively add child cards -->
|
||||
<div class="row" v-if="item.show_children">
|
||||
<div class="col-md-10 offset-md-2">
|
||||
<generic-horizontal-card v-for="child in item[children]" v-bind:key="child.id" :item="child" :model="model" @item-action="$emit('item-action', $event)"> </generic-horizontal-card>
|
||||
<generic-horizontal-card v-for="child in item[children]"
|
||||
v-bind:key="child.id"
|
||||
:item="child" :model="model"
|
||||
:use_plural="use_plural"
|
||||
@item-action="$emit('item-action', $event)"></generic-horizontal-card>
|
||||
</div>
|
||||
</div>
|
||||
<!-- conditionally view recipes -->
|
||||
@ -146,12 +153,14 @@ export default {
|
||||
item: { type: Object },
|
||||
model: { type: Object },
|
||||
title: { type: String, default: "name" }, // this and the following props need to be moved to model.js and made computed values
|
||||
plural: { type: String, default: "plural_name" },
|
||||
subtitle: { type: String, default: "description" },
|
||||
child_count: { type: String, default: "numchild" },
|
||||
children: { type: String, default: "children" },
|
||||
recipe_count: { type: String, default: "numrecipe" },
|
||||
recipes: { type: String, default: "recipes" },
|
||||
show_context_menu: { type: Boolean, default: true },
|
||||
use_plural: { type: Boolean, default: false},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -16,14 +16,43 @@
|
||||
v-html="calculateAmount(ingredient.amount)"></span>
|
||||
</td>
|
||||
<td @click="done">
|
||||
<span v-if="ingredient.unit !== null && !ingredient.no_amount">{{ ingredient.unit.name }}</span>
|
||||
<template v-if="ingredient.unit !== null && !ingredient.no_amount">
|
||||
<template v-if="!use_plural">
|
||||
<span>{{ ingredient.unit.name }}</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<template v-if="ingredient.unit.plural_name === '' || ingredient.unit.plural_name === null">
|
||||
<span>{{ ingredient.unit.name }}</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-if="ingredient.always_use_plural_unit">{{ ingredient.unit.plural_name}}</span>
|
||||
<span v-else-if="(ingredient.amount * this.ingredient_factor) > 1">{{ ingredient.unit.plural_name }}</span>
|
||||
<span v-else>{{ ingredient.unit.name }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</td>
|
||||
<td @click="done">
|
||||
<template v-if="ingredient.food !== null">
|
||||
<a :href="resolveDjangoUrl('view_recipe', ingredient.food.recipe.id)"
|
||||
v-if="ingredient.food.recipe !== null" target="_blank"
|
||||
rel="noopener noreferrer">{{ ingredient.food.name }}</a>
|
||||
<span v-if="ingredient.food.recipe === null">{{ ingredient.food.name }}</span>
|
||||
v-if="ingredient.food.recipe !== null" target="_blank"
|
||||
rel="noopener noreferrer">{{ ingredient.food.name }}</a>
|
||||
<template v-if="ingredient.food.recipe === null">
|
||||
<template v-if="!use_plural">
|
||||
<span>{{ ingredient.food.name }}</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<template v-if="ingredient.food.plural_name === '' || ingredient.food.plural_name === null">
|
||||
<span>{{ ingredient.food.name }}</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-if="ingredient.always_use_plural_food">{{ ingredient.food.plural_name }}</span>
|
||||
<span v-else-if="ingredient.no_amount">{{ ingredient.food.name }}</span>
|
||||
<span v-else-if="(ingredient.amount * this.ingredient_factor) > 1">{{ ingredient.food.plural_name }}</span>
|
||||
<span v-else>{{ ingredient.food.name }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</td>
|
||||
<td v-if="detailed">
|
||||
@ -55,6 +84,7 @@ export default {
|
||||
props: {
|
||||
ingredient: Object,
|
||||
ingredient_factor: {type: Number, default: 1},
|
||||
use_plural:{type: Boolean, default: false},
|
||||
detailed: {type: Boolean, default: true},
|
||||
},
|
||||
mixins: [ResolveUrlMixin],
|
||||
|
@ -24,6 +24,7 @@
|
||||
<ingredient-component
|
||||
:ingredient="i"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:use_plural="use_plural"
|
||||
:key="i.id"
|
||||
:detailed="detailed"
|
||||
@checked-state-changed="$emit('checked-state-changed', $event)"
|
||||
@ -45,7 +46,7 @@ import {BootstrapVue} from "bootstrap-vue"
|
||||
import "bootstrap-vue/dist/bootstrap-vue.css"
|
||||
|
||||
import IngredientComponent from "@/components/IngredientComponent"
|
||||
import {ApiMixin, StandardToasts} from "@/utils/utils"
|
||||
import {ApiMixin} from "@/utils/utils"
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
@ -63,33 +64,18 @@ export default {
|
||||
recipe: {type: Number},
|
||||
ingredient_factor: {type: Number, default: 1},
|
||||
servings: {type: Number, default: 1},
|
||||
use_plural: {type: Boolean, default: false},
|
||||
detailed: {type: Boolean, default: true},
|
||||
header: {type: Boolean, default: false},
|
||||
recipe_list: {type: Number, default: undefined},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
show_shopping: false,
|
||||
shopping_list: [],
|
||||
update_shopping: [],
|
||||
selected_shoppingrecipe: undefined,
|
||||
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
ShoppingRecipes() {
|
||||
// returns open shopping lists associated with this recipe
|
||||
let recipe_in_list = this.shopping_list
|
||||
.map((x) => {
|
||||
return {
|
||||
value: x?.list_recipe,
|
||||
text: x?.recipe_mealplan?.name,
|
||||
recipe: x?.recipe_mealplan?.recipe ?? 0,
|
||||
servings: x?.recipe_mealplan?.servings,
|
||||
}
|
||||
})
|
||||
.filter((x) => x?.recipe == this.recipe)
|
||||
return [...new Map(recipe_in_list.map((x) => [x["value"], x])).values()] // filter to unique lists
|
||||
},
|
||||
|
||||
},
|
||||
watch: {
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
||||
</b-input-group>
|
||||
</div>
|
||||
<div class="col-lg-6 d-none d-lg-block d-xl-block">
|
||||
<recipe-card v-if="entryEditing.recipe" :recipe="entryEditing.recipe" :detailed="false"></recipe-card>
|
||||
<recipe-card v-if="entryEditing.recipe" :recipe="entryEditing.recipe" :detailed="false" :use_plural="use_plural"></recipe-card>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3 mb-3">
|
||||
@ -144,6 +144,7 @@ export default {
|
||||
addshopping: false,
|
||||
reviewshopping: false,
|
||||
},
|
||||
use_plural: false,
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@ -171,7 +172,12 @@ export default {
|
||||
this.entryEditing.servings = newVal
|
||||
},
|
||||
},
|
||||
mounted: function () {},
|
||||
mounted: function () {
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
},
|
||||
computed: {
|
||||
autoMealPlan: function () {
|
||||
return getUserPreference("mealplan_autoadd_shopping")
|
||||
|
@ -1,201 +1,188 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-modal hide-footer :id="`shopping_${this.modal_id}`" @show="loadRecipe" body-class="p-3 pt-0 pt-md-3">
|
||||
<template v-slot:modal-title><h5>{{ $t("Add_Servings_to_Shopping", { servings: recipe_servings }) }}</h5></template>
|
||||
<loading-spinner v-if="loading"></loading-spinner>
|
||||
<div class="accordion" role="tablist" v-if="!loading">
|
||||
<b-card no-body class="mb-1">
|
||||
<b-card-header header-tag="header" class="p-0" role="tab">
|
||||
<b-button block v-b-toggle.accordion-0 class="text-left" variant="outline-info">{{ recipe.name }}</b-button>
|
||||
</b-card-header>
|
||||
<b-collapse id="accordion-0" class="p-2" visible accordion="my-accordion" role="tabpanel">
|
||||
<ingredients-card
|
||||
:steps="steps"
|
||||
:recipe="recipe.id"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:servings="recipe_servings"
|
||||
:add_shopping_mode="true"
|
||||
:recipe_list="list_recipe"
|
||||
:header="false"
|
||||
@add-to-shopping="addShopping($event)"
|
||||
@starting-cart="add_shopping = $event"
|
||||
/>
|
||||
</b-collapse>
|
||||
<!-- eslint-disable vue/no-v-for-template-key-on-child -->
|
||||
<template v-for="r in related_recipes">
|
||||
<b-card no-body class="mb-1" :key="r.recipe.id">
|
||||
<b-card-header header-tag="header" class="p-1" role="tab">
|
||||
<b-button btn-sm block v-b-toggle="'accordion-' + r.recipe.id" class="text-left" variant="outline-primary">{{ r.recipe.name }}</b-button>
|
||||
</b-card-header>
|
||||
<b-collapse :id="'accordion-' + r.recipe.id" accordion="my-accordion" role="tabpanel">
|
||||
<ingredients-card
|
||||
:steps="r.steps"
|
||||
:recipe="r.recipe.id"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:servings="recipe_servings"
|
||||
:add_shopping_mode="true"
|
||||
:recipe_list="list_recipe"
|
||||
:header="false"
|
||||
@add-to-shopping="addShopping($event)"
|
||||
@starting-cart="add_shopping = [...add_shopping, ...$event]"
|
||||
/>
|
||||
</b-collapse>
|
||||
</b-card>
|
||||
</template>
|
||||
<!-- eslint-disable vue/no-v-for-template-key-on-child -->
|
||||
</b-card>
|
||||
</div>
|
||||
<div>
|
||||
<b-modal hide-footer :id="`shopping_${this.modal_id}`" @show="loadRecipe" body-class="p-3 pt-0 pt-md-3">
|
||||
<template v-slot:modal-title><h5>{{ $t("Add_Servings_to_Shopping", {servings: recipe_servings}) }}</h5></template>
|
||||
<loading-spinner v-if="loading"></loading-spinner>
|
||||
<div class="accordion" role="tablist" v-if="!loading">
|
||||
<b-card no-body class="mb-1">
|
||||
<b-card-header header-tag="header" class="p-0" role="tab">
|
||||
<b-button block v-b-toggle.accordion-0 class="text-left" variant="outline-info">{{ recipe.name }}</b-button>
|
||||
</b-card-header>
|
||||
<b-collapse id="accordion-0" class="p-2" visible accordion="my-accordion" role="tabpanel">
|
||||
|
||||
<div>
|
||||
<b-input-group>
|
||||
<b-input-group-prepend is-text class="d-inline-flex">
|
||||
<i class="fa fa-calculator"></i>
|
||||
</b-input-group-prepend>
|
||||
<b-form-spinbutton min="1" v-model="recipe_servings" inline style="height: 3em"></b-form-spinbutton>
|
||||
<!-- <CustomInputSpinButton v-model.number="recipe_servings" style="height: 3em" /> -->
|
||||
<div v-for="i in steps.flatMap(s => s.ingredients)" v-bind:key="i.id">
|
||||
<table class="table table-sm mb-0">
|
||||
|
||||
<b-input-group-append class="d-inline-flex">
|
||||
<b-button variant="success" @click="saveShopping" class="d-none d-lg-inline-block">{{ $t("Save") }} </b-button>
|
||||
<b-button variant="success" @click="saveShopping" class="d-inline-block d-lg-none"><i class="fa fa-cart-plus"></i></b-button>
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
<ingredient-component
|
||||
:use_plural="true"
|
||||
:key="i.id"
|
||||
:detailed="true"
|
||||
:ingredient="i"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
@checked-state-changed="$set(i, 'checked', !i.checked)"
|
||||
/>
|
||||
</table>
|
||||
</div>
|
||||
</b-collapse>
|
||||
<!-- eslint-disable vue/no-v-for-template-key-on-child -->
|
||||
<template v-for="r in related_recipes">
|
||||
<b-card no-body class="mb-1" :key="r.recipe.id">
|
||||
<b-card-header header-tag="header" class="p-1" role="tab">
|
||||
<b-button btn-sm block v-b-toggle="'accordion-' + r.recipe.id" class="text-left" variant="outline-primary">{{ r.recipe.name }}</b-button>
|
||||
</b-card-header>
|
||||
<b-collapse :id="'accordion-' + r.recipe.id" accordion="my-accordion" role="tabpanel">
|
||||
|
||||
<div v-for="i in r.steps.flatMap(s => s.ingredients)" v-bind:key="i.id">
|
||||
<table class="table table-sm mb-0">
|
||||
<ingredient-component
|
||||
:use_plural="true"
|
||||
:key="i.id"
|
||||
:detailed="true"
|
||||
:ingredient="i"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
@checked-state-changed="$set(i, 'checked', !i.checked)"
|
||||
/>
|
||||
</table>
|
||||
</div>
|
||||
</b-collapse>
|
||||
</b-card>
|
||||
</template>
|
||||
<!-- eslint-disable vue/no-v-for-template-key-on-child -->
|
||||
</b-card>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<b-input-group>
|
||||
<b-input-group-prepend is-text class="d-inline-flex">
|
||||
<i class="fa fa-calculator"></i>
|
||||
</b-input-group-prepend>
|
||||
<b-form-spinbutton min="1" v-model="recipe_servings" inline style="height: 3em"></b-form-spinbutton>
|
||||
<!-- <CustomInputSpinButton v-model.number="recipe_servings" style="height: 3em" /> -->
|
||||
|
||||
<b-input-group-append class="d-inline-flex">
|
||||
<b-button variant="success" @click="saveShopping" class="d-none d-lg-inline-block">{{ $t("Save") }}</b-button>
|
||||
<b-button variant="success" @click="saveShopping" class="d-inline-block d-lg-none"><i class="fa fa-cart-plus"></i></b-button>
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from "vue"
|
||||
import { BootstrapVue } from "bootstrap-vue"
|
||||
import {BootstrapVue} from "bootstrap-vue"
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
const { ApiApiFactory } = require("@/utils/openapi/api")
|
||||
import { StandardToasts } from "@/utils/utils"
|
||||
import IngredientsCard from "@/components/IngredientsCard"
|
||||
const {ApiApiFactory} = require("@/utils/openapi/api")
|
||||
import {StandardToasts} from "@/utils/utils"
|
||||
import IngredientComponent from "@/components/IngredientComponent"
|
||||
import LoadingSpinner from "@/components/LoadingSpinner"
|
||||
// import CustomInputSpinButton from "@/components/CustomInputSpinButton"
|
||||
|
||||
export default {
|
||||
name: "ShoppingModal",
|
||||
components: { IngredientsCard, LoadingSpinner },
|
||||
mixins: [],
|
||||
props: {
|
||||
recipe: { required: true, type: Object },
|
||||
servings: { type: Number, default: undefined },
|
||||
modal_id: { required: true, type: Number },
|
||||
mealplan: { type: Number, default: undefined },
|
||||
list_recipe: { type: Number, default: undefined },
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
steps: [],
|
||||
recipe_servings: undefined,
|
||||
add_shopping: [],
|
||||
related_recipes: [],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.recipe_servings = this.servings
|
||||
},
|
||||
computed: {
|
||||
ingredient_factor: function () {
|
||||
return this.recipe_servings / this.recipe.servings
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
servings: function (newVal) {
|
||||
this.recipe_servings = parseInt(newVal)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
loadRecipe: function () {
|
||||
this.add_shopping = []
|
||||
this.related_recipes = []
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient
|
||||
.retrieveRecipe(this.recipe.id)
|
||||
.then((result) => {
|
||||
this.steps = result.data.steps
|
||||
// ALERT: this will all break if ingredients are re-used between recipes
|
||||
// ALERT: this also doesn't quite work right if the same recipe appears multiple time in the related recipes
|
||||
if (!this.recipe_servings) {
|
||||
this.recipe_servings = result.data?.servings
|
||||
}
|
||||
this.loading = false
|
||||
})
|
||||
.then(() => {
|
||||
// get a list of related recipes
|
||||
apiClient
|
||||
.relatedRecipe(this.recipe.id)
|
||||
.then((result) => {
|
||||
return result.data
|
||||
})
|
||||
.then((related_recipes) => {
|
||||
let promises = []
|
||||
related_recipes.forEach((x) => {
|
||||
promises.push(
|
||||
apiClient.listSteps(x.id).then((recipe_steps) => {
|
||||
this.related_recipes.push({
|
||||
recipe: x,
|
||||
steps: recipe_steps.data.results.filter((x) => x.ingredients.length > 0),
|
||||
})
|
||||
})
|
||||
)
|
||||
})
|
||||
return Promise.all(promises)
|
||||
})
|
||||
// .then(() => {
|
||||
// if (!this.list_recipe) {
|
||||
// this.add_shopping = [
|
||||
// ...this.add_shopping,
|
||||
// ...this.related_recipes
|
||||
// .map((x) => x.steps)
|
||||
// .flat()
|
||||
// .map((x) => x.ingredients)
|
||||
// .flat()
|
||||
// .filter((x) => !x.food.override_ignore)
|
||||
// .map((x) => x.id),
|
||||
// ]
|
||||
// }
|
||||
// })
|
||||
})
|
||||
},
|
||||
addShopping: function (e) {
|
||||
if (e.add) {
|
||||
this.add_shopping.push(e.item.id)
|
||||
} else {
|
||||
this.add_shopping = this.add_shopping.filter((x) => x !== e.item.id)
|
||||
}
|
||||
},
|
||||
saveShopping: function () {
|
||||
// another choice would be to create ShoppingListRecipes for each recipe - this bundles all related recipe under the parent recipe
|
||||
let shopping_recipe = {
|
||||
id: this.recipe.id,
|
||||
ingredients: this.add_shopping,
|
||||
servings: this.recipe_servings,
|
||||
mealplan: this.mealplan,
|
||||
list_recipe: this.list_recipe,
|
||||
}
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient
|
||||
.shoppingRecipe(this.recipe.id, shopping_recipe)
|
||||
.then((result) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_CREATE)
|
||||
this.$emit("finish")
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
name: "ShoppingModal",
|
||||
components: {LoadingSpinner, IngredientComponent},
|
||||
mixins: [],
|
||||
props: {
|
||||
recipe: {required: true, type: Object},
|
||||
servings: {type: Number, default: undefined},
|
||||
modal_id: {required: true, type: Number},
|
||||
mealplan: {type: Number, default: undefined},
|
||||
list_recipe: {type: Number, default: undefined},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
steps: [],
|
||||
recipe_servings: undefined,
|
||||
add_shopping: [],
|
||||
related_recipes: [],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.recipe_servings = this.servings
|
||||
},
|
||||
computed: {
|
||||
ingredient_factor: function () {
|
||||
return this.recipe_servings / this.recipe.servings
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
servings: function (newVal) {
|
||||
this.recipe_servings = parseInt(newVal)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
loadRecipe: function () {
|
||||
this.add_shopping = []
|
||||
this.related_recipes = []
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient
|
||||
.retrieveRecipe(this.recipe.id)
|
||||
.then((result) => {
|
||||
this.steps = result.data.steps
|
||||
// ALERT: this will all break if ingredients are re-used between recipes
|
||||
// ALERT: this also doesn't quite work right if the same recipe appears multiple time in the related recipes
|
||||
if (!this.recipe_servings) {
|
||||
this.recipe_servings = result.data?.servings
|
||||
}
|
||||
this.steps.forEach(s => s.ingredients.filter(i => i.food.food_onhand === false).forEach(i => this.$set(i, 'checked', true)))
|
||||
this.loading = false
|
||||
})
|
||||
.then(() => {
|
||||
// get a list of related recipes
|
||||
apiClient
|
||||
.relatedRecipe(this.recipe.id)
|
||||
.then((result) => {
|
||||
return result.data
|
||||
})
|
||||
.then((related_recipes) => {
|
||||
let promises = []
|
||||
related_recipes.forEach((x) => {
|
||||
promises.push(
|
||||
apiClient.listSteps(x.id).then((recipe_steps) => {
|
||||
let sub_recipe_steps = recipe_steps.data.results.filter((x) => x.ingredients.length > 0)
|
||||
sub_recipe_steps.forEach(s => s.ingredients.filter(i => i.food.food_onhand === false).forEach(i => this.$set(i, 'checked', true)))
|
||||
this.related_recipes.push({
|
||||
recipe: x,
|
||||
steps: sub_recipe_steps,
|
||||
})
|
||||
})
|
||||
)
|
||||
})
|
||||
return Promise.all(promises)
|
||||
})
|
||||
})
|
||||
},
|
||||
saveShopping: function () {
|
||||
// another choice would be to create ShoppingListRecipes for each recipe - this bundles all related recipe under the parent recipe
|
||||
let shopping_recipe = {
|
||||
id: this.recipe.id,
|
||||
ingredients: this.steps.flatMap(s => s.ingredients.filter(i => i.checked === true).flatMap(i => i.id)).concat(this.related_recipes.flatMap(r => r.steps.flatMap(rs => rs.ingredients.filter(i => i.checked === true).flatMap(i => i.id)))),
|
||||
servings: this.recipe_servings,
|
||||
mealplan: this.mealplan,
|
||||
list_recipe: this.list_recipe,
|
||||
}
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.shoppingRecipe(this.recipe.id, shopping_recipe)
|
||||
.then((result) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
this.$emit("finish")
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
|
||||
this.$bvModal.hide(`shopping_${this.modal_id}`)
|
||||
},
|
||||
},
|
||||
this.$bvModal.hide(`shopping_${this.modal_id}`)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.b-form-spinbutton.form-control {
|
||||
background-color: #e9ecef;
|
||||
border: 1px solid #ced4da;
|
||||
background-color: #e9ecef;
|
||||
border: 1px solid #ced4da;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,65 +1,109 @@
|
||||
<template>
|
||||
<b-card no-body v-hover v-if="recipe">
|
||||
<a :href="this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null">
|
||||
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="recipe_image" v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
|
||||
<div 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" v-if="recipe !== null"></recipe-context-menu>
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-img-overlay w-50 d-flex flex-column justify-content-left float-left text-left pt-2" v-if="recipe.working_time !== 0 || recipe.waiting_time !== 0">
|
||||
<b-badge pill variant="light" class="mt-1 font-weight-normal" v-if="recipe.working_time !== 0"><i class="fa fa-clock"></i> {{ recipe.working_time }} {{ $t("min") }} </b-badge>
|
||||
<b-badge pill variant="secondary" class="mt-1 font-weight-normal" v-if="recipe.waiting_time !== 0"><i class="fa fa-pause"></i> {{ recipe.waiting_time }} {{ $t("min") }} </b-badge>
|
||||
</div>
|
||||
</a>
|
||||
<div>
|
||||
<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>
|
||||
|
||||
<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="(20 + Math.random() * 25).toString() + '%'"></b-skeleton>
|
||||
<b-skeleton height="12px" :width="(30 + Math.random() * 35).toString() + '%'"></b-skeleton>
|
||||
</b-card-text>
|
||||
</b-card-body>
|
||||
</b-card>
|
||||
</template>
|
||||
<template v-else>
|
||||
<b-card no-body v-hover v-if="recipe">
|
||||
|
||||
<b-card-body class="p-4">
|
||||
<h6>
|
||||
<a :href="this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null">
|
||||
<template v-if="recipe !== null">{{ recipe.name }}</template>
|
||||
<template v-else>{{ meal_plan.title }}</template>
|
||||
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="recipe_image"
|
||||
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
|
||||
<div
|
||||
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" :disabled_options="context_disabled_options"
|
||||
v-if="recipe !== null"></recipe-context-menu>
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-img-overlay w-50 d-flex flex-column justify-content-left float-left text-left pt-2"
|
||||
v-if="recipe.working_time !== 0 || recipe.waiting_time !== 0">
|
||||
<b-badge pill variant="light" class="mt-1 font-weight-normal" v-if="recipe.working_time !== 0">
|
||||
<i
|
||||
class="fa fa-clock"></i> {{ working_time }}
|
||||
</b-badge>
|
||||
<b-badge pill variant="secondary" class="mt-1 font-weight-normal"
|
||||
v-if="recipe.waiting_time !== 0">
|
||||
<i class="fa fa-pause"></i> {{ waiting_time }}
|
||||
</b-badge>
|
||||
</div>
|
||||
</a>
|
||||
</h6>
|
||||
|
||||
<b-card-text style="text-overflow: ellipsis">
|
||||
<template v-if="recipe !== null">
|
||||
<recipe-rating :recipe="recipe"></recipe-rating>
|
||||
<template v-if="recipe.description !== null && recipe.description !== undefined">
|
||||
<b-card-body class="p-4">
|
||||
<h6>
|
||||
<a :href="this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null">
|
||||
<template v-if="recipe !== null">{{ recipe.name }}</template>
|
||||
<template v-else>{{ meal_plan.title }}</template>
|
||||
</a>
|
||||
</h6>
|
||||
|
||||
<b-card-text style="text-overflow: ellipsis">
|
||||
<template v-if="recipe !== null">
|
||||
<recipe-rating :recipe="recipe"></recipe-rating>
|
||||
<template v-if="recipe.description !== null && recipe.description !== undefined">
|
||||
<span v-if="recipe.description.length > text_length">
|
||||
{{ recipe.description.substr(0, text_length) + "\u2026" }}
|
||||
</span>
|
||||
<span v-if="recipe.description.length <= text_length">
|
||||
<span v-if="recipe.description.length <= text_length">
|
||||
{{ recipe.description }}
|
||||
</span>
|
||||
</template>
|
||||
<p class="mt-1">
|
||||
<last-cooked :recipe="recipe"></last-cooked>
|
||||
<keywords-component :recipe="recipe" style="margin-top: 4px; position: relative; z-index: 3;"></keywords-component>
|
||||
</p>
|
||||
<transition name="fade" mode="in-out">
|
||||
<div class="row mt-3" v-if="show_detail">
|
||||
<div class="col-md-12">
|
||||
<h6 class="card-title"><i class="fas fa-pepper-hot"></i> {{ $t("Ingredients") }}</h6>
|
||||
</template>
|
||||
<p class="mt-1">
|
||||
<last-cooked :recipe="recipe"></last-cooked>
|
||||
<keywords-component :recipe="recipe"
|
||||
style="margin-top: 4px; position: relative; z-index: 3;"></keywords-component>
|
||||
</p>
|
||||
<transition name="fade" mode="in-out">
|
||||
<div class="row mt-3" v-if="show_detail">
|
||||
<div class="col-md-12">
|
||||
<h6 class="card-title"><i class="fas fa-pepper-hot"></i> {{ $t("Ingredients") }}
|
||||
</h6>
|
||||
|
||||
<ingredients-card :steps="recipe.steps" :header="false" :detailed="false" :servings="recipe.servings" />
|
||||
<ingredients-card
|
||||
:steps="recipe.steps"
|
||||
:header="false"
|
||||
:detailed="false"
|
||||
:servings="recipe.servings"
|
||||
:use_plural="use_plural" />
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
|
||||
<b-badge pill variant="info" v-if="!recipe.internal">{{ $t("External") }}</b-badge>
|
||||
</template>
|
||||
<template v-else>{{ meal_plan.note }}</template>
|
||||
</b-card-text>
|
||||
</b-card-body>
|
||||
<b-badge pill variant="info" v-if="!recipe.internal">{{ $t("External") }}</b-badge>
|
||||
</template>
|
||||
<template v-else>{{ meal_plan.note }}</template>
|
||||
</b-card-text>
|
||||
</b-card-body>
|
||||
|
||||
<b-card-footer v-if="footer_text !== undefined"><i v-bind:class="footer_icon"></i> {{ footer_text }}
|
||||
</b-card-footer>
|
||||
</b-card>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
|
||||
<b-card-footer v-if="footer_text !== undefined"> <i v-bind:class="footer_icon"></i> {{ footer_text }} </b-card-footer>
|
||||
</b-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import RecipeContextMenu from "@/components/RecipeContextMenu"
|
||||
import KeywordsComponent from "@/components/KeywordsComponent"
|
||||
import { resolveDjangoUrl, ResolveUrlMixin } from "@/utils/utils"
|
||||
import {resolveDjangoUrl, ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils"
|
||||
import RecipeRating from "@/components/RecipeRating"
|
||||
import moment from "moment/moment"
|
||||
import Vue from "vue"
|
||||
@ -71,16 +115,31 @@ Vue.prototype.moment = moment
|
||||
export default {
|
||||
name: "RecipeCard",
|
||||
mixins: [ResolveUrlMixin],
|
||||
components: { LastCooked, RecipeRating, KeywordsComponent, "recipe-context-menu": RecipeContextMenu, IngredientsCard },
|
||||
components: {
|
||||
LastCooked,
|
||||
RecipeRating,
|
||||
KeywordsComponent,
|
||||
"recipe-context-menu": RecipeContextMenu,
|
||||
IngredientsCard
|
||||
},
|
||||
props: {
|
||||
recipe: Object,
|
||||
meal_plan: Object,
|
||||
use_plural: { type: Boolean, default: false},
|
||||
footer_text: String,
|
||||
footer_icon: String,
|
||||
detailed: { type: Boolean, default: true },
|
||||
show_context_menu: { type: Boolean, default: true }
|
||||
detailed: {type: Boolean, default: true},
|
||||
show_context_menu: {type: Boolean, default: true},
|
||||
context_disabled_options: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
placeholder_image: window.IMAGE_PLACEHOLDER,
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
},
|
||||
mounted() {},
|
||||
computed: {
|
||||
show_detail: function () {
|
||||
return this.recipe?.steps !== undefined && this.detailed
|
||||
@ -99,10 +158,14 @@ export default {
|
||||
return this.recipe.image
|
||||
}
|
||||
},
|
||||
working_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.working_time)
|
||||
},
|
||||
waiting_time: function () {
|
||||
return calculateHourMinuteSplit(this.recipe.waiting_time)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
methods: {},
|
||||
directives: {
|
||||
hover: {
|
||||
inserted: function (el) {
|
||||
@ -123,7 +186,9 @@ export default {
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.5s;
|
||||
}
|
||||
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
|
||||
|
||||
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */
|
||||
{
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,64 +1,86 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="dropdown d-print-none">
|
||||
<a class="btn shadow-none" href="javascript:void(0);" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<a class="btn shadow-none" href="javascript:void(0);" role="button" id="dropdownMenuLink"
|
||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-lg"></i>
|
||||
</a>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink">
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)"><i class="fas fa-pencil-alt fa-fw"></i> {{ $t("Edit") }}</a>
|
||||
<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>
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('edit_convert_recipe', recipe.id)"
|
||||
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 class="fas fa-bookmark fa-fw"></i> {{ $t("Manage_Books") }}</button>
|
||||
<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 class="fas fa-shopping-cart fa-fw"></i> {{ $t("Add_to_Shopping") }} </a>
|
||||
<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 class="fas fa-calendar fa-fw"></i> {{ $t("Add_to_Plan") }} </a>
|
||||
<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 class="fas fa-clipboard-list fa-fw"></i> {{ $t("Log_Cooking") }}</button>
|
||||
<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> {{ $t("copy_to_new") }}</button>
|
||||
<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>
|
||||
<a class="dropdown-item" :href="resolveDjangoUrl('view_export') + '?r=' + recipe.id" target="_blank"
|
||||
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") }}
|
||||
{{ isPinned ? $t("Unpin") : $t("Pin")}}
|
||||
</button>
|
||||
</a>
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal"><i class="fas fa-share-alt fa-fw"></i> {{ $t("Share") }}</button>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<cook-log :recipe="recipe" :modal_id="modal_id"></cook-log>
|
||||
<add-recipe-to-book :recipe="recipe" :modal_id="modal_id" :entryEditing_inital_servings="servings_value"></add-recipe-to-book>
|
||||
<shopping-modal :recipe="recipe" :servings="servings_value" :modal_id="modal_id" :mealplan="undefined" />
|
||||
<add-recipe-to-book :recipe="recipe" :modal_id="modal_id"
|
||||
:entryEditing_inital_servings="servings_value"></add-recipe-to-book>
|
||||
<shopping-modal :recipe="recipe" :servings="servings_value" :modal_id="modal_id" :mealplan="undefined"/>
|
||||
|
||||
<b-modal :id="`modal-share-link_${modal_id}`" v-bind:title="$t('Share')" hide-footer>
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<label v-if="recipe_share_link !== undefined">{{ $t("Public share link") }}</label>
|
||||
<input ref="share_link_ref" class="form-control" v-model="recipe_share_link" />
|
||||
<b-button class="mt-2 mb-3 d-none d-md-inline" variant="secondary" @click="$bvModal.hide(`modal-share-link_${modal_id}`)">{{ $t("Close") }} </b-button>
|
||||
<b-button class="mt-2 mb-3 ml-md-2" variant="primary" @click="copyShareLink()">{{ $t("Copy") }} </b-button>
|
||||
<b-button class="mt-2 mb-3 ml-2 float-right" variant="success" @click="shareIntend()">{{ $t("Share") }} <i class="fa fa-share-alt"></i></b-button>
|
||||
<input ref="share_link_ref" class="form-control" v-model="recipe_share_link"/>
|
||||
<b-button class="mt-2 mb-3 d-none d-md-inline" variant="secondary"
|
||||
@click="$bvModal.hide(`modal-share-link_${modal_id}`)">{{ $t("Close") }}
|
||||
</b-button>
|
||||
<b-button class="mt-2 mb-3 ml-md-2" variant="primary" @click="copyShareLink()">{{
|
||||
$t("Copy")
|
||||
}}
|
||||
</b-button>
|
||||
<b-button class="mt-2 mb-3 ml-2 float-right" variant="success" @click="shareIntend()">{{
|
||||
$t("Share")
|
||||
}} <i class="fa fa-share-alt"></i></b-button>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
@ -75,7 +97,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { makeToast, resolveDjangoUrl, ResolveUrlMixin, StandardToasts } from "@/utils/utils"
|
||||
import {makeToast, resolveDjangoUrl, ResolveUrlMixin, StandardToasts} from "@/utils/utils"
|
||||
import CookLog from "@/components/CookLog"
|
||||
import axios from "axios"
|
||||
import AddRecipeToBook from "@/components/Modals/AddRecipeToBook"
|
||||
@ -83,7 +105,7 @@ import MealPlanEditModal from "@/components/MealPlanEditModal"
|
||||
import ShoppingModal from "@/components/Modals/ShoppingModal"
|
||||
import moment from "moment"
|
||||
import Vue from "vue"
|
||||
import { ApiApiFactory } from "@/utils/openapi/api"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api"
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@ -99,6 +121,7 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
servings_value: 0,
|
||||
isPinned: false,
|
||||
recipe_share_link: undefined,
|
||||
modal_id: Math.round(Math.random() * 100000),
|
||||
options: {
|
||||
@ -116,7 +139,7 @@ export default {
|
||||
},
|
||||
},
|
||||
entryEditing: {},
|
||||
mealplan: undefined,
|
||||
mealplan: undefined
|
||||
}
|
||||
},
|
||||
props: {
|
||||
@ -125,13 +148,21 @@ 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
|
||||
|
||||
let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || []
|
||||
this.isPinned = pinnedRecipes.some((r) => r.id == this.recipe.id);
|
||||
},
|
||||
watch: {
|
||||
recipe: {
|
||||
handler() {},
|
||||
handler() {
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
servings: function (newVal) {
|
||||
@ -139,9 +170,16 @@ export default {
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
pinRecipe: function () {
|
||||
pinRecipe () {
|
||||
let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || []
|
||||
pinnedRecipes.push({ id: this.recipe.id, name: this.recipe.name })
|
||||
if(this.isPinned) {
|
||||
pinnedRecipes = pinnedRecipes.filter((r) => r.id !== this.recipe.id)
|
||||
makeToast(this.$t("Unpin"), this.$t("UnpinnedConfirmation", {recipe: this.recipe.name}), "info")
|
||||
} else {
|
||||
pinnedRecipes.push({id: this.recipe.id, name: this.recipe.name})
|
||||
makeToast(this.$t("Pin"), this.$t("PinnedConfirmation", {recipe: this.recipe.name}), "info")
|
||||
}
|
||||
this.isPinned = !this.isPinned
|
||||
localStorage.setItem("pinned_recipes", JSON.stringify(pinnedRecipes))
|
||||
},
|
||||
saveMealPlan: function (entry) {
|
||||
@ -159,10 +197,10 @@ export default {
|
||||
this.servings_value = result.data.servings
|
||||
this.addToShopping()
|
||||
}
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_CREATE)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_CREATE, err)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
},
|
||||
createMealPlan(data) {
|
||||
@ -174,17 +212,17 @@ export default {
|
||||
})
|
||||
},
|
||||
createShareLink: function () {
|
||||
axios
|
||||
.get(resolveDjangoUrl("api_share_link", this.recipe.id))
|
||||
.then((result) => {
|
||||
this.$bvModal.show(`modal-share-link_${this.modal_id}`)
|
||||
this.recipe_share_link = result.data.link
|
||||
})
|
||||
.catch((err) => {
|
||||
if (err.response.status === 403) {
|
||||
makeToast(this.$t("Share"), this.$t("Sharing is not enabled for this space."), "danger")
|
||||
}
|
||||
})
|
||||
console.log('create')
|
||||
axios.get(resolveDjangoUrl("api_share_link", this.recipe.id)).then((result) => {
|
||||
console.log('success')
|
||||
this.$bvModal.show(`modal-share-link_${this.modal_id}`)
|
||||
this.recipe_share_link = result.data.link
|
||||
}).catch((err) => {
|
||||
console.log('fail')
|
||||
if (err.response.status === 403) {
|
||||
makeToast(this.$t("Share"), this.$t("Sharing is not enabled for this space or your user account."), "danger")
|
||||
}
|
||||
})
|
||||
},
|
||||
copyShareLink: function () {
|
||||
let share_input = this.$refs.share_link_ref
|
||||
@ -207,29 +245,29 @@ export default {
|
||||
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveRecipe(this.recipe.id).then((results) => {
|
||||
let recipe = { ...results.data, ...{ id: undefined, name: recipe_name } }
|
||||
let recipe = {...results.data, ...{id: undefined, name: recipe_name}}
|
||||
recipe.steps = recipe.steps.map((step) => {
|
||||
return {
|
||||
...step,
|
||||
...{
|
||||
id: undefined,
|
||||
ingredients: step.ingredients.map((ingredient) => {
|
||||
return { ...ingredient, ...{ id: undefined } }
|
||||
return {...ingredient, ...{id: undefined}}
|
||||
}),
|
||||
},
|
||||
}
|
||||
})
|
||||
if (recipe.nutrition !== null){
|
||||
if (recipe.nutrition !== null) {
|
||||
delete recipe.nutrition.id
|
||||
}
|
||||
apiClient
|
||||
.createRecipe(recipe)
|
||||
.then((new_recipe) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.SUCCESS_CREATE)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
window.open(this.resolveDjangoUrl("view_recipe", new_recipe.data.id))
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this,StandardToasts.FAIL_CREATE, err)
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
<b-form-group :label="$t('Share')" :description="$t('plan_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
@change="user_preferences.plan_share = $event.val;updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.plan_share"
|
||||
label="display_name"
|
||||
@ -57,7 +57,7 @@ export default {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
if (reload !== undefined) {
|
||||
if (reload) {
|
||||
location.reload()
|
||||
}
|
||||
}).catch(err => {
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div v-if="user_preferences !== undefined">
|
||||
<b-form-group :label="$t('shopping_share')" :description="$t('shopping_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
@change="user_preferences.shopping_share = $event.val; updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.shopping_share"
|
||||
label="display_name"
|
||||
|
@ -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">
|
||||
|
@ -8,7 +8,7 @@
|
||||
<template v-if="step.name">{{ step.name }}</template>
|
||||
<template v-else>{{ $t("Step") }} {{ index + 1 }}</template>
|
||||
<small style="margin-left: 4px" class="text-muted" v-if="step.time !== 0"><i
|
||||
class="fas fa-user-clock"></i> {{ step.time }} {{ $t("min") }} </small>
|
||||
class="fas fa-user-clock"></i> {{ step_time }}</small>
|
||||
<small v-if="start_time !== ''" class="d-print-none">
|
||||
<b-link :id="`id_reactive_popover_${step.id}`" @click="openPopover" href="#">
|
||||
{{ moment(start_time).add(step.time_offset, "minutes").format("HH:mm") }}
|
||||
@ -35,7 +35,7 @@
|
||||
<div class="col col-md-4"
|
||||
v-if="step.ingredients.length > 0 && (recipe.steps.length > 1 || force_ingredients)">
|
||||
<table class="table table-sm">
|
||||
<ingredients-card :steps="[step]" :ingredient_factor="ingredient_factor"
|
||||
<ingredients-card :steps="[step]" :ingredient_factor="ingredient_factor" :use_plural="use_plural"
|
||||
@checked-state-changed="$emit('checked-state-changed', $event)"/>
|
||||
</table>
|
||||
</div>
|
||||
@ -90,6 +90,7 @@
|
||||
:index="index"
|
||||
:start_time="start_time"
|
||||
:force_ingredients="true"
|
||||
:use_plural="use_plural"
|
||||
></step-component>
|
||||
</div>
|
||||
</div>
|
||||
@ -131,7 +132,7 @@ import CompileComponent from "@/components/CompileComponent"
|
||||
import IngredientsCard from "@/components/IngredientsCard"
|
||||
import Vue from "vue"
|
||||
import moment from "moment"
|
||||
import {ResolveUrlMixin} from "@/utils/utils"
|
||||
import {ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils"
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@ -149,6 +150,14 @@ export default {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
use_plural: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
step_time: function() {
|
||||
return calculateHourMinuteSplit(this.step.time)},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -425,5 +425,12 @@
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": ""
|
||||
"Valid Until": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -410,5 +410,12 @@
|
||||
"Warning_Delete_Supermarket_Category": "Изтриването на категория супермаркет ще изтрие и всички връзки с храни. Сигурен ли си?",
|
||||
"New_Supermarket": "Създайте нов супермаркет",
|
||||
"New_Supermarket_Category": "Създаване на нова категория супермаркет",
|
||||
"Are_You_Sure": "Сигурен ли си?"
|
||||
"Are_You_Sure": "Сигурен ли си?",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -458,5 +458,12 @@
|
||||
"Days": "Dage",
|
||||
"Message": "Besked",
|
||||
"Sticky_Nav": "Fastlåst navigation",
|
||||
"reset_food_inheritance": "Nulstil nedarvning"
|
||||
"reset_food_inheritance": "Nulstil nedarvning",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -415,5 +415,57 @@
|
||||
"Invites": "Einladungen",
|
||||
"Message": "Nachricht",
|
||||
"Bookmarklet": "Lesezeichen",
|
||||
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen."
|
||||
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen.",
|
||||
"substitute_children": "Ersatzkinder",
|
||||
"Decimals": "Nachkommastellen",
|
||||
"Default_Unit": "Standardeinheit",
|
||||
"Use_Fractions": "Bruchschreibweise verwenden",
|
||||
"Use_Fractions_Help": "Nachkommastellen automatisch in Bruchschreibweise konvertieren, wenn ein Rezept angeschaut wird.",
|
||||
"Language": "Sprache",
|
||||
"Theme": "Thema",
|
||||
"Hour": "Stunde",
|
||||
"Day": "Tag",
|
||||
"Days": "Tage",
|
||||
"Second": "Sekunde",
|
||||
"Seconds": "Sekunden",
|
||||
"API": "API",
|
||||
"Nav_Color": "Farbe der Navigationsleiste",
|
||||
"Nav_Color_Help": "Farbe der Navigationsleiste ändern.",
|
||||
"Use_Kj": "kJ anstelle von kcal verwenden",
|
||||
"Manage_Emails": "E-Mails verwalten",
|
||||
"Social_Authentication": "Authentifizierung über ein soziales Netzwerk",
|
||||
"Disabled": "Deaktiviert",
|
||||
"Disable": "Deaktivieren",
|
||||
"substitute_siblings": "Ersatzgeschwister",
|
||||
"Private_Recipe": "Privates Rezept",
|
||||
"Private_Recipe_Help": "Dieses Rezept ist nur für dich und Personen mit denen du es geteilt hast sichtbar.",
|
||||
"reusable_help_text": "Soll der Einladungslink für mehr als eine Person nutzbar sein.",
|
||||
"ChildInheritFields": "Kindelemente erben Felder",
|
||||
"reset_food_inheritance_info": "Alle Lebensmittel auf ihre standardmäßig vererbten Felder und die Werte ihres Elternelementes zurücksetzen.",
|
||||
"ChildInheritFields_help": "Kindelemente erben diese Felder standardmäßig.",
|
||||
"Ingredient Overview": "Zutatenübersicht",
|
||||
"Change_Password": "Kennwort ändern",
|
||||
"Valid Until": "Gültig bis",
|
||||
"plan_share_desc": "Neue Einträge im Essensplan werden automatisch mit den ausgewählten Benutzern geteilt.",
|
||||
"Hours": "Stunden",
|
||||
"Account": "Konto",
|
||||
"Username": "Benutzerkennung",
|
||||
"InheritFields_help": "Die Werte dieser Felder werden vom Elternelement vererbt (Ausnahme: Leere Einkaufskategorien werden nicht vererbt)",
|
||||
"show_ingredient_overview": "Zeige eine Liste aller Zutaten am Anfang des Rezeptes.",
|
||||
"Cosmetic": "Kosmetisch",
|
||||
"Sticky_Nav": "Navigationsleiste immer sichtbar (sticky navigation)",
|
||||
"Sticky_Nav_Help": "Navigationsleiste immer im Seitenkopf anzeigen.",
|
||||
"First_name": "Vorname",
|
||||
"Last_name": "Nachname",
|
||||
"Comments_setting": "Kommentare anzeigen",
|
||||
"reset_food_inheritance": "Vererbung zurücksetzen",
|
||||
"food_inherit_info": "Datenfelder des Lebensmittels, die standardmäßig vererbt werden sollen.",
|
||||
"Are_You_Sure": "Bist du dir sicher?",
|
||||
"Plural": "Plural",
|
||||
"plural_short": "pl.",
|
||||
"Use_Plural_Unit_Always": "Pluralform der Maßeinheit immer verwenden",
|
||||
"Use_Plural_Unit_Simple": "Pluralform der Maßeinheit dynamisch anpassen",
|
||||
"Use_Plural_Food_Always": "Pluralform des Essens immer verwenden",
|
||||
"Use_Plural_Food_Simple": "Pluralform des Essens dynamisch anpassen",
|
||||
"plural_usage_info": "Pluralform für Einheiten und Essen in diesem Space verwenden."
|
||||
}
|
||||
|
@ -68,7 +68,8 @@
|
||||
"Enable_Amount": "Enable Amount",
|
||||
"Disable_Amount": "Disable Amount",
|
||||
"Ingredient Editor": "Ingredient Editor",
|
||||
|
||||
"Auto_Sort": "Auto Sort",
|
||||
"Auto_Sort_Help": "Move all ingredients to the best fitting step.",
|
||||
"Private_Recipe": "Private Recipe",
|
||||
"Private_Recipe_Help": "Recipe is only shown to you and people its shared with.",
|
||||
"reusable_help_text": "Should the invite link be usable for more than one user.",
|
||||
@ -308,6 +309,9 @@
|
||||
"in_shopping": "In Shopping List",
|
||||
"DelayUntil": "Delay Until",
|
||||
"Pin": "Pin",
|
||||
"Unpin": "Unpin",
|
||||
"PinnedConfirmation": "{recipe} has been pinned.",
|
||||
"UnpinnedConfirmation": "{recipe} has been unpinned.",
|
||||
"mark_complete": "Mark Complete",
|
||||
"QuickEntry": "Quick Entry",
|
||||
"shopping_add_onhand_desc": "Mark food 'On Hand' when checked off shopping list.",
|
||||
@ -459,5 +463,14 @@
|
||||
"New_Supermarket": "Create new supermarket",
|
||||
"New_Supermarket_Category": "Create new supermarket category",
|
||||
"Are_You_Sure": "Are you sure?",
|
||||
"Valid Until": "Valid Until"
|
||||
"Valid Until": "Valid Until",
|
||||
"Split_All_Steps": "Split all rows into seperate steps.",
|
||||
"Combine_All_Steps": "Combine all steps into a single field.",
|
||||
"Plural": "Plural",
|
||||
"plural_short": "plural",
|
||||
"Use_Plural_Unit_Always": "Use plural form for unit always",
|
||||
"Use_Plural_Unit_Simple": "Use plural form for unit dynamically",
|
||||
"Use_Plural_Food_Always": "Use plural form for food always",
|
||||
"Use_Plural_Food_Simple": "Use plural form for food dynamically",
|
||||
"plural_usage_info": "Use the plural form for units and food inside this space."
|
||||
}
|
||||
|
@ -1,19 +1,19 @@
|
||||
{
|
||||
"warning_feature_beta": "Esta función está en fase BETA de pruebas. Podrían aparecer fallos y cambios importantes en un futuro(pudiendo perder la información) cuando uses esta función.",
|
||||
"err_fetching_resource": "¡Ha habido un error al obtener el recurso!",
|
||||
"err_creating_resource": "¡Ha habido un error al crear el recurso!",
|
||||
"err_updating_resource": "¡Ha habido un error al actualizar el recurso!",
|
||||
"err_deleting_resource": "¡Ha habido un error al eliminar el recurso!",
|
||||
"warning_feature_beta": "Esta función está en fase BETA de pruebas. Podrían aparecer fallos y cambios importantes en un futuro (pudiendo perder la información) cuando uses esta función.",
|
||||
"err_fetching_resource": "¡Hubo un error al obtener el recurso!",
|
||||
"err_creating_resource": "¡Hubo un error al crear el recurso!",
|
||||
"err_updating_resource": "¡Hubo un error al actualizar el recurso!",
|
||||
"err_deleting_resource": "¡Hubo un error al eliminar el recurso!",
|
||||
"err_deleting_protected_resource": "El objeto a eliminar sigue en uso y no puede ser eliminado.",
|
||||
"err_moving_resource": "¡Ha habido un error moviendo el recurso!",
|
||||
"err_merging_resource": "¡Ha habido un error uniendo el recurso!",
|
||||
"success_fetching_resource": "¡Se ha obtenido con éxito un recurso!",
|
||||
"success_creating_resource": "¡Se ha creado con éxito un recurso!",
|
||||
"success_updating_resource": "¡Se ha actualizado con éxito un recurso!",
|
||||
"success_deleting_resource": "¡Se ha eliminado con éxito un recurso!",
|
||||
"success_moving_resource": "¡Se ha movido con éxito un recurso!",
|
||||
"success_merging_resource": "¡Se ha unido con éxito un recurso!",
|
||||
"file_upload_disabled": "La subida de archivos no está habilitada para tu espacio.",
|
||||
"err_moving_resource": "¡Hubo un error moviendo el recurso!",
|
||||
"err_merging_resource": "¡Hubo un error al fusionar un recurso!",
|
||||
"success_fetching_resource": "¡Se ha obtenido un recurso con éxito!",
|
||||
"success_creating_resource": "¡Se ha creado un recurso con éxito!",
|
||||
"success_updating_resource": "¡Se ha actualizado un recurso con éxito !",
|
||||
"success_deleting_resource": "¡Se ha eliminado un recurso con éxito!",
|
||||
"success_moving_resource": "¡Se ha movido un recurso con éxito!",
|
||||
"success_merging_resource": "¡Se ha fusionado con éxito un recurso!",
|
||||
"file_upload_disabled": "La carga de archivos no está habilitada para su espacio.",
|
||||
"step_time_minutes": "Tiempo del paso en minutos",
|
||||
"confirm_delete": "¿Estás seguro de eliminar este {object}?",
|
||||
"import_running": "Importación realizándose, ¡Espere!",
|
||||
@ -259,7 +259,7 @@
|
||||
"Coming_Soon": "Próximamente",
|
||||
"Auto_Planner": "Planificador Automático",
|
||||
"New_Cookbook": "Nuevo libro de recetas",
|
||||
"Hide_Keyword": "Ocultar etiquetas",
|
||||
"Hide_Keyword": "Esconder Palabras Clave",
|
||||
"Clear": "Limpiar",
|
||||
"err_move_self": "No puedes mover un elemento a sí mismo",
|
||||
"nothing": "Nada que hacer",
|
||||
@ -298,27 +298,27 @@
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "Comida",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"enable_expert": "Habilitar Modo Experto",
|
||||
"expert_mode": "Modo Experto",
|
||||
"simple_mode": "Modo Simple",
|
||||
"advanced": "Avanzado",
|
||||
"fields": "Campos",
|
||||
"show_keywords": "Mostrar palabras clave",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_books": "Mostrar Libros",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"show_units": "Mostrar Unidades",
|
||||
"show_filters": "Mostrar Filtros",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"save_filter": "Guardar Filtros",
|
||||
"filter_name": "Nombre de Filtro",
|
||||
"left_handed": "Modo Zurdo",
|
||||
"left_handed_help": "Optimizará la interfaz de usuario para su uso con la mano izquierda.",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"shared_with": "Compartido con",
|
||||
"sort_by": "Ordenar por",
|
||||
"asc": "ascendente",
|
||||
"desc": "",
|
||||
"desc": "Descendiente",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
@ -336,7 +336,7 @@
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"filter": "Filtro",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Bookmarklet": "",
|
||||
@ -412,7 +412,7 @@
|
||||
"New_Supermarket": "Crear nuevo supermercado",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"warning_space_delete": "Puedes borrar tu espacio incluyendo todas las recetas, listas de la compra, regímenes de comidas y cualquier otra cosa creada. ¡Esto no puede deshacerse! ¿Estás seguro de que quieres hacerlo?",
|
||||
"warning_space_delete": "Puedes eliminar tu espacio, incluyendo todas las recetas, listas de la compra, regímenes de comidas y cualquier otra cosa creada. ¡Esto no se puede deshacer! ¿Estás seguro de que quieres hacerlo?",
|
||||
"Private_Recipe": "Receta Privada",
|
||||
"Private_Recipe_Help": "La receta solo podrás verla tu y la gente con la que esta compartida.",
|
||||
"reusable_help_text": "El link de invitación podrá ser usado por mas de un usuario",
|
||||
@ -422,5 +422,26 @@
|
||||
"facet_count_info": "Mostrar contadores de receta en los filtros de búsqueda.",
|
||||
"Copy Link": "Copiar Enlace",
|
||||
"Copy Token": "Copiar Token",
|
||||
"Create_New_Shopping_Category": "Añadir nueva Categoría de Compras"
|
||||
"Create_New_Shopping_Category": "Añadir nueva Categoría de Compras",
|
||||
"Use_Fractions": "Use fracciones",
|
||||
"Theme": "Tema",
|
||||
"Hours": "Horas",
|
||||
"Day": "Día",
|
||||
"Days": "Días",
|
||||
"Second": "Segundo",
|
||||
"Seconds": "Segundos",
|
||||
"Account": "Cuenta",
|
||||
"API": "API",
|
||||
"Decimals": "Decimales",
|
||||
"Default_Unit": "Unidad Predeterminada",
|
||||
"Language": "Lenguaje",
|
||||
"Hour": "Hora",
|
||||
"Username": "Nombre de Usuario",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -212,5 +212,12 @@
|
||||
"success_moving_resource": "Resurssin siirto onnistui!",
|
||||
"success_merging_resource": "Resurssin yhdistäminen onnistui!",
|
||||
"Search Settings": "Hakuasetukset",
|
||||
"Shopping_Categories": "Ostoskategoriat"
|
||||
"Shopping_Categories": "Ostoskategoriat",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -341,7 +341,7 @@
|
||||
"nothing_planned_today": "Vous n'avez rien de prévu pour aujourd'hui !",
|
||||
"Pinned": "Epinglé",
|
||||
"select_recipe": "Sélectionner Recette",
|
||||
"Pin": "Epingler",
|
||||
"Pin": "Épingler",
|
||||
"remove_selection": "Désélectionner",
|
||||
"New_Entry": "Nouvelle Entrée",
|
||||
"search_rank": "Rechercher par note",
|
||||
@ -381,5 +381,33 @@
|
||||
"sql_debug": "Débogage de la base SQL",
|
||||
"last_cooked": "Dernière recette utilisée",
|
||||
"times_cooked": "Temps de cuisson",
|
||||
"show_sortby": "Trier par"
|
||||
"show_sortby": "Trier par",
|
||||
"Hours": "Heures",
|
||||
"Days": "Jours",
|
||||
"Second": "Seconde",
|
||||
"Seconds": "Secondes",
|
||||
"Users": "Utilisateurs",
|
||||
"Private_Recipe": "Recette privée",
|
||||
"Create_New_Shopping_Category": "Ajouter une nouvelle catégorie de courses",
|
||||
"Private_Recipe_Help": "La recette est uniquement visible par vous et les gens avec qui elle est partagée.",
|
||||
"Language": "Langue",
|
||||
"Copy Link": "Copier le lien",
|
||||
"Default_Unit": "Unité par défaut",
|
||||
"Hour": "Heure",
|
||||
"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",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -412,5 +412,12 @@
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": ""
|
||||
"Are_You_Sure": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -122,5 +122,12 @@
|
||||
"Save_and_View": "Պահպանել և Դիտել",
|
||||
"Select_File": "Ընտրել Ֆայլ",
|
||||
"Edit_Keyword": "Խմբագրել բանալի բառը",
|
||||
"Hide_Recipes": "Թաքցնել բաղադրատոմսերը"
|
||||
"Hide_Recipes": "Թաքցնել բաղադրատոմսերը",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
462
vue/src/locales/id.json
Normal file
462
vue/src/locales/id.json
Normal file
@ -0,0 +1,462 @@
|
||||
{
|
||||
"warning_feature_beta": "Fitur ini saat ini dalam status BETA (pengujian). Harap perkirakan bug dan kemungkinan kerusakan perubahan di masa mendatang (mungkin kehilangan data terkait fitur) saat menggunakan fitur ini.",
|
||||
"err_fetching_resource": "Terjadi kesalahan saat mengambil sumber daya!",
|
||||
"err_creating_resource": "Terjadi kesalahan saat membuat sumber daya!",
|
||||
"err_updating_resource": "Terjadi kesalahan saat mengupdate sumber daya!",
|
||||
"err_deleting_resource": "Terjadi kesalahan saat menghapus sumber daya!",
|
||||
"err_deleting_protected_resource": "Objek yang Anda coba hapus masih digunakan dan tidak dapat dihapus.",
|
||||
"err_moving_resource": "Terjadi kesalahan saat memindahkan sumber daya!",
|
||||
"err_merging_resource": "Terjadi kesalahan saat menggabungkan sumber daya!",
|
||||
"success_fetching_resource": "Berhasil mengambil sumber daya!",
|
||||
"success_creating_resource": "Berhasil membuat sumber daya!",
|
||||
"success_updating_resource": "Berhasil memperbarui sumber daya!",
|
||||
"success_deleting_resource": "Berhasil menghapus sumber daya!",
|
||||
"success_moving_resource": "Berhasil memindahkan sumber daya!",
|
||||
"success_merging_resource": "Berhasil menggabungkan sumber daya!",
|
||||
"file_upload_disabled": "Unggahan file tidak diaktifkan untuk ruang Anda.",
|
||||
"warning_space_delete": "Anda dapat menghapus ruang Anda termasuk semua resep, daftar belanja, rencana makan, dan apa pun yang telah Anda buat. Ini tidak dapat dibatalkan! Apakah Anda yakin ingin melakukan ini?",
|
||||
"food_inherit_info": "Bidang pada makanan yang harus diwarisi secara default.",
|
||||
"facet_count_info": "Tampilkan jumlah resep pada filter pencarian.",
|
||||
"step_time_minutes": "Langkah waktu dalam menit",
|
||||
"confirm_delete": "Anda yakin ingin menghapus {object} ini?",
|
||||
"import_running": "Impor berjalan, harap tunggu!",
|
||||
"all_fields_optional": "Semua bidang adalah opsional dan dapat dibiarkan kosong.",
|
||||
"convert_internal": "Ubah ke resep internal",
|
||||
"show_only_internal": "Hanya tampilkan resep internal",
|
||||
"show_split_screen": "Tampilan Terpisah",
|
||||
"Log_Recipe_Cooking": "Log Resep Memasak",
|
||||
"External_Recipe_Image": "Gambar Resep Eksternal",
|
||||
"Add_to_Shopping": "Tambahkan ke Belanja",
|
||||
"Add_to_Plan": "Tambahkan ke Rencana",
|
||||
"Step_start_time": "Langkah waktu mulai",
|
||||
"Sort_by_new": "Urutkan berdasarkan baru",
|
||||
"Table_of_Contents": "Daftar isi",
|
||||
"Recipes_per_page": "Resep per Halaman",
|
||||
"Show_as_header": "Tampilkan sebagai tajuk",
|
||||
"Hide_as_header": "Sembunyikan sebagai tajuk",
|
||||
"Add_nutrition_recipe": "Tambahkan nutrisi ke resep",
|
||||
"Remove_nutrition_recipe": "Hapus nutrisi dari resep",
|
||||
"Copy_template_reference": "Salin referensi template",
|
||||
"Save_and_View": "Simpan & Lihat",
|
||||
"Manage_Books": "Kelola Buku",
|
||||
"Meal_Plan": "rencana makan",
|
||||
"Select_Book": "Pilih Buku",
|
||||
"Select_File": "Pilih Buku",
|
||||
"Recipe_Image": "Gambar Resep",
|
||||
"Import_finished": "Impor selesai",
|
||||
"View_Recipes": "Lihat Resep",
|
||||
"Log_Cooking": "Log Memasak",
|
||||
"New_Recipe": "Resep Baru",
|
||||
"Url_Import": "Impor Url",
|
||||
"Reset_Search": "Setel Ulang Pencarian",
|
||||
"Recently_Viewed": "baru saja dilihat",
|
||||
"Load_More": "Muat lebih banyak",
|
||||
"New_Keyword": "Kata Kunci Baru",
|
||||
"Delete_Keyword": "Hapus Kata Kunci",
|
||||
"Edit_Keyword": "Rubah Kata Kunci",
|
||||
"Edit_Recipe": "Rubah Resep",
|
||||
"Move_Keyword": "Pindahkan Kata Kunci",
|
||||
"Merge_Keyword": "Gabungkan Kata Kunci",
|
||||
"Hide_Keywords": "Sembunyikan Kata Kunci",
|
||||
"Hide_Recipes": "Sembunyikan Resep",
|
||||
"Move_Up": "Pindahkan keatas",
|
||||
"Move_Down": "Pindahkan kebawah",
|
||||
"Step_Name": "Nama Langkah",
|
||||
"Step_Type": "Tipe Langkah",
|
||||
"Make_Header": "Buat Header",
|
||||
"Make_Ingredient": "Buat bahan",
|
||||
"Enable_Amount": "Aktifkan Jumlah",
|
||||
"Disable_Amount": "Nonaktifkan Jumlah",
|
||||
"Ingredient Editor": "Editor Bahan",
|
||||
"Private_Recipe": "Resep Pribadi",
|
||||
"Private_Recipe_Help": "Resep hanya diperlihatkan kepada Anda dan orang-orang yang dibagikan resep tersebut.",
|
||||
"reusable_help_text": "Haruskah tautan undangan dapat digunakan untuk lebih dari satu pengguna.",
|
||||
"Add_Step": "Tambahkan Langkah",
|
||||
"Keywords": "Kata Kunci",
|
||||
"Books": "Buku",
|
||||
"Proteins": "Protein",
|
||||
"Fats": "Lemak",
|
||||
"Carbohydrates": "Karbohidrat",
|
||||
"Calories": "Kalori",
|
||||
"Energy": "Energi",
|
||||
"Nutrition": "Nutrisi",
|
||||
"Date": "Tanggal",
|
||||
"Share": "Bagikan",
|
||||
"Automation": "Automatis",
|
||||
"Parameter": "Parameter",
|
||||
"Export": "Ekspor",
|
||||
"Copy": "Salin",
|
||||
"Rating": "Peringkat",
|
||||
"Close": "Tutup",
|
||||
"Cancel": "Batal",
|
||||
"Link": "Link",
|
||||
"Add": "Tambahkan",
|
||||
"New": "Baru",
|
||||
"Note": "Catatan",
|
||||
"Success": "Sukses",
|
||||
"Failure": "Kegagalan",
|
||||
"Protected": "Terlindung",
|
||||
"Ingredients": "bahan-bahan",
|
||||
"Supermarket": "Supermarket",
|
||||
"Categories": "Kategori",
|
||||
"Category": "Kategori",
|
||||
"Selected": "Terpilih",
|
||||
"min": "min",
|
||||
"Servings": "Porsi",
|
||||
"Waiting": "Menunggu",
|
||||
"Preparation": "Persiapan",
|
||||
"External": "Luar",
|
||||
"Size": "Ukuran",
|
||||
"Files": "File",
|
||||
"File": "Berkas",
|
||||
"Edit": "Sunting",
|
||||
"Image": "Gambar",
|
||||
"Delete": "Menghapus",
|
||||
"Open": "Membuka",
|
||||
"Ok": "Membuka",
|
||||
"Save": "Menyimpan",
|
||||
"Step": "Melangkah",
|
||||
"Search": "Mencari",
|
||||
"Import": "Impor",
|
||||
"Print": "Mencetak",
|
||||
"Settings": "Pengaturan",
|
||||
"or": "atau",
|
||||
"and": "dan",
|
||||
"Information": "Informasi",
|
||||
"Download": "Unduh",
|
||||
"Create": "Membuat",
|
||||
"Search Settings": "Pengaturan Pencarian",
|
||||
"View": "Melihat",
|
||||
"Recipes": "Resep",
|
||||
"Move": "Bergerak",
|
||||
"Merge": "Menggabungkan",
|
||||
"Parent": "Induk",
|
||||
"Copy Link": "Salin Tautan",
|
||||
"Copy Token": "Salin Token",
|
||||
"delete_confirmation": "Yakin ingin menghapus {source}?",
|
||||
"move_confirmation": "Pindahkan <i>{child}</i> ke induk<i>{parent}</i>",
|
||||
"merge_confirmation": "Ganti <i>{source}</i> dengan <i>{target}</i>",
|
||||
"create_rule": "dan buat otomatisasi",
|
||||
"move_selection": "Pilih {type} induk untuk memindahkan {source}.",
|
||||
"merge_selection": "Ganti semua kemunculan {source} dengan {type} yang dipilih.",
|
||||
"Root": "Akar",
|
||||
"Ignore_Shopping": "Abaikan Belanja",
|
||||
"Shopping_Category": "Kategori Belanja",
|
||||
"Shopping_Categories": "Kategori Belanja",
|
||||
"Edit_Food": "Sunting Makanan",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "",
|
||||
"copy_to_new": "",
|
||||
"recipe_name": "",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "",
|
||||
"Supermarkets": "",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "",
|
||||
"Last_name": "",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "",
|
||||
"Import_Error": "",
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": ""
|
||||
}
|
@ -14,7 +14,7 @@
|
||||
"show_split_screen": "Vista divisa",
|
||||
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
|
||||
"External_Recipe_Image": "Immagine ricetta esterna",
|
||||
"Add_to_Shopping": "Aggiunti a lista della spesa",
|
||||
"Add_to_Shopping": "Aggiunti agli acquisti",
|
||||
"Add_to_Plan": "Aggiungi a Piano",
|
||||
"Step_start_time": "Ora di inizio dello Step",
|
||||
"Sort_by_new": "Prima i nuovi",
|
||||
@ -91,18 +91,18 @@
|
||||
"Recipes": "Ricette",
|
||||
"Move": "Sposta",
|
||||
"Merge": "Unisci",
|
||||
"Parent": "Principale",
|
||||
"Parent": "Primario",
|
||||
"delete_confimation": "Sei sicuro di voler eliminare {kw} e tutti gli elementi dipendenti?",
|
||||
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
|
||||
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
|
||||
"move_selection": "Scegli un primario {type} dove spostare {source}.",
|
||||
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
|
||||
"Root": "Radice",
|
||||
"Ignore_Shopping": "Ignora lista della spesa",
|
||||
"Ignore_Shopping": "Ignora spesa",
|
||||
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
|
||||
"Description": "Descrizione",
|
||||
"Icon": "Icona",
|
||||
"Unit": "Unità",
|
||||
"Unit": "Unità di misura",
|
||||
"No_ID": "ID non trovato, non è possibile eliminare.",
|
||||
"Recipe_Book": "Libro di Ricette",
|
||||
"create_title": "Nuovo {type}",
|
||||
@ -240,5 +240,219 @@
|
||||
"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": "Fissa",
|
||||
"DelayUntil": "Ritarda fino a",
|
||||
"Default_Unit": "Unità predefinita",
|
||||
"Decimals": "Decimali",
|
||||
"FoodOnHand": "Hai {food} a disposizione.",
|
||||
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
|
||||
"Language": "Lingua",
|
||||
"Theme": "Tema",
|
||||
"SupermarketCategoriesOnly": "Solo categorie supermercati",
|
||||
"CountMore": "...più +{count}",
|
||||
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
|
||||
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
|
||||
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
|
||||
"plan_share_desc": "Le nuove voci del piano alimentare saranno automaticamente condivise con gli utenti selezionati.",
|
||||
"Hour": "Ora",
|
||||
"Hours": "Ore",
|
||||
"Day": "Giorno",
|
||||
"Days": "Giorni",
|
||||
"Second": "Secondo",
|
||||
"Seconds": "Secondi",
|
||||
"csv_prefix_help": "Prefisso da aggiungere quando si copia una lista negli appunti.",
|
||||
"copy_markdown_table": "Copia come tabella Markdown",
|
||||
"in_shopping": "Nella lista della spesa",
|
||||
"Account": "Account",
|
||||
"Cosmetic": "Aspetto",
|
||||
"API": "API",
|
||||
"Copy Token": "Copia token",
|
||||
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
|
||||
"default_delay": "Ore di ritardo predefinite",
|
||||
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
|
||||
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
|
||||
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
|
||||
"filter_to_supermarket": "Filtra per supermercato",
|
||||
"filter_to_supermarket_desc": "Per impostazione predefinita, filtra la lista della spesa per includere esclusivamente le categorie del supermercato selezionato.",
|
||||
"CategoryName": "Nome categoria",
|
||||
"shopping_recent_days": "Giorni recenti",
|
||||
"download_pdf": "Scarica PDF",
|
||||
"download_csv": "Scarica CSV",
|
||||
"SuccessClipboard": "Lista della spesa copiata negli appunti",
|
||||
"Users": "Utenti",
|
||||
"Invites": "Inviti",
|
||||
"date_viewed": "Recenti",
|
||||
"copy_to_clipboard": "Copia negli appunti",
|
||||
"related_recipes": "Ricette correlate",
|
||||
"Foods": "Alimenti",
|
||||
"asc": "Crescente",
|
||||
"desc": "Decrescente",
|
||||
"Units": "Unità di misura",
|
||||
"shopping_add_onhand_desc": "Contrassegna gli alimenti come \"disponibili\" quando vengono spuntati dalla lista della spesa.",
|
||||
"shopping_add_onhand": "Auto disponibilità",
|
||||
"mark_complete": "Contrassegna come completato",
|
||||
"QuickEntry": "Inserimento rapido",
|
||||
"remember_hours": "Ore da ricordare",
|
||||
"tree_select": "Usa selezione ad albero",
|
||||
"sql_debug": "Debug SQL",
|
||||
"remember_search": "Ricorda ricerca",
|
||||
"facet_count_info": "Mostra il conteggio delle ricette nei filtri di ricerca.",
|
||||
"warning_space_delete": "Stai per eliminare la tua istanza che include tutte le ricette, liste della spesa, piani alimentari e tutto ciò che hai creato. Questa azione non può essere annullata! Sei sicuro di voler procedere?",
|
||||
"food_inherit_info": "Campi di alimenti che devono essere ereditati per impostazione predefinita.",
|
||||
"enable_expert": "Abilita modalità esperto",
|
||||
"expert_mode": "Modalità esperto",
|
||||
"simple_mode": "Modalità semplice",
|
||||
"advanced": "Avanzate",
|
||||
"fields": "Campi",
|
||||
"show_keywords": "Mostra parole chiave",
|
||||
"show_foods": "Mostra alimenti",
|
||||
"show_books": "Mostra libri",
|
||||
"show_rating": "Mostra valutazione",
|
||||
"show_filters": "Mostra filtri",
|
||||
"save_filter": "Salva filtro",
|
||||
"filter_name": "Nome filtro",
|
||||
"left_handed_help": "L'interfaccia verrà ottimizzata per l'uso con la mano sinistra.",
|
||||
"Custom Filter": "Filtro personalizzato",
|
||||
"shared_with": "Condiviso con",
|
||||
"sort_by": "Ordina per",
|
||||
"Ingredient Overview": "Panoramica Ingredienti",
|
||||
"show_units": "Mostra unità di misura",
|
||||
"select_unit": "Seleziona unità di misura",
|
||||
"Ingredient Editor": "Editor Ingredienti",
|
||||
"Private_Recipe": "Ricetta privata",
|
||||
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e a chi l'hai condivisa.",
|
||||
"Protected": "Protetto",
|
||||
"Copy Link": "Copia link",
|
||||
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
|
||||
"and_down": "& Giù",
|
||||
"OnHand": "Attualmente disponibili",
|
||||
"New_Entry": "Nuova voce",
|
||||
"Use_Fractions": "Usa frazioni",
|
||||
"FoodInherit": "Campi ereditabili dagli Alimenti",
|
||||
"one_url_per_line": "Un indirizzo per riga",
|
||||
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
|
||||
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
|
||||
"mealplan_autoinclude_related_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), includi tutte le ricette correlate.",
|
||||
"err_merge_self": "Non è possibile unire un elemento in sé stesso",
|
||||
"shopping_recent_days_desc": "Giorni di visualizzazione delle voci recenti della lista della spesa.",
|
||||
"csv_delim_help": "Delimitatore usato per le esportazioni CSV.",
|
||||
"csv_prefix_label": "Prefisso lista",
|
||||
"not": "not",
|
||||
"Keyword": "Parola chiave",
|
||||
"Plural": "Plurale",
|
||||
"plural_short": "plurale",
|
||||
"Use_Plural_Unit_Always": "Usa sempre il plurale per le unità di misura",
|
||||
"Use_Plural_Unit_Simple": "Usa dinamicamente il plurale per le unità di misura",
|
||||
"Use_Plural_Food_Always": "Usa sempre il plurale per gli alimenti",
|
||||
"Use_Plural_Food_Simple": "Usa dinamicamente il plurale per gli alimenti",
|
||||
"plural_usage_info": "Usa il plurale per le unità di misura e gli alimenti messi qui.",
|
||||
"reusable_help_text": "Il link di invito dovrebbe essere usabile per più di un utente.",
|
||||
"empty_list": "La lista è vuota.",
|
||||
"no_pinned_recipes": "Non hai ricette fissate!",
|
||||
"recipe_name": "Nome Ricetta",
|
||||
"advanced_search_settings": "Impostazioni avanzate di ricerca",
|
||||
"search_no_recipes": "Non sono state trovate ricette!",
|
||||
"SubstituteOnHand": "Hai un sostituto disponibile.",
|
||||
"Manage_Emails": "Gestisci email",
|
||||
"Supermarkets": "Supermercati",
|
||||
"Create Food": "Crea alimento",
|
||||
"review_shopping": "Rivedi le voci della spesa prima di salvare",
|
||||
"created_on": "Creato il",
|
||||
"nothing_planned_today": "Non hai pianificato nulla per oggi!",
|
||||
"last_viewed": "Ultima visualizzazione",
|
||||
"Ratings": "Valutazioni",
|
||||
"add_keyword": "Aggiungi parola chiave",
|
||||
"Export_Not_Yet_Supported": "Esportazione non ancora supportata",
|
||||
"Import_Result_Info": "{imported} di {total} ricette sono state importate",
|
||||
"Recipes_In_Import": "Rocette nel tuo file di importazione",
|
||||
"Toggle": "Attiva/Disattiva",
|
||||
"Import_Not_Yet_Supported": "Importazione non ancora supportata",
|
||||
"Are_You_Sure": "Sei sicuro?",
|
||||
"Import_Error": "Si è verificato un errore durante l'importazione. Per avere maggiori informazioni, espandi la sezione dettagli in fondo alla pagina.",
|
||||
"select_food": "Seleziona alimento",
|
||||
"remove_selection": "Deseleziona",
|
||||
"Documentation": "Documentazione",
|
||||
"Select_App_To_Import": "Seleziona una App da cui importare",
|
||||
"Import_Supported": "Importazione supportata",
|
||||
"paste_ingredients": "Incolla ingredienti",
|
||||
"shopping_auto_sync_desc": "La sincronizzazione automatica verrà disabilitata se impostato a 0. Quando si visualizza una lista della spesa, la lista viene aggiornata ogni tot secondi impostati per sincronizzare le modifiche che qualcun altro potrebbe aver fatto. Utile per gli acquisti condivisi con più persone, ma potrebbe utilizzare un po' di dati mobili.",
|
||||
"CategoryInstruction": "Trascina le categorie per cambiare l'ordine in cui appaiono nella lista della spesa.",
|
||||
"show_sortby": "Mostra Ordina per",
|
||||
"Page": "Pagina",
|
||||
"Auto_Sort": "Ordinamento Automatico",
|
||||
"date_created": "Data di creazione",
|
||||
"times_cooked": "Cucinato N volte",
|
||||
"recipe_filter": "Filtro ricette",
|
||||
"view_recipe": "Mostra ricetta",
|
||||
"copy_to_new": "Copia in una nuova ricetta",
|
||||
"Pinned": "Fissato",
|
||||
"App": "App",
|
||||
"filter": "Filtro",
|
||||
"explain": "Maggior informazioni",
|
||||
"Website": "Sito web",
|
||||
"Message": "Messaggio",
|
||||
"Sticky_Nav": "Navigazione con menu fissato",
|
||||
"Nav_Color": "Colore di navigazione",
|
||||
"Nav_Color_Help": "Cambia il colore di navigazione.",
|
||||
"Use_Kj": "Usa kJ invece di kcal",
|
||||
"Comments_setting": "Mostra commenti",
|
||||
"click_image_import": "Clicca sull'immagine che vuoi importare per questa ricetta",
|
||||
"no_more_images_found": "Non sono state trovate altre immagini sul sito web.",
|
||||
"Click_To_Edit": "Clicca per modificare",
|
||||
"search_import_help_text": "Importa una ricetta da un sito web o da una applicazione.",
|
||||
"Bookmarklet": "Segnalibro",
|
||||
"paste_json": "Incolla qui il codice sorgente html o json per caricare la ricetta.",
|
||||
"Imported_From": "Importato da",
|
||||
"Planned": "Pianificato",
|
||||
"Imported": "Importato",
|
||||
"Quick actions": "Azioni rapide",
|
||||
"Internal": "Interno",
|
||||
"ingredient_list": "Lista Ingredienti",
|
||||
"show_ingredient_overview": "Mostra la lista degli ingredienti all'inizio della ricetta.",
|
||||
"Change_Password": "Cambia password",
|
||||
"Social_Authentication": "Autenticazione social",
|
||||
"Random Recipes": "Ricette casuali",
|
||||
"parameter_count": "Parametro {count}",
|
||||
"select_keyword": "Seleziona parola chiave",
|
||||
"select_file": "Seleziona file",
|
||||
"select_recipe": "Seleziona ricetta",
|
||||
"User": "Utente",
|
||||
"Username": "Nome utente",
|
||||
"First_name": "Nome",
|
||||
"Last_name": "Cognome",
|
||||
"Advanced": "Avanzate",
|
||||
"Single": "Singolo",
|
||||
"Multiple": "Multiplo",
|
||||
"Reset": "Azzera",
|
||||
"Disabled": "Disabilitato",
|
||||
"Disable": "Disabilita",
|
||||
"Options": "Opzioni",
|
||||
"create_food_desc": "Crea un alimento e collegalo a questa ricetta.",
|
||||
"additional_options": "Opzioni aggiuntive",
|
||||
"Export_Supported": "Esportazione supportata",
|
||||
"New_Supermarket": "Crea nuovo supermercato",
|
||||
"New_Supermarket_Category": "Crea nuova categoria di supermercato",
|
||||
"Valid Until": "Valido fino",
|
||||
"Split_All_Steps": "Divide tutte le righe in step separati.",
|
||||
"Combine_All_Steps": "Combina tutti gli step in un singolo campo.",
|
||||
"Select": "Seleziona",
|
||||
"OnHand_help": "Gli alimenti sono nell'inventario e non verranno automaticamente aggiunti alla lista della spesa. Lo stato di disponibilità è condiviso con gli utenti di spesa.",
|
||||
"Unpin": "Non fissare",
|
||||
"PinnedConfirmation": "{recipe} è stata fissata.",
|
||||
"UnpinnedConfirmation": "{recipe} non è più fissata.",
|
||||
"updatedon": "Aggiornato il",
|
||||
"Auto_Sort_Help": "Sposta tutti gli ingredienti allo step più adatto.",
|
||||
"ignore_shopping_help": "Non aggiungere gli alimenti alla lista della spesa (es. acqua)",
|
||||
"Sticky_Nav_Help": "Mostra sempre il menu di navigazione in alto.",
|
||||
"paste_ingredients_placeholder": "Incolla qui la lista degli ingredienti...",
|
||||
"Importer_Help": "Per altre informazioni e aiuto su questo importer:",
|
||||
"search_create_help_text": "Crea una nuova ricetta direttamente in Tandoor."
|
||||
}
|
||||
|
@ -360,6 +360,9 @@
|
||||
"Page": "Pagina",
|
||||
"left_handed": "Linkshandige modus",
|
||||
"Pin": "Pin",
|
||||
"Unpin": "Pin losmaken",
|
||||
"PinnedConfirmation": "{recipe} is vast vastgepind.",
|
||||
"UnpinnedConfirmation": "{recipe} is losgemaakt.",
|
||||
"shopping_category_help": "Supermarkten kunnen gesorteerd en gefilterd worden per boodschappencategorie conform the indeling van de gangpaden.",
|
||||
"Foods": "Ingrediënten",
|
||||
"OnHand_help": "Ingrediënt is op voorraad en wordt niet automatisch aan een boodschappenlijstje toegevoegd. Voorraadstatus is gedeeld tussen gebruikers.",
|
||||
@ -416,5 +419,59 @@
|
||||
"additional_options": "Extra opties",
|
||||
"Create Food": "Maak Ingrediënt",
|
||||
"Create_New_Shopping_Category": "Voeg nieuwe boodschappencategorie toe",
|
||||
"New_Entry": "Nieuw"
|
||||
"New_Entry": "Nieuw",
|
||||
"Ingredient Overview": "Ingrediëntenlijst",
|
||||
"Default_Unit": "Standaardeenheid",
|
||||
"Use_Fractions_Help": "Zet decimalen automatisch om naar breuken tijdens het bekijken van een recept.",
|
||||
"Language": "Taal",
|
||||
"plan_share_desc": "Nieuwe bijdragen in maaltijdplannen worden automatisch met geselecteerde gebruikers gedeeld.",
|
||||
"Hours": "Uren",
|
||||
"Day": "Dag",
|
||||
"Days": "Dagen",
|
||||
"Second": "Seconde",
|
||||
"Seconds": "Seconden",
|
||||
"Account": "Account",
|
||||
"Cosmetic": "Kosmetisch",
|
||||
"Message": "Bericht",
|
||||
"Sticky_Nav": "Navigatie altijd zichbaar",
|
||||
"Sticky_Nav_Help": "Geef navigatiemenu altijd bovenin weer.",
|
||||
"Nav_Color": "Navigatiekleur",
|
||||
"Nav_Color_Help": "Verander de navigatiekleur.",
|
||||
"Use_Kj": "kJ gebruiken in plaats van kcal",
|
||||
"Comments_setting": "Commentaar weergeven",
|
||||
"Change_Password": "Wachtwoord veranderen",
|
||||
"Social_Authentication": "Authenticeren met sociale media-account",
|
||||
"First_name": "Voornaam",
|
||||
"Last_name": "Achternaam",
|
||||
"Disabled": "Gedeactiveerd",
|
||||
"Disable": "Deactiveren",
|
||||
"Private_Recipe_Help": "Recept is alleen zichtbaar voor jou en de mensen waar je het mee gedeeld hebt.",
|
||||
"reusable_help_text": "Zou de uitnodigingslink voor meer dan een gebruiker bruikbaar zijn.",
|
||||
"Copy Token": "Kopieer Token",
|
||||
"Invites": "Uitnodigingen",
|
||||
"Private_Recipe": "Privé Recept",
|
||||
"Copy Link": "Kopieer Link",
|
||||
"Decimals": "Decimalen",
|
||||
"Use_Fractions": "Gebruik Kommagetallen",
|
||||
"Theme": "Thema",
|
||||
"Hour": "Uur",
|
||||
"Users": "Gebruikers",
|
||||
"API": "API",
|
||||
"reset_food_inheritance": "Overerving terugzetten",
|
||||
"show_ingredient_overview": "Geef een lijst met alle ingrediënten weer aan het begin van het recept.",
|
||||
"Manage_Emails": "E-mail beheren",
|
||||
"Username": "Gebruikersnaam",
|
||||
"Valid Until": "Geldig tot",
|
||||
"warning_space_delete": "Je kunt jouw space verwijderen inclusief alle recepten, boodschappenlijstjes, maaltijdplannen en alles wat je verder aangemaakt hebt. Dit kan niet ongedaan worden gemaakt! Weet je het zeker?",
|
||||
"food_inherit_info": "Voedselvelden die standaard geërfd worden.",
|
||||
"facet_count_info": "Geef receptenaantal bij zoekfilters weer.",
|
||||
"Split_All_Steps": "Splits alle rijen in apparte stappen.",
|
||||
"Combine_All_Steps": "Voeg alle stappen samen tot een veld.",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -284,7 +284,7 @@
|
||||
"related_recipes": "Powiązane przepisy",
|
||||
"today_recipes": "Dzisiejsze przepisy",
|
||||
"Search Settings": "Ustawienia wyszukiwania",
|
||||
"Pin": "Pin",
|
||||
"Pin": "Przypnij",
|
||||
"left_handed_help": "Zoptymalizuje interfejs użytkownika do użytku lewą ręką.",
|
||||
"food_recipe_help": "Powiązanie tutaj przepisu będzie skutkowało połączenie przepisu z każdym innym przepisem, który używa tego jedzenia",
|
||||
"Foods": "Żywność",
|
||||
@ -427,5 +427,52 @@
|
||||
"reset_food_inheritance_info": "Zresetuj wszystkie produkty spożywcze do domyślnych dziedziczonych pól i ich wartości nadrzędnych.",
|
||||
"Valid Until": "Ważne do",
|
||||
"show_ingredient_overview": "Wyświetl listę wszystkich składników na początku przepisu.",
|
||||
"Ingredient Overview": "Przegląd składników"
|
||||
"Ingredient Overview": "Przegląd składników",
|
||||
"Decimals": "Ułamki dziesiętne",
|
||||
"Default_Unit": "Jednostka domyślna",
|
||||
"Use_Fractions_Help": "Automatycznie konwertuj ułamki dziesiętne na ułamki zwykłe podczas przeglądania przepisów.",
|
||||
"Language": "Język",
|
||||
"Theme": "Motyw",
|
||||
"plan_share_desc": "Nowe wpisy planu posiłków będą automatycznie udostępniane wybranym użytkownikom.",
|
||||
"Hour": "Godzina",
|
||||
"Hours": "Godziny",
|
||||
"Day": "Dzień",
|
||||
"Days": "Dni",
|
||||
"Second": "Sekunda",
|
||||
"Cosmetic": "Kosmetyczne",
|
||||
"API": "API",
|
||||
"Sticky_Nav_Help": "Zawsze pokazuj menu nawigacyjne u góry ekranu.",
|
||||
"Nav_Color": "Kolor nawigacji",
|
||||
"Nav_Color_Help": "Zmień kolor nawigacji.",
|
||||
"Use_Kj": "Użyj kJ zamiast kcal",
|
||||
"Comments_setting": "Pokaż komentarze",
|
||||
"Social_Authentication": "Uwierzytelnianie społecznościowe",
|
||||
"reusable_help_text": "Czy link z zaproszeniem może być używany przez więcej niż jednego użytkownika.",
|
||||
"Private_Recipe": "Prywatny przepis",
|
||||
"Private_Recipe_Help": "Przepis jest widoczny tylko dla Ciebie i dla osób, którym jest udostępniany.",
|
||||
"Use_Fractions": "Użyj ułamków",
|
||||
"Seconds": "Sekundy",
|
||||
"Account": "Konto",
|
||||
"Sticky_Nav": "Przyklejona nawigacja",
|
||||
"Manage_Emails": "Zarządzaj e-mailami",
|
||||
"Change_Password": "Zmień hasło",
|
||||
"Username": "Nazwa użytkownika",
|
||||
"First_name": "Imię",
|
||||
"Last_name": "Nazwisko",
|
||||
"Disabled": "Wyłączone",
|
||||
"Disable": "Wyłączyć",
|
||||
"Plural": "Liczba mnoga",
|
||||
"plural_short": "l. mnoga",
|
||||
"Use_Plural_Unit_Always": "Zawsze używaj liczby mnogiej dla jednostki",
|
||||
"Use_Plural_Unit_Simple": "Dynamicznie używaj liczby mnogiej dla jednostki",
|
||||
"Use_Plural_Food_Always": "Zawsze używaj liczby mnogiej dla produktu spożywczego",
|
||||
"Use_Plural_Food_Simple": "Dynamicznie używaj liczby mnogiej dla produktu spożywczego",
|
||||
"plural_usage_info": "Używaj liczby mnogiej dla jednostek i produktów spożywczych wewnątrz tej przestrzeni.",
|
||||
"Auto_Sort": "Auto sortowanie",
|
||||
"Unpin": "Odepnij",
|
||||
"PinnedConfirmation": "{recipe} została przypięta.",
|
||||
"UnpinnedConfirmation": "{recipe} została odpięta.",
|
||||
"Auto_Sort_Help": "Przenieś wszystkie składniki do najlepiej dopasowanego kroku.",
|
||||
"Split_All_Steps": "Traktuj każdy wiersz jako osobne kroki.",
|
||||
"Combine_All_Steps": "Połącz wszystkie kroki w jedno pole."
|
||||
}
|
||||
|
@ -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,16 @@
|
||||
"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.",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -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,22 @@
|
||||
"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.",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -206,5 +206,12 @@
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Clear": ""
|
||||
"Clear": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -342,5 +342,6 @@
|
||||
"IgnoreThis": "Никогда не добавлять {food} в список покупок автоматически",
|
||||
"DelayFor": "Отложить на {hours} часов",
|
||||
"New_Entry": "Новая запись",
|
||||
"GroupBy": "Сгруппировать по"
|
||||
"GroupBy": "Сгруппировать по",
|
||||
"facet_count_info": "Показывать количество рецептов в фильтрах поиска."
|
||||
}
|
||||
|
@ -284,5 +284,12 @@
|
||||
"sql_debug": "SQL razhroščevanje",
|
||||
"remember_search": "Zapomni si iskanje",
|
||||
"remember_hours": "Ure, ki si jih zapomni",
|
||||
"tree_select": "Uporabi drevesno označbo"
|
||||
"tree_select": "Uporabi drevesno označbo",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -380,5 +380,12 @@
|
||||
"create_food_desc": "Skapa ett livsmedel och länka det till det här receptet.",
|
||||
"additional_options": "Ytterligare alternativ",
|
||||
"remember_hours": "Timmar att komma ihåg",
|
||||
"tree_select": "Använd trädval"
|
||||
"tree_select": "Använd trädval",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
462
vue/src/locales/tr.json
Normal file
462
vue/src/locales/tr.json
Normal file
@ -0,0 +1,462 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "Kaynak alınırken bir hata oluştu!",
|
||||
"err_creating_resource": "Kaynak oluşturulurken bir hata oluştu!",
|
||||
"err_updating_resource": "Kaynak güncellenirken bir hata oluştu!",
|
||||
"err_deleting_resource": "Kaynak silinirken bir hata oluştu!",
|
||||
"err_deleting_protected_resource": "",
|
||||
"err_moving_resource": "",
|
||||
"err_merging_resource": "",
|
||||
"success_fetching_resource": "Kaynak başarıyla getirildi!",
|
||||
"success_creating_resource": "Kaynak başarıyla oluşturuldu!",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "Kaynak başarıyla silindi!",
|
||||
"success_moving_resource": "Kaynak başarıyla taşındı!",
|
||||
"success_merging_resource": "Kaynak başarıyla birleştirildi!",
|
||||
"file_upload_disabled": "Alanınız için dosya yükleme aktif değil.",
|
||||
"warning_space_delete": "Tüm tarifler, alışveriş listeleri, yemek planları ve oluşturduğunuz her şey dahil olmak üzere silinecektir. Bu geri alınamaz! Bunu yapmak istediğinizden emin misiniz?",
|
||||
"food_inherit_info": "",
|
||||
"facet_count_info": "",
|
||||
"step_time_minutes": "Dakika olarak adım süresi",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "Dahili tarif'e dönüştür",
|
||||
"show_only_internal": "Sadece dahili tarifler",
|
||||
"show_split_screen": "Bölünmüş Görünüm",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "Alışverişe Ekle",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "Yeniye göre sırala",
|
||||
"Table_of_Contents": "İçindekiler Tablosu",
|
||||
"Recipes_per_page": "Sayfa Başına Tarif",
|
||||
"Show_as_header": "Başlığı Göster",
|
||||
"Hide_as_header": "Başlığı gizle",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "Kaydet & Görüntüle",
|
||||
"Manage_Books": "Kitapları Yönet",
|
||||
"Meal_Plan": "Yemek Planı",
|
||||
"Select_Book": "Kitap Seç",
|
||||
"Select_File": "Dosya Seç",
|
||||
"Recipe_Image": "Tarif Resmi",
|
||||
"Import_finished": "İçeriye Aktarma Bitti",
|
||||
"View_Recipes": "Tarifleri Görüntüle",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "Yeni Tarif",
|
||||
"Url_Import": "Url İçeri Aktar",
|
||||
"Reset_Search": "Aramayı Sıfırla",
|
||||
"Recently_Viewed": "Son Görüntülenen",
|
||||
"Load_More": "Daha Fazla",
|
||||
"New_Keyword": "Yeni Anahtar Kelime",
|
||||
"Delete_Keyword": "Anahtar Kelimeyi Sil",
|
||||
"Edit_Keyword": "Anahtar Kelimeyi Düzenle",
|
||||
"Edit_Recipe": "Tarifi Düzenle",
|
||||
"Move_Keyword": "Anahtar Kelimeyi Taşı",
|
||||
"Merge_Keyword": "Anahtar Kelimeyi Birleştir",
|
||||
"Hide_Keywords": "Anahtar Kelimeyi Gizle",
|
||||
"Hide_Recipes": "Tarifi Gizle",
|
||||
"Move_Up": "Yukarı Taşı",
|
||||
"Move_Down": "Aşağıya Taşı",
|
||||
"Step_Name": "Adım Adı",
|
||||
"Step_Type": "Adım Tipi",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Enable_Amount": "Tutarı Etkinleştir",
|
||||
"Disable_Amount": "Tutarı Devre Dışı Bırak",
|
||||
"Ingredient Editor": "",
|
||||
"Private_Recipe": "Özel Tarif",
|
||||
"Private_Recipe_Help": "",
|
||||
"reusable_help_text": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "Anahtar Kelimeler",
|
||||
"Books": "Kitaplar",
|
||||
"Proteins": "Proteinler",
|
||||
"Fats": "Yağlar",
|
||||
"Carbohydrates": "Karbonhidratlar",
|
||||
"Calories": "Kaloriler",
|
||||
"Energy": "Enerji",
|
||||
"Nutrition": "Besin",
|
||||
"Date": "Tarih",
|
||||
"Share": "Paylaş",
|
||||
"Automation": "Otomasyon",
|
||||
"Parameter": "Parametre",
|
||||
"Export": "Dışa Aktar",
|
||||
"Copy": "Kopyala",
|
||||
"Rating": "Puanlama",
|
||||
"Close": "Kapat",
|
||||
"Cancel": "İptal",
|
||||
"Link": "Bağlantı",
|
||||
"Add": "Ekle",
|
||||
"New": "Yeni",
|
||||
"Note": "Not",
|
||||
"Success": "Başarılı",
|
||||
"Failure": "Hata",
|
||||
"Protected": "Korumalı",
|
||||
"Ingredients": "Mazemeler",
|
||||
"Supermarket": "Market",
|
||||
"Categories": "Kategoriler",
|
||||
"Category": "Kategori",
|
||||
"Selected": "Seçilen",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "Boyut",
|
||||
"Files": "Dosyalar",
|
||||
"File": "Dosya",
|
||||
"Edit": "Düzenle",
|
||||
"Image": "Resim",
|
||||
"Delete": "Sil",
|
||||
"Open": "Aç",
|
||||
"Ok": "Aç",
|
||||
"Save": "Kaydet",
|
||||
"Step": "Adım",
|
||||
"Search": "Ara",
|
||||
"Import": "İçeriye Aktar",
|
||||
"Print": "Yazdır",
|
||||
"Settings": "Ayarlar",
|
||||
"or": "veya",
|
||||
"and": "ve",
|
||||
"Information": "bilgi",
|
||||
"Download": "İndir",
|
||||
"Create": "Oluştur",
|
||||
"Search Settings": "Arama Ayarları",
|
||||
"View": "Görüntüle",
|
||||
"Recipes": "Tarifler",
|
||||
"Move": "Taşı",
|
||||
"Merge": "Birleştir",
|
||||
"Parent": "",
|
||||
"Copy Link": "",
|
||||
"Copy Token": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "Tarif Filtresi",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "Tarif Görüntüle",
|
||||
"copy_to_new": "Yeni Tarif'e Kopyala",
|
||||
"recipe_name": "Tarif Adı",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "Planlanan",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "Hızlı işlemler",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "Birimler",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "Rasgele Tarifler",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "Dosya Seç",
|
||||
"select_recipe": "Tarif Seç",
|
||||
"select_unit": "Birim Seç",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "Seç",
|
||||
"Supermarkets": "Marketler",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "İsim",
|
||||
"Last_name": "Soyisim",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "Sayfa",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "Değiştir",
|
||||
"Import_Error": "İçeri aktarma sırasında bir hata oluştu. Görüntülemek için lütfen sayfanın altındaki Ayrıntıları genişletin.",
|
||||
"Warning_Delete_Supermarket_Category": "Bir market kategorisinin silinmesi, gıdalarla olan tüm ilişkileri de silecektir. Emin misiniz?",
|
||||
"New_Supermarket": "Yeni Market",
|
||||
"New_Supermarket_Category": "Yeni Market Kategorisi",
|
||||
"Are_You_Sure": "Emin misin?",
|
||||
"Valid Until": "Geçerlilik Tarihi"
|
||||
}
|
@ -412,5 +412,12 @@
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": ""
|
||||
"Are_You_Sure": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -9,23 +9,23 @@
|
||||
"success_deleting_resource": "已成功删除资源!",
|
||||
"import_running": "正在导入,请稍候!",
|
||||
"all_fields_optional": "所有字段都是可选的,可以留空。",
|
||||
"convert_internal": "转换为内部菜谱",
|
||||
"show_only_internal": "仅显示内部菜谱",
|
||||
"Log_Recipe_Cooking": "菜谱烹饪记录",
|
||||
"External_Recipe_Image": "外部菜谱图像",
|
||||
"convert_internal": "转换为内部食谱",
|
||||
"show_only_internal": "仅显示内部食谱",
|
||||
"Log_Recipe_Cooking": "食谱烹饪记录",
|
||||
"External_Recipe_Image": "外部食谱图像",
|
||||
"Add_to_Shopping": "添加到购物",
|
||||
"Add_to_Plan": "添加到计划",
|
||||
"Step_start_time": "步骤开始时间",
|
||||
"Sort_by_new": "按新旧排序",
|
||||
"Recipes_per_page": "每页菜谱数量",
|
||||
"Recipes_per_page": "每页食谱数量",
|
||||
"Manage_Books": "管理书籍",
|
||||
"Meal_Plan": "用餐计划",
|
||||
"Select_Book": "选择书籍",
|
||||
"Recipe_Image": "菜谱图像",
|
||||
"Recipe_Image": "食谱图像",
|
||||
"Import_finished": "导入完成",
|
||||
"View_Recipes": "查看菜谱",
|
||||
"View_Recipes": "查看食谱",
|
||||
"Log_Cooking": "烹饪记录",
|
||||
"New_Recipe": "新菜谱",
|
||||
"New_Recipe": "新食谱",
|
||||
"Url_Import": "导入网址",
|
||||
"Reset_Search": "重置搜索",
|
||||
"Recently_Viewed": "最近浏览",
|
||||
@ -49,7 +49,7 @@
|
||||
"New": "新",
|
||||
"Success": "成功",
|
||||
"Failure": "失败",
|
||||
"Ingredients": "材料",
|
||||
"Ingredients": "食材",
|
||||
"Supermarket": "超市",
|
||||
"Categories": "分类",
|
||||
"Category": "分类",
|
||||
@ -86,16 +86,16 @@
|
||||
"Merge_Keyword": "合并关键词",
|
||||
"Hide_Keywords": "隐藏关键词",
|
||||
"Image": "图片",
|
||||
"Recipes": "菜谱",
|
||||
"Recipes": "食谱",
|
||||
"Move": "移动",
|
||||
"Merge": "合并",
|
||||
"confirm_delete": "您确定要删除 {object} 吗?",
|
||||
"Save_and_View": "保存并查看",
|
||||
"Edit_Recipe": "编辑菜谱",
|
||||
"Edit_Recipe": "编辑食谱",
|
||||
"Move_Up": "上移",
|
||||
"show_split_screen": "拆分视图",
|
||||
"Move_Keyword": "移动关键词",
|
||||
"Hide_Recipes": "隐藏菜谱",
|
||||
"Hide_Recipes": "隐藏食谱",
|
||||
"Move_Down": "下移",
|
||||
"Step_Name": "步骤名",
|
||||
"Step_Type": "步骤类型",
|
||||
@ -119,8 +119,8 @@
|
||||
"Create_New_Unit": "添加新的单位",
|
||||
"Create_New_Food": "添加新的食物",
|
||||
"warning_feature_beta": "此功能目前处于测试状态。在使用此功能时,请做好将来会出现错误和破坏性更改(可能会丢失与功能相关的数据)的准备。",
|
||||
"Add_nutrition_recipe": "将营养信息添加到菜谱中",
|
||||
"Remove_nutrition_recipe": "从菜谱中删除营养信息",
|
||||
"Add_nutrition_recipe": "将营养信息添加到食谱中",
|
||||
"Remove_nutrition_recipe": "从食谱中删除营养信息",
|
||||
"Keyword_Alias": "关键词别名",
|
||||
"Create_New_Meal_Type": "添加新的用餐类型",
|
||||
"Time": "时间",
|
||||
@ -134,7 +134,7 @@
|
||||
"Create_New_Keyword": "添加新的关键词",
|
||||
"Added_by": "添加者",
|
||||
"Shopping_list": "采购单",
|
||||
"Recipe": "菜谱",
|
||||
"Recipe": "食谱",
|
||||
"file_upload_disabled": "你的空间未启用文件上传。",
|
||||
"delete_title": "删除 {type}",
|
||||
"tree_root": "树根",
|
||||
@ -160,7 +160,7 @@
|
||||
"No_ID": "未找到标识,不能删除。",
|
||||
"Meal_Plan_Days": "未来的用餐计划",
|
||||
"Food": "食物",
|
||||
"Recipe_Book": "菜谱书",
|
||||
"Recipe_Book": "食谱书",
|
||||
"Icon": "图标",
|
||||
"Create_New_Shopping Category": "创建新的购物类别",
|
||||
"Automate": "自动化",
|
||||
@ -186,14 +186,14 @@
|
||||
"Starting_Day": "一周中的第一天",
|
||||
"Meal_Types": "用餐类型",
|
||||
"Make_Header": "显示注意事项",
|
||||
"Make_Ingredient": "显示材料",
|
||||
"Make_Ingredient": "制作食材",
|
||||
"Color": "颜色",
|
||||
"New_Meal_Type": "新用餐类型",
|
||||
"Pin": "固定",
|
||||
"Planner_Settings": "计划者设置",
|
||||
"Meal_Type": "用餐类型",
|
||||
"Clone": "复制",
|
||||
"Title_or_Recipe_Required": "需要选择标题或菜谱",
|
||||
"Title_or_Recipe_Required": "需要标题或食谱选择",
|
||||
"Export_As_ICal": "将当前周期导出为 iCal 格式",
|
||||
"Week_Numbers": "周数",
|
||||
"Show_Week_Numbers": "显示周数?",
|
||||
@ -214,7 +214,7 @@
|
||||
"Note": "笔记",
|
||||
"Added_on": "添加到",
|
||||
"AddToShopping": "添加到购物清单",
|
||||
"IngredientInShopping": "此材料已在购物清单。",
|
||||
"IngredientInShopping": "此食材已在购物清单中。",
|
||||
"OnHand": "目前",
|
||||
"FoodOnHand": "你手上有 {food}。",
|
||||
"FoodNotOnHand": "你还没有 {food}。",
|
||||
@ -246,17 +246,17 @@
|
||||
"shopping_share": "分享购物清单",
|
||||
"shopping_auto_sync": "自动同步",
|
||||
"mealplan_autoadd_shopping": "自动添加用餐计划",
|
||||
"mealplan_autoinclude_related": "添加相关的菜谱",
|
||||
"mealplan_autoinclude_related": "添加相关的食谱",
|
||||
"default_delay": "默认延迟时间",
|
||||
"mealplan_autoadd_shopping_desc": "自动将用餐计划配料添加到购物清单中。",
|
||||
"mealplan_autoexclude_onhand_desc": "将用餐计划添加到购物清单时(手动或自动),排除当前手头上的配料。",
|
||||
"mealplan_autoinclude_related_desc": "将用餐计划(手动或自动)添加到购物清单时,包括所有相关菜谱。",
|
||||
"mealplan_autoadd_shopping_desc": "自动将膳食计划食材添加到购物清单中。",
|
||||
"mealplan_autoexclude_onhand_desc": "将膳食计划添加到购物清单时(手动或自动),排除当前手头上的食材。",
|
||||
"mealplan_autoinclude_related_desc": "将膳食计划(手动或自动)添加到购物清单时,包括所有相关食谱。",
|
||||
"default_delay_desc": "延迟购物清单条目的默认小时数。",
|
||||
"err_move_self": "无法将项目移动到自身",
|
||||
"nothing": "无事可做",
|
||||
"show_sql": "显示 SQL",
|
||||
"filter_to_supermarket_desc": "默认情况下,过滤购物清单只包括所选超市的类别。",
|
||||
"shopping_recent_days_desc": "显示最近几天的购物清单条目。",
|
||||
"shopping_recent_days_desc": "显示最近几天的购物清单列表。",
|
||||
"shopping_recent_days": "最近几天",
|
||||
"create_shopping_new": "添加到新的购物清单",
|
||||
"download_pdf": "下载 PDF",
|
||||
@ -273,7 +273,198 @@
|
||||
"QuickEntry": "快速入口",
|
||||
"shopping_add_onhand_desc": "在核对购物清单时,将食物标记为“入手”。",
|
||||
"shopping_add_onhand": "自动入手",
|
||||
"related_recipes": "相关的菜谱",
|
||||
"today_recipes": "今日菜谱",
|
||||
"sql_debug": "调试 SQL"
|
||||
"related_recipes": "相关的食谱",
|
||||
"today_recipes": "今日食谱",
|
||||
"sql_debug": "调试 SQL",
|
||||
"OnHand_help": "食物在库存中时,不会自动添加到购物清单中。 并且现有状态会与购物用户共享。",
|
||||
"view_recipe": "查看食谱",
|
||||
"date_created": "创建日期",
|
||||
"show_sortby": "显示排序方式",
|
||||
"shared_with": "一起分享",
|
||||
"asc": "升序",
|
||||
"sort_by": "排序方式",
|
||||
"err_deleting_protected_resource": "您尝试删除的对象正在使用中,无法删除。",
|
||||
"Show_as_header": "显示标题",
|
||||
"Ingredient Editor": "食材编辑器",
|
||||
"Protected": "受保护的",
|
||||
"merge_selection": "将所有出现的 {source} 替换为 {type}。",
|
||||
"New_Entry": "新条目",
|
||||
"Language": "语言",
|
||||
"InheritWarning": "{food} 设置为继承, 更改可能无法保存。",
|
||||
"Auto_Planner": "自动计划",
|
||||
"Decimals": "小数",
|
||||
"Default_Unit": "默认单位",
|
||||
"Seconds": "秒",
|
||||
"and_down": "& Down",
|
||||
"ignore_shopping_help": "请不要将食物添加到购物列表中(例如水)",
|
||||
"Use_Fractions_Help": "查看食谱时自动将小数转换为分数。",
|
||||
"Foods": "食物",
|
||||
"Use_Fractions": "使用分数",
|
||||
"simple_mode": "简单模式",
|
||||
"left_handed": "左手模式",
|
||||
"left_handed_help": "将使用左手模式优化界面显示。",
|
||||
"desc": "降序",
|
||||
"review_shopping": "保存前查看购物列表",
|
||||
"Nav_Color_Help": "改变导航栏颜色。",
|
||||
"Theme": "主题",
|
||||
"SupermarketCategoriesOnly": "仅限超市类别",
|
||||
"CountMore": "...+{count} 更多",
|
||||
"one_url_per_line": "每行一个 URL",
|
||||
"plan_share_desc": "新的膳食计划条目将自动与选定的用户共享。",
|
||||
"paste_json": "在此处粘贴 json 或 html 源代码以加载食谱。",
|
||||
"Hour": "小数",
|
||||
"Hours": "小时",
|
||||
"Day": "天",
|
||||
"Days": "天",
|
||||
"Second": "秒",
|
||||
"filter_to_supermarket": "按超市筛选",
|
||||
"Clear": "清除",
|
||||
"Users": "用户",
|
||||
"Invites": "邀请",
|
||||
"warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个筛选器可能会产生意想不到的结果。",
|
||||
"Account": "账户",
|
||||
"Cosmetic": "化妆品",
|
||||
"API": "API",
|
||||
"enable_expert": "启用专家模式",
|
||||
"expert_mode": "专家模式",
|
||||
"advanced": "高级",
|
||||
"fields": "字段",
|
||||
"show_keywords": "显示关键字",
|
||||
"show_foods": "显示食物",
|
||||
"show_books": "显示书籍",
|
||||
"show_units": "显示单位",
|
||||
"show_filters": "显示筛选器",
|
||||
"filter_name": "筛选器名称",
|
||||
"food_recipe_help": "在此处链接食谱可以在使用此食物的任何食谱中包含此食谱的链接",
|
||||
"date_viewed": "最后查看",
|
||||
"paste_ingredients_placeholder": "在此处粘贴食材表...",
|
||||
"Bookmarklet": "书签",
|
||||
"Sticky_Nav_Help": "始终在屏幕顶部显示导航菜单。",
|
||||
"Nav_Color": "导航栏颜色",
|
||||
"Comments_setting": "显示评论",
|
||||
"no_more_images_found": "没有在网站上找到其他图片。",
|
||||
"Click_To_Edit": "点击编辑",
|
||||
"search_no_recipes": "找不到任何食谱!",
|
||||
"search_import_help_text": "从外部网站或应用程序导入食谱。",
|
||||
"search_create_help_text": "直接在泥炉中创建新食谱。",
|
||||
"reset_children": "重置子继承",
|
||||
"reset_food_inheritance": "重置继承",
|
||||
"reset_food_inheritance_info": "将所有食物重置为默认继承字段及其父值。",
|
||||
"select_food": "选择食物",
|
||||
"Sticky_Nav": "粘性导航",
|
||||
"Use_Kj": "使用千焦代替千卡",
|
||||
"import_duplicates": "为防止食谱与现有食谱同名,将被忽略。 选中此框以导入所有内容。",
|
||||
"ChildInheritFields_help": "默认情况下,子项将继承这些字段。",
|
||||
"InheritFields_help": "这些字段的值将从父级继承(例外:不会继承空的购物类别)",
|
||||
"Planned": "计划",
|
||||
"Manage_Emails": "管理电子邮件",
|
||||
"Change_Password": "更改密码",
|
||||
"select_recipe": "选择食谱",
|
||||
"select_unit": "选择单位",
|
||||
"remove_selection": "取消选择",
|
||||
"empty_list": "列表为空。",
|
||||
"Select": "选择",
|
||||
"Username": "用户名",
|
||||
"First_name": "名",
|
||||
"substitute_children_help": "所有与这种食物相同子级的食物都被视作替代品。",
|
||||
"substitute_children": "代替子级",
|
||||
"SubstituteOnHand": "你手头有一个替代品。",
|
||||
"ChildInheritFields": "子级继承字段",
|
||||
"Social_Authentication": "社交认证",
|
||||
"show_rating": "显示评分",
|
||||
"Last_name": "姓",
|
||||
"Keyword": "关键词",
|
||||
"Reset": "重置",
|
||||
"Disabled": "禁用",
|
||||
"Disable": "禁用",
|
||||
"Options": "选项",
|
||||
"Export_Supported": "导出支持",
|
||||
"Toggle": "切换",
|
||||
"Importer_Help": "有关此进口商的更多信息和帮助:",
|
||||
"created_on": "创建于",
|
||||
"Create Food": "创建食物",
|
||||
"create_food_desc": "创建食物并将其链接到此食谱。",
|
||||
"additional_options": "附加选项",
|
||||
"Documentation": "文档",
|
||||
"Select_App_To_Import": "请选择一个要导入的应用",
|
||||
"Import_Error": "导入时发生错误。 请跳转至页面底部的详细信息进行查看。",
|
||||
"Import_Not_Yet_Supported": "导入尚未支持",
|
||||
"Export_Not_Yet_Supported": "导入尚未支持",
|
||||
"Recipes_In_Import": "从文件中导入食谱",
|
||||
"New_Supermarket_Category": "新建超市类别",
|
||||
"Are_You_Sure": "你确定吗?",
|
||||
"Import_Result_Info": "导入 {imported} 个,共 {total} 个食谱已导入",
|
||||
"Valid Until": "有效期限",
|
||||
"Import_Supported": "支持导入",
|
||||
"move_selection": "选择要将 {source} 移动到的父级 {type}。",
|
||||
"and_up": "& Up",
|
||||
"last_cooked": "最后烹饪",
|
||||
"click_image_import": "单击此处为食谱导入图像",
|
||||
"substitute_help": "搜索可以用现有食材制作的食谱时,会考虑替代品。",
|
||||
"substitute_siblings_help": "所有与这种食物相同父级的食物都被视作替代品。",
|
||||
"Private_Recipe": "私人食谱",
|
||||
"Private_Recipe_Help": "食谱只有你和共享的人会显示。",
|
||||
"reusable_help_text": "邀请链接是否可用于多个用户。",
|
||||
"Copy Link": "复制链接",
|
||||
"Copy Token": "复制令牌",
|
||||
"Create_New_Shopping_Category": "添加新的购物类别",
|
||||
"merge_confirmation": "将 <i>{source}</i> 替换为 <i>{target}</i>",
|
||||
"save_filter": "保存筛选器",
|
||||
"not": "不",
|
||||
"Warning_Delete_Supermarket_Category": "删除超市类别也会删除与食品的所有关系。 你确定吗?",
|
||||
"New_Supermarket": "创建新超市",
|
||||
"warning_space_delete": "您可以删除您的空间,包括所有食谱、购物清单、膳食计划以及您创建的任何其他内容。 这不能被撤消! 你确定要这么做吗 ?",
|
||||
"facet_count_info": "在搜索筛选器上显示食谱计数。",
|
||||
"Hide_as_header": "隐藏标题",
|
||||
"food_inherit_info": "默认情况下应继承的食物上的字段。",
|
||||
"Custom Filter": "自定义筛选器",
|
||||
"search_rank": "搜索排行",
|
||||
"make_now": "立即制作",
|
||||
"recipe_filter": "食谱筛选器",
|
||||
"copy_to_new": "复制到新食谱",
|
||||
"recipe_name": "食谱名字",
|
||||
"ingredient_list": "食材列表",
|
||||
"filter": "筛选",
|
||||
"Website": "网站",
|
||||
"App": "应用",
|
||||
"Message": "信息",
|
||||
"paste_ingredients": "糊状食材",
|
||||
"explain": "解释",
|
||||
"Supermarkets": "超市",
|
||||
"User": "用户",
|
||||
"Advanced": "高级",
|
||||
"Ingredient Overview": "食材概述",
|
||||
"last_viewed": "最后查看",
|
||||
"updatedon": "更新时间",
|
||||
"advanced_search_settings": "高级搜索设置",
|
||||
"nothing_planned_today": "你今天没有任何计划!",
|
||||
"no_pinned_recipes": "你没有固定的食谱!",
|
||||
"Units": "单位",
|
||||
"Random Recipes": "随机食谱",
|
||||
"parameter_count": "参数 {count}",
|
||||
"select_keyword": "选择关键字",
|
||||
"add_keyword": "添加关键字",
|
||||
"select_file": "选择文件",
|
||||
"show_ingredient_overview": "在开始时显示食谱中所有食材的列表。",
|
||||
"Imported_From": "导入",
|
||||
"Pinned": "固定",
|
||||
"Imported": "导入",
|
||||
"Quick actions": "快捷操作",
|
||||
"Ratings": "等级",
|
||||
"Page": "页",
|
||||
"Single": "单个",
|
||||
"Multiple": "多个",
|
||||
"shopping_category_help": "超市可以按购物分类进行筛选使其与商店的内部布局相匹配。",
|
||||
"times_cooked": "烹饪时间",
|
||||
"reset_children_help": "用继承字段中的值覆盖所有子项。 继承的子字段将设置为继承,除非它们已设置为继承。",
|
||||
"substitute_siblings": "代替品",
|
||||
"book_filter_help": "除手动选择的食谱外,还包括筛选中的食谱。",
|
||||
"Internal": "内部",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -77,5 +77,12 @@
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": ""
|
||||
"Create": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
}
|
||||
|
@ -78,6 +78,7 @@ export class Models {
|
||||
params: [
|
||||
[
|
||||
"name",
|
||||
"plural_name",
|
||||
"description",
|
||||
"recipe",
|
||||
"food_onhand",
|
||||
@ -103,6 +104,13 @@ export class Models {
|
||||
placeholder: "", // form.placeholder always translated
|
||||
subtitle_field: "full_name",
|
||||
},
|
||||
plural_name: {
|
||||
form_field: true,
|
||||
type: "text",
|
||||
field: "plural_name",
|
||||
label: "Plural",
|
||||
placeholder: "",
|
||||
},
|
||||
description: {
|
||||
form_field: true,
|
||||
type: "text",
|
||||
@ -261,7 +269,7 @@ export class Models {
|
||||
apiName: "Unit",
|
||||
paginated: true,
|
||||
create: {
|
||||
params: [["name", "description"]],
|
||||
params: [["name", "plural_name", "description",]],
|
||||
form: {
|
||||
name: {
|
||||
form_field: true,
|
||||
@ -270,6 +278,13 @@ export class Models {
|
||||
label: "Name",
|
||||
placeholder: "",
|
||||
},
|
||||
plural_name: {
|
||||
form_field: true,
|
||||
type: "text",
|
||||
field: "plural_name",
|
||||
label: "Plural name",
|
||||
placeholder: "",
|
||||
},
|
||||
description: {
|
||||
form_field: true,
|
||||
type: "text",
|
||||
|
@ -280,7 +280,7 @@ export function getUserPreference(pref = undefined) {
|
||||
export function calculateAmount(amount, factor) {
|
||||
if (getUserPreference("use_fractions")) {
|
||||
let return_string = ""
|
||||
let fraction = frac(amount * factor, 10, true)
|
||||
let fraction = frac(amount * factor, 16, true)
|
||||
|
||||
if (fraction[0] === 0 && fraction[1] === 0 && fraction[2] === 1) {
|
||||
return roundDecimals(amount * factor)
|
||||
@ -305,6 +305,22 @@ export function roundDecimals(num) {
|
||||
return +(Math.round(num + `e+${decimals}`) + `e-${decimals}`)
|
||||
}
|
||||
|
||||
export function calculateHourMinuteSplit(amount) {
|
||||
if (amount >= 60) {
|
||||
let hours = Math.floor(amount / 60)
|
||||
let minutes = amount - hours * 60
|
||||
let output_text = hours + " h"
|
||||
|
||||
if (minutes > 0){
|
||||
output_text += " " + minutes + " min"
|
||||
}
|
||||
|
||||
return output_text
|
||||
} else {
|
||||
return amount + " min"
|
||||
}
|
||||
}
|
||||
|
||||
const KILOJOULES_PER_CALORIE = 4.18
|
||||
|
||||
export function calculateEnergy(amount, factor) {
|
||||
|
Reference in New Issue
Block a user