Merge remote-tracking branch 'origin/develop' into Auto-Planner
# Conflicts: # vue/src/apps/MealPlanView/MealPlanView.vue
This commit is contained in:
@ -18,7 +18,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3" v-for="book in filteredBooks" :key="book.id">
|
||||
<div style="padding-bottom: 55px">
|
||||
<div class="mb-3" v-for="book in filteredBooks" :key="book.id">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<b-card class="d-flex flex-column" v-hover v-on:click="openBook(book.id)">
|
||||
@ -53,7 +54,21 @@
|
||||
@reload="openBook(current_book, true)"
|
||||
></cookbook-slider>
|
||||
</transition>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<bottom-navigation-bar>
|
||||
<template #custom_create_functions>
|
||||
<div class="dropdown-divider" ></div>
|
||||
<h6 class="dropdown-header">{{ $t('Books')}}</h6>
|
||||
|
||||
<a class="dropdown-item" @click="createNew()"><i
|
||||
class="fa fa-book"></i> {{$t("Create")}}</a>
|
||||
|
||||
</template>
|
||||
</bottom-navigation-bar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -66,13 +81,14 @@ import { ApiApiFactory } from "@/utils/openapi/api"
|
||||
import CookbookSlider from "@/components/CookbookSlider"
|
||||
import LoadingSpinner from "@/components/LoadingSpinner"
|
||||
import { StandardToasts, ApiMixin } from "@/utils/utils"
|
||||
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
export default {
|
||||
name: "CookbookView",
|
||||
mixins: [ApiMixin],
|
||||
components: { LoadingSpinner, CookbookSlider },
|
||||
components: { LoadingSpinner, CookbookSlider, BottomNavigationBar },
|
||||
data() {
|
||||
return {
|
||||
cookbooks: [],
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './CookbookView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ExportResponseView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ExportView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ImportResponseView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -24,8 +24,11 @@
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 justify-content-cente">
|
||||
<b-checkbox v-model="import_multiple" switch><span
|
||||
v-if="import_multiple"><i class="far fa-copy fa-fw"></i> {{ $t('Multiple') }}</span><span
|
||||
v-if="!import_multiple"><i class="far fa-file fa-fw"></i> {{ $t('Single') }}</span></b-checkbox>
|
||||
v-if="import_multiple"><i
|
||||
class="far fa-copy fa-fw"></i> {{ $t('Multiple') }}</span><span
|
||||
v-if="!import_multiple"><i
|
||||
class="far fa-file fa-fw"></i> {{ $t('Single') }}</span>
|
||||
</b-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<b-input-group class="mt-2" :class="{ bounce: empty_input }"
|
||||
@ -52,23 +55,23 @@
|
||||
</b-button>
|
||||
|
||||
<!-- recent imports, nice for testing/development -->
|
||||
<!-- <div class="row mt-2"> -->
|
||||
<!-- <div class="col col-md-12">-->
|
||||
<!-- <div v-if="!import_multiple">-->
|
||||
<!-- <a href="#" @click="clearRecentImports()">Clear recent-->
|
||||
<!-- imports</a>-->
|
||||
<!-- <ul>-->
|
||||
<!-- <li v-for="x in recent_urls" v-bind:key="x">-->
|
||||
<!-- <a href="#"-->
|
||||
<!-- @click="loadRecipe(x, false, undefined)">{{-->
|
||||
<!-- x-->
|
||||
<!-- }}</a>-->
|
||||
<!-- </li>-->
|
||||
<!-- </ul>-->
|
||||
<!-- <div class="row mt-2"> -->
|
||||
<!-- <div class="col col-md-12">-->
|
||||
<!-- <div v-if="!import_multiple">-->
|
||||
<!-- <a href="#" @click="clearRecentImports()">Clear recent-->
|
||||
<!-- imports</a>-->
|
||||
<!-- <ul>-->
|
||||
<!-- <li v-for="x in recent_urls" v-bind:key="x">-->
|
||||
<!-- <a href="#"-->
|
||||
<!-- @click="loadRecipe(x, false, undefined)">{{-->
|
||||
<!-- x-->
|
||||
<!-- }}</a>-->
|
||||
<!-- </li>-->
|
||||
<!-- </ul>-->
|
||||
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@ -204,7 +207,7 @@
|
||||
v-if="!import_multiple">
|
||||
|
||||
<recipe-card :recipe="recipe_json" :detailed="false"
|
||||
:show_context_menu="false" :use_plural="use_plural"
|
||||
:show_context_menu="false"
|
||||
></recipe-card>
|
||||
</b-col>
|
||||
<b-col>
|
||||
@ -238,17 +241,22 @@
|
||||
</b-row>
|
||||
</b-card-body>
|
||||
<b-card-footer class="text-center">
|
||||
<div class="d-flex justify-content-center mb-3" v-if="import_loading">
|
||||
<b-spinner variant="primary"></b-spinner>
|
||||
</div>
|
||||
<b-button-group>
|
||||
<b-button @click="importRecipe('view')" v-if="!import_multiple">Import &
|
||||
<b-button @click="importRecipe('view')" v-if="!import_multiple"
|
||||
:disabled="import_loading">Import &
|
||||
View
|
||||
</b-button> <!-- TODO localize -->
|
||||
<b-button @click="importRecipe('edit')" variant="success"
|
||||
v-if="!import_multiple">Import & Edit
|
||||
v-if="!import_multiple" :disabled="import_loading">Import & Edit
|
||||
</b-button>
|
||||
<b-button @click="importRecipe('import')" v-if="!import_multiple">Import &
|
||||
<b-button @click="importRecipe('import')" v-if="!import_multiple"
|
||||
:disabled="import_loading">Import &
|
||||
Restart
|
||||
</b-button>
|
||||
<b-button @click="location.reload()">Restart
|
||||
<b-button @click="location.reload()" :disabled="import_loading">Restart
|
||||
</b-button>
|
||||
</b-button-group>
|
||||
</b-card-footer>
|
||||
@ -462,6 +470,7 @@ export default {
|
||||
source_data: '',
|
||||
recipe_json: undefined,
|
||||
use_plural: false,
|
||||
import_loading: false,
|
||||
// recipe_html: undefined,
|
||||
// recipe_tree: undefined,
|
||||
recipe_images: [],
|
||||
@ -495,6 +504,13 @@ export default {
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
|
||||
let urlParams = new URLSearchParams(window.location.search)
|
||||
|
||||
if (urlParams.has("url")) {
|
||||
this.website_url = urlParams.get('url')
|
||||
this.loadRecipe(this.website_url)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
@ -504,6 +520,7 @@ export default {
|
||||
* @param silent do not show any messages for imports
|
||||
*/
|
||||
importRecipe: function (action, data, silent) {
|
||||
this.import_loading = true
|
||||
if (this.recipe_json !== undefined) {
|
||||
this.$set(this.recipe_json, 'keywords', this.recipe_json.keywords.filter(k => k.show))
|
||||
}
|
||||
@ -528,12 +545,14 @@ export default {
|
||||
if (recipe_json.source_url !== '') {
|
||||
this.failed_imports.push(recipe_json.source_url)
|
||||
}
|
||||
this.import_loading = false
|
||||
if (!silent) {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
console.log('cant import recipe without data')
|
||||
this.import_loading = false
|
||||
if (!silent) {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE)
|
||||
}
|
||||
@ -563,6 +582,7 @@ export default {
|
||||
this.imported_recipes.push(recipe)
|
||||
break;
|
||||
case 'nothing':
|
||||
this.import_loading = false
|
||||
break;
|
||||
}
|
||||
},
|
||||
@ -614,6 +634,11 @@ export default {
|
||||
}
|
||||
|
||||
return axios.post(resolveDjangoUrl('api_recipe_from_source'), payload,).then((response) => {
|
||||
if (response.status === 201 && 'link' in response.data) {
|
||||
window.location = response.data.link
|
||||
return
|
||||
}
|
||||
|
||||
this.loading = false
|
||||
this.recipe_json = response.data['recipe_json'];
|
||||
|
||||
|
@ -1,63 +1,101 @@
|
||||
<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="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 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 mr-2"></i>
|
||||
<b-badge variant="light">{{ i.amount.toFixed(2) }}</b-badge>
|
||||
<b-badge variant="secondary" v-if="i.unit">{{ i.unit.name }}</b-badge>
|
||||
<b-badge variant="info" v-if="i.food">{{ i.food.name }}</b-badge>
|
||||
<i>{{ i.original_text }}</i>
|
||||
<b-button @click="prepareIngredientEditModal(s,i)" v-b-modal.ingredient_edit_modal class="float-right btn-sm"><i class="fas fa-pencil-alt"></i></b-button>
|
||||
</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>
|
||||
|
||||
<b-modal id="ingredient_edit_modal" :title="$t('Edit')">
|
||||
<div v-if="current_edit_ingredient !== null">
|
||||
<b-form-group v-bind:label="$t('Original_Text')" class="mb-3">
|
||||
<b-form-input v-model="current_edit_ingredient.original_text" type="text" disabled></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group v-bind:label="$t('Amount')" class="mb-3">
|
||||
<b-form-input v-model.number="current_edit_ingredient.amount" type="number"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group v-bind:label="$t('Unit')" class="mb-3" v-if="current_edit_ingredient.unit !== null">
|
||||
<b-form-input v-model="current_edit_ingredient.unit.name" type="text"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group v-bind:label="$t('Food')" class="mb-3">
|
||||
<b-form-input v-model="current_edit_ingredient.food.name" type="text"></b-form-input>
|
||||
</b-form-group>
|
||||
<b-form-group v-bind:label="$t('Note')" class="mb-3">
|
||||
<b-form-input v-model="current_edit_ingredient.note" type="text"></b-form-input>
|
||||
</b-form-group>
|
||||
</div>
|
||||
|
||||
<template v-slot:modal-footer>
|
||||
<div class="row w-100">
|
||||
|
||||
<div class="col-auto justify-content-end">
|
||||
<b-button class="mx-1" @click="destroyIngredientEditModal()">{{ $t('Ok') }}</b-button>
|
||||
<b-button class="mx-1" @click="removeIngredient(current_edit_step,current_edit_ingredient);destroyIngredientEditModal()" variant="danger">{{ $t('Delete') }}</b-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</b-modal>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@ -67,116 +105,161 @@ 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)
|
||||
name: "ImportViewStepEditor",
|
||||
components: {
|
||||
draggable
|
||||
},
|
||||
},
|
||||
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': []})
|
||||
props: {
|
||||
recipe: undefined
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
recipe_json: undefined,
|
||||
current_edit_ingredient: null,
|
||||
current_edit_step: null,
|
||||
}
|
||||
})
|
||||
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
|
||||
watch: {
|
||||
recipe_json: function () {
|
||||
this.$emit('change', this.recipe_json)
|
||||
},
|
||||
},
|
||||
/**
|
||||
* 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)
|
||||
mounted() {
|
||||
this.recipe_json = this.recipe
|
||||
},
|
||||
/**
|
||||
* 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)
|
||||
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 = [])
|
||||
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}
|
||||
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
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
* Prepare variable that holds currently edited ingredient for modal to manipulate it
|
||||
* add default placeholder for food/unit in case it is not present, so it can be edited as well
|
||||
* @param ingredient
|
||||
*/
|
||||
prepareIngredientEditModal: function (step, ingredient) {
|
||||
if (ingredient.unit === null) {
|
||||
ingredient.unit = {
|
||||
"name": ""
|
||||
}
|
||||
}
|
||||
})
|
||||
best_match.step.ingredients.push(i)
|
||||
found = true
|
||||
if (ingredient.food === null) {
|
||||
ingredient.food = {
|
||||
"name": ""
|
||||
}
|
||||
}
|
||||
this.current_edit_ingredient = ingredient
|
||||
this.current_edit_step = step
|
||||
},
|
||||
/**
|
||||
* can be called to remove an ingredient from the given step
|
||||
* @param step step to remove ingredient from
|
||||
* @param ingredient ingredient to remove
|
||||
*/
|
||||
removeIngredient: function (step, ingredient) {
|
||||
step.ingredients = step.ingredients.filter((i) => i !== ingredient)
|
||||
},
|
||||
/**
|
||||
* cleanup method called to close modal
|
||||
* closes modal UI and cleanups variables
|
||||
*/
|
||||
destroyIngredientEditModal: function () {
|
||||
this.$bvModal.hide('ingredient_edit_modal')
|
||||
if (this.current_edit_ingredient.unit.name === ''){
|
||||
this.current_edit_ingredient.unit = null
|
||||
}
|
||||
if (this.current_edit_ingredient.food.name === ''){
|
||||
this.current_edit_ingredient.food = null
|
||||
}
|
||||
this.current_edit_ingredient = null
|
||||
this.current_edit_step = null
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ImportView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './IngredientEditorView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div>
|
||||
<b-tabs content-class="mt-3" v-model="current_tab">
|
||||
<b-tab :title="$t('Planner')" active>
|
||||
<div class="row calender-row">
|
||||
<div class="row calender-row d-none d-lg-block">
|
||||
<div class="col-12 calender-parent">
|
||||
<calendar-view
|
||||
:show-date="showDate"
|
||||
@ -48,6 +48,79 @@
|
||||
</calendar-view>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row d-block d-lg-none">
|
||||
<div>
|
||||
<div class="col-12">
|
||||
<div class="col-12 d-flex justify-content-center mt-2">
|
||||
<b-button-toolbar key-nav aria-label="Toolbar with button groups">
|
||||
<b-button-group class="mx-1">
|
||||
<b-button v-html="'<<'" class="p-2 pr-3 pl-3"
|
||||
@click="setShowDate($refs.header.headerProps.previousPeriod)"></b-button>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<b-button @click="setShowDate($refs.header.headerProps.currentPeriod)"><i
|
||||
class="fas fa-home"></i></b-button>
|
||||
<b-form-datepicker right button-only button-variant="secondary" @context="datePickerChanged"></b-form-datepicker>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<b-button v-html="'>>'" class="p-2 pr-3 pl-3"
|
||||
@click="setShowDate($refs.header.headerProps.nextPeriod)"></b-button>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mt-2" style="padding-bottom: 60px">
|
||||
<div v-for="day in mobileSimpleGrid" v-bind:key="day.day">
|
||||
<b-list-group>
|
||||
<b-list-group-item>
|
||||
<div class="d-flex flex-row align-middle">
|
||||
<h6 class="mb-0 mt-1 align-middle">{{ day.date_label }}</h6>
|
||||
|
||||
<div class="flex-grow-1 text-right">
|
||||
<b-button class="btn-sm btn-outline-primary" @click="showMealPlanEditModal(null, day.create_default_date)"><i
|
||||
class="fa fa-plus"></i></b-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</b-list-group-item>
|
||||
<b-list-group-item v-for="plan in day.plan_entries" v-bind:key="plan.entry.id" >
|
||||
<div class="d-flex flex-row align-items-center">
|
||||
<div>
|
||||
<b-img style="height: 50px; width: 50px; object-fit: cover"
|
||||
:src="plan.entry.recipe.image" rounded="circle" v-if="plan.entry.recipe?.image"></b-img>
|
||||
<b-img style="height: 50px; width: 50px; object-fit: cover"
|
||||
:src="image_placeholder" rounded="circle" v-else></b-img>
|
||||
</div>
|
||||
<div class="flex-grow-1 ml-2"
|
||||
style="text-overflow: ellipsis; overflow-wrap: anywhere;">
|
||||
<span class="two-row-text">
|
||||
<a :href="resolveDjangoUrl('view_recipe', plan.entry.recipe.id)" v-if="plan.entry.recipe">{{ plan.entry.recipe.name }}</a>
|
||||
<span v-else>{{ plan.entry.title }}</span> <br/>
|
||||
</span>
|
||||
<span v-if="plan.entry.note" class="two-row-text">
|
||||
<small>{{ plan.entry.note }}</small> <br/>
|
||||
</span>
|
||||
<small class="text-muted">
|
||||
<span v-if="plan.entry.shopping" class="font-light"><i class="fas fa-shopping-cart fa-xs "/></span>
|
||||
{{ plan.entry.meal_type_name }}
|
||||
<span v-if="plan.entry.recipe">
|
||||
- <i class="fa fa-clock"></i> {{ plan.entry.recipe.working_time + plan.entry.recipe.waiting_time }} {{ $t('min') }}
|
||||
</span>
|
||||
</small>
|
||||
</div>
|
||||
<div class="hover-button">
|
||||
<a class="pr-2" @click.stop="openContextMenu($event, {originalItem: plan})"><i class="fas fa-ellipsis-v"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</b-list-group-item>
|
||||
|
||||
</b-list-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</b-tab>
|
||||
<b-tab :title="$t('Settings')">
|
||||
<div class="row mt-3">
|
||||
@ -166,7 +239,7 @@
|
||||
<ContextMenuItem
|
||||
@click="
|
||||
$refs.menu.close()
|
||||
moveEntryLeft(contextData)
|
||||
moveEntryLeft(contextData.originalItem)
|
||||
"
|
||||
>
|
||||
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-left"></i>
|
||||
@ -175,7 +248,7 @@
|
||||
<ContextMenuItem
|
||||
@click="
|
||||
$refs.menu.close()
|
||||
moveEntryRight(contextData)
|
||||
moveEntryRight(contextData.originalItem)
|
||||
"
|
||||
>
|
||||
<a class="dropdown-item p-2" href="javascript:void(0)"><i class="fas fa-arrow-right"></i>
|
||||
@ -192,7 +265,7 @@
|
||||
<ContextMenuItem
|
||||
@click="
|
||||
$refs.menu.close()
|
||||
deleteEntry(contextData)
|
||||
deleteEntry(contextData.originalItem)
|
||||
"
|
||||
>
|
||||
<a class="dropdown-item p-2 text-danger" href="javascript:void(0)"><i class="fas fa-trash"></i>
|
||||
@ -203,9 +276,7 @@
|
||||
<meal-plan-edit-modal
|
||||
:entry="entryEditing"
|
||||
:modal_title="modal_title"
|
||||
:edit_modal_show="edit_modal_show"
|
||||
@save-entry="editEntry"
|
||||
@delete-entry="deleteEntry"
|
||||
:create_date="mealplan_default_date"
|
||||
@reload-meal-types="refreshMealTypes"
|
||||
></meal-plan-edit-modal>
|
||||
<auto-meal-plan-modal
|
||||
@ -214,46 +285,29 @@
|
||||
@create-plan="doAutoPlan"
|
||||
></auto-meal-plan-modal>
|
||||
|
||||
<transition name="slide-fade">
|
||||
<div class="row fixed-bottom p-2 b-1 border-top text-center" style="background: rgba(255, 255, 255, 0.6)"
|
||||
v-if="current_tab === 0">
|
||||
<div class="col-md-3 col-6 mb-1 mb-md-0">
|
||||
<button class="btn btn-block btn-success shadow-none" @click="createEntryClick(new Date())"><i
|
||||
class="fas fa-calendar-plus"></i> {{ $t("Create") }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-md-3 col-6 mb-1 mb-md-0">
|
||||
<a class="btn btn-block btn-primary shadow-none" :href="iCalUrl"
|
||||
><i class="fas fa-download"></i>
|
||||
{{ $t("Export_To_ICal") }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 col-6 mb-1 mb-md-0">
|
||||
<div class="row d-none d-lg-block">
|
||||
<div class="col-12 float-right">
|
||||
<button class="btn btn-success shadow-none" @click="createEntryClick(new Date())"><i
|
||||
class="fas fa-calendar-plus"></i> {{ $t("Create") }}
|
||||
</button>
|
||||
<a class="btn btn-primary shadow-none" :href="iCalUrl"><i class="fas fa-download"></i>
|
||||
{{ $t("Export_To_ICal") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<bottom-navigation-bar :create_links="[{label:$t('Export_To_ICal'), url: iCalUrl, icon:'fas fa-download'}]">
|
||||
<template #custom_create_functions>
|
||||
<h6 class="dropdown-header">{{ $t('Meal_Plan')}}</h6>
|
||||
<a class="dropdown-item" @click="createEntryClick(new Date())"><i
|
||||
class="fas fa-calendar-plus fa-fw"></i> {{ $t("Create") }}</a>
|
||||
</template>
|
||||
<div class="col-md-3 col-6 mb-1 mb-md-0">
|
||||
<button class="btn btn-block btn-primary shadow-none" @click="createAutoPlan(new Date())">
|
||||
{{ $t("Auto_Planner") }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-12 d-flex justify-content-center mt-2 d-block d-md-none">
|
||||
<b-button-toolbar key-nav aria-label="Toolbar with button groups">
|
||||
<b-button-group class="mx-1">
|
||||
<b-button v-html="'<<'" class="p-2 pr-3 pl-3"
|
||||
@click="setShowDate($refs.header.headerProps.previousPeriod)"></b-button>
|
||||
<b-button v-html="'<'" @click="setStartingDay(-1)" class="p-2 pr-3 pl-3"></b-button>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<b-button @click="setShowDate($refs.header.headerProps.currentPeriod)"><i
|
||||
class="fas fa-home"></i></b-button>
|
||||
<b-form-datepicker button-only button-variant="secondary"></b-form-datepicker>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<b-button v-html="'>'" @click="setStartingDay(1)" class="p-2 pr-3 pl-3"></b-button>
|
||||
<b-button v-html="'>>'" class="p-2 pr-3 pl-3"
|
||||
@click="setShowDate($refs.header.headerProps.nextPeriod)"></b-button>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
</bottom-navigation-bar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -276,6 +330,8 @@ import VueCookies from "vue-cookies"
|
||||
import {ApiMixin, StandardToasts, ResolveUrlMixin} from "@/utils/utils"
|
||||
import {CalendarView, CalendarMathMixin} from "vue-simple-calendar/src/components/bundle"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api"
|
||||
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
|
||||
import {useMealPlanStore} from "@/stores/MealPlanStore";
|
||||
import axios from "axios";
|
||||
import AutoMealPlanModal from "@/components/AutoMealPlanModal";
|
||||
|
||||
@ -299,6 +355,7 @@ export default {
|
||||
MealPlanCalenderHeader,
|
||||
EmojiInput,
|
||||
draggable,
|
||||
BottomNavigationBar,
|
||||
},
|
||||
mixins: [CalendarMathMixin, ApiMixin, ResolveUrlMixin],
|
||||
data: function () {
|
||||
@ -334,29 +391,18 @@ export default {
|
||||
{text: this.$t("Year"), value: "year"},
|
||||
],
|
||||
displayPeriodCount: [1, 2, 3],
|
||||
entryEditing: {
|
||||
date: null,
|
||||
id: -1,
|
||||
meal_type: null,
|
||||
note: "",
|
||||
note_markdown: "",
|
||||
recipe: null,
|
||||
servings: 1,
|
||||
shared: [],
|
||||
title: "",
|
||||
title_placeholder: this.$t("Title"),
|
||||
},
|
||||
},
|
||||
shopping_list: [],
|
||||
current_period: null,
|
||||
entryEditing: {},
|
||||
edit_modal_show: false,
|
||||
entryEditing: null,
|
||||
mealplan_default_date: null,
|
||||
ical_url: window.ICAL_URL,
|
||||
image_placeholder: window.IMAGE_PLACEHOLDER,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
modal_title: function () {
|
||||
if (this.entryEditing.id === -1) {
|
||||
if (this.entryEditing === null || this.entryEditing?.id === -1) {
|
||||
return this.$t("Create_Meal_Plan_Entry")
|
||||
} else {
|
||||
return this.$t("Edit_Meal_Plan_Entry")
|
||||
@ -364,7 +410,7 @@ export default {
|
||||
},
|
||||
plan_items: function () {
|
||||
let items = []
|
||||
this.plan_entries.forEach((entry) => {
|
||||
useMealPlanStore().plan_list.forEach((entry) => {
|
||||
items.push(this.buildItem(entry))
|
||||
})
|
||||
return items
|
||||
@ -398,6 +444,22 @@ export default {
|
||||
return ""
|
||||
}
|
||||
},
|
||||
mobileSimpleGrid() {
|
||||
let grid = []
|
||||
|
||||
if (this.current_period !== null) {
|
||||
for (const x of Array(7).keys()) {
|
||||
let moment_date = moment(this.current_period.periodStart).add(x, "d")
|
||||
grid.push({
|
||||
date: moment_date,
|
||||
create_default_date: moment_date.format("YYYY-MM-DD"), // improve meal plan edit modal to do formatting itself and accept dates
|
||||
date_label: moment_date.format('ddd DD.MM'),
|
||||
plan_entries: this.plan_items.filter((m) => moment(m.startDate).isSame(moment_date, 'day'))
|
||||
})
|
||||
}
|
||||
}
|
||||
return grid
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(function () {
|
||||
@ -407,6 +469,7 @@ export default {
|
||||
})
|
||||
this.$root.$on("change", this.updateEmoji)
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
moment.locale(window.CUSTOM_LOCALE)
|
||||
},
|
||||
watch: {
|
||||
settings: {
|
||||
@ -504,33 +567,26 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
editEntry(edit_entry) {
|
||||
if (edit_entry.id !== -1) {
|
||||
this.plan_entries.forEach((entry, index) => {
|
||||
if (entry.id === edit_entry.id) {
|
||||
this.$set(this.plan_entries, index, edit_entry)
|
||||
this.saveEntry(this.plan_entries[index])
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.createEntry(edit_entry)
|
||||
}
|
||||
datePickerChanged(ctx) {
|
||||
this.setShowDate(ctx.selectedDate)
|
||||
},
|
||||
setShowDate(d) {
|
||||
this.showDate = d
|
||||
},
|
||||
createEntryClick(data) {
|
||||
this.entryEditing = this.options.entryEditing
|
||||
this.entryEditing.date = moment(data).format("YYYY-MM-DD")
|
||||
this.$bvModal.show(`edit-modal`)
|
||||
this.mealplan_default_date = moment(data).format("YYYY-MM-DD")
|
||||
this.entryEditing = null
|
||||
this.$nextTick(function () {
|
||||
this.$bvModal.show(`id_meal_plan_edit_modal`)
|
||||
})
|
||||
},
|
||||
findEntry(id) {
|
||||
return this.plan_entries.filter((entry) => {
|
||||
return useMealPlanStore().plan_list.filter((entry) => {
|
||||
return entry.id === id
|
||||
})[0]
|
||||
},
|
||||
moveEntry(null_object, target_date, drag_event) {
|
||||
this.plan_entries.forEach((entry) => {
|
||||
useMealPlanStore().plan_list.forEach((entry) => {
|
||||
if (entry.id === this.dragged_item.id) {
|
||||
if (drag_event.ctrlKey) {
|
||||
let new_entry = Object.assign({}, entry)
|
||||
@ -544,7 +600,7 @@ export default {
|
||||
})
|
||||
},
|
||||
moveEntryLeft(data) {
|
||||
this.plan_entries.forEach((entry) => {
|
||||
useMealPlanStore().plan_list.forEach((entry) => {
|
||||
if (entry.id === data.id) {
|
||||
entry.date = moment(entry.date).subtract(1, "d")
|
||||
this.saveEntry(entry)
|
||||
@ -552,7 +608,7 @@ export default {
|
||||
})
|
||||
},
|
||||
moveEntryRight(data) {
|
||||
this.plan_entries.forEach((entry) => {
|
||||
useMealPlanStore().plan_list.forEach((entry) => {
|
||||
if (entry.id === data.id) {
|
||||
entry.date = moment(entry.date).add(1, "d")
|
||||
this.saveEntry(entry)
|
||||
@ -560,20 +616,7 @@ export default {
|
||||
})
|
||||
},
|
||||
deleteEntry(data) {
|
||||
this.plan_entries.forEach((entry, index, list) => {
|
||||
if (entry.id === data.id) {
|
||||
let apiClient = new ApiApiFactory()
|
||||
|
||||
apiClient
|
||||
.destroyMealPlan(entry.id)
|
||||
.then((e) => {
|
||||
list.splice(index, 1)
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
}
|
||||
})
|
||||
useMealPlanStore().deleteObject(data)
|
||||
},
|
||||
entryClick(data) {
|
||||
let entry = this.findEntry(data.id)
|
||||
@ -583,7 +626,7 @@ export default {
|
||||
this.$refs.menu.open($event, value)
|
||||
},
|
||||
openEntryEdit(entry) {
|
||||
this.$bvModal.show(`edit-modal`)
|
||||
this.$bvModal.show(`id_meal_plan_edit_modal`)
|
||||
this.entryEditing = entry
|
||||
this.entryEditing.date = moment(entry.date).format("YYYY-MM-DD")
|
||||
if (this.entryEditing.recipe != null) {
|
||||
@ -592,18 +635,9 @@ export default {
|
||||
},
|
||||
periodChangedCallback(date) {
|
||||
this.current_period = date
|
||||
let apiClient = new ApiApiFactory()
|
||||
|
||||
apiClient
|
||||
.listMealPlans({
|
||||
query: {
|
||||
from_date: moment(date.periodStart).format("YYYY-MM-DD"),
|
||||
to_date: moment(date.periodEnd).format("YYYY-MM-DD"),
|
||||
},
|
||||
})
|
||||
.then((result) => {
|
||||
this.plan_entries = result.data
|
||||
})
|
||||
useMealPlanStore().refreshFromAPI(moment(date.periodStart).format("YYYY-MM-DD"), moment(date.periodEnd).format("YYYY-MM-DD"))
|
||||
|
||||
this.refreshMealTypes()
|
||||
},
|
||||
refreshMealTypes() {
|
||||
@ -619,25 +653,11 @@ export default {
|
||||
saveEntry(entry) {
|
||||
entry.date = moment(entry.date).format("YYYY-MM-DD")
|
||||
|
||||
let apiClient = new ApiApiFactory()
|
||||
|
||||
apiClient.updateMealPlan(entry.id, entry).catch((err) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
useMealPlanStore().updateObject(entry)
|
||||
},
|
||||
createEntry(entry) {
|
||||
entry.date = moment(entry.date).format("YYYY-MM-DD")
|
||||
|
||||
let apiClient = new ApiApiFactory()
|
||||
|
||||
apiClient
|
||||
.createMealPlan(entry)
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
.then((entry_result) => {
|
||||
this.plan_entries.push(entry_result.data)
|
||||
})
|
||||
useMealPlanStore().createObject(entry)
|
||||
},
|
||||
buildItem(plan_entry) {
|
||||
//dirty hack to order items within a day
|
||||
@ -649,6 +669,15 @@ export default {
|
||||
entry: plan_entry,
|
||||
}
|
||||
},
|
||||
showMealPlanEditModal: function (entry, date) {
|
||||
this.mealplan_default_date = date
|
||||
this.entryEditing = entry
|
||||
|
||||
this.$nextTick(function () {
|
||||
this.$bvModal.show(`id_meal_plan_edit_modal`)
|
||||
})
|
||||
|
||||
}
|
||||
createAutoPlan() {
|
||||
this.$bvModal.show(`autoplan-modal`)
|
||||
},
|
||||
@ -713,6 +742,10 @@ export default {
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#id_base_container {
|
||||
margin-top: 12px
|
||||
}
|
||||
|
||||
.slide-fade-enter-active {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './MealPlanView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,7 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -41,7 +41,6 @@
|
||||
<!-- 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,7 +50,6 @@
|
||||
<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>
|
||||
@ -63,7 +61,6 @@
|
||||
<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>
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ModelListView'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './OfflineView.vue'
|
||||
import i18n from "@/i18n";
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './ProfileView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -572,7 +572,7 @@
|
||||
{{ $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">
|
||||
@ -600,7 +600,7 @@
|
||||
<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)">
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './RecipeEditView'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div id="app" style="margin-bottom: 4vh">
|
||||
<div id="app" style="padding-bottom: 60px">
|
||||
<RecipeSwitcher ref="ref_recipe_switcher"/>
|
||||
<div class="row">
|
||||
<div class="col-12 col-xl-10 col-lg-10 offset-xl-1 offset-lg-1">
|
||||
@ -90,7 +90,7 @@
|
||||
<b-form-group v-if="ui.show_meal_plan"
|
||||
v-bind:label="$t('Meal_Plan_Days')"
|
||||
label-for="popover-input-5" label-cols="8" class="mb-1">
|
||||
<b-form-input type="number" v-model="ui.meal_plan_days"
|
||||
<b-form-input type="number" v-model.number="ui.meal_plan_days"
|
||||
id="popover-input-5" size="sm"
|
||||
class="mt-1"></b-form-input>
|
||||
</b-form-group>
|
||||
@ -797,8 +797,9 @@
|
||||
<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" >
|
||||
<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="
|
||||
@ -812,7 +813,7 @@
|
||||
</b-dropdown>
|
||||
|
||||
<b-button variant="outline-primary" size="sm" class="shadow-none ml-1"
|
||||
@click="resetSearch()"><i class="fas fa-file-alt"></i> {{
|
||||
@click="resetSearch()" v-if="searchFiltered()"><i class="fas fa-file-alt"></i> {{
|
||||
search.pagination_page
|
||||
}}/{{ Math.ceil(pagination_count / ui.page_size) }} {{ $t("Reset") }} <i
|
||||
class="fas fa-times-circle"></i>
|
||||
@ -828,34 +829,92 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template v-if="!searchFiltered() && ui.show_meal_plan && meal_plan_grid.length > 0">
|
||||
<hr/>
|
||||
<div class="row">
|
||||
|
||||
<div class="col col-md-12">
|
||||
<div
|
||||
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); column-gap: 0.5rem;row-gap: 0.5rem; grid-auto-rows: max-content; ">
|
||||
<div v-for="day in meal_plan_grid" v-bind:key="day.day" :class="{'d-none d-sm-block': day.plan_entries.length === 0}">
|
||||
<b-list-group >
|
||||
<b-list-group-item class="hover-div pb-0">
|
||||
<div class="d-flex flex-row align-items-center">
|
||||
<div>
|
||||
<h6>{{ day.date_label }}</h6>
|
||||
</div>
|
||||
<div class="flex-grow-1 text-right">
|
||||
<b-button class="hover-button btn-outline-primary btn-sm" @click="showMealPlanEditModal(null, day.create_default_date)"><i
|
||||
class="fa fa-plus"></i></b-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</b-list-group-item>
|
||||
<b-list-group-item v-for="plan in day.plan_entries" v-bind:key="plan.id" class="hover-div">
|
||||
<div class="d-flex flex-row align-items-center">
|
||||
<div>
|
||||
<b-img style="height: 50px; width: 50px; object-fit: cover"
|
||||
:src="plan.recipe.image" rounded="circle" v-if="plan.recipe?.image"></b-img>
|
||||
<b-img style="height: 50px; width: 50px; object-fit: cover"
|
||||
:src="image_placeholder" rounded="circle" v-else></b-img>
|
||||
</div>
|
||||
<div class="flex-grow-1 ml-2"
|
||||
style="text-overflow: ellipsis; overflow-wrap: anywhere;">
|
||||
<span class="two-row-text">
|
||||
<a :href="resolveDjangoUrl('view_recipe', plan.recipe.id)" v-if="plan.recipe">{{ plan.recipe.name }}</a>
|
||||
<span v-else>{{ plan.title }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="hover-button">
|
||||
<b-button @click="showMealPlanEditModal(plan,null)" class="btn-outline-primary btn-sm"><i class="fas fa-pencil-alt"></i></b-button>
|
||||
</div>
|
||||
</div>
|
||||
</b-list-group-item>
|
||||
|
||||
</b-list-group>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<hr/>
|
||||
</template>
|
||||
|
||||
|
||||
<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.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>
|
||||
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); column-gap: 0.5rem;row-gap: 1rem; grid-auto-rows: max-content; ">
|
||||
|
||||
<!-- TODO remove once new meal plan view has proven to be good -->
|
||||
<!-- <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]"
|
||||
:use_plural="use_plural">
|
||||
</recipe-card>
|
||||
</recipe-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="margin-top: 2vh" v-if="!random_search">
|
||||
<div class="col col-md-12">
|
||||
<b-pagination pills v-model="search.pagination_page" :total-rows="pagination_count"
|
||||
<b-pagination v-model="search.pagination_page" :total-rows="pagination_count" first-number
|
||||
last-number size="lg"
|
||||
:per-page="ui.page_size" @change="pageChange" align="center"></b-pagination>
|
||||
</div>
|
||||
</div>
|
||||
@ -894,6 +953,15 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<meal-plan-edit-modal
|
||||
:entry="mealplan_entry_edit"
|
||||
:create_date="mealplan_default_date"
|
||||
></meal-plan-edit-modal>
|
||||
|
||||
<bottom-navigation-bar>
|
||||
|
||||
</bottom-navigation-bar>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -916,7 +984,10 @@ 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"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api"
|
||||
import {useMealPlanStore} from "@/stores/MealPlanStore";
|
||||
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
|
||||
import MealPlanEditModal from "@/components/MealPlanEditModal.vue";
|
||||
|
||||
Vue.use(VueCookies)
|
||||
Vue.use(BootstrapVue)
|
||||
@ -927,7 +998,7 @@ let UI_COOKIE_NAME = "ui_search_settings"
|
||||
export default {
|
||||
name: "RecipeSearchView",
|
||||
mixins: [ResolveUrlMixin, ApiMixin, ToastMixin],
|
||||
components: {GenericMultiselect, RecipeCard, Treeselect, RecipeSwitcher, Multiselect},
|
||||
components: {GenericMultiselect, RecipeCard, Treeselect, RecipeSwitcher, Multiselect, BottomNavigationBar, MealPlanEditModal},
|
||||
data() {
|
||||
return {
|
||||
// this.Models and this.Actions inherited from ApiMixin
|
||||
@ -935,6 +1006,7 @@ export default {
|
||||
recipes_loading: true,
|
||||
facets: {Books: [], Foods: [], Keywords: []},
|
||||
meal_plans: [],
|
||||
meal_plan_store: null,
|
||||
last_viewed_recipes: [],
|
||||
sortMenu: false,
|
||||
use_plural: false,
|
||||
@ -1015,9 +1087,27 @@ export default {
|
||||
pagination_count: 0,
|
||||
random_search: false,
|
||||
debug: false,
|
||||
mealplan_default_date: null,
|
||||
mealplan_entry_edit: null,
|
||||
image_placeholder: window.IMAGE_PLACEHOLDER,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
meal_plan_grid: function () {
|
||||
let grid = []
|
||||
if (this.meal_plan_store !== null && this.meal_plan_store.plan_list.length > 0) {
|
||||
for (const x of Array(this.ui.meal_plan_days).keys()) {
|
||||
let moment_date = moment().add(x, "d")
|
||||
grid.push({
|
||||
date: moment_date,
|
||||
create_default_date: moment_date.format("YYYY-MM-DD"), // improve meal plan edit modal to do formatting itself and accept dates
|
||||
date_label: moment_date.format('ddd DD.MM'),
|
||||
plan_entries: this.meal_plan_store.plan_list.filter((m) => moment(m.date).isSame(moment_date, 'day'))
|
||||
})
|
||||
}
|
||||
}
|
||||
return grid
|
||||
},
|
||||
locale: function () {
|
||||
return window.CUSTOM_LOCALE
|
||||
},
|
||||
@ -1120,6 +1210,12 @@ export default {
|
||||
})
|
||||
return sort_order
|
||||
},
|
||||
isMobile: function () { //TODO move to central helper
|
||||
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
|
||||
},
|
||||
isTouch: function () {
|
||||
return window.matchMedia("(pointer: coarse)").matches
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
||||
@ -1169,6 +1265,7 @@ export default {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
moment.locale(window.CUSTOM_LOCALE)
|
||||
this.debug = localStorage.getItem("DEBUG") == "True" || false
|
||||
},
|
||||
watch: {
|
||||
@ -1257,21 +1354,26 @@ export default {
|
||||
return [...new Map(data.map((item) => [key(item), item])).values()]
|
||||
},
|
||||
loadMealPlan: function () {
|
||||
if (this.ui.show_meal_plan) {
|
||||
let params = {
|
||||
options: {
|
||||
query: {
|
||||
from_date: moment().format("YYYY-MM-DD"),
|
||||
to_date: moment().add(this.ui.meal_plan_days, "days").format("YYYY-MM-DD"),
|
||||
},
|
||||
},
|
||||
}
|
||||
this.genericAPI(this.Models.MEAL_PLAN, this.Actions.LIST, params).then((result) => {
|
||||
this.meal_plans = result.data
|
||||
})
|
||||
} else {
|
||||
this.meal_plans = []
|
||||
}
|
||||
console.log('loadMealpLan')
|
||||
this.meal_plan_store = useMealPlanStore()
|
||||
this.meal_plan_store.refreshFromAPI(moment().format("YYYY-MM-DD"), moment().add(this.ui.meal_plan_days, "days").format("YYYY-MM-DD"))
|
||||
|
||||
|
||||
// if (this.ui.show_meal_plan) {
|
||||
// let params = {
|
||||
// options: {
|
||||
// query: {
|
||||
// from_date: moment().format("YYYY-MM-DD"),
|
||||
// to_date: moment().add(this.ui.meal_plan_days, "days").format("YYYY-MM-DD"),
|
||||
// },
|
||||
// },
|
||||
// }
|
||||
// this.genericAPI(this.Models.MEAL_PLAN, this.Actions.LIST, params).then((result) => {
|
||||
// this.meal_plans = result.data
|
||||
// })
|
||||
// } else {
|
||||
// this.meal_plans = []
|
||||
// }
|
||||
},
|
||||
genericSelectChanged: function (obj) {
|
||||
if (obj.var.includes("::")) {
|
||||
@ -1544,6 +1646,15 @@ export default {
|
||||
type.filter((x) => x.operator === false && x.not === false).length > 1
|
||||
)
|
||||
},
|
||||
showMealPlanEditModal: function (entry, date) {
|
||||
this.mealplan_default_date = date
|
||||
this.mealplan_entry_edit = entry
|
||||
|
||||
this.$nextTick(function () {
|
||||
this.$bvModal.show(`id_meal_plan_edit_modal`)
|
||||
})
|
||||
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -1579,4 +1690,12 @@ export default {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
.hover-button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.hover-div:hover .hover-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './RecipeSearchView'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -4,7 +4,7 @@
|
||||
<loading-spinner></loading-spinner>
|
||||
</template>
|
||||
|
||||
<div v-if="!loading">
|
||||
<div v-if="!loading" style="padding-bottom: 60px">
|
||||
<RecipeSwitcher ref="ref_recipe_switcher" @switch="quickSwitch($event)"/>
|
||||
<div class="row">
|
||||
<div class="col-12" style="text-align: center">
|
||||
@ -90,7 +90,6 @@
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:servings="servings"
|
||||
:header="true"
|
||||
:use_plural="use_plural"
|
||||
id="ingredient_container"
|
||||
@checked-state-changed="updateIngredientCheckedState"
|
||||
@change-servings="servings = $event"
|
||||
@ -124,7 +123,6 @@
|
||||
:step="s"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
:index="index"
|
||||
:use_plural="use_plural"
|
||||
:start_time="start_time"
|
||||
@update-start-time="updateStartTime"
|
||||
@checked-state-changed="updateIngredientCheckedState"
|
||||
@ -149,11 +147,14 @@
|
||||
<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"
|
||||
v-if="share_uid !== 'None'">
|
||||
v-if="share_uid !== 'None' && !loading">
|
||||
<div class="col col-md-12">
|
||||
<a :href="resolveDjangoUrl('view_report_share_abuse', share_uid)">{{ $t("Report Abuse") }}</a>
|
||||
<import-tandoor></import-tandoor> <br/>
|
||||
<a :href="resolveDjangoUrl('view_report_share_abuse', share_uid)" class="mt-3">{{ $t("Report Abuse") }}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<bottom-navigation-bar></bottom-navigation-bar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -182,6 +183,8 @@ import NutritionComponent from "@/components/NutritionComponent"
|
||||
import RecipeSwitcher from "@/components/Buttons/RecipeSwitcher"
|
||||
import CustomInputSpinButton from "@/components/CustomInputSpinButton"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
import ImportTandoor from "@/components/Modals/ImportTandoor.vue";
|
||||
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@ -191,6 +194,7 @@ export default {
|
||||
name: "RecipeView",
|
||||
mixins: [ResolveUrlMixin, ToastMixin],
|
||||
components: {
|
||||
ImportTandoor,
|
||||
LastCooked,
|
||||
RecipeRating,
|
||||
PdfViewer,
|
||||
@ -204,6 +208,7 @@ export default {
|
||||
AddRecipeToBook,
|
||||
RecipeSwitcher,
|
||||
CustomInputSpinButton,
|
||||
BottomNavigationBar,
|
||||
},
|
||||
computed: {
|
||||
ingredient_factor: function () {
|
||||
@ -221,7 +226,6 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
use_plural: false,
|
||||
loading: true,
|
||||
recipe: undefined,
|
||||
rootrecipe: undefined,
|
||||
@ -244,10 +248,6 @@ export default {
|
||||
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()
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './RecipeView.vue'
|
||||
import i18n from "@/i18n";
|
||||
import {createPinia, PiniaVuePlugin} from 'pinia'
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './SettingsView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,7 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<div id="app" style="margin-bottom: 4vh">
|
||||
<div id="app">
|
||||
<b-alert :show="!online" dismissible class="small float-up" variant="warning">{{ $t("OfflineAlert") }}</b-alert>
|
||||
|
||||
<div class="row float-top w-100">
|
||||
<div class="col-auto no-gutter ml-auto">
|
||||
<b-button variant="link" class="px-1 pt-0 pb-1 d-none d-md-inline-block">
|
||||
@ -469,30 +470,6 @@
|
||||
</b-tab>
|
||||
</b-tabs>
|
||||
|
||||
<transition name="slided-fade">
|
||||
<div class="row fixed-bottom p-2 b-1 border-top text-center d-flex d-md-none"
|
||||
style="background: rgba(255, 255, 255, 0.6);width: 105%;" v-if="current_tab === 0">
|
||||
<div class="col-6">
|
||||
<a class="btn btn-block btn-success shadow-none" @click="entrymode = !entrymode; "
|
||||
><i class="fas fa-cart-plus"></i>
|
||||
{{ $t("New_Entry") }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<b-dropdown id="dropdown-dropup" block dropup variant="primary" class="shadow-none">
|
||||
<template #button-content><i class="fas fa-download"></i> {{ $t("Export") }}</template>
|
||||
<DownloadPDF dom="#shoppinglist" name="shopping.pdf" :label="$t('download_pdf')"
|
||||
icon="far fa-file-pdf"/>
|
||||
<DownloadCSV :items="csvData" :delim="settings.csv_delim" name="shopping.csv"
|
||||
:label="$t('download_csv')" icon="fas fa-file-csv"/>
|
||||
<CopyToClipboard :items="csvData" :settings="settings" :label="$t('copy_to_clipboard')"
|
||||
icon="fas fa-clipboard-list"/>
|
||||
<CopyToClipboard :items="csvData" :settings="settings" format="table"
|
||||
:label="$t('copy_markdown_table')" icon="fab fa-markdown"/>
|
||||
</b-dropdown>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<b-popover target="id_filters_button" triggers="click" placement="bottomleft" :title="$t('Filters')">
|
||||
<div>
|
||||
<b-form-group v-bind:label="$t('GroupBy')" label-for="popover-input-1" label-cols="6" class="mb-1">
|
||||
@ -588,6 +565,29 @@
|
||||
</ContextMenu>
|
||||
<shopping-modal v-if="new_recipe.id" :recipe="new_recipe" :servings="parseInt(add_recipe_servings)"
|
||||
:modal_id="new_recipe.id" @finish="finishShopping" :list_recipe="new_recipe.list_recipe"/>
|
||||
|
||||
<bottom-navigation-bar>
|
||||
<template #custom_create_functions>
|
||||
|
||||
<div class="dropdown-divider"></div>
|
||||
<h6 class="dropdown-header">{{ $t('Shopping_list')}}</h6>
|
||||
|
||||
<a class="dropdown-item" @click="entrymode = !entrymode; " ><i class="fas fa-cart-plus"></i>
|
||||
{{ $t("New_Entry") }}
|
||||
</a>
|
||||
|
||||
<DownloadPDF dom="#shoppinglist" name="shopping.pdf" :label="$t('download_pdf')"
|
||||
icon="far fa-file-pdf fa-fw"/>
|
||||
<DownloadCSV :items="csvData" :delim="settings.csv_delim" name="shopping.csv"
|
||||
:label="$t('download_csv')" icon="fas fa-file-csv fa-fw"/>
|
||||
<CopyToClipboard :items="csvData" :settings="settings" :label="$t('copy_to_clipboard')"
|
||||
icon="fas fa-clipboard-list fa-fw"/>
|
||||
<CopyToClipboard :items="csvData" :settings="settings" format="table"
|
||||
:label="$t('copy_markdown_table')" icon="fab fa-markdown fa-fw"/>
|
||||
|
||||
|
||||
</template>
|
||||
</bottom-navigation-bar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -615,6 +615,8 @@ import ShoppingSettingsComponent from "@/components/Settings/ShoppingSettingsCom
|
||||
Vue.use(BootstrapVue)
|
||||
Vue.use(VueCookies)
|
||||
let SETTINGS_COOKIE_NAME = "shopping_settings"
|
||||
import {Workbox} from 'workbox-window';
|
||||
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
|
||||
|
||||
export default {
|
||||
name: "ShoppingListView",
|
||||
@ -630,7 +632,8 @@ export default {
|
||||
CopyToClipboard,
|
||||
ShoppingModal,
|
||||
draggable,
|
||||
ShoppingSettingsComponent
|
||||
ShoppingSettingsComponent,
|
||||
BottomNavigationBar,
|
||||
},
|
||||
|
||||
data() {
|
||||
@ -903,9 +906,30 @@ export default {
|
||||
}
|
||||
})
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
console.log(window.CUSTOM_LOCALE)
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* failed requests to sync entry check events are automatically re-queued by the service worker for sync
|
||||
* this command allows to manually force replaying those events before re-enabling automatic sync
|
||||
*/
|
||||
replaySyncQueue: function () {
|
||||
const wb = new Workbox('/service-worker.js');
|
||||
wb.register();
|
||||
wb.messageSW({type: 'BGSYNC_REPLAY_REQUESTS'}).then((r) => {
|
||||
console.log('Background sync queue replayed!', r);
|
||||
})
|
||||
},
|
||||
/**
|
||||
* get the number of entries left in the sync queue for entry check events
|
||||
* @returns {Promise<Number>} promise resolving to the number of entries left
|
||||
*/
|
||||
getSyncQueueLength: function () {
|
||||
const wb = new Workbox('/service-worker.js');
|
||||
wb.register();
|
||||
return wb.messageSW({type: 'BGSYNC_COUNT_QUEUE'}).then((r) => {
|
||||
return r
|
||||
})
|
||||
},
|
||||
setFocus() {
|
||||
if (this.ui.entry_mode_simple) {
|
||||
this.$refs['amount_input_simple'].focus()
|
||||
@ -1043,21 +1067,27 @@ export default {
|
||||
} else {
|
||||
this.loading = true
|
||||
}
|
||||
this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params)
|
||||
.then((results) => {
|
||||
if (!autosync) {
|
||||
if (results.data?.length) {
|
||||
this.items = results.data
|
||||
} else {
|
||||
console.log("no data returned")
|
||||
}
|
||||
this.loading = false
|
||||
this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params).then((results) => {
|
||||
if (!autosync) {
|
||||
if (results.data?.length) {
|
||||
this.items = results.data
|
||||
} else {
|
||||
if (!this.auto_sync_blocked) {
|
||||
this.mergeShoppingList(results.data)
|
||||
}
|
||||
console.log("no data returned")
|
||||
}
|
||||
})
|
||||
this.loading = false
|
||||
} else {
|
||||
if (!this.auto_sync_blocked) {
|
||||
this.getSyncQueueLength().then((r) => {
|
||||
if (r === 0) {
|
||||
this.mergeShoppingList(results.data)
|
||||
} else {
|
||||
this.auto_sync_running = false
|
||||
this.replaySyncQueue()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
if (!autosync) {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_FETCH, err)
|
||||
@ -1205,7 +1235,7 @@ export default {
|
||||
let api = new ApiApiFactory()
|
||||
if (field) {
|
||||
// assume if field is changing it should no longer be inherited
|
||||
food.inherit_fields = food.inherit_fields.filter((x) => x.field !== field)
|
||||
food.inherit_fields = food.inherit_fields?.filter((x) => x.field !== field)
|
||||
}
|
||||
|
||||
return api
|
||||
|
@ -1,6 +1,7 @@
|
||||
import i18n from "@/i18n"
|
||||
import Vue from "vue"
|
||||
import App from "./ShoppingListView"
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,7 +12,11 @@ if (process.env.NODE_ENV === "development") {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: (h) => h(App),
|
||||
}).$mount("#app")
|
||||
|
@ -151,9 +151,6 @@
|
||||
<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"
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './SpaceManageView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import App from './SupermarketView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') {
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
||||
|
155
vue/src/apps/TestView/TestView.vue
Normal file
155
vue/src/apps/TestView/TestView.vue
Normal file
@ -0,0 +1,155 @@
|
||||
<template>
|
||||
|
||||
<div id="app">
|
||||
<div class="row" v-if="food">
|
||||
<div class="col-12">
|
||||
<h2>{{ food.name }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<b-form v-if="food">
|
||||
<b-form-group :label="$t('Name')" description="">
|
||||
<b-form-input v-model="food.name"></b-form-input>
|
||||
</b-form-group>
|
||||
<b-form-group :label="$t('Plural')" description="">
|
||||
<b-form-input v-model="food.plural_name"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
|
||||
<b-form-group :label="$t('Recipe')" :description="$t('food_recipe_help')">
|
||||
<generic-multiselect
|
||||
@change="food.recipe = $event.val;"
|
||||
:model="Models.RECIPE"
|
||||
:initial_selection="food.recipe"
|
||||
label="name"
|
||||
:multiple="false"
|
||||
:placeholder="$t('Recipe')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('OnHand_help')">
|
||||
<b-form-checkbox v-model="food.food_onhand">{{ $t('OnHand') }}</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('ignore_shopping_help')">
|
||||
<b-form-checkbox v-model="food.ignore_shopping">{{ $t('Ignore_Shopping') }}</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('Shopping_Category')" :description="$t('shopping_category_help')">
|
||||
<generic-multiselect
|
||||
@change="food.supermarket_category = $event.val;"
|
||||
:model="Models.SHOPPING_CATEGORY"
|
||||
:initial_selection="food.supermarket_category"
|
||||
label="name"
|
||||
:multiple="false"
|
||||
:placeholder="$t('Shopping_Category')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<hr/>
|
||||
<!-- todo add conditions if false disable dont hide -->
|
||||
<b-form-group :label="$t('Substitutes')" :description="$t('substitute_help')">
|
||||
<generic-multiselect
|
||||
@change="food.substitute = $event.val;"
|
||||
:model="Models.FOOD"
|
||||
:initial_selection="food.substitute"
|
||||
label="name"
|
||||
:multiple="false"
|
||||
:placeholder="$t('Substitutes')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('substitute_siblings_help')">
|
||||
<b-form-checkbox v-model="food.substitute_siblings">{{ $t('substitute_siblings') }}</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('InheritFields')" :description="$t('InheritFields_help')">
|
||||
<generic-multiselect
|
||||
@change="food.inherit_fields = $event.val;"
|
||||
:model="Models.FOOD_INHERIT_FIELDS"
|
||||
:initial_selection="food.inherit_fields"
|
||||
label="name"
|
||||
:multiple="false"
|
||||
:placeholder="$t('InheritFields')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('ChildInheritFields')" :description="$t('ChildInheritFields_help')">
|
||||
<generic-multiselect
|
||||
@change="food.child_inherit_fields = $event.val;"
|
||||
:model="Models.FOOD_INHERIT_FIELDS"
|
||||
:initial_selection="food.child_inherit_fields"
|
||||
label="name"
|
||||
:multiple="false"
|
||||
:placeholder="$t('ChildInheritFields')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<!-- TODO change to a button -->
|
||||
<b-form-group :description="$t('reset_children_help')">
|
||||
<b-form-checkbox v-model="food.reset_inherit">{{ $t('reset_children') }}</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-button variant="primary" @click="updateFood">{{ $t('Save') }}</b-button>
|
||||
</b-form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
import Vue from "vue"
|
||||
import {BootstrapVue} from "bootstrap-vue"
|
||||
|
||||
import "bootstrap-vue/dist/bootstrap-vue.css"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
import RecipeCard from "@/components/RecipeCard.vue";
|
||||
import GenericMultiselect from "@/components/GenericMultiselect.vue";
|
||||
import {ApiMixin, StandardToasts} from "@/utils/utils";
|
||||
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
|
||||
export default {
|
||||
name: "TestView",
|
||||
mixins: [ApiMixin],
|
||||
components: {
|
||||
GenericMultiselect
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
food: undefined,
|
||||
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveFood('1').then((r) => {
|
||||
this.food = r.data
|
||||
})
|
||||
|
||||
},
|
||||
methods: {
|
||||
updateFood: function () {
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.updateFood(this.food.id, this.food).then((r) => {
|
||||
this.food = r.data
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
22
vue/src/apps/TestView/main.js
Normal file
22
vue/src/apps/TestView/main.js
Normal file
@ -0,0 +1,22 @@
|
||||
import Vue from 'vue'
|
||||
import App from './TestView.vue'
|
||||
import i18n from '@/i18n'
|
||||
import {createPinia, PiniaVuePlugin} from "pinia";
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
// TODO move this and other default stuff to centralized JS file (verify nothing breaks)
|
||||
let publicPath = localStorage.STATIC_URL + 'vue/'
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
publicPath = 'http://localhost:8080/'
|
||||
}
|
||||
export default __webpack_public_path__ = publicPath // eslint-disable-line
|
||||
|
||||
Vue.use(PiniaVuePlugin)
|
||||
const pinia = createPinia()
|
||||
|
||||
new Vue({
|
||||
pinia,
|
||||
i18n,
|
||||
render: h => h(App),
|
||||
}).$mount('#app')
|
0
vue/src/apps/base_app.js
Normal file
0
vue/src/apps/base_app.js
Normal file
100
vue/src/components/BottomNavigationBar.vue
Normal file
100
vue/src/components/BottomNavigationBar.vue
Normal file
@ -0,0 +1,100 @@
|
||||
<template>
|
||||
<!-- bottom button nav -->
|
||||
<div class="fixed-bottom p-1 pt-2 pl-2 pr-2 border-top text-center d-lg-none" style="background: white">
|
||||
<div class="d-flex flex-row justify-content-around">
|
||||
<div class="flex-column" v-if="show_button_1">
|
||||
<slot name="button_1">
|
||||
<a class="nav-link bottom-nav-link p-0" v-bind:href="resolveDjangoUrl('view_search')">
|
||||
<i class="fas fa-fw fa-book " style="font-size: 1.5em"></i><br/><small>{{ $t('Recipes') }}</small></a> <!-- TODO localize -->
|
||||
</slot>
|
||||
|
||||
</div>
|
||||
<div class="flex-column" v-if="show_button_2">
|
||||
<slot name="button_2">
|
||||
<a class="nav-link bottom-nav-link p-0" v-bind:href="resolveDjangoUrl('view_plan')">
|
||||
<i class="fas fa-calendar-alt" style="font-size: 1.5em"></i><br/><small>{{ $t('Meal_Plan') }}</small></a>
|
||||
</slot>
|
||||
|
||||
</div>
|
||||
<div class="flex-column" v-if="show_button_create">
|
||||
<slot name="button_create">
|
||||
<div class="dropup">
|
||||
<a class="nav-link bottom-nav-link p-0" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
|
||||
aria-haspopup="true" aria-expanded="false"><i class="fas fa-plus-circle fa-2x bottom-nav-link"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu center-dropup" aria-labelledby="navbarDropdownMenuLink">
|
||||
|
||||
<a class="dropdown-item" v-bind:href="resolveDjangoUrl('new_recipe')"><i
|
||||
class="fas fa-fw fa-plus"></i> {{ $t('Create Recipe') }}</a>
|
||||
<a class="dropdown-item" v-bind:href="resolveDjangoUrl('data_import_url')"><i
|
||||
class="fas fa-fw fa-file-import"></i> {{ $t('Import Recipe') }}</a>
|
||||
<div class="dropdown-divider" v-if="create_links.length > 0"></div>
|
||||
|
||||
<slot name="custom_create_functions">
|
||||
|
||||
</slot>
|
||||
|
||||
<a class="dropdown-item" v-bind:href="cl.url" v-for="cl in create_links" v-bind:key="cl.label">
|
||||
<i :class="cl.icon + ' fa-fw'"></i> {{ cl.label }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
</div>
|
||||
<div class="flex-column" v-if="show_button_3">
|
||||
<slot name="button_3">
|
||||
<a class="nav-link bottom-nav-link p-0" v-bind:href="resolveDjangoUrl('view_shopping')">
|
||||
<i class="fas fa-shopping-cart" style="font-size: 1.5em"></i><br/><small>{{ $t('Shopping_list') }}</small></a>
|
||||
</slot>
|
||||
</div>
|
||||
<div class="flex-column">
|
||||
|
||||
<slot name="button_4" v-if="show_button_4">
|
||||
<a class="nav-link bottom-nav-link p-0" v-bind:href="resolveDjangoUrl('view_books')">
|
||||
<i class="fas fa-book-open" style="font-size: 1.5em"></i><br/><small>{{ $t('Books') }}</small></a> <!-- TODO localize -->
|
||||
</slot>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {ResolveUrlMixin} from "@/utils/utils";
|
||||
|
||||
export default {
|
||||
name: "BottomNavigationBar",
|
||||
mixins: [ResolveUrlMixin],
|
||||
props: {
|
||||
create_links: {
|
||||
type: Array, default() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
show_button_1: {type: Boolean, default: true},
|
||||
show_button_2: {type: Boolean, default: true},
|
||||
show_button_3: {type: Boolean, default: true},
|
||||
show_button_4: {type: Boolean, default: true},
|
||||
show_button_create: {type: Boolean, default: true},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
.bottom-nav-link {
|
||||
color: #666666
|
||||
}
|
||||
|
||||
.center-dropup {
|
||||
right: auto;
|
||||
left: 50%;
|
||||
-webkit-transform: translate(-50%, 0);
|
||||
-o-transform: translate(-50%, 0);
|
||||
transform: translate(-50%, 0);
|
||||
}
|
||||
</style>
|
@ -95,7 +95,7 @@ export default {
|
||||
<style scoped>
|
||||
.context-menu {
|
||||
position: fixed;
|
||||
z-index: 999;
|
||||
z-index: 5000;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
border-radius: 4px;
|
||||
|
@ -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" :use_plural="use_plural"></recipe-card>
|
||||
<recipe-card :recipe="display_recipes[0].recipe_content" v-if="current_page > 1" :key="display_recipes[0].recipe" ></recipe-card>
|
||||
</transition>
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
|
@ -23,9 +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 v-if="item[plural]!== '' && item[plural] !== null && item[plural] !== undefined" class="m-0 text-truncate">({{ $t("plural_short") }}: {{ item[plural] }})</div>
|
||||
|
||||
<div class="m-0 text-truncate">{{ item[subtitle] }}</div>
|
||||
<div class="m-0 text-truncate small text-muted" v-if="getFullname">{{ getFullname }}</div>
|
||||
|
||||
|
@ -155,8 +155,9 @@ export default {
|
||||
pageSize: this.limit,
|
||||
query: query,
|
||||
limit: this.limit,
|
||||
options: {query: {simple: 1}}, // for API endpoints that support a simple view
|
||||
}
|
||||
console.log(query, options)
|
||||
|
||||
this.genericAPI(this.model, this.Actions.LIST, options).then((result) => {
|
||||
this.objects = this.sticky_options.concat(result.data?.results ?? result.data)
|
||||
if (this.nothingSelected && this.objects.length > 0) {
|
||||
|
@ -12,21 +12,17 @@
|
||||
<i class="far fa-check-circle text-primary" v-if="!ingredient.checked"></i>
|
||||
</td>
|
||||
<td class="text-nowrap" @click="done">
|
||||
<span v-if="ingredient.amount !== 0 && !ingredient.no_amount"
|
||||
v-html="calculateAmount(ingredient.amount)"></span>
|
||||
<span v-if="ingredient.amount !== 0 && !ingredient.no_amount" v-html="calculateAmount(ingredient.amount)"></span>
|
||||
</td>
|
||||
<td @click="done">
|
||||
<template v-if="ingredient.unit !== null && !ingredient.no_amount">
|
||||
<template v-if="!use_plural">
|
||||
<span>{{ ingredient.unit.name }}</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<template>
|
||||
<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-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>
|
||||
@ -34,21 +30,18 @@
|
||||
</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>
|
||||
<a :href="resolveDjangoUrl('view_recipe', ingredient.food.recipe.id)" 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>
|
||||
<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-if="ingredient.amount * this.ingredient_factor > 1">{{ ingredient.food.plural_name }}</span>
|
||||
<span v-else>{{ ingredient.food.name }}</span>
|
||||
</template>
|
||||
</template>
|
||||
@ -56,36 +49,32 @@
|
||||
</template>
|
||||
</td>
|
||||
<td v-if="detailed">
|
||||
<div v-if="ingredient.note">
|
||||
<span v-b-popover.hover="ingredient.note" class="d-print-none touchable p-0 pl-md-2 pr-md-2">
|
||||
<template v-if="ingredient.note">
|
||||
<span v-b-popover.hover="ingredient.note" class="d-print-none touchable py-0 px-2">
|
||||
<i class="far fa-comment"></i>
|
||||
</span>
|
||||
|
||||
<div class="d-none d-print-block"><i class="far fa-comment-alt d-print-none"></i> {{
|
||||
ingredient.note
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-print-block"><i class="far fa-comment-alt d-print-none"></i> {{ ingredient.note }}</div>
|
||||
</template>
|
||||
</td>
|
||||
</template>
|
||||
</tr>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {calculateAmount, ResolveUrlMixin} from "@/utils/utils"
|
||||
import { calculateAmount, ResolveUrlMixin } from "@/utils/utils"
|
||||
|
||||
import Vue from "vue"
|
||||
import VueSanitize from "vue-sanitize";
|
||||
import VueSanitize from "vue-sanitize"
|
||||
|
||||
Vue.use(VueSanitize);
|
||||
Vue.use(VueSanitize)
|
||||
|
||||
export default {
|
||||
name: "IngredientComponent",
|
||||
props: {
|
||||
ingredient: Object,
|
||||
ingredient_factor: {type: Number, default: 1},
|
||||
use_plural:{type: Boolean, default: false},
|
||||
detailed: {type: Boolean, default: true},
|
||||
ingredient_factor: { type: Number, default: 1 },
|
||||
detailed: { type: Boolean, default: true },
|
||||
},
|
||||
mixins: [ResolveUrlMixin],
|
||||
data() {
|
||||
@ -94,9 +83,7 @@ export default {
|
||||
}
|
||||
},
|
||||
watch: {},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
calculateAmount: function (x) {
|
||||
return this.$sanitize(calculateAmount(x, this.ingredient_factor))
|
||||
@ -112,9 +99,9 @@ export default {
|
||||
<style scoped>
|
||||
/* increase size of hover/touchable space without changing spacing */
|
||||
.touchable {
|
||||
padding-right: 2em;
|
||||
padding-left: 2em;
|
||||
margin-right: -2em;
|
||||
margin-left: -2em;
|
||||
/* padding-right: 2em;
|
||||
padding-left: 2em; */
|
||||
margin-right: -1em;
|
||||
margin-left: -1em;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div v-if="recipe.keywords.length > 0">
|
||||
<span :key="k.id" v-for="k in recipe.keywords.filter((kk) => { return kk.show || kk.show === undefined })" class="pl-1">
|
||||
<span :key="k.id" v-for="k in recipe.keywords.slice(0,keyword_splice).filter((kk) => { return kk.show || kk.show === undefined })" class="pl-1">
|
||||
<a :href="`${resolveDjangoUrl('view_search')}?keyword=${k.id}`"><b-badge pill variant="light"
|
||||
class="font-weight-normal">{{ k.label }}</b-badge></a>
|
||||
|
||||
@ -17,6 +17,15 @@ export default {
|
||||
mixins: [ResolveUrlMixin],
|
||||
props: {
|
||||
recipe: Object,
|
||||
limit: Number,
|
||||
},
|
||||
computed: {
|
||||
keyword_splice: function (){
|
||||
if(this.limit){
|
||||
return this.limit
|
||||
}
|
||||
return this.recipe.keywords.lenght
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@ -1,114 +1,148 @@
|
||||
<template>
|
||||
<b-modal :id="modal_id" size="lg" :title="modal_title" hide-footer aria-label="" @show="showModal">
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<div class="row">
|
||||
<div class="col-6 col-lg-9">
|
||||
<b-input-group>
|
||||
<b-form-input id="TitleInput" v-model="entryEditing.title" :placeholder="entryEditing.title_placeholder" @change="missing_recipe = false"></b-form-input>
|
||||
<b-input-group-append class="d-none d-lg-block">
|
||||
<b-button variant="primary" @click="entryEditing.title = ''"><i class="fa fa-eraser"></i></b-button>
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
<span class="text-danger" v-if="missing_recipe">{{ $t("Title_or_Recipe_Required") }}</span>
|
||||
<small tabindex="-1" class="form-text text-muted" v-if="!missing_recipe">{{ $t("Title") }}</small>
|
||||
<div>
|
||||
<b-modal :id="modal_id" size="lg" :title="modal_title" hide-footer aria-label="" @show="showModal">
|
||||
<div class="row" v-if="entryEditing !== null">
|
||||
<div class="col col-md-12">
|
||||
<div class="row">
|
||||
<div class="col col-md-12">
|
||||
<div class="row">
|
||||
<div class="col-6 col-lg-9">
|
||||
<b-input-group>
|
||||
<b-form-input id="TitleInput" v-model="entryEditing.title"
|
||||
:placeholder="entryEditing.title_placeholder"
|
||||
@change="missing_recipe = false"></b-form-input>
|
||||
<b-input-group-append class="d-none d-lg-block">
|
||||
<b-button variant="primary" @click="entryEditing.title = ''"><i
|
||||
class="fa fa-eraser"></i></b-button>
|
||||
</b-input-group-append>
|
||||
</b-input-group>
|
||||
<span class="text-danger" v-if="missing_recipe">{{
|
||||
$t("Title_or_Recipe_Required")
|
||||
}}</span>
|
||||
<small tabindex="-1" class="form-text text-muted" v-if="!missing_recipe">{{
|
||||
$t("Title")
|
||||
}}</small>
|
||||
</div>
|
||||
<div class="col-6 col-lg-3">
|
||||
<input type="date" id="DateInput" class="form-control" v-model="entryEditing.date"/>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Date") }}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-lg-3">
|
||||
<input type="date" id="DateInput" class="form-control" v-model="entryEditing.date" />
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Date") }}</small>
|
||||
<div class="row mt-3">
|
||||
<div class="col-12 col-lg-6 col-xl-6">
|
||||
<b-form-group>
|
||||
<generic-multiselect
|
||||
@change="selectRecipe"
|
||||
:initial_single_selection="entryEditing.recipe"
|
||||
:label="'name'"
|
||||
:model="Models.RECIPE"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Recipe')"
|
||||
:limit="10"
|
||||
:multiple="false"
|
||||
></generic-multiselect>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Recipe") }}</small>
|
||||
</b-form-group>
|
||||
<b-form-group class="mt-3">
|
||||
<generic-multiselect
|
||||
required
|
||||
@change="selectMealType"
|
||||
:label="'name'"
|
||||
:model="Models.MEAL_TYPE"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Meal_Type')"
|
||||
:limit="10"
|
||||
:multiple="false"
|
||||
:initial_single_selection="entryEditing.meal_type"
|
||||
:allow_create="true"
|
||||
:create_placeholder="$t('Create_New_Meal_Type')"
|
||||
></generic-multiselect>
|
||||
<span class="text-danger" v-if="missing_meal_type">{{
|
||||
$t("Meal_Type_Required")
|
||||
}}</span>
|
||||
<small tabindex="-1" class="form-text text-muted"
|
||||
v-if="!missing_meal_type">{{ $t("Meal_Type") }}</small>
|
||||
</b-form-group>
|
||||
<b-form-group label-for="NoteInput" :description="$t('Note')" class="mt-3">
|
||||
<textarea class="form-control" id="NoteInput" v-model="entryEditing.note"
|
||||
:placeholder="$t('Note')"></textarea>
|
||||
</b-form-group>
|
||||
<b-input-group>
|
||||
<b-form-input id="ServingsInput" v-model="entryEditing.servings"
|
||||
:placeholder="$t('Servings')"></b-form-input>
|
||||
</b-input-group>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Servings") }}</small>
|
||||
<b-form-group class="mt-3">
|
||||
<generic-multiselect
|
||||
required
|
||||
@change="entryEditing.shared = $event.val"
|
||||
parent_variable="entryEditing.shared"
|
||||
:label="'display_name'"
|
||||
:model="Models.USER_NAME"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Share')"
|
||||
:limit="10"
|
||||
:multiple="true"
|
||||
:initial_selection="entryEditing.shared"
|
||||
></generic-multiselect>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Share") }}</small>
|
||||
</b-form-group>
|
||||
<b-input-group v-if="!autoMealPlan">
|
||||
<b-form-checkbox id="AddToShopping" v-model="mealplan_settings.addshopping"/>
|
||||
<small tabindex="-1" class="form-text text-muted">{{
|
||||
$t("AddToShopping")
|
||||
}}</small>
|
||||
</b-input-group>
|
||||
<b-input-group v-if="mealplan_settings.addshopping && !autoMealPlan">
|
||||
<b-form-checkbox id="reviewShopping"
|
||||
v-model="mealplan_settings.reviewshopping"/>
|
||||
<small tabindex="-1" class="form-text text-muted">{{
|
||||
$t("review_shopping")
|
||||
}}</small>
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-12 col-lg-6 col-xl-6">
|
||||
<b-form-group>
|
||||
<generic-multiselect
|
||||
@change="selectRecipe"
|
||||
:initial_single_selection="entryEditing.recipe"
|
||||
:label="'name'"
|
||||
:model="Models.RECIPE"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Recipe')"
|
||||
:limit="10"
|
||||
:multiple="false"
|
||||
></generic-multiselect>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Recipe") }}</small>
|
||||
</b-form-group>
|
||||
<b-form-group class="mt-3">
|
||||
<generic-multiselect
|
||||
required
|
||||
@change="selectMealType"
|
||||
:label="'name'"
|
||||
:model="Models.MEAL_TYPE"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Meal_Type')"
|
||||
:limit="10"
|
||||
:multiple="false"
|
||||
:initial_single_selection="entryEditing.meal_type"
|
||||
:allow_create="true"
|
||||
:create_placeholder="$t('Create_New_Meal_Type')"
|
||||
></generic-multiselect>
|
||||
<span class="text-danger" v-if="missing_meal_type">{{ $t("Meal_Type_Required") }}</span>
|
||||
<small tabindex="-1" class="form-text text-muted" v-if="!missing_meal_type">{{ $t("Meal_Type") }}</small>
|
||||
</b-form-group>
|
||||
<b-form-group label-for="NoteInput" :description="$t('Note')" class="mt-3">
|
||||
<textarea class="form-control" id="NoteInput" v-model="entryEditing.note" :placeholder="$t('Note')"></textarea>
|
||||
</b-form-group>
|
||||
<b-input-group>
|
||||
<b-form-input id="ServingsInput" v-model="entryEditing.servings" :placeholder="$t('Servings')"></b-form-input>
|
||||
</b-input-group>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Servings") }}</small>
|
||||
<b-form-group class="mt-3">
|
||||
<generic-multiselect
|
||||
required
|
||||
@change="entryEditing.shared = $event.val"
|
||||
parent_variable="entryEditing.shared"
|
||||
:label="'display_name'"
|
||||
:model="Models.USER_NAME"
|
||||
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
|
||||
v-bind:placeholder="$t('Share')"
|
||||
:limit="10"
|
||||
:multiple="true"
|
||||
:initial_selection="entryEditing.shared"
|
||||
></generic-multiselect>
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("Share") }}</small>
|
||||
</b-form-group>
|
||||
<b-input-group v-if="!autoMealPlan">
|
||||
<b-form-checkbox id="AddToShopping" v-model="mealplan_settings.addshopping" />
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("AddToShopping") }}</small>
|
||||
</b-input-group>
|
||||
<b-input-group v-if="mealplan_settings.addshopping">
|
||||
<b-form-checkbox id="reviewShopping" v-model="mealplan_settings.reviewshopping" />
|
||||
<small tabindex="-1" class="form-text text-muted">{{ $t("review_shopping") }}</small>
|
||||
</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" :use_plural="use_plural"></recipe-card>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3 mb-3">
|
||||
<div class="col-12">
|
||||
<b-button variant="danger" @click="deleteEntry" v-if="allow_delete">{{ $t("Delete") }} </b-button>
|
||||
<b-button class="float-right" variant="primary" @click="editEntry">{{ $t("Save") }}</b-button>
|
||||
<div class="row mt-3 mb-3">
|
||||
<div class="col-12">
|
||||
<b-button variant="danger" @click="deleteEntry" v-if="allow_delete">{{
|
||||
$t("Delete")
|
||||
}}
|
||||
</b-button>
|
||||
<b-button class="float-right" variant="primary" @click="editEntry">{{
|
||||
$t("Save")
|
||||
}}
|
||||
</b-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</b-modal>
|
||||
|
||||
<shopping-modal :recipe="last_created_plan.recipe" :servings="last_created_plan.servings" :modal_id="999999"
|
||||
:mealplan="last_created_plan" v-if="last_created_plan !== null && last_created_plan.recipe !== null"/>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from "vue"
|
||||
import VueCookies from "vue-cookies"
|
||||
import { BootstrapVue } from "bootstrap-vue"
|
||||
import {BootstrapVue} from "bootstrap-vue"
|
||||
import GenericMultiselect from "@/components/GenericMultiselect"
|
||||
import { ApiMixin, getUserPreference } from "@/utils/utils"
|
||||
import {ApiMixin, getUserPreference} from "@/utils/utils"
|
||||
|
||||
const { ApiApiFactory } = require("@/utils/openapi/api")
|
||||
const { StandardToasts } = require("@/utils/utils")
|
||||
const {ApiApiFactory} = require("@/utils/openapi/api")
|
||||
const {StandardToasts} = require("@/utils/utils")
|
||||
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
|
||||
import {useMealPlanStore} from "@/stores/MealPlanStore";
|
||||
import ShoppingModal from "@/components/Modals/ShoppingModal.vue";
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
Vue.use(VueCookies)
|
||||
@ -118,11 +152,11 @@ export default {
|
||||
name: "MealPlanEditModal",
|
||||
props: {
|
||||
entry: Object,
|
||||
entryEditing_inital_servings: Number,
|
||||
create_date: String,
|
||||
modal_title: String,
|
||||
modal_id: {
|
||||
type: String,
|
||||
default: "edit-modal",
|
||||
default: "id_meal_plan_edit_modal",
|
||||
},
|
||||
allow_delete: {
|
||||
type: Boolean,
|
||||
@ -133,10 +167,11 @@ export default {
|
||||
components: {
|
||||
GenericMultiselect,
|
||||
RecipeCard: () => import("@/components/RecipeCard.vue"),
|
||||
ShoppingModal,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
entryEditing: {},
|
||||
entryEditing: null,
|
||||
missing_recipe: false,
|
||||
missing_meal_type: false,
|
||||
default_plan_share: [],
|
||||
@ -144,22 +179,19 @@ export default {
|
||||
addshopping: false,
|
||||
reviewshopping: false,
|
||||
},
|
||||
use_plural: false,
|
||||
last_created_plan: null,
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
entry: {
|
||||
handler() {
|
||||
this.entryEditing = Object.assign({}, this.entry)
|
||||
|
||||
if (this.entryEditing_inital_servings) {
|
||||
this.entryEditing.servings = this.entryEditing_inital_servings
|
||||
}
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
entryEditing: {
|
||||
handler(newVal) {},
|
||||
handler(newVal) {
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
mealplan_settings: {
|
||||
@ -168,19 +200,13 @@ export default {
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
entryEditing_inital_servings: function (newVal) {
|
||||
this.entryEditing.servings = newVal
|
||||
},
|
||||
},
|
||||
mounted: function () {
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => {
|
||||
this.use_plural = r.data.use_plural
|
||||
})
|
||||
useUserPreferenceStore().updateIfStaleOrEmpty()
|
||||
},
|
||||
computed: {
|
||||
autoMealPlan: function () {
|
||||
return getUserPreference("mealplan_autoadd_shopping")
|
||||
return useUserPreferenceStore().getStaleData()?.mealplan_autoadd_shopping
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
@ -188,35 +214,53 @@ export default {
|
||||
if (this.$cookies.isKey(MEALPLAN_COOKIE_NAME)) {
|
||||
this.mealplan_settings = Object.assign({}, this.mealplan_settings, this.$cookies.get(MEALPLAN_COOKIE_NAME))
|
||||
}
|
||||
let apiClient = new ApiApiFactory()
|
||||
|
||||
apiClient.listUserPreferences().then((result) => {
|
||||
if (this.entry.id === -1) {
|
||||
this.entryEditing.shared = result.data[0].plan_share
|
||||
if (this.entry === null) {
|
||||
this.entryEditing = Object.assign({}, useMealPlanStore().empty_meal_plan, null)
|
||||
} else {
|
||||
this.entryEditing = Object.assign({}, this.entry, null)
|
||||
}
|
||||
|
||||
if (this.create_date) {
|
||||
this.entryEditing.date = this.create_date
|
||||
}
|
||||
|
||||
useUserPreferenceStore().getData().then(userPreference => {
|
||||
if (this.entryEditing.id === -1) {
|
||||
this.entryEditing.shared = userPreference.plan_share
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
editEntry() {
|
||||
this.missing_meal_type = false
|
||||
this.missing_recipe = false
|
||||
let cancel = false
|
||||
|
||||
if (this.entryEditing.meal_type == null) {
|
||||
this.missing_meal_type = true
|
||||
cancel = true
|
||||
return;
|
||||
}
|
||||
if (this.entryEditing.recipe == null && this.entryEditing.title === "") {
|
||||
this.missing_recipe = true
|
||||
cancel = true
|
||||
return
|
||||
}
|
||||
if (!cancel) {
|
||||
this.$bvModal.hide(`edit-modal`)
|
||||
this.$emit("save-entry", { ...this.mealplan_settings, ...this.entryEditing, ...{ addshopping: this.mealplan_settings.addshopping && !this.autoMealPlan } })
|
||||
//TODO properly validate
|
||||
this.$bvModal.hide(this.modal_id)
|
||||
|
||||
// only set addshopping if review is not enabled
|
||||
this.$set(this.entryEditing, 'addshopping', (this.mealplan_settings.addshopping && !this.mealplan_settings.reviewshopping))
|
||||
|
||||
if (!('id' in this.entryEditing) || this.entryEditing.id === -1) {
|
||||
useMealPlanStore().createObject(this.entryEditing).then((r) => {
|
||||
this.last_created_plan = r.data
|
||||
if (r.data.recipe && this.mealplan_settings.addshopping && !this.autoMealPlan && this.mealplan_settings.reviewshopping) {
|
||||
this.$nextTick(function () {
|
||||
this.$bvModal.show(`shopping_999999`)
|
||||
})
|
||||
}
|
||||
})
|
||||
} else {
|
||||
useMealPlanStore().updateObject(this.entryEditing)
|
||||
}
|
||||
},
|
||||
deleteEntry() {
|
||||
this.$bvModal.hide(`edit-modal`)
|
||||
this.$emit("delete-entry", this.entryEditing)
|
||||
this.$bvModal.hide(this.modal_id)
|
||||
useMealPlanStore().deleteObject(this.entryEditing)
|
||||
},
|
||||
selectMealType(event) {
|
||||
this.missing_meal_type = false
|
||||
|
@ -3,69 +3,52 @@
|
||||
<b-form-group
|
||||
v-bind:label="label"
|
||||
class="mb-3">
|
||||
<twemoji-textarea
|
||||
:ref="'_edit_' + id"
|
||||
:initialContent="value"
|
||||
:emojiData="emojiDataAll"
|
||||
:emojiGroups="emojiGroups"
|
||||
triggerType="click"
|
||||
:recentEmojisFeat="true"
|
||||
recentEmojisStorage="local"
|
||||
@contentChanged="setIcon"
|
||||
/>
|
||||
|
||||
<input class="form-control" v-model="new_value">
|
||||
|
||||
<Picker :data="emojiIndex" :ref="'_edit_' + id" :native="true"
|
||||
@select="setIcon"/>
|
||||
|
||||
</b-form-group>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {TwemojiTextarea} from '@kevinfaguiar/vue-twemoji-picker';
|
||||
// TODO add localization
|
||||
import EmojiAllData from '@kevinfaguiar/vue-twemoji-picker/emoji-data/en/emoji-all-groups.json';
|
||||
import EmojiGroups from '@kevinfaguiar/vue-twemoji-picker/emoji-data/emoji-groups.json';
|
||||
|
||||
import data from "emoji-mart-vue-fast/data/all.json";
|
||||
import "emoji-mart-vue-fast/css/emoji-mart.css";
|
||||
import {Picker, EmojiIndex} from "emoji-mart-vue-fast";
|
||||
let emojiIndex = new EmojiIndex(data);
|
||||
|
||||
export default {
|
||||
name: 'EmojiInput',
|
||||
components: {TwemojiTextarea},
|
||||
props: {
|
||||
field: {type: String, default: 'You Forgot To Set Field Name'},
|
||||
label: {type: String, default: ''},
|
||||
value: {type: String, default: ''},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
new_value: undefined,
|
||||
id: null
|
||||
name: 'EmojiInput',
|
||||
components: {Picker},
|
||||
props: {
|
||||
field: {type: String, default: 'You Forgot To Set Field Name'},
|
||||
label: {type: String, default: ''},
|
||||
value: {type: String, default: ''},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
new_value: undefined,
|
||||
id: null,
|
||||
emojiIndex: emojiIndex,
|
||||
emojisOutput: ""
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'new_value': function () {
|
||||
this.$root.$emit('change', this.field, this.new_value ?? null)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.id = this._uid
|
||||
},
|
||||
methods: {
|
||||
setIcon: function (icon) {
|
||||
console.log(icon)
|
||||
this.new_value = icon.native
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// modelName() {
|
||||
// return this?.model?.name ?? this.$t('Search')
|
||||
// },
|
||||
emojiDataAll() {
|
||||
return EmojiAllData;
|
||||
},
|
||||
emojiGroups() {
|
||||
return EmojiGroups;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'new_value': function () {
|
||||
this.$root.$emit('change', this.field, this.new_value ?? null)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.id = this._uid
|
||||
},
|
||||
methods: {
|
||||
prepareEmoji: function() {
|
||||
this.$refs['_edit_' + this.id].addText(this.this_item.icon || '');
|
||||
this.$refs['_edit_' + this.id].blur()
|
||||
document.getElementById('btn-emoji-default').disabled = true;
|
||||
},
|
||||
setIcon: function(icon) {
|
||||
this.new_value = icon
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
@ -15,6 +15,7 @@
|
||||
<file-input v-if="visibleCondition(f, 'file')" :label="f.label" :value="f.value" :field="f.field" @change="storeValue" />
|
||||
<small-text v-if="visibleCondition(f, 'smalltext')" :value="f.value" />
|
||||
<date-input v-if="visibleCondition(f, 'date')" :label="f.label" :value="f.value" :field="f.field" :help="showHelp && f.help" :subtitle="f.subtitle" />
|
||||
<number-input v-if="visibleCondition(f, 'number')" :label="f.label" :value="f.value" :field="f.field" :placeholder="f.placeholder" :help="showHelp && f.help" :subtitle="f.subtitle" />
|
||||
</div>
|
||||
<template v-slot:modal-footer>
|
||||
<div class="row w-100">
|
||||
@ -49,10 +50,11 @@ import ChoiceInput from "@/components/Modals/ChoiceInput"
|
||||
import FileInput from "@/components/Modals/FileInput"
|
||||
import SmallText from "@/components/Modals/SmallText"
|
||||
import HelpBadge from "@/components/Badges/Help"
|
||||
import NumberInput from "@/components/Modals/NumberInput.vue";
|
||||
|
||||
export default {
|
||||
name: "GenericModalForm",
|
||||
components: { FileInput, CheckboxInput, LookupInput, TextInput, EmojiInput, ChoiceInput, SmallText, HelpBadge,DateInput },
|
||||
components: { FileInput, CheckboxInput, LookupInput, TextInput, EmojiInput, ChoiceInput, SmallText, HelpBadge,DateInput, NumberInput },
|
||||
mixins: [ApiMixin, ToastMixin],
|
||||
props: {
|
||||
model: { required: true, type: Object },
|
||||
|
101
vue/src/components/Modals/ImportTandoor.vue
Normal file
101
vue/src/components/Modals/ImportTandoor.vue
Normal file
@ -0,0 +1,101 @@
|
||||
<template>
|
||||
|
||||
<div>
|
||||
<b-button v-b-modal.id_import_tandoor_modal>{{ $t("Import into Tandoor") }}</b-button>
|
||||
|
||||
<b-modal class="modal" id="id_import_tandoor_modal" :title="$t('Import')" hide-footer>
|
||||
<p>Tandoor ist eine OpenSource Rezeptverwaltungs Plattform</p>
|
||||
|
||||
<p>Bitte wähle aus ob du deinen eigenen Tandoor Server hast oder tandoor.dev nutzt.
|
||||
</p>
|
||||
<div class="justify-content-center text-center">
|
||||
<b-form-group v-slot="{ ariaDescribedby }">
|
||||
<b-form-radio-group
|
||||
id="btn-radios-1"
|
||||
v-model="import_mode"
|
||||
:options="options"
|
||||
:aria-describedby="ariaDescribedby"
|
||||
name="radios-btn-default"
|
||||
buttons
|
||||
></b-form-radio-group>
|
||||
</b-form-group>
|
||||
</div>
|
||||
<div v-if="import_mode === 'tandoor'">
|
||||
<ol>
|
||||
<li><a href="https://app.tandoor.dev/accounts/signup/" target="_blank" ref="nofollow">Hier</a> einen
|
||||
Account anlegen<br/></li>
|
||||
<li>
|
||||
<b-button @click="importTandoor()">Import</b-button>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
|
||||
</div>
|
||||
<div v-if="import_mode === 'selfhosted'">
|
||||
Deine Server URL (z.B. <code>https://tandoor.mydomain.com/</code>)
|
||||
<b-input v-model="selfhosted_url"></b-input>
|
||||
<b-button class="mt-2" :disabled="selfhosted_url === ''" @click="importSelfHosted()">Import</b-button>
|
||||
</div>
|
||||
|
||||
<div class="row mt-3 text-left mb-3">
|
||||
<p>Alternativ kannst du den Link zum Rezept in den Importer in deiner Tandoor Instanz kopieren.</p>
|
||||
|
||||
<a href="https://tandoor.dev" target="_blank" rel="nofollow">Jetzt mehr über Tandoor erfahren</a>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from "vue";
|
||||
import {BootstrapVue} from "bootstrap-vue";
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
|
||||
|
||||
Vue.use(BootstrapVue)
|
||||
|
||||
export default {
|
||||
name: 'ImportTandoor',
|
||||
components: {},
|
||||
props: {
|
||||
recipe: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
import_mode: 'tandoor',
|
||||
options: [
|
||||
{text: 'Tandoor.dev', value: 'tandoor'},
|
||||
{text: 'Self-Hosted', value: 'selfhosted'},
|
||||
],
|
||||
selfhosted_url: '',
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
selfhosted_url: function (newVal) {
|
||||
window.localStorage.setItem('MY_TANDOOR_URL', newVal)
|
||||
},
|
||||
},
|
||||
computed: {},
|
||||
mounted() {
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
let selfhosted_url = window.localStorage.getItem('MY_TANDOOR_URL')
|
||||
if (selfhosted_url !== undefined) {
|
||||
this.selfhosted_url = selfhosted_url
|
||||
this.import_mode = 'selfhosted'
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
importTandoor: function () {
|
||||
location.href = 'https://app.tandoor.dev/data/import/url?url=' + location.href
|
||||
},
|
||||
importSelfHosted: function () {
|
||||
this.selfhosted_url = this.selfhosted_url.replace('/search/', '')
|
||||
let import_path = 'data/import/url?url='
|
||||
if (!this.selfhosted_url.endsWith('/')) {
|
||||
import_path = '/' + import_path
|
||||
}
|
||||
location.href = this.selfhosted_url + import_path + location.href
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
37
vue/src/components/Modals/NumberInput.vue
Normal file
37
vue/src/components/Modals/NumberInput.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-form-group v-bind:label="label" class="mb-3">
|
||||
<b-form-input v-model="new_value" type="number" :placeholder="placeholder"></b-form-input>
|
||||
<em v-if="help" class="small text-muted">{{ help }}</em>
|
||||
<small v-if="subtitle" class="text-muted">{{ subtitle }}</small>
|
||||
</b-form-group>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "TextInput",
|
||||
props: {
|
||||
field: { type: String, default: "You Forgot To Set Field Name" },
|
||||
label: { type: String, default: "Text Field" },
|
||||
value: { type: String, default: "" },
|
||||
placeholder: { type: Number, default: 0 },
|
||||
help: { type: String, default: undefined },
|
||||
subtitle: { type: String, default: undefined },
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
new_value: undefined,
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.new_value = this.value
|
||||
},
|
||||
watch: {
|
||||
new_value: function () {
|
||||
this.$root.$emit("change", this.field, this.new_value)
|
||||
},
|
||||
},
|
||||
methods: {},
|
||||
}
|
||||
</script>
|
@ -10,12 +10,10 @@
|
||||
</b-card-header>
|
||||
<b-collapse id="accordion-0" class="p-2" visible accordion="my-accordion" role="tabpanel">
|
||||
|
||||
<div v-for="i in steps.flatMap(s => s.ingredients)" v-bind:key="i.id">
|
||||
<div>
|
||||
<table class="table table-sm mb-0">
|
||||
|
||||
<ingredient-component
|
||||
:use_plural="true"
|
||||
:key="i.id"
|
||||
<ingredient-component v-for="i in steps.flatMap(s => s.ingredients)" v-bind:key="i.id"
|
||||
:detailed="true"
|
||||
:ingredient="i"
|
||||
:ingredient_factor="ingredient_factor"
|
||||
@ -79,6 +77,7 @@ const {ApiApiFactory} = require("@/utils/openapi/api")
|
||||
import {StandardToasts} from "@/utils/utils"
|
||||
import IngredientComponent from "@/components/IngredientComponent"
|
||||
import LoadingSpinner from "@/components/LoadingSpinner"
|
||||
import {useMealPlanStore} from "@/stores/MealPlanStore";
|
||||
// import CustomInputSpinButton from "@/components/CustomInputSpinButton"
|
||||
|
||||
export default {
|
||||
@ -89,7 +88,7 @@ export default {
|
||||
recipe: {required: true, type: Object},
|
||||
servings: {type: Number, default: undefined},
|
||||
modal_id: {required: true, type: Number},
|
||||
mealplan: {type: Number, default: undefined},
|
||||
mealplan: {type: Object, default: undefined},
|
||||
list_recipe: {type: Number, default: undefined},
|
||||
},
|
||||
data() {
|
||||
@ -128,7 +127,7 @@ export default {
|
||||
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.steps.forEach(s => s.ingredients.filter(i => i.food?.food_onhand === false).forEach(i => this.$set(i, 'checked', true)))
|
||||
this.loading = false
|
||||
})
|
||||
.then(() => {
|
||||
@ -170,6 +169,9 @@ export default {
|
||||
.then((result) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
this.$emit("finish")
|
||||
if (this.mealplan !== undefined && this.mealplan !== null){
|
||||
useMealPlanStore().plans[this.mealplan.id].shopping = true
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<template v-if="recipe && recipe.loading">
|
||||
<b-card no-body v-hover>
|
||||
<b-card no-body v-hover style="height: 100%">
|
||||
<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>
|
||||
|
||||
@ -19,54 +19,59 @@
|
||||
</b-card>
|
||||
</template>
|
||||
<template v-else>
|
||||
<b-card no-body v-hover v-if="recipe">
|
||||
<b-card no-body v-hover v-if="recipe" style="height: 100%">
|
||||
|
||||
<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" :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 class="content">
|
||||
<div class="content-overlay" v-if="recipe.description !== null && recipe.description !== ''"></div>
|
||||
<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="content-details" >
|
||||
<p class="content-text">
|
||||
{{ recipe.description }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card-img-overlay d-flex flex-column justify-content-left float-left text-left pt-2" style="width:40%"
|
||||
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>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<b-card-body class="p-4">
|
||||
<h6>
|
||||
<a :href="this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null">
|
||||
<b-card-body class="p-2 pl-3 pr-3">
|
||||
<div class="d-flex flex-row">
|
||||
<div class="flex-grow-1">
|
||||
<a :href="this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null" class="text-body font-weight-bold two-row-text">
|
||||
<template v-if="recipe !== null">{{ recipe.name }}</template>
|
||||
<template v-else>{{ meal_plan.title }}</template>
|
||||
</a>
|
||||
</h6>
|
||||
</div>
|
||||
<div class="justify-content-end">
|
||||
<recipe-context-menu :recipe="recipe" class="justify-content-end float-right align-items-end pr-0"
|
||||
:disabled_options="context_disabled_options"
|
||||
v-if="recipe !== null"></recipe-context-menu>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<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">
|
||||
{{ recipe.description }}
|
||||
</span>
|
||||
</template>
|
||||
<p class="mt-1">
|
||||
<div v-if="show_detail">
|
||||
{{ recipe.description }}
|
||||
</div>
|
||||
|
||||
<p class="mt-1 mb-1">
|
||||
<last-cooked :recipe="recipe"></last-cooked>
|
||||
<keywords-component :recipe="recipe"
|
||||
<keywords-component :recipe="recipe" :limit="3"
|
||||
style="margin-top: 4px; position: relative; z-index: 3;"></keywords-component>
|
||||
</p>
|
||||
<transition name="fade" mode="in-out">
|
||||
@ -75,29 +80,46 @@
|
||||
<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"
|
||||
:use_plural="use_plural" />
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<ingredients-card
|
||||
:steps="recipe.steps"
|
||||
:header="false"
|
||||
:detailed="false"
|
||||
:servings="recipe.servings"/>
|
||||
</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-card-footer v-if="footer_text !== undefined"><i v-bind:class="footer_icon"></i> {{ footer_text }}
|
||||
</b-card-footer>
|
||||
|
||||
</b-card>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
|
||||
<!--
|
||||
|
||||
<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">
|
||||
{{ recipe.description }}
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<b-card-footer v-if="footer_text !== undefined"><i v-bind:class="footer_icon"></i> {{ footer_text }}
|
||||
</b-card-footer>
|
||||
|
||||
<template v-else>{{ meal_plan.note }}</template>
|
||||
|
||||
-->
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@ -117,7 +139,6 @@ export default {
|
||||
mixins: [ResolveUrlMixin],
|
||||
components: {
|
||||
LastCooked,
|
||||
RecipeRating,
|
||||
KeywordsComponent,
|
||||
"recipe-context-menu": RecipeContextMenu,
|
||||
IngredientsCard
|
||||
@ -125,7 +146,7 @@ export default {
|
||||
props: {
|
||||
recipe: Object,
|
||||
meal_plan: Object,
|
||||
use_plural: { type: Boolean, default: false},
|
||||
use_plural: {type: Boolean, default: false},
|
||||
footer_text: String,
|
||||
footer_icon: String,
|
||||
detailed: {type: Boolean, default: true},
|
||||
@ -144,13 +165,6 @@ export default {
|
||||
show_detail: function () {
|
||||
return this.recipe?.steps !== undefined && this.detailed
|
||||
},
|
||||
text_length: function () {
|
||||
if (this.show_detail) {
|
||||
return 200
|
||||
} else {
|
||||
return 120
|
||||
}
|
||||
},
|
||||
recipe_image: function () {
|
||||
if (this.recipe == null || this.recipe.image === null) {
|
||||
return window.IMAGE_PLACEHOLDER
|
||||
@ -191,4 +205,79 @@ export default {
|
||||
{
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.two-row-text {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2; /* number of lines to show */
|
||||
line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
.content {
|
||||
position: relative;
|
||||
|
||||
margin: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.content .content-overlay {
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
position: absolute;
|
||||
height: 99%;
|
||||
width: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
opacity: 0;
|
||||
-webkit-transition: all 0.4s ease-in-out 0s;
|
||||
-moz-transition: all 0.4s ease-in-out 0s;
|
||||
transition: all 0.4s ease-in-out 0s;
|
||||
}
|
||||
|
||||
.content:hover .content-overlay {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.content-details {
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
width: 100%;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
opacity: 0;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
-moz-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transition: all 0.3s ease-in-out 0s;
|
||||
-moz-transition: all 0.3s ease-in-out 0s;
|
||||
transition: all 0.3s ease-in-out 0s;
|
||||
}
|
||||
|
||||
.content:hover .content-details {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.content-details h3 {
|
||||
color: #fff;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0.15em;
|
||||
margin-bottom: 0.5em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.content-details p {
|
||||
color: #fff;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.fadeIn-bottom {
|
||||
top: 80%;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="dropdown d-print-none">
|
||||
<a class="btn shadow-none" href="javascript:void(0);" role="button" id="dropdownMenuLink"
|
||||
<a class="btn shadow-none pr-0 pl-0" 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">
|
||||
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink" >
|
||||
<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>
|
||||
|
||||
@ -106,6 +106,7 @@ import ShoppingModal from "@/components/Modals/ShoppingModal"
|
||||
import moment from "moment"
|
||||
import Vue from "vue"
|
||||
import {ApiApiFactory} from "@/utils/openapi/api"
|
||||
import {useMealPlanStore} from "@/stores/MealPlanStore";
|
||||
|
||||
Vue.prototype.moment = moment
|
||||
|
||||
@ -191,6 +192,7 @@ export default {
|
||||
apiClient
|
||||
.createMealPlan(entry)
|
||||
.then((result) => {
|
||||
useMealPlanStore().plans.push(result.data)
|
||||
this.$bvModal.hide(`modal-meal-plan_${this.modal_id}`)
|
||||
if (reviewshopping) {
|
||||
this.mealplan = result.data.id
|
||||
|
@ -24,7 +24,7 @@
|
||||
<span v-if="user_preferences.shopping_auto_sync < 1">{{ $t('Disable') }}</span>
|
||||
</div>
|
||||
<br/>
|
||||
<b-button class="btn btn-sm" @click="user_preferences.shopping_auto_sync = 0">{{ $t('Disabled') }}</b-button>
|
||||
<b-button class="btn btn-sm" @click="user_preferences.shopping_auto_sync = 0; updateSettings(false)">{{ $t('Disabled') }}</b-button>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('mealplan_autoadd_shopping_desc')">
|
||||
|
@ -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" :use_plural="use_plural"
|
||||
<ingredients-card :steps="[step]" :ingredient_factor="ingredient_factor"
|
||||
@checked-state-changed="$emit('checked-state-changed', $event)"/>
|
||||
</table>
|
||||
</div>
|
||||
|
482
vue/src/locales/cs.json
Normal file
482
vue/src/locales/cs.json
Normal file
@ -0,0 +1,482 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "",
|
||||
"err_creating_resource": "",
|
||||
"err_updating_resource": "",
|
||||
"err_deleting_resource": "",
|
||||
"err_deleting_protected_resource": "",
|
||||
"err_moving_resource": "",
|
||||
"err_merging_resource": "",
|
||||
"success_fetching_resource": "",
|
||||
"success_creating_resource": "",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "",
|
||||
"success_moving_resource": "",
|
||||
"success_merging_resource": "",
|
||||
"file_upload_disabled": "",
|
||||
"warning_space_delete": "",
|
||||
"food_inherit_info": "",
|
||||
"facet_count_info": "",
|
||||
"step_time_minutes": "",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "",
|
||||
"show_only_internal": "",
|
||||
"show_split_screen": "",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "",
|
||||
"Manage_Books": "",
|
||||
"Meal_Plan": "",
|
||||
"Select_Book": "",
|
||||
"Select_File": "",
|
||||
"Recipe_Image": "",
|
||||
"Import_finished": "",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"New_Keyword": "",
|
||||
"Delete_Keyword": "",
|
||||
"Edit_Keyword": "",
|
||||
"Edit_Recipe": "",
|
||||
"Move_Keyword": "",
|
||||
"Merge_Keyword": "",
|
||||
"Hide_Keywords": "",
|
||||
"Hide_Recipes": "",
|
||||
"Move_Up": "",
|
||||
"Move_Down": "",
|
||||
"Step_Name": "",
|
||||
"Step_Type": "",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Amount": "",
|
||||
"Enable_Amount": "",
|
||||
"Disable_Amount": "",
|
||||
"Ingredient Editor": "",
|
||||
"Description_Replace": "",
|
||||
"Instruction_Replace": "",
|
||||
"Auto_Sort": "",
|
||||
"Auto_Sort_Help": "",
|
||||
"Private_Recipe": "",
|
||||
"Private_Recipe_Help": "",
|
||||
"reusable_help_text": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Cancel": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Protected": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"Copy Link": "",
|
||||
"Copy Token": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Original_Text": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"Unpin": "",
|
||||
"PinnedConfirmation": "",
|
||||
"UnpinnedConfirmation": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "",
|
||||
"copy_to_new": "",
|
||||
"recipe_name": "",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "",
|
||||
"Supermarkets": "",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "",
|
||||
"Last_name": "",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "",
|
||||
"Import_Error": "",
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": "",
|
||||
"Split_All_Steps": "",
|
||||
"Combine_All_Steps": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": "",
|
||||
"Create Recipe": "",
|
||||
"Import Recipe": ""
|
||||
}
|
@ -459,11 +459,24 @@
|
||||
"Message": "Besked",
|
||||
"Sticky_Nav": "Fastlåst navigation",
|
||||
"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": ""
|
||||
"Plural": "Flertal",
|
||||
"plural_short": "flertal",
|
||||
"Use_Plural_Unit_Always": "Benyt altid flertalsform for enheder",
|
||||
"Use_Plural_Unit_Simple": "Brug flertalsform dynamisk for enheder",
|
||||
"Use_Plural_Food_Always": "Brug altid flertalsform for mad",
|
||||
"Use_Plural_Food_Simple": "Brug flertalsform dynamisk for mad",
|
||||
"plural_usage_info": "Brug flertalsform for enheder og mad på denne placering.",
|
||||
"Original_Text": "Original tekst",
|
||||
"Import Recipe": "Importer opskrift",
|
||||
"Amount": "Mængde",
|
||||
"Split_All_Steps": "Opdel rækker i separate trin.",
|
||||
"Create Recipe": "Opret opskrift",
|
||||
"Description_Replace": "Erstat beskrivelse",
|
||||
"Instruction_Replace": "Erstat instruktion",
|
||||
"Auto_Sort_Help": "Flyt alle ingredienser til mest egnede trin.",
|
||||
"Auto_Sort": "Sortér automatisk",
|
||||
"Unpin": "Frigør",
|
||||
"PinnedConfirmation": "{recipe} er fastgjort.",
|
||||
"UnpinnedConfirmation": "{recipe} er frigjort.",
|
||||
"Combine_All_Steps": "Kombiner alle trin til ét felt."
|
||||
}
|
||||
|
@ -72,7 +72,7 @@
|
||||
"Cancel": "Abbrechen",
|
||||
"success_deleting_resource": "Ressource erfolgreich gelöscht!",
|
||||
"Load_More": "Weitere laden",
|
||||
"Ok": "Öffnen",
|
||||
"Ok": "Ok",
|
||||
"Link": "Link",
|
||||
"Key_Ctrl": "Strg",
|
||||
"move_title": "{type} verschieben",
|
||||
@ -114,7 +114,7 @@
|
||||
"Create_New_Shopping Category": "Neue Einkaufskategorie erstellen",
|
||||
"Automate": "Automatisieren",
|
||||
"Type": "Typ",
|
||||
"and_up": "& Höher",
|
||||
"and_up": "& Hoch",
|
||||
"Unrated": "Unbewertet",
|
||||
"Shopping_list": "Einkaufsliste",
|
||||
"step_time_minutes": "Schritt Dauer in Minuten",
|
||||
@ -206,7 +206,7 @@
|
||||
"New_Cookbook": "Neues Kochbuch",
|
||||
"Coming_Soon": "Bald verfügbar",
|
||||
"Auto_Planner": "Smart Planen",
|
||||
"Hide_Keyword": "Keywords schließen",
|
||||
"Hide_Keyword": "Schlüsselwörter verbergen",
|
||||
"Clear": "Leeren",
|
||||
"GroupBy": "Gruppieren nach",
|
||||
"IgnoreThis": "Füge {food} nie automatisch zur Einkaufsliste hinzu",
|
||||
@ -222,17 +222,17 @@
|
||||
"NoCategory": "Keine Kategorie ausgewählt.",
|
||||
"ShowDelayed": "Zeige verschobene Elemente",
|
||||
"Completed": "Fertig",
|
||||
"OfflineAlert": "Du bist offline, deine Einkaufsliste wird nicht synchronisiert.",
|
||||
"OfflineAlert": "Du bist offline. Deine Einkaufsliste wird nicht synchronisiert.",
|
||||
"shopping_share": "Einkaufsliste teilen",
|
||||
"mealplan_autoadd_shopping": "Automatisches Hinzufügen zum Essensplan",
|
||||
"mealplan_autoexclude_onhand": "Ignoriere vorrätige Zutaten",
|
||||
"mealplan_autoinclude_related": "Füge verwandte Rezepte hinzu",
|
||||
"mealplan_autoinclude_related": "Ähnliche Rezepte hinzufügen",
|
||||
"default_delay": "Standard-Verzögerungszeit",
|
||||
"Added_by": "Hinzugefügt durch",
|
||||
"AddToShopping": "Zur Einkaufsliste hinzufügen",
|
||||
"FoodOnHand": "Sie haben {food} vorrätig.",
|
||||
"DeleteShoppingConfirm": "Möchten Sie wirklich alle {food} von der Einkaufsliste entfernen?",
|
||||
"err_moving_resource": "Es ist ein Fehler beim Verschieben einer Ressource aufgetreten!",
|
||||
"err_moving_resource": "Beim Verschieben einer Ressource trat ein Fehler auf!",
|
||||
"err_merging_resource": "Beim Zusammenführen einer Ressource trat ein Fehler auf!",
|
||||
"success_moving_resource": "Ressource wurde erfolgreich verschoben!",
|
||||
"success_merging_resource": "Zusammenführung einer Ressource war erfolgreich!",
|
||||
@ -241,7 +241,7 @@
|
||||
"IngredientInShopping": "Diese Zutat befindet sich auf Ihrer Einkaufsliste.",
|
||||
"NotInShopping": "{food} befindet sich nicht auf Ihrer Einkaufsliste.",
|
||||
"OnHand": "Aktuell vorrätig",
|
||||
"FoodNotOnHand": "Sie habe {food} nicht vorrätig.",
|
||||
"FoodNotOnHand": "Sie haben {food} nicht vorrätig.",
|
||||
"Undefined": "undefiniert",
|
||||
"AddFoodToShopping": "Fügen Sie {food} zur Einkaufsliste hinzu",
|
||||
"RemoveFoodFromShopping": "{food} von der Einkaufsliste löschen",
|
||||
@ -251,23 +251,23 @@
|
||||
"mealplan_autoadd_shopping_desc": "Zutaten aus dem Essensplan automatisch zur Einkaufsliste hinzufügen.",
|
||||
"Pin": "Anheften",
|
||||
"mark_complete": "Vollständig markieren",
|
||||
"shopping_add_onhand_desc": "Markiere Lebensmittel als \"Vorrätig\", wenn von der Einkaufsliste abgehakt wurden.",
|
||||
"shopping_add_onhand_desc": "Zutat beim Abhaken auf der Einkausfliste als \"vorrätig\" kennzeichnen.",
|
||||
"left_handed": "Linkshänder-Modus",
|
||||
"left_handed_help": "Optimiert die Benutzeroberfläche für die Bedienung mit der linken Hand.",
|
||||
"FoodInherit": "Lebensmittel vererbbare Felder",
|
||||
"SupermarketCategoriesOnly": "Nur Supermarktkategorien",
|
||||
"InheritWarning": "{food} ist auf Vererbung gesetzt ist, Änderungen werden möglicherweise nicht gespeichert.",
|
||||
"mealplan_autoexclude_onhand_desc": "Beim (manuellen oder automatischen) Hinzufügen eines Essensplans zur Einkaufsliste vorrätige Zutagen ausnehmen.",
|
||||
"InheritWarning": "{food} ist auf Vererbung gesetzt, Änderungen werden möglicherweise nicht gespeichert.",
|
||||
"mealplan_autoexclude_onhand_desc": "Wenn ein Speiseplan zur Einkaufsliste zugefügt wird (manuell oder automatisch), Zutaten ausschliessen, die gerade vorrätig sind.",
|
||||
"mealplan_autoinclude_related_desc": "Wenn Sie einen Essensplan zur Einkaufsliste hinzufügen (manuell oder automatisch), fügen Sie alle zugehörigen Rezepte hinzu.",
|
||||
"default_delay_desc": "Voreingestellte Anzahl von Stunden für die Verzögerung eines Einkaufslisteneintrags.",
|
||||
"filter_to_supermarket": "Nach Supermarkt filtern",
|
||||
"err_move_self": "Element kann nicht auf sich selbst verschoben werden",
|
||||
"nothing": "Nichts zu tun",
|
||||
"err_merge_self": "Element kann nicht mit sich selbst zusammengeführt werden",
|
||||
"show_sql": "SQL anzeigen",
|
||||
"show_sql": "Zeige SQL",
|
||||
"filter_to_supermarket_desc": "Standardmäßig wird die Einkaufsliste so gefiltert, dass sie nur Kategorien für den ausgewählten Supermarkt enthält.",
|
||||
"CategoryName": "Kategorie Name",
|
||||
"SupermarketName": "Supermarkt Name",
|
||||
"CategoryName": "Kategorienname",
|
||||
"SupermarketName": "Name Supermarkt",
|
||||
"CategoryInstruction": "Ziehen Sie Kategorien, um die Reihenfolge zu ändern, in der die Kategorien in der Einkaufsliste erscheinen.",
|
||||
"shopping_recent_days_desc": "Tage der letzten Einträge in der Einkaufsliste, die angezeigt werden sollen.",
|
||||
"shopping_recent_days": "Letzte Tage",
|
||||
@ -277,7 +277,7 @@
|
||||
"csv_delim_help": "Trennzeichen für CSV-Exporte.",
|
||||
"csv_delim_label": "CSV-Trennzeichen",
|
||||
"SuccessClipboard": "Einkaufsliste wurde in die Zwischenablage kopiert",
|
||||
"copy_to_clipboard": "In die Zwischenablage kopieren",
|
||||
"copy_to_clipboard": "In Zwischenablage kopieren",
|
||||
"csv_prefix_help": "Präfix, das beim Kopieren der Liste in die Zwischenablage hinzugefügt wird.",
|
||||
"csv_prefix_label": "Listenpräfix",
|
||||
"copy_markdown_table": "Als Markdown-Tabelle kopieren",
|
||||
@ -291,10 +291,10 @@
|
||||
"remember_search": "Suchbegriff merken",
|
||||
"remember_hours": "Stunden zu erinnern",
|
||||
"tree_select": "Baum-Auswahl verwenden",
|
||||
"CountMore": "...+{count} weitere",
|
||||
"ignore_shopping_help": "Füge Zutat nie zur Einkaufsliste hinzu (z.B. Wasser)",
|
||||
"CountMore": "...+{count} mehr",
|
||||
"ignore_shopping_help": "Zutat nie auf Einkaufsliste setzen (z.B. Wasser)",
|
||||
"OnHand_help": "Lebensmittel ist \"Vorrätig\" und wird nicht automatisch zur Einkaufsliste hinzugefügt. Der Status \"Vorrätig\" wird mit den Benutzern der Einkaufsliste geteilt.",
|
||||
"shopping_category_help": "Supermärkte können nach Einkaufskategorien geordnet und gefiltert werden, je nachdem, wie die Gänge angeordnet sind.",
|
||||
"shopping_category_help": "Einkaufsläden können nach Produktkategorie entsprechend der Anordnung der Regalreihen sortiert werden.",
|
||||
"Foods": "Lebensmittel",
|
||||
"food_recipe_help": "Wird ein Rezept hier verknüpft, wird diese Verknüpfung in allen anderen Rezepten übernommen, die dieses Lebensmittel beinhaltet",
|
||||
"review_shopping": "Überprüfe die Einkaufsliste vor dem Speichern",
|
||||
@ -347,7 +347,7 @@
|
||||
"Select": "Auswählen",
|
||||
"Supermarkets": "Supermärkte",
|
||||
"User": "Benutzer",
|
||||
"Keyword": "Stichwort",
|
||||
"Keyword": "Schlüsselwort",
|
||||
"Advanced": "Erweitert",
|
||||
"Substitutes": "Zusätze",
|
||||
"copy_to_new": "Kopiere zu neuem Rezept",
|
||||
@ -355,11 +355,11 @@
|
||||
"Reset": "Zurücksetzen",
|
||||
"search_rank": "Such-Rang",
|
||||
"paste_ingredients": "Zutaten einfügen",
|
||||
"Ingredient Editor": "Zutaten bearbeiten",
|
||||
"Protected": "Geschützt",
|
||||
"Ingredient Editor": "Zutateneditor",
|
||||
"Protected": "Schützen",
|
||||
"not": "nicht",
|
||||
"warning_duplicate_filter": "Warnung: Wegen technischen Limitierungen können mehrere Filter der selben Kombination (und/oder/nicht) zu unerwarteten Ergebnissen führen.",
|
||||
"and_down": "& Niedriger",
|
||||
"and_down": "& Runter",
|
||||
"enable_expert": "Expertenmodus aktivieren",
|
||||
"filter_name": "Name des Filters",
|
||||
"shared_with": "Geteilt mit",
|
||||
@ -367,13 +367,13 @@
|
||||
"desc": "Absteigend",
|
||||
"book_filter_help": "Schließt zusätzlich zu den manuell hinzugefügten Rezepten, alle Rezepte die dem Filter entsprechen ein.",
|
||||
"recipe_name": "Rezeptname",
|
||||
"paste_ingredients_placeholder": "Zutatenliste hier einfügen",
|
||||
"paste_ingredients_placeholder": "Zutatenliste hier einfügen...",
|
||||
"ingredient_list": "Zutatenliste",
|
||||
"filter": "Filter",
|
||||
"err_deleting_protected_resource": "Das zu löschende Objekt wird noch verwendet und kann nicht gelöscht werden.",
|
||||
"Create Food": "Zutat erstellen",
|
||||
"additional_options": "Weitere Möglichkeiten",
|
||||
"create_food_desc": "Zutat erstellen und mit diesem Rezept verknüpfen",
|
||||
"create_food_desc": "Zutat erstellen und mit diesem Rezept verknüpfen.",
|
||||
"App": "App",
|
||||
"Documentation": "Dokumentation",
|
||||
"Toggle": "Umschalten",
|
||||
@ -407,11 +407,11 @@
|
||||
"Warning_Delete_Supermarket_Category": "Die Löschung einer Supermarktkategorie werden auch alle Beziehungen zu Lebensmitteln gelöscht. Bist du dir sicher?",
|
||||
"New_Supermarket": "Erstelle einen neuen Supermarkt",
|
||||
"New_Supermarket_Category": "Erstelle eine neue Supermarktkategorie",
|
||||
"warning_space_delete": "Sie können ihren Space mit allen Rezepten, Einkaufslisten, Essensplänen und allem andren löschen. Dieser Vorgang kann nicht Rückgängig gemacht werden! Sind Sie sicher?",
|
||||
"Copy Link": "Link kopieren",
|
||||
"warning_space_delete": "Du kannst deinen Space inklusive all deiner Rezepte, Shoppinglisten, Essensplänen und allem anderen, das du erstellt hast löschen. Dieser Schritt kann nicht rückgängig gemacht werden! Bist du sicher, dass du das tun möchtest?",
|
||||
"Copy Link": "Kopiere den Link in die Zwischenablage",
|
||||
"Users": "Benutzer",
|
||||
"facet_count_info": "Die Anzahl an Rezepten im Suchfilter anzeigen.",
|
||||
"Copy Token": "Token kopieren",
|
||||
"facet_count_info": "Zeige die Anzahl der Rezepte auf den Suchfiltern.",
|
||||
"Copy Token": "Kopiere Token",
|
||||
"Invites": "Einladungen",
|
||||
"Message": "Nachricht",
|
||||
"Bookmarklet": "Lesezeichen",
|
||||
@ -467,5 +467,19 @@
|
||||
"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."
|
||||
"plural_usage_info": "Pluralform für Einheiten und Essen in diesem Space verwenden.",
|
||||
"Auto_Sort": "Automatisch sortieren",
|
||||
"PinnedConfirmation": "{recipe} wurde angeheftet.",
|
||||
"UnpinnedConfirmation": "{recipe} wurde gelöst.",
|
||||
"Description_Replace": "Beschreibung ersetzen",
|
||||
"Instruction_Replace": "Anleitung ersetzen",
|
||||
"Split_All_Steps": "Teile alle Zeilen in separate Schritte auf.",
|
||||
"Auto_Sort_Help": "Verschiebe alle Zutaten zu dem Schritt, der am Besten passt.",
|
||||
"Combine_All_Steps": "Fasse alle Schritte in einem einzelnem Feld zusammen.",
|
||||
"reset_children_help": "Überschreibe alle Kinder mit den Werten der vererbten Felder. Die vererbten Felder der Kinder werden als vererbte Felder gesetzt, es sei denn, das Kind-Vererben-Feld ist gesetzt.",
|
||||
"Unpin": "Lösen",
|
||||
"Amount": "Menge",
|
||||
"Original_Text": "Originaler Text",
|
||||
"Import Recipe": "Rezept importieren",
|
||||
"Create Recipe": "Rezept erstellen"
|
||||
}
|
||||
|
@ -65,9 +65,12 @@
|
||||
"Step_Type": "Step Type",
|
||||
"Make_Header": "Make Header",
|
||||
"Make_Ingredient": "Make Ingredient",
|
||||
"Amount": "Amount",
|
||||
"Enable_Amount": "Enable Amount",
|
||||
"Disable_Amount": "Disable Amount",
|
||||
"Ingredient Editor": "Ingredient Editor",
|
||||
"Description_Replace": "Description Replace",
|
||||
"Instruction_Replace": "Instruction Replace",
|
||||
"Auto_Sort": "Auto Sort",
|
||||
"Auto_Sort_Help": "Move all ingredients to the best fitting step.",
|
||||
"Private_Recipe": "Private Recipe",
|
||||
@ -115,7 +118,7 @@
|
||||
"Image": "Image",
|
||||
"Delete": "Delete",
|
||||
"Open": "Open",
|
||||
"Ok": "Open",
|
||||
"Ok": "Ok",
|
||||
"Save": "Save",
|
||||
"Step": "Step",
|
||||
"Search": "Search",
|
||||
@ -158,6 +161,7 @@
|
||||
"merge_title": "Merge {type}",
|
||||
"move_title": "Move {type}",
|
||||
"Food": "Food",
|
||||
"Original_Text": "Original Text",
|
||||
"Recipe_Book": "Recipe Book",
|
||||
"del_confirmation_tree": "Are you sure that you want to delete {source} and all of it's children?",
|
||||
"delete_title": "Delete {type}",
|
||||
@ -464,7 +468,7 @@
|
||||
"New_Supermarket_Category": "Create new supermarket category",
|
||||
"Are_You_Sure": "Are you sure?",
|
||||
"Valid Until": "Valid Until",
|
||||
"Split_All_Steps": "Split all rows into seperate steps.",
|
||||
"Split_All_Steps": "Split all rows into separate steps.",
|
||||
"Combine_All_Steps": "Combine all steps into a single field.",
|
||||
"Plural": "Plural",
|
||||
"plural_short": "plural",
|
||||
@ -472,5 +476,7 @@
|
||||
"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."
|
||||
"plural_usage_info": "Use the plural form for units and food inside this space.",
|
||||
"Create Recipe": "Create Recipe",
|
||||
"Import Recipe": "Import Recipe"
|
||||
}
|
||||
|
@ -167,8 +167,8 @@
|
||||
"Create_New_Keyword": "Añadir nueva Etiqueta",
|
||||
"Create_New_Unit": "Añadir nueva unidad",
|
||||
"Create_New_Meal_Type": "Añadir nuevo Tipo de Comida",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"and_up": "& Arriba",
|
||||
"and_down": "& Abajo",
|
||||
"Instructions": "Instrucciones",
|
||||
"Unrated": "Sin puntuar",
|
||||
"Automate": "Automatizar",
|
||||
@ -443,5 +443,14 @@
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
"plural_usage_info": "",
|
||||
"Original_Text": "Texto original",
|
||||
"Use_Fractions_Help": "Convertir automáticamente los decimales en fracciones al ver una receta.",
|
||||
"Description_Replace": "Reemplazar Descripción",
|
||||
"Instruction_Replace": "Reemplazar Instrucción",
|
||||
"plan_share_desc": "Las Nuevas entradas del Plan de Comidas se compartirán automáticamente con los usuarios seleccionados.",
|
||||
"Auto_Sort": "Ordenar Automáticamente",
|
||||
"Auto_Sort_Help": "Mueva todos los ingredientes al paso que mejor se adapte.",
|
||||
"Unpin": "Desanclar",
|
||||
"Amount": "Cantidad"
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"err_fetching_resource": "Erreur lors de la récupération d’une ressource !",
|
||||
"err_fetching_resource": "Il y a eu une erreur lors de la récupération d'une ressource !",
|
||||
"err_creating_resource": "Erreur lors de la création d’une ressource !",
|
||||
"err_updating_resource": "Erreur lors de la mise à jour d’une ressource !",
|
||||
"err_deleting_resource": "Erreur lors de la suppression d’une ressource !",
|
||||
@ -12,7 +12,7 @@
|
||||
"convert_internal": "Convertir en recette interne",
|
||||
"show_only_internal": "Montrer uniquement les recettes internes",
|
||||
"Log_Recipe_Cooking": "Marquer la recette comme cuisinée",
|
||||
"External_Recipe_Image": "Image externe de recette",
|
||||
"External_Recipe_Image": "Image de recette externe",
|
||||
"Add_to_Shopping": "Ajouter à la liste de courses",
|
||||
"Add_to_Plan": "Ajouter au menu",
|
||||
"Step_start_time": "Heure de début de l’étape",
|
||||
@ -22,7 +22,7 @@
|
||||
"Meal_Plan": "Menu de la semaine",
|
||||
"Select_Book": "Sélectionner le livre",
|
||||
"Recipe_Image": "Image de la recette",
|
||||
"Import_finished": "Importation finie",
|
||||
"Import_finished": "Importation terminée",
|
||||
"View_Recipes": "Voir les recettes",
|
||||
"Log_Cooking": "Marquer comme cuisiné",
|
||||
"New_Recipe": "Nouvelle recette",
|
||||
@ -30,7 +30,7 @@
|
||||
"Reset_Search": "Réinitialiser la recherche",
|
||||
"Recently_Viewed": "Vu récemment",
|
||||
"Load_More": "Charger plus",
|
||||
"Keywords": "Mots-clés",
|
||||
"Keywords": "mots-clés",
|
||||
"Books": "Livres",
|
||||
"Proteins": "Protéines",
|
||||
"Fats": "Matières grasses",
|
||||
@ -62,11 +62,11 @@
|
||||
"Size": "Taille",
|
||||
"Files": "Fichiers",
|
||||
"File": "Fichier",
|
||||
"Edit": "Modifier",
|
||||
"Edit": "modifier",
|
||||
"Cancel": "Annuler",
|
||||
"Delete": "Supprimer",
|
||||
"Open": "Ouvrir",
|
||||
"Ok": "Ouvrir",
|
||||
"Ok": "D'accord",
|
||||
"Save": "Sauvegarder",
|
||||
"Step": "Étape",
|
||||
"Search": "Rechercher",
|
||||
@ -78,12 +78,12 @@
|
||||
"Information": "Information",
|
||||
"Download": "Télécharger",
|
||||
"Create": "Créer",
|
||||
"show_split_screen": "Vue Séparée",
|
||||
"show_split_screen": "Vue séparée",
|
||||
"New_Keyword": "Nouveau mot-clé",
|
||||
"Delete_Keyword": "Supprimer mot-clé",
|
||||
"Move_Keyword": "Déplacer mot-clé",
|
||||
"Merge_Keyword": "Fusionner mots-clés",
|
||||
"Hide_Recipes": "Cacher recettes",
|
||||
"Delete_Keyword": "Supprimer le mot-clé",
|
||||
"Move_Keyword": "Déplacer le mot-clé",
|
||||
"Merge_Keyword": "Fusionner le mot-clé",
|
||||
"Hide_Recipes": "Cacher les recettes",
|
||||
"Advanced Search Settings": "Paramètres de recherche avancée",
|
||||
"View": "Voir",
|
||||
"Recipes": "Recettes",
|
||||
@ -96,8 +96,8 @@
|
||||
"delete_confirmation": "Êtes-vous sûr de vouloir supprimer {source} ?",
|
||||
"Shopping_Category": "Catégorie de courses",
|
||||
"Ignore_Shopping": "Ignorer les courses",
|
||||
"Edit_Food": "Modifier aliment",
|
||||
"Move_Food": "Déplacer aliment",
|
||||
"Edit_Food": "Modifier l’aliment",
|
||||
"Move_Food": "Déplacer l’aliment",
|
||||
"New_Food": "Nouvel aliment",
|
||||
"Hide_Food": "Cacher l’aliment",
|
||||
"Delete_Food": "Supprimer l’aliment",
|
||||
@ -113,13 +113,13 @@
|
||||
"Description": "Description",
|
||||
"Recipe": "Recette",
|
||||
"tree_root": "Racine de l’arbre",
|
||||
"Edit_Keyword": "Modifier mot-clé",
|
||||
"Edit_Keyword": "Modifier le mot-clé",
|
||||
"Hide_Keywords": "Cacher le mot-clé",
|
||||
"move_selection": "Sélectionner un parent {type} pour y déplacer {source}.",
|
||||
"merge_selection": "Remplace toutes les occurrences de {source} par {type}.",
|
||||
"merge_selection": "Remplacer toutes les occurrences de {source} par {type}.",
|
||||
"move_title": "Déplacer {type}",
|
||||
"del_confirmation_tree": "Êtes-vous sûr de vouloir supprimer {source} et tous ses enfants ?",
|
||||
"warning_feature_beta": "Cette fonctionnalité est actuellement en phase BETA (test). Veuillez vous attendre à des bugs et éventuellement à des modifications conséquentes à l’avenir (perte éventuelle de données liées à la fonctionnalité) lorsque vous utilisez cette fonctionnalité.",
|
||||
"warning_feature_beta": "Cette fonctionnalité est actuellement en état BETA (de test). Veuillez vous attendre à des bogues et éventuellement à des modifications majeures à l'avenir (pouvant entraîner une perte de données liées à la fonctionnalité) lors de l'utilisation de cette fonctionnalité.",
|
||||
"confirm_delete": "Voulez-vous vraiment supprimer {objet} ?",
|
||||
"Note": "Notes",
|
||||
"Add_Step": "Ajouter une étape",
|
||||
@ -189,7 +189,7 @@
|
||||
"Show_as_header": "Montrer comme en-tête",
|
||||
"Hide_as_header": "Cacher comme en-tête",
|
||||
"Copy_template_reference": "Copier la référence du modèle",
|
||||
"Edit_Recipe": "Modifier une Recette",
|
||||
"Edit_Recipe": "Modifier la recette",
|
||||
"Move_Up": "Monter",
|
||||
"Time": "Temps",
|
||||
"Coming_Soon": "Bientôt disponible",
|
||||
@ -225,14 +225,14 @@
|
||||
"Clear": "Supprimer",
|
||||
"AddToShopping": "Ajouter à la liste de courses",
|
||||
"IngredientInShopping": "Cet ingrédient est dans votre liste de courses.",
|
||||
"NotInShopping": "{food} n’est pas dans votre liste de courses.",
|
||||
"NotInShopping": "L’aliment {food} n’est pas dans votre liste de courses.",
|
||||
"OnHand": "Disponible actuellement",
|
||||
"FoodNotOnHand": "L’ingrédient {food} n’est pas disponible.",
|
||||
"FoodNotOnHand": "L’aliment {food} n’est pas disponible.",
|
||||
"Planner": "Planificateur",
|
||||
"Planner_Settings": "Paramètres du planificateur",
|
||||
"AddFoodToShopping": "Ajouter l’ingrédient {food} à votre liste de courses",
|
||||
"DeleteShoppingConfirm": "Êtes-vous sûr(e) de vouloir retirer tous les ingrédients {food} de votre liste de courses ?",
|
||||
"IgnoredFood": "L’ingrédient {food} est paramétré pour ignorer les courses.",
|
||||
"AddFoodToShopping": "Ajouter l’aliment {food} à votre liste de courses",
|
||||
"DeleteShoppingConfirm": "Êtes-vous sûr(e) de vouloir supprimer tous les aliments {food} de votre liste de courses ?",
|
||||
"IgnoredFood": "Ignorer les courses est paramétré pour l’aliment {food}.",
|
||||
"Inherit": "Hériter",
|
||||
"InheritFields": "Hériter les valeurs des champs",
|
||||
"FoodInherit": "Ingrédient hérité",
|
||||
@ -240,7 +240,7 @@
|
||||
"GroupBy": "Grouper par",
|
||||
"SupermarketCategoriesOnly": "Catégories de supermarché uniquement",
|
||||
"MoveCategory": "Déplacer vers : ",
|
||||
"IgnoreThis": "Ne jamais ajouter l'ingrédient {food} aux courses",
|
||||
"IgnoreThis": "Ne jamais ajouter automatiquement l’aliment {food} aux courses",
|
||||
"DelayFor": "Retard de {hours} heures",
|
||||
"Warning": "Avertissement",
|
||||
"InheritWarning": "L'ingrédient {food} est un héritage, les changements pourraient ne pas être conservés.",
|
||||
@ -275,15 +275,15 @@
|
||||
"DelayUntil": "Retard jusqu'à",
|
||||
"mark_complete": "Marque comme terminé",
|
||||
"QuickEntry": "Entrée rapide",
|
||||
"shopping_add_onhand_desc": "Marquer les aliments comme \"disponibles\" lorsqu'ils sont cochés sur la liste des courses.",
|
||||
"shopping_add_onhand_desc": "Marquer les aliments comme « disponibles » lorsqu'ils sont cochés sur la liste des courses.",
|
||||
"shopping_add_onhand": "Disponible par défaut",
|
||||
"related_recipes": "Recettes connexes",
|
||||
"today_recipes": "Recettes du jour",
|
||||
"Search Settings": "Paramètres de recherche",
|
||||
"FoodOnHand": "L’ingrédient {food} est disponible.",
|
||||
"FoodOnHand": "L’aliment {food} est disponible.",
|
||||
"Undefined": "Indéfini",
|
||||
"Create_Meal_Plan_Entry": "Créer une entrée de menu",
|
||||
"RemoveFoodFromShopping": "Retirer l’ingrédient {food} de votre liste de courses",
|
||||
"RemoveFoodFromShopping": "Supprimer l’aliment {food} de votre liste de courses",
|
||||
"left_handed": "Mode gaucher",
|
||||
"left_handed_help": "Optimise l’interface utilisateur pour une utilisation avec la main gauche.",
|
||||
"Custom Filter": "Filtre personnalisé",
|
||||
@ -298,9 +298,9 @@
|
||||
"paste_ingredients": "Copier les ingrédients",
|
||||
"ingredient_list": "Liste des ingrédients",
|
||||
"search_no_recipes": "Aucune recette trouvée !",
|
||||
"substitute_siblings_help": "Tous les ingrédients qui partagent un parent avec cette ingrédient sont considérés comme des substituts.",
|
||||
"OnHand_help": "L'ingrédient est dans l'inventaire et ne sera pas automatiquement ajouté à la liste de courses. Le status actuel est partagé avec les utilisateurs de la liste.",
|
||||
"ignore_shopping_help": "Ne jamais ajouter l'ingrédient à la liste de courses (ex: eau)",
|
||||
"substitute_siblings_help": "Tous les aliments qui partagent un parent avec cet aliment sont considérés comme des substituts.",
|
||||
"OnHand_help": "L’aliment est dans l’inventaire et ne sera pas automatiquement ajouté à la liste de courses. L’état de disponibilité est partagé avec les utilisateurs de la liste.",
|
||||
"ignore_shopping_help": "Ne jamais ajouter d’aliment à la liste de courses (ex. : eau)",
|
||||
"food_recipe_help": "Ajouter un lien vers la recette ici incluera cette recette dans n'importe qu'elle autre recette qui utilise cet ingrédient",
|
||||
"shopping_category_help": "Les supermarchés peuvent être triés et filtrés par catégorie d'ingrédients selon la disposition des rayons.",
|
||||
"Units": "Unités",
|
||||
@ -310,7 +310,7 @@
|
||||
"Supermarkets": "Supermarchés",
|
||||
"User": "Utilisateur",
|
||||
"Keyword": "Mot-clé",
|
||||
"Foods": "Ingrédients",
|
||||
"Foods": "Aliments",
|
||||
"enable_expert": "Activer le mode expert",
|
||||
"show_rating": "Afficher les notes",
|
||||
"asc": "Ordre croissant",
|
||||
@ -324,7 +324,7 @@
|
||||
"advanced": "Avancé",
|
||||
"fields": "Champs",
|
||||
"show_keywords": "Afficher les mots-clés",
|
||||
"show_foods": "Afficher les ingrédients",
|
||||
"show_foods": "Afficher les aliments",
|
||||
"show_books": "Afficher les livres",
|
||||
"show_units": "Afficher les unités",
|
||||
"show_filters": "Afficher les filtres",
|
||||
@ -333,10 +333,10 @@
|
||||
"click_image_import": "Cliquez sur l'image que vous souhaitez importer pour cette recette",
|
||||
"select_unit": "Sélectionner Unité",
|
||||
"Select_App_To_Import": "Veuillez sélectionner une App pour importer depuis",
|
||||
"err_deleting_protected_resource": "L'objet que vous essayez de supprimer est toujours utilisé et ne peut pas être supprimé.",
|
||||
"err_deleting_protected_resource": "L’objet que vous essayez de supprimer est toujours utilisé et ne peut pas être supprimé.",
|
||||
"Are_You_Sure": "Etes-vous sûr ?",
|
||||
"filter": "Filtre",
|
||||
"Ingredient Editor": "Éditeur d'ingrédients",
|
||||
"Ingredient Editor": "Éditeur d’ingrédients",
|
||||
"advanced_search_settings": "Paramètres de recherche avancée",
|
||||
"nothing_planned_today": "Vous n'avez rien de prévu pour aujourd'hui !",
|
||||
"Pinned": "Epinglé",
|
||||
@ -355,7 +355,7 @@
|
||||
"Options": "Options",
|
||||
"additional_options": "Options Supplémentaires",
|
||||
"Website": "Site",
|
||||
"App": "App",
|
||||
"App": "Appli",
|
||||
"Click_To_Edit": "Cliquer pour éditer",
|
||||
"reset_children": "Réinitialiser l'héritage enfant",
|
||||
"created_on": "Créé le",
|
||||
@ -380,7 +380,7 @@
|
||||
"no_more_images_found": "Pas d'images supplémentaires trouvées sur le site.",
|
||||
"sql_debug": "Débogage de la base SQL",
|
||||
"last_cooked": "Dernière recette utilisée",
|
||||
"times_cooked": "Temps de cuisson",
|
||||
"times_cooked": "Nombre de fois cuisiné",
|
||||
"show_sortby": "Trier par",
|
||||
"Hours": "Heures",
|
||||
"Days": "Jours",
|
||||
@ -395,7 +395,7 @@
|
||||
"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.",
|
||||
"food_inherit_info": "Champs sur les aliments à hériter 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 ?",
|
||||
@ -403,11 +403,62 @@
|
||||
"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": ""
|
||||
"Plural": "Pluriel",
|
||||
"plural_short": "pluriel",
|
||||
"Use_Plural_Unit_Always": "Toujours utiliser la forme plurielle pour les unités",
|
||||
"Use_Plural_Unit_Simple": "Utiliser la forme plurielle pour les unités de manière dynamique",
|
||||
"Use_Plural_Food_Always": "Toujours utiliser la forme plurielle pour les aliments",
|
||||
"Use_Plural_Food_Simple": "Utiliser la forme plurielle pour les aliments de manière dynamique",
|
||||
"plural_usage_info": "Utiliser la forme plurielle pour les unités et les aliments dans ce groupe.",
|
||||
"Planned": "Planifié",
|
||||
"Amount": "Quantité",
|
||||
"Original_Text": "Texte d’origine",
|
||||
"Use_Fractions": "Utiliser les fractions",
|
||||
"Use_Fractions_Help": "Convertir les décimales en fractions automatiquement lors de la visualisation d’une recette.",
|
||||
"Message": "Message",
|
||||
"Sticky_Nav_Help": "Toujours afficher le menu de navigation en haut de l’écran.",
|
||||
"Combine_All_Steps": "Combiner toutes les étapes en un seul champ.",
|
||||
"facet_count_info": "Afficher les compteurs de recette sur les filtres de recherche.",
|
||||
"Decimals": "Décimales",
|
||||
"plan_share_desc": "Les nouvelles entrées de menu de la semaine seront partagées automatiquement avec des utilisateurs sélectionnés.",
|
||||
"Use_Kj": "Utiliser kJ au lieu de kcal",
|
||||
"Manage_Emails": "Gérer les e-mails",
|
||||
"select_food": "Séletionner l’aliment",
|
||||
"Toggle": "Basculer",
|
||||
"Theme": "Thème",
|
||||
"Import_Supported": "Importation prise en charge",
|
||||
"Auto_Sort": "Tri automatique",
|
||||
"Auto_Sort_Help": "Déplacer tous les ingrédients à l’étape la mieux adaptée.",
|
||||
"reusable_help_text": "Le lien d’invitation doit-il être utilisable par plus d’un utilisateur.",
|
||||
"date_viewed": "Dernier vu",
|
||||
"Username": "Nom d’utilisateur",
|
||||
"First_name": "Prénom",
|
||||
"Last_name": "Nom",
|
||||
"Disabled": "Désactivé",
|
||||
"Disable": "Désactiver",
|
||||
"Export_Supported": "Exportation prise en charge",
|
||||
"Recipes_In_Import": "Recettes dans votre fichier d’importation",
|
||||
"Import_Error": "Une erreur est survenue pendant votre importation. Veuillez développer les détails au bas de la page pour la consulter.",
|
||||
"Valid Until": "Valide jusqu’au",
|
||||
"Create Food": "Créer un aliment",
|
||||
"create_food_desc": "Créer un aliment et le relier par une lien à cette recette.",
|
||||
"remember_hours": "Horaires à retenir",
|
||||
"Ingredient Overview": "Aperçu des ingrédients",
|
||||
"parameter_count": "Paramètres {count}",
|
||||
"show_ingredient_overview": "Afficher une liste de tous les ingrédients au début de la recette.",
|
||||
"Import_Not_Yet_Supported": "Importation pas encore prise en charge",
|
||||
"Export_Not_Yet_Supported": "Exportation pas encore prise en charge",
|
||||
"Import_Result_Info": "{imported} sur {total} recettes ont été importées",
|
||||
"API": "API",
|
||||
"not": "pas",
|
||||
"Create Recipe": "Créer une recette",
|
||||
"Import Recipe": "Importer une recette",
|
||||
"Copy Token": "Copier le jeton",
|
||||
"Description_Replace": "Remplacer la Description",
|
||||
"Cosmetic": "Cosmétique",
|
||||
"explain": "Expliquer",
|
||||
"Unpin": "Détacher",
|
||||
"Split_All_Steps": "Diviser toutes les lignes en étapes séparées.",
|
||||
"Warning_Delete_Supermarket_Category": "Supprimer une catégorie de supermarché supprimera également toutes les relations avec les aliments. Êtes-vous sûr ?",
|
||||
"Instruction_Replace": "Instruction Remplacer"
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"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!",
|
||||
"warning_feature_beta": "Fitur ini saat ini dalam status BETA (pengujian). Mungkin terdapat bug dan perubahan yang penting di masa mendatang (sehingga mungkin terjadi kehilangan data terkait fitur) saat menggunakan fitur ini.",
|
||||
"err_fetching_resource": "Terjadi kesalahan saat memperoleh sumber daya!",
|
||||
"err_creating_resource": "Terjadi kesalahan saat membuat sumber daya!",
|
||||
"err_updating_resource": "Terjadi kesalahan saat mengupdate sumber daya!",
|
||||
"err_updating_resource": "Terjadi kesalahan saat memperbarui 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!",
|
||||
|
@ -74,7 +74,7 @@
|
||||
"Edit": "Modifica",
|
||||
"Delete": "Elimina",
|
||||
"Open": "Apri",
|
||||
"Ok": "Apri",
|
||||
"Ok": "Ok",
|
||||
"Save": "Salva",
|
||||
"Step": "Step",
|
||||
"Search": "Cerca",
|
||||
@ -454,5 +454,17 @@
|
||||
"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."
|
||||
"search_create_help_text": "Crea una nuova ricetta direttamente in Tandoor.",
|
||||
"Description_Replace": "Sostituisci descrizione",
|
||||
"Instruction_Replace": "Sostituisci istruzioni",
|
||||
"book_filter_help": "Includi ricette dal filtro ricette oltre a quelle assegnate manualmente.",
|
||||
"import_duplicates": "Per evitare duplicati, le ricette con lo stesso nome di quelle esistenti vengono ignorate. Selezionare questa casella per importare tutto.",
|
||||
"shopping_category_help": "I supermercati possono essere ordinati e filtrati per categoria di spesa seguendo la disposizione degli scaffali.",
|
||||
"food_recipe_help": "Collegando qui una ricetta, includerà la stessa in ogni altra ricetta che usa questo alimento",
|
||||
"warning_duplicate_filter": "Avviso: a causa di limitazioni tecniche, usare più filtri di ricerca della stessa combinazione (and/or/not) potrebbe portare a risultati inaspettati.",
|
||||
"Warning_Delete_Supermarket_Category": "L'eliminazione di una categoria di supermercato comporta anche l'eliminazione di tutte le relazioni con gli alimenti. Sei sicuro?",
|
||||
"Original_Text": "Testo originale",
|
||||
"search_rank": "Posizione di ricerca",
|
||||
"make_now": "Fai ora",
|
||||
"Amount": "Quantità"
|
||||
}
|
||||
|
482
vue/src/locales/nb_NO.json
Normal file
482
vue/src/locales/nb_NO.json
Normal file
@ -0,0 +1,482 @@
|
||||
{
|
||||
"warning_feature_beta": "Denne funksjonen er foreløpig i BETA-versjon (testing). Regn med feil og at det i fremtidige oppdateringer kan komme endringer som gjør funksjonen ubrukelig.",
|
||||
"err_fetching_resource": "Feil ved henting av ressurs!",
|
||||
"err_creating_resource": "Feil ved oppretting av ressurs!",
|
||||
"err_updating_resource": "Feil ved oppdatering av ressurs!",
|
||||
"err_deleting_resource": "Feil ved sletting av ressurs!",
|
||||
"err_deleting_protected_resource": "Objektet du prøver å slette er fortsatt i bruk, og kan ikke slettes.",
|
||||
"err_moving_resource": "Feil ved flytting av ressurs!",
|
||||
"err_merging_resource": "Feil ved sammenslåing av ressurs!",
|
||||
"success_fetching_resource": "Vellykket henting av ressurs!",
|
||||
"success_creating_resource": "Vellykket oppretting av ressurs!",
|
||||
"success_updating_resource": "Vellykket oppdatering av ressurs!",
|
||||
"success_deleting_resource": "Vellykket sletting av ressurs!",
|
||||
"success_moving_resource": "Vellykket flytting av ressurs!",
|
||||
"success_merging_resource": "Vellykket sammenslåing av ressurs!",
|
||||
"file_upload_disabled": "Opplasting av filer er ikke aktivert i området ditt.",
|
||||
"warning_space_delete": "Du kan slette området, inkludert alle oppskrifter, handlelister, måltidsplaner og alt annet du har opprettet. Dette kan ikke angres! Er du sikker på at du vil gjøre dette?",
|
||||
"food_inherit_info": "Felter på matvarer som skal arves som standard.",
|
||||
"facet_count_info": "Vis oppskriftsantall i søkefilter.",
|
||||
"step_time_minutes": "Tid for trinn, i minutter",
|
||||
"confirm_delete": "Er du sikker på at du vil slette dette {object}?",
|
||||
"import_running": "Importering pågår. Vennligst vent!",
|
||||
"all_fields_optional": "Alle felt er valgfri, og kan stå tomme.",
|
||||
"convert_internal": "Konverter til intern oppskrift",
|
||||
"show_only_internal": "Vis bare interne oppskrifter",
|
||||
"show_split_screen": "Delt visning",
|
||||
"Log_Recipe_Cooking": "Logg oppskriftsbruk",
|
||||
"External_Recipe_Image": "Bilde av ekstern oppskrift",
|
||||
"Add_to_Shopping": "Legg til i handleliste",
|
||||
"Add_to_Plan": "Legg til i Plan",
|
||||
"Step_start_time": "Trinn starttid",
|
||||
"Sort_by_new": "Sorter etter nyest",
|
||||
"Table_of_Contents": "Innholdsfortegnelse",
|
||||
"Recipes_per_page": "Oppskrifter per side",
|
||||
"Show_as_header": "Vis som overskrift",
|
||||
"Hide_as_header": "Skjul overskrift",
|
||||
"Add_nutrition_recipe": "Legg til næringsinnhold til oppskrift",
|
||||
"Remove_nutrition_recipe": "Fjern næringsinnhold fra oppskrift",
|
||||
"Copy_template_reference": "Kopier mal-referanse",
|
||||
"Save_and_View": "Lagre og vis",
|
||||
"Manage_Books": "Administrer bøker",
|
||||
"Meal_Plan": "Måltidsplan",
|
||||
"Select_Book": "Velg bok",
|
||||
"Select_File": "Velg fil",
|
||||
"Recipe_Image": "Oppskriftsbilde",
|
||||
"Import_finished": "Importering fullført",
|
||||
"View_Recipes": "Vis oppskrifter",
|
||||
"Log_Cooking": "Loggfør tilbereding",
|
||||
"New_Recipe": "Ny oppskrift",
|
||||
"Url_Import": "Importer lenke",
|
||||
"Reset_Search": "Nullstill søk",
|
||||
"Recently_Viewed": "Nylig vist",
|
||||
"Load_More": "Last inn flere",
|
||||
"New_Keyword": "Nytt nøkkelord",
|
||||
"Delete_Keyword": "Slett nøkkelord",
|
||||
"Edit_Keyword": "Rediger nøkkelord",
|
||||
"Edit_Recipe": "Rediger oppskrift",
|
||||
"Move_Keyword": "Flytt nøkkelord",
|
||||
"Merge_Keyword": "Slå sammen nøkkelord",
|
||||
"Hide_Keywords": "Skjul nøkkelord",
|
||||
"Hide_Recipes": "Skjul oppskrifter",
|
||||
"Move_Up": "Flytt opp",
|
||||
"Move_Down": "Flytt ned",
|
||||
"Step_Name": "Trinn navn",
|
||||
"Step_Type": "Trinn type",
|
||||
"Make_Header": "Bruk som overskrift",
|
||||
"Make_Ingredient": "Bruk som ingrediens",
|
||||
"Amount": "Mengde",
|
||||
"Enable_Amount": "Aktiver mengde",
|
||||
"Disable_Amount": "Deaktiver mengde",
|
||||
"Ingredient Editor": "",
|
||||
"Description_Replace": "",
|
||||
"Instruction_Replace": "",
|
||||
"Auto_Sort": "",
|
||||
"Auto_Sort_Help": "",
|
||||
"Private_Recipe": "",
|
||||
"Private_Recipe_Help": "",
|
||||
"reusable_help_text": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "Bøker",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "Karbohydrater",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "Karakter",
|
||||
"Close": "Lukk",
|
||||
"Cancel": "",
|
||||
"Link": "Lenke",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Protected": "",
|
||||
"Ingredients": "Ingredienser",
|
||||
"Supermarket": "Butikk",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "Innstillinger",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "Opprett",
|
||||
"Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"Copy Link": "",
|
||||
"Copy Token": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Original_Text": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"Unpin": "",
|
||||
"PinnedConfirmation": "",
|
||||
"UnpinnedConfirmation": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"recipe_filter": "",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "",
|
||||
"copy_to_new": "",
|
||||
"recipe_name": "",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "Velg",
|
||||
"Supermarkets": "",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "",
|
||||
"Last_name": "",
|
||||
"Keyword": "Nøkkelord",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "",
|
||||
"Import_Error": "",
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": "",
|
||||
"Split_All_Steps": "",
|
||||
"Combine_All_Steps": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": "",
|
||||
"Create Recipe": "",
|
||||
"Import Recipe": ""
|
||||
}
|
@ -74,7 +74,7 @@
|
||||
"success_deleting_resource": "Hulpbron succesvol verwijderd!",
|
||||
"Cancel": "Annuleer",
|
||||
"Delete": "Verwijder",
|
||||
"Ok": "Open",
|
||||
"Ok": "Ok",
|
||||
"Load_More": "Laad meer",
|
||||
"Manage_Books": "Beheer boeken",
|
||||
"Create": "Voeg toe",
|
||||
@ -162,7 +162,7 @@
|
||||
"del_confirmation_tree": "Weet je zeker dat je {source} en al zijn kinderen wil verwijderen?",
|
||||
"Create_New_Food": "Voeg nieuw Eten toe",
|
||||
"Time": "Tijd",
|
||||
"warning_feature_beta": "Deze functie zit op dit moment in de BETA (test) fase. Verwacht hier bugs en toekomstige wijzigingen die tot het verlies van data gaan leiden bij het gebruik.",
|
||||
"warning_feature_beta": "Deze functie zit op dit moment in de BETA (test) fase. Verwacht hier bugs en toekomstige wijzigingen die tot het verlies van data kunnen leiden bij het gebruik.",
|
||||
"Table_of_Contents": "Inhoudsopgave",
|
||||
"Create_New_Meal_Type": "Voeg Nieuw Maaltijdtype toe",
|
||||
"Empty": "Leeg",
|
||||
@ -376,7 +376,7 @@
|
||||
"substitute_children_help": "Alle ingrediënten die kinderen zijn van dit ingrediënt worden beschouwd als vervangers.",
|
||||
"SubstituteOnHand": "Je hebt een vervanger op voorraad.",
|
||||
"ChildInheritFields": "Kinderen erven velden",
|
||||
"InheritFields_help": "De waarden van deze velden worden geërfd van een ouder (uitzondering: lege boodschappencategorieën)",
|
||||
"InheritFields_help": "De waarden van deze velden worden overgenomen van de bovenliggende waarden (uitzondering: lege boodschappencategorieën)",
|
||||
"no_pinned_recipes": "Je hebt geen vastgepinde recepten!",
|
||||
"Internal": "Interne",
|
||||
"Reset": "Herstel",
|
||||
@ -467,11 +467,18 @@
|
||||
"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": ""
|
||||
"Plural": "Meervoud",
|
||||
"plural_short": "meervoud",
|
||||
"Use_Plural_Unit_Always": "Gebruik altijd de meervoudsvorm voor eenheden",
|
||||
"Use_Plural_Unit_Simple": "Gebruik meervoudsvorm voor eenheden dynamisch",
|
||||
"Use_Plural_Food_Always": "Gebruik altijd meervoudsvorm voor voedsel",
|
||||
"Use_Plural_Food_Simple": "Gebruik meervoudsvorm voor voedsels dynamisch",
|
||||
"plural_usage_info": "Gebruik de meervoudsvorm voor eenheden en voedsels in deze ruimte.",
|
||||
"Amount": "Hoeveelheid",
|
||||
"Original_Text": "Originele tekst",
|
||||
"reset_food_inheritance_info": "Herstel alle voedingsmiddelen naar de standaard overgenomen velden en hun bovenliggende waarden.",
|
||||
"Description_Replace": "Vervang beschrijving",
|
||||
"Instruction_Replace": "Vervang instructie",
|
||||
"Auto_Sort_Help": "Verplaats alle ingrediënten naar de best passende stap.",
|
||||
"Auto_Sort": "Automatisch sorteren"
|
||||
}
|
||||
|
@ -474,5 +474,11 @@
|
||||
"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."
|
||||
"Combine_All_Steps": "Połącz wszystkie kroki w jedno pole.",
|
||||
"Amount": "Ilość",
|
||||
"Original_Text": "Tekst oryginalny",
|
||||
"Description_Replace": "Zmień opis",
|
||||
"Instruction_Replace": "Zmień instrukcję",
|
||||
"Import Recipe": "Importuj przepis",
|
||||
"Create Recipe": "Utwórz przepis"
|
||||
}
|
||||
|
@ -9,244 +9,244 @@
|
||||
"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_deleting_resource": "Recurso excluído 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": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "",
|
||||
"show_only_internal": "",
|
||||
"show_split_screen": "",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "",
|
||||
"Manage_Books": "",
|
||||
"Meal_Plan": "",
|
||||
"Select_Book": "",
|
||||
"Select_File": "",
|
||||
"Recipe_Image": "",
|
||||
"Import_finished": "",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"New_Keyword": "",
|
||||
"Delete_Keyword": "",
|
||||
"Edit_Keyword": "",
|
||||
"Edit_Recipe": "",
|
||||
"Move_Keyword": "",
|
||||
"Merge_Keyword": "",
|
||||
"Hide_Keywords": "",
|
||||
"Hide_Recipes": "",
|
||||
"Move_Up": "",
|
||||
"Move_Down": "",
|
||||
"Step_Name": "",
|
||||
"Step_Type": "",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"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": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"and_up": "",
|
||||
"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": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"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": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"step_time_minutes": "tempo da etapa em minutos",
|
||||
"confirm_delete": "Tem a certeza que pretende eliminar este {object}?",
|
||||
"import_running": "Importação a decorrer, por favor aguarde!",
|
||||
"all_fields_optional": "Todo os campos são opcionais e podem ficar vazios.",
|
||||
"convert_internal": "Converter em receita interna",
|
||||
"show_only_internal": "Mostrar apenas receitas internas",
|
||||
"show_split_screen": "Vista dividida",
|
||||
"Log_Recipe_Cooking": "Registrar Receitas de Culinária",
|
||||
"External_Recipe_Image": "Imagem da receita externa",
|
||||
"Add_to_Shopping": "Adicionar á lista de compras",
|
||||
"Add_to_Plan": "Adicionar ao plano",
|
||||
"Step_start_time": "Hora de Inicio do passo",
|
||||
"Sort_by_new": "Ordenar por mais recente",
|
||||
"Table_of_Contents": "Tabela de Conteúdos",
|
||||
"Recipes_per_page": "Receitas por página",
|
||||
"Show_as_header": "Mostrar como cabeçalho",
|
||||
"Hide_as_header": "Esconder como cabeçalho",
|
||||
"Add_nutrition_recipe": "Adicionar valor nutricional á receita",
|
||||
"Remove_nutrition_recipe": "Remover valor nutricional da receita",
|
||||
"Copy_template_reference": "Copiar modelo de referencia",
|
||||
"Save_and_View": "Gravar & Ver",
|
||||
"Manage_Books": "Gerenciar Livros",
|
||||
"Meal_Plan": "Plano de Refeição",
|
||||
"Select_Book": "Selecionar Livro",
|
||||
"Select_File": "Selecionar Ficheiro",
|
||||
"Recipe_Image": "Imagem da Receita",
|
||||
"Import_finished": "Importação terminada",
|
||||
"View_Recipes": "Ver Receitas",
|
||||
"Log_Cooking": "Registrar Culinária",
|
||||
"New_Recipe": "Nova Receita",
|
||||
"Url_Import": "Importação de URL",
|
||||
"Reset_Search": "Repor Pesquisa",
|
||||
"Recently_Viewed": "Vistos Recentemente",
|
||||
"Load_More": "Carregar Mais",
|
||||
"New_Keyword": "Nova Palavra Chave",
|
||||
"Delete_Keyword": "Eliminar Palavra Chave",
|
||||
"Edit_Keyword": "Editar Palavra Chave",
|
||||
"Edit_Recipe": "Editar receita",
|
||||
"Move_Keyword": "Mover palavra-chave",
|
||||
"Merge_Keyword": "Unir palavra-chave",
|
||||
"Hide_Keywords": "Esconder palavra-chave",
|
||||
"Hide_Recipes": "Esconder Receitas",
|
||||
"Move_Up": "Mover para cima",
|
||||
"Move_Down": "Mover para baixo",
|
||||
"Step_Name": "Nome do Passo",
|
||||
"Step_Type": "Tipo do passo",
|
||||
"Make_Header": "Tornar cabeçalho",
|
||||
"Make_Ingredient": "Fazer ingrediente",
|
||||
"Enable_Amount": "Ativar quantidade",
|
||||
"Disable_Amount": "Desativar quantidade",
|
||||
"Add_Step": "Adicionar passo",
|
||||
"Keywords": "Palavras-chave",
|
||||
"Books": "Livros",
|
||||
"Proteins": "Proteínas",
|
||||
"Fats": "Gorduras",
|
||||
"Carbohydrates": "Carboidratos",
|
||||
"Calories": "Calorias",
|
||||
"Energy": "Energia",
|
||||
"Nutrition": "Nutrição",
|
||||
"Date": "Data",
|
||||
"Share": "Partilhar",
|
||||
"Automation": "Automação",
|
||||
"Parameter": "Parâmetro",
|
||||
"Export": "Exportar",
|
||||
"Copy": "Copiar",
|
||||
"Rating": "Avaliação",
|
||||
"Close": "Fechar",
|
||||
"Cancel": "Cancelar",
|
||||
"Link": "Ligação",
|
||||
"Add": "Adicionar",
|
||||
"New": "Novo",
|
||||
"Note": "Nota",
|
||||
"Success": "Sucesso",
|
||||
"Failure": "Falha",
|
||||
"Ingredients": "Ingredientes",
|
||||
"Supermarket": "Supermercado",
|
||||
"Categories": "Categorias",
|
||||
"Category": "Categoria",
|
||||
"Selected": "Selecionado",
|
||||
"min": "minimo",
|
||||
"Servings": "Doses",
|
||||
"Waiting": "Em espera",
|
||||
"Preparation": "Preparação",
|
||||
"External": "Externo",
|
||||
"Size": "Tamanho",
|
||||
"Files": "Ficheiros",
|
||||
"File": "Ficheiro",
|
||||
"Edit": "Editar",
|
||||
"Image": "Image",
|
||||
"Delete": "Apagar",
|
||||
"Open": "Abrir",
|
||||
"Ok": "Ok",
|
||||
"Save": "Guardar",
|
||||
"Step": "Passo",
|
||||
"Search": "Pesquisar",
|
||||
"Import": "Importar",
|
||||
"Print": "Imprimir",
|
||||
"Settings": "Definições",
|
||||
"or": "ou",
|
||||
"and": "e",
|
||||
"Information": "Informação",
|
||||
"Download": "Transferência",
|
||||
"Create": "Criar",
|
||||
"Search Settings": "Definições de Pesquisa",
|
||||
"View": "Vista",
|
||||
"Recipes": "Receitas",
|
||||
"Move": "Mover",
|
||||
"Merge": "Juntar",
|
||||
"Parent": "Parente",
|
||||
"delete_confirmation": "Tem a certeza que pretende eliminar {source}?",
|
||||
"move_confirmation": "Mover <i> {child}</i>para parente <i>{parent}</i>",
|
||||
"merge_confirmation": "Substituir <i>{source}</i> por <i>{target}</i>",
|
||||
"create_rule": "e criar automação",
|
||||
"move_selection": "Selecionar um parente {type} para mover {source} para.",
|
||||
"merge_selection": "Substituir todas as ocorrências de {source} por {type}.",
|
||||
"Root": "Raiz",
|
||||
"Ignore_Shopping": "Ignorar compras",
|
||||
"Shopping_Category": "Categoria de Compras",
|
||||
"Shopping_Categories": "Categorias de Compras",
|
||||
"Edit_Food": "Editar comida",
|
||||
"Move_Food": "Mover comida",
|
||||
"New_Food": "Nova comida",
|
||||
"Hide_Food": "Esconder comida",
|
||||
"Food_Alias": "Alcunha da comida",
|
||||
"Unit_Alias": "Alcunha da unidade",
|
||||
"Keyword_Alias": "Alcunha da palavra-chave",
|
||||
"Delete_Food": "Eliminar comida",
|
||||
"No_ID": "identificação não encontrada, impossível eliminar.",
|
||||
"Meal_Plan_Days": "Planos de alimentação futuros",
|
||||
"merge_title": "Unir {type}",
|
||||
"move_title": "Mover {type}",
|
||||
"Food": "Comida",
|
||||
"Recipe_Book": "Livro de Receitas",
|
||||
"del_confirmation_tree": "Tem a certeza que pretende eliminar {source} e todas as suas crianças?",
|
||||
"delete_title": "Eliminar {type}",
|
||||
"create_title": "Novo {type}",
|
||||
"edit_title": "Editar {type}",
|
||||
"Name": "Nome",
|
||||
"Type": "Tipo",
|
||||
"Description": "Descrição",
|
||||
"Recipe": "Receita",
|
||||
"tree_root": "Raiz da árvore",
|
||||
"Icon": "Ícone",
|
||||
"Unit": "Unidade",
|
||||
"No_Results": "Sem resultados",
|
||||
"New_Unit": "Nova Unidade",
|
||||
"Create_New_Shopping Category": "Criar nova categoria de Compras",
|
||||
"Create_New_Food": "Adicionar nova comida",
|
||||
"Create_New_Keyword": "Adicionar nova palavra-chave",
|
||||
"Create_New_Unit": "Adicionar nova unidade",
|
||||
"Create_New_Meal_Type": "Adicionar novo tipo de refeição",
|
||||
"and_up": "e para cima",
|
||||
"and_down": "e para baixo",
|
||||
"Instructions": "Instruções",
|
||||
"Unrated": "Sem classificação",
|
||||
"Automate": "Automatizar",
|
||||
"Empty": "Esvaziar",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"Key_Shift": "Shift",
|
||||
"Time": "tempo",
|
||||
"Text": "Texto",
|
||||
"Shopping_list": "Lista de Compras",
|
||||
"Added_by": "Adicionado por",
|
||||
"Added_on": "Adicionado a",
|
||||
"AddToShopping": "Adicionar á lista de compras",
|
||||
"IngredientInShopping": "Este ingrediente está na sua lista de compras.",
|
||||
"NotInShopping": "{food} não está na sua lista de compras.",
|
||||
"OnHand": "Atualmente disponível",
|
||||
"FoodOnHand": "Tem {food} disponível.",
|
||||
"FoodNotOnHand": "Não têm {food} disponível.",
|
||||
"Undefined": "Não definido",
|
||||
"Create_Meal_Plan_Entry": "Criar entrada para plano de refeições",
|
||||
"Edit_Meal_Plan_Entry": "Editar entrada de plano de refeições",
|
||||
"Title": "Título",
|
||||
"Week": "Semana",
|
||||
"Month": "Mês",
|
||||
"Year": "Ano",
|
||||
"Planner": "Planeador",
|
||||
"Planner_Settings": "Definições do planeador",
|
||||
"Period": "Período",
|
||||
"Plan_Period_To_Show": "Mostrar semanas, meses ou anos",
|
||||
"Periods": "Períodos",
|
||||
"Plan_Show_How_Many_Periods": "Quantos períodos mostrar",
|
||||
"Starting_Day": "Dia de início da semana",
|
||||
"Meal_Types": "Tipos de refeições",
|
||||
"Meal_Type": "Tipo de refeição",
|
||||
"Clone": "Clonar",
|
||||
"Drag_Here_To_Delete": "Arraste para aqui para eliminar",
|
||||
"Meal_Type_Required": "Tipo de refeição é necessário",
|
||||
"Title_or_Recipe_Required": "Título ou seleção de receitas é necessário",
|
||||
"Color": "Cor",
|
||||
"New_Meal_Type": "Novo tipo de refeição",
|
||||
"AddFoodToShopping": "Adicionar {food} à sua lista de compras",
|
||||
"RemoveFoodFromShopping": "Remover {food} da sua lista de compras",
|
||||
"DeleteShoppingConfirm": "Tem a certeza que pretende remover toda {food} da sua lista de compras?",
|
||||
"IgnoredFood": "{food} está definida para ignorar compras.",
|
||||
"Add_Servings_to_Shopping": "Adicionar {servings} doses ás compras",
|
||||
"Week_Numbers": "Números das semanas",
|
||||
"Show_Week_Numbers": "Mostrar números das semanas?",
|
||||
"Export_As_ICal": "Exportar período atual para o formato ICal",
|
||||
"Export_To_ICal": "Exportar .ics",
|
||||
"Cannot_Add_Notes_To_Shopping": "Notas não podem ser adicionadas à lista de compras",
|
||||
"Added_To_Shopping_List": "Adicionado à lista de compras",
|
||||
"Shopping_List_Empty": "A sua lista de compras encontra-se vazia, pode adicionar itens através do menu de contexto de um plano de refeições (carregar com o botão direito no cartão ou carregar com o botão esquerdo no ícone do menu)",
|
||||
"Next_Period": "Próximo período",
|
||||
"Previous_Period": "Período anterior",
|
||||
"Current_Period": "Período atual",
|
||||
"Next_Day": "Dia seguinte",
|
||||
"Previous_Day": "Dia anterior",
|
||||
"Inherit": "Herdado",
|
||||
"InheritFields": "Campos herdados",
|
||||
"FoodInherit": "Campos herdados por comida",
|
||||
"ShowUncategorizedFood": "Mostrar não definidos",
|
||||
"GroupBy": "Agrupar por",
|
||||
"SupermarketCategoriesOnly": "Apenas categorias do supermercado",
|
||||
"MoveCategory": "Mover para: ",
|
||||
"CountMore": "...+{count} mais",
|
||||
"IgnoreThis": "Nunca adicionar automaticamente {food} á lista de compras",
|
||||
"DelayFor": "Atrasar por {hours} horas",
|
||||
"Warning": "Aviso",
|
||||
"NoCategory": "Nenhuma categoria selecionada.",
|
||||
"InheritWarning": "{food} esta definida para herdar, alterações podem não persistir.",
|
||||
"ShowDelayed": "Mostrar itens atrasados",
|
||||
"Completed": "Completo",
|
||||
"OfflineAlert": "Está offline, lista das compras poderá não sincronizar.",
|
||||
"shopping_share": "Partilhar lista de compras",
|
||||
"shopping_auto_sync": "Sincronização automática",
|
||||
"mealplan_autoadd_shopping": "Adicionar automaticamente plano de refeições",
|
||||
"mealplan_autoexclude_onhand": "Excluir comida disponível",
|
||||
"mealplan_autoinclude_related": "Adicionar receitas relacionadas",
|
||||
"default_delay": "Horas de atraso por padrão",
|
||||
"shopping_share_desc": "Utilizadores poderão ver todos os itens que adicionar à sua lista de compras. Eles devem adicioná-lo para ver os itens na lista deles.",
|
||||
"shopping_auto_sync_desc": "Definir a 0 irá desativar a sincronização automática. Quando se visualiza uma lista de compras a lista é atualizada após um número determinado de segundos para sincronizar com possíveis alterações feitas por outrem. Útil quando se partilha a lista de compras porém irá consumir dados móveis.",
|
||||
"mealplan_autoadd_shopping_desc": "Adicionar automaticamente ingredientes do plano de refeições á lista de compras.",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
@ -369,7 +369,7 @@
|
||||
"select_unit": "Selecionar Unidade",
|
||||
"select_food": "Selecionar Comida",
|
||||
"remove_selection": "Deselecionar",
|
||||
"empty_list": "Lista está Vazia.",
|
||||
"empty_list": "Lista está vazia.",
|
||||
"Select": "Selecionar",
|
||||
"Supermarkets": "Supermercados",
|
||||
"User": "Utilizador",
|
||||
@ -381,7 +381,7 @@
|
||||
"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?",
|
||||
"warning_space_delete": "Pode eliminar o seu espaço incluindo todas as receitas, listas de compras, planos de refeição e tudo o que tenha criado. Isto não pode ser desfeito! Tem a certeza que quer fazer isto?",
|
||||
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca.",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
@ -389,5 +389,28 @@
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
"plural_usage_info": "",
|
||||
"Protected": "Protegido",
|
||||
"Copy Token": "Copiar Chave",
|
||||
"Ingredient Editor": "Editor de Ingredientes",
|
||||
"Amount": "Quantidade",
|
||||
"plan_share_desc": "Novas entradas do plano de refeições serão automaticamente partilhadas com os utilizadores selecionados.",
|
||||
"New_Entry": "Nova entrada",
|
||||
"Decimals": "Casas decimais",
|
||||
"Default_Unit": "Unidade padrão",
|
||||
"Use_Fractions": "Usar frações",
|
||||
"Use_Fractions_Help": "Converter automaticamente casas decimais para frações enquanto se visualiza uma receita.",
|
||||
"Language": "Linguagem",
|
||||
"Private_Recipe": "Receita Privada",
|
||||
"Auto_Sort": "Classificação automática",
|
||||
"Create_New_Shopping_Category": "Adicionar nova categoria de compras",
|
||||
"Description_Replace": "Substituir descrição",
|
||||
"Instruction_Replace": "Substituir Instrução",
|
||||
"Auto_Sort_Help": "Mover todos os ingredientes para o passo mais indicado.",
|
||||
"Private_Recipe_Help": "A receita só é mostrada ás pessoas com que foi partilhada.",
|
||||
"reusable_help_text": "O link de convite poderá ser usado por mais do que um utilizador.",
|
||||
"Copy Link": "Copiar Ligação",
|
||||
"Theme": "Tema",
|
||||
"one_url_per_line": "Um URL por linha",
|
||||
"Original_Text": "Texto original"
|
||||
}
|
||||
|
@ -150,15 +150,15 @@
|
||||
"delete_title": "Deletar {type}",
|
||||
"create_title": "Novo {type}",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"Name": "Nome",
|
||||
"Type": "Tipo",
|
||||
"Description": "Descrição",
|
||||
"Recipe": "Receita",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Icon": "Ícone",
|
||||
"Unit": "Unidade",
|
||||
"No_Results": "Sem Resultados",
|
||||
"New_Unit": "Nova Unidade",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
@ -394,5 +394,9 @@
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
"plural_usage_info": "",
|
||||
"Amount": "Quantidade",
|
||||
"Description_Replace": "Substituir Descrição",
|
||||
"Decimals": "Decimais",
|
||||
"Instruction_Replace": "Substituir Instrução"
|
||||
}
|
||||
|
@ -16,202 +16,468 @@
|
||||
"convert_internal": "Transformați în rețetă internă",
|
||||
"show_only_internal": "Arătați doar rețetele interne",
|
||||
"show_split_screen": "Vedere divizată",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"Save_and_View": "",
|
||||
"Manage_Books": "",
|
||||
"Meal_Plan": "",
|
||||
"Select_Book": "",
|
||||
"Select_File": "",
|
||||
"Recipe_Image": "",
|
||||
"Import_finished": "",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"New_Keyword": "",
|
||||
"Delete_Keyword": "",
|
||||
"Edit_Keyword": "",
|
||||
"Edit_Recipe": "",
|
||||
"Move_Keyword": "",
|
||||
"Merge_Keyword": "",
|
||||
"Hide_Keywords": "",
|
||||
"Hide_Recipes": "",
|
||||
"Move_Up": "",
|
||||
"Move_Down": "",
|
||||
"Step_Name": "",
|
||||
"Step_Type": "",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Enable_Amount": "",
|
||||
"Disable_Amount": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Cancel": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Log_Recipe_Cooking": "Jurnalul rețetelor de pregătire",
|
||||
"External_Recipe_Image": "Imagine rețetă externă",
|
||||
"Add_to_Shopping": "Adaugare la cumpărături",
|
||||
"Add_to_Plan": "Adăugare la plan",
|
||||
"Step_start_time": "Pasule de începere a orei",
|
||||
"Sort_by_new": "Sortare după nou",
|
||||
"Table_of_Contents": "Cuprins",
|
||||
"Recipes_per_page": "Rețete pe pagină",
|
||||
"Show_as_header": "Afișare ca antet",
|
||||
"Hide_as_header": "Ascunderea ca antet",
|
||||
"Add_nutrition_recipe": "Adăugare a nutriției la rețetă",
|
||||
"Remove_nutrition_recipe": "Ștergere a nutriției din rețetă",
|
||||
"Copy_template_reference": "Copie referința șablonului",
|
||||
"Save_and_View": "Salvare și vizionare",
|
||||
"Manage_Books": "Gestionarea cărților",
|
||||
"Meal_Plan": "Plan de alimentare",
|
||||
"Select_Book": "Selectare carte",
|
||||
"Select_File": "Selectare fișier",
|
||||
"Recipe_Image": "Imagine a rețetei",
|
||||
"Import_finished": "Importare finalizată",
|
||||
"View_Recipes": "Vizionare rețete",
|
||||
"Log_Cooking": "Jurnal de pregătire",
|
||||
"New_Recipe": "Rețetă nouă",
|
||||
"Url_Import": "Importă URL",
|
||||
"Reset_Search": "Resetarea căutării",
|
||||
"Recently_Viewed": "Vizualizate recent",
|
||||
"Load_More": "Încărcați mai mult",
|
||||
"New_Keyword": "Cuvânt cheie nou",
|
||||
"Delete_Keyword": "Ștergere cuvânt cheie",
|
||||
"Edit_Keyword": "Editează cuvânt cheie",
|
||||
"Edit_Recipe": "Editează rețeta",
|
||||
"Move_Keyword": "Mută cuvânt cheie",
|
||||
"Merge_Keyword": "Unește cuvânt cheie",
|
||||
"Hide_Keywords": "Ascunde cuvânt cheie",
|
||||
"Hide_Recipes": "Ascunde rețetele",
|
||||
"Move_Up": "Deplasați-vă în sus",
|
||||
"Move_Down": "Deplasați-vă în jos",
|
||||
"Step_Name": "Nume pas",
|
||||
"Step_Type": "Tip pas",
|
||||
"Make_Header": "Creare antet",
|
||||
"Make_Ingredient": "Create ingredient",
|
||||
"Enable_Amount": "Activare cantitate",
|
||||
"Disable_Amount": "Dezactivare cantitate",
|
||||
"Add_Step": "Adaugă pas",
|
||||
"Keywords": "Cuvinte cheie",
|
||||
"Books": "Cărți",
|
||||
"Proteins": "Proteine",
|
||||
"Fats": "Grăsimi",
|
||||
"Carbohydrates": "Carbohidrați",
|
||||
"Calories": "Calorii",
|
||||
"Energy": "Energie",
|
||||
"Nutrition": "Nutriție",
|
||||
"Date": "Dată",
|
||||
"Share": "Împărtășire",
|
||||
"Automation": "Automatizare",
|
||||
"Parameter": "Parametru",
|
||||
"Export": "Exportă",
|
||||
"Copy": "Copie",
|
||||
"Rating": "Evaluare",
|
||||
"Close": "Închide",
|
||||
"Cancel": "Anulează",
|
||||
"Link": "Link",
|
||||
"Add": "Adaugă",
|
||||
"New": "Nou",
|
||||
"Note": "Notă",
|
||||
"Success": "Succes",
|
||||
"Failure": "Eșec",
|
||||
"Ingredients": "Ingrediente",
|
||||
"Supermarket": "Supermarket",
|
||||
"Categories": "Categorii",
|
||||
"Category": "Categorie",
|
||||
"Selected": "Selectat",
|
||||
"min": "min",
|
||||
"Servings": "Porții",
|
||||
"Waiting": "Așteptare",
|
||||
"Preparation": "Pregătire",
|
||||
"External": "Extern",
|
||||
"Size": "Marime",
|
||||
"Files": "Fișiere",
|
||||
"File": "Fișier",
|
||||
"Edit": "Editează",
|
||||
"Image": "Imagine",
|
||||
"Delete": "Șterge",
|
||||
"Open": "Deschide",
|
||||
"Ok": "Ok",
|
||||
"Save": "Salvare",
|
||||
"Step": "Pas",
|
||||
"Search": "Căutare",
|
||||
"Import": "Importă",
|
||||
"Print": "Tipărește",
|
||||
"Settings": "Setări",
|
||||
"or": "sau",
|
||||
"and": "și",
|
||||
"Information": "Informație",
|
||||
"Download": "Descarcă",
|
||||
"Create": "Creează",
|
||||
"Advanced Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"and_up": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Clear": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
"View": "Vizualizare",
|
||||
"Recipes": "Rețete",
|
||||
"Move": "Mută",
|
||||
"Merge": "Unire",
|
||||
"Parent": "Părinte",
|
||||
"delete_confirmation": "Sunteți sigur că doriți să ștergeți {source}?",
|
||||
"move_confirmation": "Mutare <i>{copil}</i> la părinte <i>{părinte}</i>",
|
||||
"merge_confirmation": "Înlocuiți <i>{source}</i> cu <i>{target}</i>",
|
||||
"create_rule": "și crearea automatizării",
|
||||
"move_selection": "Selectați un părinte {type} pentru a muta {source} în.",
|
||||
"merge_selection": "Înlocuiți toate aparițiile {source} cu {type} selectat.",
|
||||
"Root": "Rădăcină",
|
||||
"Ignore_Shopping": "Ignoră cumpărăturile",
|
||||
"Shopping_Category": "Categorie de cumpărături",
|
||||
"Edit_Food": "Editare mâncare",
|
||||
"Move_Food": "Mutare mâncare",
|
||||
"New_Food": "Mâncare nouă",
|
||||
"Hide_Food": "Ascunde mâncare",
|
||||
"Food_Alias": "Pseudonim mâncare",
|
||||
"Unit_Alias": "Pseudonim unitate",
|
||||
"Keyword_Alias": "Pseudonim cuvânt cheie",
|
||||
"Delete_Food": "Ștergere mâncare",
|
||||
"No_ID": "ID-ul nu a fost găsit, nu se poate șterge.",
|
||||
"Meal_Plan_Days": "Planuri de alimentație pe viitor",
|
||||
"merge_title": "Unire {type}",
|
||||
"move_title": "Mutare {type}",
|
||||
"Food": "Mâncare",
|
||||
"Recipe_Book": "Carte de rețete",
|
||||
"del_confirmation_tree": "Sunteți sigur că doriți să ștergeți {sursa} și toți copiii săi?",
|
||||
"delete_title": "Ștergere {type}",
|
||||
"create_title": "{type} nou",
|
||||
"edit_title": "Editare {type}",
|
||||
"Name": "Nume",
|
||||
"Type": "Tip",
|
||||
"Description": "Descriere",
|
||||
"Recipe": "Rețetă",
|
||||
"tree_root": "Rădăcina copacului",
|
||||
"Icon": "Iconiță",
|
||||
"Unit": "Unitate",
|
||||
"No_Results": "Fără rezultate",
|
||||
"New_Unit": "Unitate nouă",
|
||||
"Create_New_Shopping Category": "Creați o nouă categorie de cumpărături",
|
||||
"Create_New_Food": "Adaugă mâncare nouă",
|
||||
"Create_New_Keyword": "Adaugă cuvânt cheie nou",
|
||||
"Create_New_Unit": "Adaugă unitate nouă",
|
||||
"Create_New_Meal_Type": "Adaugă tip mâncare nou",
|
||||
"and_up": "& Sus",
|
||||
"Instructions": "Instrucțiuni",
|
||||
"Unrated": "Neevaluat",
|
||||
"Automate": "Automatizat",
|
||||
"Empty": "Gol",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"Key_Shift": "Shift",
|
||||
"Time": "Timp",
|
||||
"Text": "Text",
|
||||
"Shopping_list": "Lisă de cumpărături",
|
||||
"Create_Meal_Plan_Entry": "Crearea înregistrării în planul de alimentare",
|
||||
"Edit_Meal_Plan_Entry": "Editarea înregistrării în planul de alimentare",
|
||||
"Title": "Titlu",
|
||||
"Week": "Săptămână",
|
||||
"Month": "Lună",
|
||||
"Year": "An",
|
||||
"Planner": "Planificator",
|
||||
"Planner_Settings": "Setări planificator",
|
||||
"Period": "Perioadă",
|
||||
"Plan_Period_To_Show": "Afișați săptămâni, luni sau ani",
|
||||
"Periods": "Perioade",
|
||||
"Plan_Show_How_Many_Periods": "Câte perioade să afișezi",
|
||||
"Starting_Day": "Ziua de început a săptămânii",
|
||||
"Meal_Types": "Tipuri de mese",
|
||||
"Meal_Type": "Tipul mesei",
|
||||
"Clone": "Clonă",
|
||||
"Drag_Here_To_Delete": "Mută aici pentru a șterge",
|
||||
"Meal_Type_Required": "Tipul mesei este necesar",
|
||||
"Title_or_Recipe_Required": "Titlul sau selecția rețetei necesare",
|
||||
"Color": "Culoare",
|
||||
"New_Meal_Type": "Tip de masă nou",
|
||||
"Week_Numbers": "Numerele săptămânii",
|
||||
"Show_Week_Numbers": "Afișați numerele săptămânii?",
|
||||
"Export_As_ICal": "Exportul perioadei curente în format iCal",
|
||||
"Export_To_ICal": "Exportă .ics",
|
||||
"Cannot_Add_Notes_To_Shopping": "Notele nu pot fi adăugate la lista de cumpărături",
|
||||
"Added_To_Shopping_List": "Adăugat la lista de cumpărături",
|
||||
"Shopping_List_Empty": "Lista de cumpărături este în prezent goală, puteți adăuga articole prin meniul contextual al unei intrări în planul de alimentație (faceți click dreapta pe card sau faceți click stânga pe iconița meniului)",
|
||||
"Next_Period": "Perioada următoare",
|
||||
"Previous_Period": "Perioada precedentă",
|
||||
"Current_Period": "Perioada curentă",
|
||||
"Next_Day": "Ziua următoare",
|
||||
"Previous_Day": "Ziua precedentă",
|
||||
"Coming_Soon": "În curând",
|
||||
"Auto_Planner": "Planificator automat",
|
||||
"New_Cookbook": "Nouă carte de bucate",
|
||||
"Hide_Keyword": "Ascunde cuvintele cheie",
|
||||
"Clear": "Curățare",
|
||||
"Plural": "Plural",
|
||||
"plural_short": "plural",
|
||||
"Use_Plural_Unit_Always": "Utilizarea formei plurale pentru unitate întotdeauna",
|
||||
"Use_Plural_Unit_Simple": "Utilizarea dinamică a formei plurale pentru unitate",
|
||||
"Use_Plural_Food_Always": "Utilizarea formei plurale pentru alimente întotdeauna",
|
||||
"Use_Plural_Food_Simple": "Utilizarea dinamica a formei plurale pentru alimente",
|
||||
"plural_usage_info": "Utilizarea formei plurale pentru unități și alimente în interiorul acestui spațiu.",
|
||||
"last_viewed": "Ultima vizualizare",
|
||||
"created_on": "Creat la data de",
|
||||
"updatedon": "Actualizat la data de",
|
||||
"Imported_From": "Importat din",
|
||||
"and_down": "& Jos",
|
||||
"Warning": "Atenționare",
|
||||
"ShowDelayed": "Afișarea elementelor întârziate",
|
||||
"shopping_share_desc": "Utilizatorii vor vedea toate articolele pe care le adăugați în lista de cumpărături. Ei trebuie să vă adauge pentru a vedea elementele din lista lor.",
|
||||
"mealplan_autoinclude_related_desc": "Atunci când adăugați un plan de alimentare în lista de cumpărături (manual sau automat), includeți toate rețetele asociate.",
|
||||
"SuccessClipboard": "Lista de cumpărături copiată în clipboard",
|
||||
"in_shopping": "În lista de cumpărături",
|
||||
"not": "nu",
|
||||
"Pin": "Fixează",
|
||||
"Create Recipe": "Crearea rețetei",
|
||||
"Import Recipe": "Importă rețeta",
|
||||
"csv_prefix_label": "Prefix a listei",
|
||||
"Click_To_Edit": "Faceți click pentru a edita",
|
||||
"Ingredient Editor": "Editor de ingrediente",
|
||||
"FoodOnHand": "Aveți {food} la îndemână.",
|
||||
"AddFoodToShopping": "Adăugă {food} în lista de cumpărături",
|
||||
"New_Entry": "Înregistrare nouă",
|
||||
"GroupBy": "Grupat de",
|
||||
"CountMore": "...+{count} mai mult",
|
||||
"IgnoreThis": "Nu adăugați niciodată automat {food} la cumpărături",
|
||||
"InheritWarning": "{food} este setat să moștenească, este posibil ca modificările să nu persiste.",
|
||||
"err_move_self": "Nu se poate muta elementul în sine",
|
||||
"CategoryName": "Nume categorie",
|
||||
"Foods": "Alimente",
|
||||
"copy_to_new": "Copiere in rețetă nouă",
|
||||
"reset_children": "Resetarea moștenirii copilului",
|
||||
"err_moving_resource": "A existat o eroare în mutarea unei resurse!",
|
||||
"err_merging_resource": "A existat o eroare la fuzionarea unei resurse!",
|
||||
"success_moving_resource": "Resursă mutată cu succes!",
|
||||
"success_merging_resource": "A fuzionat cu succes o resursă!",
|
||||
"Decimals": "Zecimale",
|
||||
"Default_Unit": "Unitate standard",
|
||||
"Use_Fractions": "Folosire fracțiuni",
|
||||
"Use_Fractions_Help": "Convertiți automat zecimalele în fracții atunci când vizualizați o rețetă.",
|
||||
"RemoveFoodFromShopping": "Șterge {food} din lista de cumpărături",
|
||||
"IgnoredFood": "{food} este setat să ignore cumpărăturile.",
|
||||
"Add_Servings_to_Shopping": "Adăugă {servings} porții la cumpărături",
|
||||
"InheritFields": "Moștenirea valorilor câmpurilor",
|
||||
"Language": "Limba",
|
||||
"Theme": "Tema",
|
||||
"NoCategory": "Nicio categorie selectată.",
|
||||
"OfflineAlert": "Sunteți offline, este posibil ca lista de cumpărături să nu se sincronizeze.",
|
||||
"mealplan_autoinclude_related": "Adăugați rețete asociate",
|
||||
"shopping_auto_sync": "Sincronizare automată",
|
||||
"mealplan_autoadd_shopping": "Adăugare automată a planului de alimentare",
|
||||
"default_delay": "Ore de întârziere implicite",
|
||||
"plan_share_desc": "Noile intrări din Planul de alimentare vor fi partajate automat cu utilizatorii selectați.",
|
||||
"shopping_auto_sync_desc": "Setarea la 0 va dezactiva sincronizarea automată. Atunci când vizualizați o listă de cumpărături, lista este actualizată la fiecare câteva secunde setate pentru a sincroniza modificările pe care altcineva le-ar fi putut face. Util atunci când faceți cumpărături cu mai multe persoane, dar va folosi mai multe date mobile.",
|
||||
"mealplan_autoexclude_onhand_desc": "Atunci când adăugați un plan de alimentare în lista de cumpărături (manual sau automat), excludeți ingredientele care sunt în prezent la îndemână.",
|
||||
"default_delay_desc": "Numărul implicit de ore pentru a întârzia o intrare în lista de cumpărături.",
|
||||
"Hour": "Oră",
|
||||
"Hours": "Ore",
|
||||
"Day": "Zi",
|
||||
"Days": "Zile",
|
||||
"Second": "Secundă",
|
||||
"Seconds": "Secunde",
|
||||
"Users": "Utilizatori",
|
||||
"Invites": "Invită",
|
||||
"nothing": "Nimic de făcut",
|
||||
"err_merge_self": "Nu se poate uni elementul cu el însuși",
|
||||
"download_csv": "Descarcă CSV",
|
||||
"Account": "Cont",
|
||||
"Cosmetic": "Cosmetice",
|
||||
"API": "API",
|
||||
"left_handed_help": "Va optimiza interfața de utilizare pentru utilizare cu mâna stângă.",
|
||||
"Custom Filter": "Filtru personalizat",
|
||||
"recipe_name": "Nume rețetă",
|
||||
"paste_ingredients": "Inserați ingredientele",
|
||||
"Website": "Site web",
|
||||
"Nav_Color_Help": "Modificare culoare navigare.",
|
||||
"Use_Kj": "Utilizare kJ în loc de kcal",
|
||||
"Username": "Nume utilizator",
|
||||
"First_name": "Prenume",
|
||||
"Last_name": "Nume de familie",
|
||||
"Keyword": "Cuvânt cheie",
|
||||
"Advanced": "Avansat",
|
||||
"Page": "Pagină",
|
||||
"User": "Utilizator",
|
||||
"Shopping_Categories": "Categorii de cumpărături",
|
||||
"Single": "Singur",
|
||||
"Multiple": "Multiplu",
|
||||
"Reset": "Resetare",
|
||||
"Disabled": "Dezactivat",
|
||||
"Disable": "Dezactivare",
|
||||
"Importer_Help": "Mai multe informații și ajutor cu privire la acest importator:",
|
||||
"Documentation": "Documentație",
|
||||
"Import_Error": "A apărut o eroare în timpul importului. Vă rugăm să extindeți detaliile din partea de jos a paginii pentru a le vizualiza.",
|
||||
"Warning_Delete_Supermarket_Category": "Ștergerea unei categorii de supermarketuri va șterge, de asemenea, toate relațiile cu alimentele. Sunteți sigur?",
|
||||
"one_url_per_line": "O adresă URL pe linie",
|
||||
"mealplan_autoexclude_onhand": "Excludeți alimentele la îndemână",
|
||||
"shopping_recent_days": "Zilele recente",
|
||||
"download_pdf": "Descarcă PDF",
|
||||
"filter": "Filtru",
|
||||
"Search Settings": "Setări de căutare",
|
||||
"err_deleting_protected_resource": "Obiectul pe care încercați să îl ștergeți este încă utilizat și nu poate fi șters.",
|
||||
"csv_delim_help": "Delimitatorul utilizat pentru exporturile CSV.",
|
||||
"csv_delim_label": "Delimitatorul CSV",
|
||||
"SupermarketCategoriesOnly": "Numai categorii de supermarket-uri",
|
||||
"shopping_category_help": "Supermarket-urile pot fi ordonate și filtrate în funcție de categoria de cumpărături în conformitate cu aspectul culoarului.",
|
||||
"food_recipe_help": "Legarea unei rețete aici va include rețeta legată în orice altă rețetă care utilizează acest aliment",
|
||||
"Private_Recipe": "Rețetă privată",
|
||||
"DelayUntil": "Amână până la",
|
||||
"shared_with": "Împărtășit cu",
|
||||
"asc": "Crescător",
|
||||
"desc": "Descrescător",
|
||||
"date_viewed": "Ultimul vizionat",
|
||||
"show_sortby": "Afișează sortat de",
|
||||
"Quick actions": "Acțiuni rapide",
|
||||
"Internal": "Intern",
|
||||
"parameter_count": "Parametru {count}",
|
||||
"Ratings": "Evaluări",
|
||||
"warning_space_delete": "Puteți șterge spațiul, inclusiv toate rețetele, listele de cumpărături, planurile de alimentare și orice altceva ați creat. Acest lucru nu poate fi anulat! Sunteți sigur că doriți să faceți acest lucru?",
|
||||
"remember_hours": "Ore de reținut",
|
||||
"tree_select": "Utilizarea selecției arborilor",
|
||||
"last_cooked": "Ultimul pregătit",
|
||||
"Auto_Sort": "Sortare automatizată",
|
||||
"Private_Recipe_Help": "Rețeta este arătată doar ție și oamenilor cu care este împărtășită.",
|
||||
"save_filter": "Salvare filtru",
|
||||
"Nav_Color": "Culoare navigare",
|
||||
"Comments_setting": "Afișează comentarii",
|
||||
"search_no_recipes": "Nu a putut găsi nici o rețetă!",
|
||||
"Supermarkets": "Supermarket-uri",
|
||||
"Undefined": "Nedefinit",
|
||||
"Select": "Selectare",
|
||||
"food_inherit_info": "Câmpuri pe alimente care ar trebui să fie moștenite în mod implicit.",
|
||||
"facet_count_info": "Afișarea numărului de rețete pe filtrele de căutare.",
|
||||
"Amount": "Cantitate",
|
||||
"Auto_Sort_Help": "Mutați toate ingredientele la cel mai potrivit pas.",
|
||||
"search_create_help_text": "Creați o rețetă nouă direct în Tandoor.",
|
||||
"reusable_help_text": "Ar trebui link-ul de invitație să poată fi utilizat de mai mulți utilizatori.",
|
||||
"Copy Link": "Copiere link",
|
||||
"AddToShopping": "Adaugă la lista de cumpărături",
|
||||
"FoodNotOnHand": "Nu aveți {food} la îndemână.",
|
||||
"DeleteShoppingConfirm": "Sunteți sigur că doriți să eliminați toate {food} din lista de cumpărături?",
|
||||
"mealplan_autoadd_shopping_desc": "Adăugați automat ingredientele planului de alimentare în lista de cumpărături.",
|
||||
"filter_to_supermarket_desc": "În mod implicit, filtrați lista de cumpărături pentru a include numai categoriile pentru supermarketul selectat.",
|
||||
"CategoryInstruction": "Trageți categoriile pentru a schimba categoriile de comenzi care apar în lista de cumpărături.",
|
||||
"copy_markdown_table": "Copiere ca tabel Markdown",
|
||||
"sql_debug": "Depanare SQL",
|
||||
"remember_search": "Rețineți căutarea",
|
||||
"OnHand_help": "Alimentele sunt în inventar și nu vor fi adăugate automat la o listă de cumpărături. Starea la îndemână este partajată cu utilizatorii de cumpărături.",
|
||||
"show_rating": "Afișează evaluarea",
|
||||
"search_rank": "Rang de căutare",
|
||||
"book_filter_help": "Includeți rețete din filtrul de rețete în plus față de cele atribuite manual.",
|
||||
"Sticky_Nav_Help": "Afișați întotdeauna meniul de navigare din partea de sus a ecranului.",
|
||||
"import_duplicates": "Pentru a preveni duplicatele, rețetele cu același nume ca și cele existente sunt ignorate. Bifați această casetă pentru a importa totul.",
|
||||
"warning_duplicate_filter": "Atenționare: Din cauza limitărilor tehnice care au mai multe filtre de aceeași combinație (și/sau/nu) ar putea da rezultate neașteptate.",
|
||||
"substitute_help": "Înlocuitorii sunt luați în considerare atunci când căutați rețete care pot fi făcute cu ingrediente la îndemână.",
|
||||
"substitute_children": "Înlocuire copii",
|
||||
"SubstituteOnHand": "Ai un înlocuitor la îndemână.",
|
||||
"InheritFields_help": "Valorile acestor câmpuri vor fi moștenite de la părinte (Excepție: categoriile de cumpărături necompletate nu sunt moștenite)",
|
||||
"Social_Authentication": "Autentificare socială",
|
||||
"empty_list": "Lista este goală.",
|
||||
"Select_App_To_Import": "Selectați o aplicație din care să importați",
|
||||
"Recipes_In_Import": "Rețete în fișierul de import",
|
||||
"Split_All_Steps": "Împărțiți toate rândurile în pași separați.",
|
||||
"Description_Replace": "Înlocuire descripție",
|
||||
"Instruction_Replace": "Înlocuire instrucții",
|
||||
"Copy Token": "Copiere token",
|
||||
"ShowUncategorizedFood": "Afișează nedefinit",
|
||||
"MoveCategory": "Mută la: ",
|
||||
"DelayFor": "Întârziere pentru {hours} ore",
|
||||
"Completed": "Completat",
|
||||
"shopping_share": "Partajați lista de cumpărături",
|
||||
"filter_to_supermarket": "Filtrați la supermarket",
|
||||
"show_sql": "Afișează SQL",
|
||||
"SupermarketName": "Numele supermarketului",
|
||||
"FoodInherit": "Câmpuri moștenite de alimente",
|
||||
"mark_complete": "Marcare completată",
|
||||
"shopping_add_onhand_desc": "Marcați mâncarea 'La îndemână' atunci când este bifată de pe lista de cumpărături.",
|
||||
"shopping_add_onhand": "La îndemână automat",
|
||||
"related_recipes": "Rețete înrudite",
|
||||
"ignore_shopping_help": "Nu adăugați niciodată alimente pe lista de cumpărături (ex. apă)",
|
||||
"today_recipes": "Rețete de astăzi",
|
||||
"enable_expert": "Activarea modului Expert",
|
||||
"expert_mode": "Modul Expert",
|
||||
"simple_mode": "Modul Simplu",
|
||||
"advanced": "Avansat",
|
||||
"Unpin": "Anularea fixării",
|
||||
"Protected": "Protejat",
|
||||
"Original_Text": "Text original",
|
||||
"Create_New_Shopping_Category": "Adaugă categorie de cumpărături nouă",
|
||||
"Added_by": "Adăugat de",
|
||||
"Added_on": "Adăugat la",
|
||||
"IngredientInShopping": "Acest ingredient se află în lista de cumpărături.",
|
||||
"NotInShopping": "{food} nu se află în lista de cumpărături.",
|
||||
"OnHand": "În prezent, la îndemână",
|
||||
"Inherit": "Moștenire",
|
||||
"shopping_recent_days_desc": "Zile de intrări recente lista de cumpărături pentru a afișa.",
|
||||
"copy_to_clipboard": "Copierea în Clipboard",
|
||||
"csv_prefix_help": "Prefix de adăugat la copierea listei în clipboard.",
|
||||
"PinnedConfirmation": "{recipe} a fost fixată.",
|
||||
"UnpinnedConfirmation": "Fixarea {recipe} a fost anulată.",
|
||||
"QuickEntry": "Înscriere rapidă",
|
||||
"fields": "Câmpuri",
|
||||
"show_keywords": "Afișează cuvinte cheie",
|
||||
"show_foods": "Afișează mâncări",
|
||||
"show_books": "Afișează cărți",
|
||||
"show_units": "Afișează unitățile",
|
||||
"show_filters": "Afișează filtrele",
|
||||
"filter_name": "Nume filtru",
|
||||
"left_handed": "Modul stângaci",
|
||||
"sort_by": "Sortat de",
|
||||
"times_cooked": "Ori pregătite",
|
||||
"date_created": "Data creării",
|
||||
"make_now": "Creează acum",
|
||||
"recipe_filter": "Filtru rețete",
|
||||
"review_shopping": "Examinați intrările de cumpărături înainte de a salva",
|
||||
"view_recipe": "Vizionează rețeta",
|
||||
"paste_ingredients_placeholder": "Inserați lista de ingrediente aici...",
|
||||
"ingredient_list": "Lista de ingrediente",
|
||||
"explain": "Explicație",
|
||||
"App": "Aplicație",
|
||||
"Message": "Mesaj",
|
||||
"Sticky_Nav": "Navigare lipicioasă",
|
||||
"click_image_import": "Faceți click pe imaginea pe care doriți să o importați pentru această rețetă",
|
||||
"no_more_images_found": "Nu există imagini suplimentare găsite pe site-ul web.",
|
||||
"paste_json": "Inserați sursă JSON sau HTML aici pentru a încărca rețetă.",
|
||||
"search_import_help_text": "Importați o rețetă de pe un site web sau o aplicație externă.",
|
||||
"reset_children_help": "Suprascrieți toți copiii cu valori din câmpurile moștenite. Câmpurile moștenite ale copiilor vor fi setate la câmpuri standard, cu excepția cazului în care sunt setate câmpurile moștenite de copii.",
|
||||
"reset_food_inheritance": "Resetați moștenirea",
|
||||
"reset_food_inheritance_info": "Resetați toate alimentele la câmpurile moștenite implicit și la valorile părinte ale acestora.",
|
||||
"substitute_siblings_help": "Toate alimentele care împărtășesc un părinte al acestui aliment sunt considerate înlocuitori.",
|
||||
"substitute_children_help": "Toate alimentele care sunt copii ai acestui aliment sunt considerate înlocuitori.",
|
||||
"substitute_siblings": "Înlocuire frați",
|
||||
"Bookmarklet": "Marcaj",
|
||||
"ChildInheritFields": "Copiii moștenesc câmpurile",
|
||||
"ChildInheritFields_help": "Copiii vor moșteni aceste câmpuri în mod implicit.",
|
||||
"show_ingredient_overview": "Afișați o listă cu toate ingredientele la începutul rețetei.",
|
||||
"Ingredient Overview": "Prezentare generală a ingredientelor",
|
||||
"advanced_search_settings": "Setări avansate de căutare",
|
||||
"nothing_planned_today": "Nu ai nimic planificat pentru ziua de azi!",
|
||||
"no_pinned_recipes": "Nu ai rețete fixate!",
|
||||
"Planned": "Planificate",
|
||||
"Pinned": "Fixate",
|
||||
"Imported": "Importate",
|
||||
"Units": "Unități",
|
||||
"Manage_Emails": "Gestionarea e-mailurilor",
|
||||
"Change_Password": "Schimbați parola",
|
||||
"Random Recipes": "Rețete aleatoare",
|
||||
"select_keyword": "Selectați cuvânt cheie",
|
||||
"add_keyword": "Adăugare cuvânt cheie",
|
||||
"select_file": "Selectare fișier",
|
||||
"select_recipe": "Selectare rețetă",
|
||||
"select_unit": "Selectare unitate",
|
||||
"select_food": "Selectare mâncare",
|
||||
"remove_selection": "Deselectare",
|
||||
"Options": "Opțiuni",
|
||||
"Create Food": "Creare mâncare",
|
||||
"create_food_desc": "Creați un aliment și conectați-l la această rețetă.",
|
||||
"additional_options": "Opțiuni suplimentare",
|
||||
"Import_Supported": "Import compatibil",
|
||||
"Export_Supported": "Export compatibil",
|
||||
"Import_Not_Yet_Supported": "Importul încă nu este compatibil",
|
||||
"Export_Not_Yet_Supported": "Exportul încă nu este compatibil",
|
||||
"Import_Result_Info": "{imported} din {total} rețete au fost importate",
|
||||
"Toggle": "Comutare",
|
||||
"New_Supermarket": "Creați un supermarket nou",
|
||||
"New_Supermarket_Category": "Creați o nouă categorie de supermarket-uri",
|
||||
"Are_You_Sure": "Sunteți sigur?",
|
||||
"Valid Until": "Valabil până la",
|
||||
"Combine_All_Steps": "Combinați toți pașii într-un singur câmp."
|
||||
}
|
||||
|
@ -286,7 +286,7 @@
|
||||
"expert_mode": "Экспертный режим",
|
||||
"enable_expert": "Включить экспертный режим",
|
||||
"review_shopping": "Просмотрите записи о покупках перед сохранением",
|
||||
"empty_list": "Список пуст",
|
||||
"empty_list": "Список пуст.",
|
||||
"default_delay_desc": "Число часов по умолчанию для отсрочки записи в списке покупок.",
|
||||
"one_url_per_line": "Один URL в строке",
|
||||
"mealplan_autoinclude_related": "Добавить сопутствующие рецепты",
|
||||
@ -343,5 +343,8 @@
|
||||
"DelayFor": "Отложить на {hours} часов",
|
||||
"New_Entry": "Новая запись",
|
||||
"GroupBy": "Сгруппировать по",
|
||||
"facet_count_info": "Показывать количество рецептов в фильтрах поиска."
|
||||
"facet_count_info": "Показывать количество рецептов в фильтрах поиска.",
|
||||
"food_inherit_info": "Поля для продуктов питания, которые должны наследоваться по умолчанию.",
|
||||
"warning_space_delete": "Вы можете удалить свое пространство, включая все рецепты, списки покупок, планы питания и все остальное, что вы создали. Этого нельзя отменить! Ты уверен, что хочешь это сделать?",
|
||||
"Description_Replace": "Изменить описание"
|
||||
}
|
||||
|
@ -328,7 +328,7 @@
|
||||
"remember_search": "Kom ihåg sökning",
|
||||
"sql_debug": "SQL felsökning",
|
||||
"Create_New_Food": "Lägg till nytt livsmedel",
|
||||
"Pin": "Pin",
|
||||
"Pin": "Fäst",
|
||||
"Edit_Food": "Redigera livsmedel",
|
||||
"Move_Food": "Flytta livsmedel",
|
||||
"Create_Meal_Plan_Entry": "Skapa en måltidsplan",
|
||||
@ -363,7 +363,7 @@
|
||||
"ChildInheritFields_help": "Underordnade kommer att ärva dessa fält som standard.",
|
||||
"InheritFields_help": "Värdena i dessa fält kommer att ärvas från förälder (Undantag: tomma shoppingkategorier ärvs inte)",
|
||||
"no_pinned_recipes": "Du har inga nålade recept!",
|
||||
"Pinned": "Nålad",
|
||||
"Pinned": "Fäst",
|
||||
"OnHand_help": "Livsmedel som finns i lager kommer inte automatiskt att läggas till på en inköpslista. Onhand-status delas med shoppinganvändare.",
|
||||
"shopping_category_help": "Mataffärer kan sorteras och filtreras efter Shopping-kategori enligt gångarnas layout.",
|
||||
"food_recipe_help": "Om du länkar ett recept här kommer det länkade receptet att inkluderas i alla andra recept som använder detta livsmedel",
|
||||
@ -381,11 +381,102 @@
|
||||
"additional_options": "Ytterligare alternativ",
|
||||
"remember_hours": "Timmar att komma ihåg",
|
||||
"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": ""
|
||||
"Plural": "Plural",
|
||||
"plural_short": "plural",
|
||||
"Use_Plural_Unit_Always": "Använd alltid pluralform för enhet",
|
||||
"Use_Plural_Unit_Simple": "Använd pluralform för enhet dynamiskt",
|
||||
"Use_Plural_Food_Always": "Använd alltid pluralform för mat",
|
||||
"Use_Plural_Food_Simple": "Använd pluralform för mat dynamiskt",
|
||||
"plural_usage_info": "Använd pluralformen för enheter och mat i detta utrymme.",
|
||||
"Are_You_Sure": "Är du säker?",
|
||||
"API": "API",
|
||||
"Website": "Hemsida",
|
||||
"Message": "Meddelande",
|
||||
"Use_Kj": "Använd kJ istället för kcal",
|
||||
"Auto_Sort_Help": "Flytta alla ingredienser till det bästa passande steget.",
|
||||
"Protected": "Skyddad",
|
||||
"Copy Link": "Kopiera Länk",
|
||||
"Original_Text": "Original Text",
|
||||
"Cosmetic": "Kosmetisk",
|
||||
"import_duplicates": "För att förhindra duplicerade recept ignoreras recept med samma namn. Markera den här rutan för att importera allt.",
|
||||
"Imported": "Importerad",
|
||||
"Create_New_Shopping_Category": "Lägg till ny shoppingkategori",
|
||||
"plan_share_desc": "Nya måltidsplaner kommer automatiskt att delas med utvalda användare.",
|
||||
"Last_name": "Efternamn",
|
||||
"Select_App_To_Import": "Vänligen välj en App att importera från",
|
||||
"Import_Error": "Ett fel uppstod under din import. Expandera informationen längst ner på sidan för att se den.",
|
||||
"Combine_All_Steps": "Kombinera alla steg i ett enda fält.",
|
||||
"Ingredient Overview": "Ingrediensöversikt",
|
||||
"New_Entry": "Ny post",
|
||||
"one_url_per_line": "Endast en URL per rad",
|
||||
"Decimals": "Decimaler",
|
||||
"Default_Unit": "Standardenhet",
|
||||
"Use_Fractions": "Använd bråk",
|
||||
"Use_Fractions_Help": "Konvertera automatiskt decimaler till bråktal när du visar ett recept.",
|
||||
"Imported_From": "Importerad från",
|
||||
"Disable": "Inaktivera",
|
||||
"Documentation": "Dokumentation",
|
||||
"Options": "Val",
|
||||
"Click_To_Edit": "Klicka för att redigera",
|
||||
"paste_json": "Klistra in JSON eller HTML källkoden här för att ladda recept.",
|
||||
"err_deleting_protected_resource": "Objektet du försöker radera används fortfarande och kan inte raderas.",
|
||||
"Private_Recipe": "Privat Recept",
|
||||
"Private_Recipe_Help": "Receptet visas bara för dig och personer som det delas med.",
|
||||
"reusable_help_text": "Bör inbjudningslänken vara användbar för mer än en användare.",
|
||||
"Ingredient Editor": "Ingrediensredigerare",
|
||||
"warning_space_delete": "Du kan ta bort ditt utrymme inklusive alla recept, inköpslistor, måltidsplaner och allt annat du har skapat. Detta kan inte ångras! Är du säker på att du vill göra detta?",
|
||||
"facet_count_info": "Visa recept antal på sökfilter.",
|
||||
"food_inherit_info": "Fält på mat som ska ärvas som standard.",
|
||||
"Auto_Sort": "Automatisk Sortering",
|
||||
"Day": "Dag",
|
||||
"Days": "Dagar",
|
||||
"Hours": "Timmar",
|
||||
"Instruction_Replace": "Ersätt instruktion",
|
||||
"Description_Replace": "Ersätt beskrivning",
|
||||
"Seconds": "Sekunder",
|
||||
"Users": "Användare",
|
||||
"Invites": "Inbjudningar",
|
||||
"Hour": "Timme",
|
||||
"Second": "Sekund",
|
||||
"Manage_Emails": "Hantera mejladresser",
|
||||
"Account": "Konto",
|
||||
"Unpin": "Lossa",
|
||||
"PinnedConfirmation": "{recipe} har fästs.",
|
||||
"UnpinnedConfirmation": "{recipe} har lossats.",
|
||||
"Amount": "Mängd",
|
||||
"Copy Token": "Kopiera token",
|
||||
"Language": "Språk",
|
||||
"Theme": "Tema",
|
||||
"Bookmarklet": "Bokmärke",
|
||||
"Comments_setting": "Visa Kommentarer",
|
||||
"no_more_images_found": "Inga ytterligare bilder hittades på webbplatsen.",
|
||||
"Sticky_Nav": "Fastlåst navigering",
|
||||
"Sticky_Nav_Help": "Visa alltid navigeringsmenyn högst upp på skärmen.",
|
||||
"Nav_Color": "Navigeringsfärg",
|
||||
"Nav_Color_Help": "Ändra navigeringsfärg.",
|
||||
"click_image_import": "Klicka på bilden du vill importera till detta recept",
|
||||
"reset_food_inheritance": "Återställ arv",
|
||||
"reset_food_inheritance_info": "Återställ alla livsmedel till ärvda standardfält och deras överordnade värden.",
|
||||
"show_ingredient_overview": "Visa en lista över alla ingredienser i början av receptet.",
|
||||
"App": "App",
|
||||
"Change_Password": "Ändra lösenord",
|
||||
"Username": "Användarnamn",
|
||||
"First_name": "Förnamn",
|
||||
"Multiple": "Flera",
|
||||
"Importer_Help": "Mer information och hjälp om denna import:",
|
||||
"Import_Supported": "Import stöds",
|
||||
"Export_Supported": "Export stöds",
|
||||
"Import_Not_Yet_Supported": "Import stöds inte ännu",
|
||||
"Export_Not_Yet_Supported": "Export stöds inte ännu",
|
||||
"Import_Result_Info": "{imported} av totalt {total} recept blev importerat",
|
||||
"Recipes_In_Import": "Recept i din importfil",
|
||||
"Toggle": "Växla",
|
||||
"Valid Until": "Giltig till",
|
||||
"Split_All_Steps": "Dela upp alla rader i separata steg.",
|
||||
"New_Supermarket": "Skapa ny mataffärs",
|
||||
"New_Supermarket_Category": "Skapa ny mataffärskategori",
|
||||
"Warning_Delete_Supermarket_Category": "Om du tar bort en mataffärskategori raderas också alla relationer till livsmedel. Är du säker?",
|
||||
"Disabled": "Inaktiverad",
|
||||
"Social_Authentication": "Social autentisering",
|
||||
"Single": "Enstaka"
|
||||
}
|
||||
|
@ -1,256 +1,256 @@
|
||||
{
|
||||
"warning_feature_beta": "",
|
||||
"err_fetching_resource": "",
|
||||
"err_creating_resource": "",
|
||||
"err_updating_resource": "",
|
||||
"err_deleting_resource": "",
|
||||
"err_deleting_protected_resource": "",
|
||||
"err_moving_resource": "",
|
||||
"err_merging_resource": "",
|
||||
"success_fetching_resource": "",
|
||||
"success_creating_resource": "",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "",
|
||||
"success_moving_resource": "",
|
||||
"success_merging_resource": "",
|
||||
"file_upload_disabled": "",
|
||||
"step_time_minutes": "",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "",
|
||||
"show_only_internal": "",
|
||||
"warning_feature_beta": "Ця функція зараз в БЕТІ (тестується). Будь ласка, очікуйте помилок і можливих порушень і майбутньому (можлива втрата даних), коли користуєтесь цією функцією.",
|
||||
"err_fetching_resource": "Виникла помилка при отриманні ресурсу!",
|
||||
"err_creating_resource": "Виникла помилка при створенні ресурсу!",
|
||||
"err_updating_resource": "Виникла помилка при оновленні ресурсу!",
|
||||
"err_deleting_resource": "Виникла помилка при видаленні ресурсу!",
|
||||
"err_deleting_protected_resource": "Об'єкт який ви намагаєтесь видалити зараз використовується і не може бути видаленим.",
|
||||
"err_moving_resource": "Виникла помилка при переміщені ресурсу!",
|
||||
"err_merging_resource": "Виникла помилка при злитті ресурсу!",
|
||||
"success_fetching_resource": "Успішно отримано ресурс!",
|
||||
"success_creating_resource": "Успішно створено ресурс!",
|
||||
"success_updating_resource": "Успішно оновлено ресурс!",
|
||||
"success_deleting_resource": "Успішно видалено ресурс!",
|
||||
"success_moving_resource": "Успішно переміщено ресурс!",
|
||||
"success_merging_resource": "Успішно злито ресурс!",
|
||||
"file_upload_disabled": "Завантаження файлів не включено на вашому просторі.",
|
||||
"step_time_minutes": "Час кроку в хвилинах",
|
||||
"confirm_delete": "Ви впевнені, що хочете видалити {object}?",
|
||||
"import_running": "Імпортується, будь ласка зачекайте!",
|
||||
"all_fields_optional": "Всі поля опціональні і можна залишити їх пустими.",
|
||||
"convert_internal": "Конвертувати у внутрішній рецепт",
|
||||
"show_only_internal": "Показати тільки внутрішні рецепти",
|
||||
"show_split_screen": "",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"External_Recipe_Image": "Зображення Зовнішнього Рецепту",
|
||||
"Add_to_Shopping": "Додати до Покупок",
|
||||
"Add_to_Plan": "Додати до Плану",
|
||||
"Step_start_time": "Час початку кроку",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Table_of_Contents": "Зміст",
|
||||
"Recipes_per_page": "Кількість Рецептів на Сторінку",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"Ingredient Editor": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Cancel": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Protected": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Search Settings": "",
|
||||
"Enable_Amount": "Включити Кількість",
|
||||
"Disable_Amount": "Виключити Кількість",
|
||||
"Ingredient Editor": "Редактор Інгредієнтів",
|
||||
"Add_Step": "Додати Крок",
|
||||
"Keywords": "Ключові слова",
|
||||
"Books": "Книжки",
|
||||
"Proteins": "Білки",
|
||||
"Fats": "Жири",
|
||||
"Carbohydrates": "Вуглеводи",
|
||||
"Calories": "Калорії",
|
||||
"Energy": "Енергія",
|
||||
"Nutrition": "Харчова цінність",
|
||||
"Date": "Дата",
|
||||
"Share": "Поділитися",
|
||||
"Automation": "Автоматизація",
|
||||
"Parameter": "Параметр",
|
||||
"Export": "Експорт",
|
||||
"Copy": "Копіювати",
|
||||
"Rating": "Рейтинг",
|
||||
"Close": "Закрити",
|
||||
"Cancel": "Відмінити",
|
||||
"Link": "Посилання",
|
||||
"Add": "Додати",
|
||||
"New": "Новий",
|
||||
"Note": "Нотатка",
|
||||
"Success": "Успішно",
|
||||
"Failure": "Невдало",
|
||||
"Protected": "Захищено",
|
||||
"Ingredients": "Інгредієнти",
|
||||
"Supermarket": "Супермаркет",
|
||||
"Categories": "Категорії",
|
||||
"Category": "Категорія",
|
||||
"Selected": "Вибрано",
|
||||
"min": "хв",
|
||||
"Servings": "Порції",
|
||||
"Waiting": "Очікування",
|
||||
"Preparation": "Підготовка",
|
||||
"External": "Зовнішній",
|
||||
"Size": "Розмір",
|
||||
"Files": "Файли",
|
||||
"File": "Файл",
|
||||
"Edit": "Редагувати",
|
||||
"Image": "Зображення",
|
||||
"Delete": "Видалити",
|
||||
"Open": "Відкрити",
|
||||
"Ok": "Відкрити",
|
||||
"Save": "Зберегти",
|
||||
"Step": "Крок",
|
||||
"Search": "Пошук",
|
||||
"Import": "Імпорт",
|
||||
"Print": "Друкувати",
|
||||
"Settings": "Налаштування",
|
||||
"or": "або",
|
||||
"and": "і",
|
||||
"Information": "Інформація",
|
||||
"Download": "Скачати",
|
||||
"Create": "Створити",
|
||||
"Search Settings": "Налаштування Пошуку",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"Recipes": "Рецепти",
|
||||
"Move": "Перемістити",
|
||||
"Merge": "Об'єднати",
|
||||
"Parent": "Батько",
|
||||
"delete_confirmation": "Ви впевнені, що хочете видалити {source}?",
|
||||
"move_confirmation": "Перемістити <i>{child}</i> до батька <i>{parent}</i>",
|
||||
"merge_confirmation": "Замінити <i>{source}</i> на <i>{target}</i>",
|
||||
"create_rule": "і створити автоматизацію",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"Delete_Food": "Видалити Їжу",
|
||||
"No_ID": "ID не знайдено, неможливо видалити.",
|
||||
"Meal_Plan_Days": "Майбутній план харчування",
|
||||
"merge_title": "Об'єднати {type}",
|
||||
"move_title": "Перемістити {type}",
|
||||
"Food": "Їжа",
|
||||
"Recipe_Book": "Книга Рецептів",
|
||||
"del_confirmation_tree": "Ви впевненні, що хочете видалити {source} і всіх його дітей?",
|
||||
"delete_title": "Видалити {type}",
|
||||
"create_title": "Новий {type}",
|
||||
"edit_title": "Редагувати {type}",
|
||||
"Name": "Ім'я",
|
||||
"Type": "Тип",
|
||||
"Description": "Опис",
|
||||
"Recipe": "Рецепт",
|
||||
"tree_root": "Корінь Дерева",
|
||||
"Icon": "Іконка",
|
||||
"Unit": "Одиниця",
|
||||
"No_Results": "Немає Результату",
|
||||
"New_Unit": "Нова Одиниця",
|
||||
"Create_New_Shopping Category": "Створити Нову Категорію Покупок",
|
||||
"Create_New_Food": "Додати Нову Їжу",
|
||||
"Create_New_Keyword": "Додати Нове Ключове слово",
|
||||
"Create_New_Unit": "Додати Нову Одиницю",
|
||||
"Create_New_Meal_Type": "Додати Новий Тип Страви",
|
||||
"Create_New_Shopping_Category": "Додати Нову Категорію Покупок",
|
||||
"and_up": "І Уверх",
|
||||
"and_down": "І Вниз",
|
||||
"Instructions": "Інструкції",
|
||||
"Unrated": "Без рейтингу",
|
||||
"Automate": "Автоматично",
|
||||
"Empty": "Пусто",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"Key_Shift": "Shift",
|
||||
"Time": "Час",
|
||||
"Text": "Текст",
|
||||
"Shopping_list": "Список Покупок",
|
||||
"Added_by": "Додано",
|
||||
"Added_on": "Додано На",
|
||||
"AddToShopping": "Додати до списку покупок",
|
||||
"IngredientInShopping": "Цей інгредієнт є в вашому списку покупок.",
|
||||
"NotInShopping": "{food} немає в вашому списку покупок.",
|
||||
"OnHand": "Зараз На Руках",
|
||||
"FoodOnHand": "Ви маєте {food} на руках.",
|
||||
"FoodNotOnHand": "У вас немає {food} на руках.",
|
||||
"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": "Новий Тип страви",
|
||||
"AddFoodToShopping": "Додати {food} до вашого списку покупок",
|
||||
"RemoveFoodFromShopping": "Видалити {food} з вашого списку покупок",
|
||||
"DeleteShoppingConfirm": "Ви впевнені, що хочете видалити {food} з вашого списку покупок?",
|
||||
"IgnoredFood": "{food} ігнорується в покупках.",
|
||||
"Add_Servings_to_Shopping": "Додати {servings} Порції до Покупок",
|
||||
"Week_Numbers": "Номер тижня",
|
||||
"Show_Week_Numbers": "Показати номер тижня?",
|
||||
"Export_As_ICal": "Експортувати теперішній період до формату iCal",
|
||||
"Export_To_ICal": "Експортувати .ics",
|
||||
"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": "По Групі",
|
||||
"SupermarketCategoriesOnly": "Тільки Категорії Супермаркету",
|
||||
"MoveCategory": "Перемістити До: ",
|
||||
"CountMore": "...+{count} більше",
|
||||
"IgnoreThis": "Ніколи {food} автоматично не додавати до покупок",
|
||||
"DelayFor": "Затримка на {hours} годин",
|
||||
"Warning": "Увага",
|
||||
"NoCategory": "Жодна категорія не вибрана.",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"ShowDelayed": "Показати Відкладені Предмети",
|
||||
"Completed": "Виконано",
|
||||
"OfflineAlert": "Ви офлайн, список покупок може не синхронізуватися.",
|
||||
"shopping_share": "Поділитися Списком Покупок",
|
||||
"shopping_auto_sync": "Автосинхронізація",
|
||||
"one_url_per_line": "Одна URL на лінію",
|
||||
"mealplan_autoadd_shopping": "Автоматично Додати План Харчування",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"mealplan_autoinclude_related": "Додати Пов'язані Рецепти",
|
||||
"default_delay": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_share_desc": "Користувачі будуть бачати всі елементи, які ви додаєте до списку покупок. Вони мають додати вас, щоб бачати елементи в їх списках.",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
@ -419,5 +419,24 @@
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": ""
|
||||
"plural_usage_info": "",
|
||||
"warning_space_delete": "Ви можете видалити ваш простір разом зі всіма рецептами, списками покупок, планами харчування і всім іншим, що ви створили. Ця дія незворотня! Ви впевнені, що бажаєте це зробити?",
|
||||
"facet_count_info": "Показати кількість рецептів на полі пошуку.",
|
||||
"Amount": "Кількість",
|
||||
"Auto_Sort": "Автоматичне сортування",
|
||||
"Auto_Sort_Help": "Перемістити всі інгредієнти до більш підходящого кроку.",
|
||||
"reusable_help_text": "Запрошувальне посилання має бути тільки для одного користувача.",
|
||||
"Copy Token": "Скопіювати Токен",
|
||||
"Decimals": "Десятки",
|
||||
"Language": "Мова",
|
||||
"Theme": "Тема",
|
||||
"Private_Recipe": "Приватний Рецепт",
|
||||
"Private_Recipe_Help": "Рецепт показаний тільки Вам і тими з ким ви поділилися їм.",
|
||||
"Description_Replace": "Замінити Опис",
|
||||
"Instruction_Replace": "Замінити Інструкцію",
|
||||
"Use_Fractions": "Використовувати дроби",
|
||||
"Use_Fractions_Help": "Автоматично конвертувати десятки в дроби, коли дивитесь рецепт.",
|
||||
"Copy Link": "Скопіювати Посилання",
|
||||
"Original_Text": "Оригінальний текст",
|
||||
"Default_Unit": "Одиниця замовчуванням"
|
||||
}
|
||||
|
@ -66,7 +66,7 @@
|
||||
"Cancel": "取消",
|
||||
"Delete": "删除",
|
||||
"Open": "打开",
|
||||
"Ok": "打开",
|
||||
"Ok": "确认",
|
||||
"Save": "保存",
|
||||
"Step": "步骤",
|
||||
"Search": "搜索",
|
||||
@ -460,11 +460,24 @@
|
||||
"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": ""
|
||||
"Plural": "复数",
|
||||
"plural_short": "复数",
|
||||
"Use_Plural_Unit_Always": "单位总是使用复数形式",
|
||||
"Use_Plural_Unit_Simple": "动态使用单位的复数形式",
|
||||
"Use_Plural_Food_Always": "始终对食物使用复数形式",
|
||||
"Use_Plural_Food_Simple": "食物动态使用复数形式",
|
||||
"plural_usage_info": "在此空间内使用复数形式表示单位和食物。",
|
||||
"Amount": "数量",
|
||||
"Original_Text": "原文",
|
||||
"Description_Replace": "替换描述",
|
||||
"Instruction_Replace": "替换指令",
|
||||
"Split_All_Steps": "将所有行拆分为单独的步骤。",
|
||||
"Combine_All_Steps": "将所有步骤合并到一个字段中。",
|
||||
"PinnedConfirmation": "{recipe} 已固定。",
|
||||
"UnpinnedConfirmation": "{recipe} 已取消固定。",
|
||||
"Unpin": "取消固定",
|
||||
"Auto_Sort": "自动分类",
|
||||
"Auto_Sort_Help": "将所有食材移动到最恰当的步骤。",
|
||||
"Create Recipe": "创建食谱",
|
||||
"Import Recipe": "导入食谱"
|
||||
}
|
||||
|
33
vue/src/stores/BaseStorePlugin.js
Normal file
33
vue/src/stores/BaseStorePlugin.js
Normal file
@ -0,0 +1,33 @@
|
||||
|
||||
|
||||
|
||||
https://pinia.vuejs.org/core-concepts/plugins.html#adding-new-state
|
||||
|
||||
|
||||
export function BaseStorePlugin () {
|
||||
return {
|
||||
collection: [],
|
||||
item: {},
|
||||
getCollection: function (url) {
|
||||
api.get(url)
|
||||
.then((response) => {
|
||||
this.collection = response.data;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.handleError(error);
|
||||
});
|
||||
},
|
||||
getItem: function (url) {
|
||||
api.get(url)
|
||||
.then((response) => {
|
||||
this.item = response.data;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.handleError(error);
|
||||
});
|
||||
},
|
||||
handleError: function (error) {
|
||||
window.alert(error);
|
||||
},
|
||||
};
|
||||
}
|
89
vue/src/stores/MealPlanStore.js
Normal file
89
vue/src/stores/MealPlanStore.js
Normal file
@ -0,0 +1,89 @@
|
||||
import {defineStore} from 'pinia'
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
|
||||
const _STORE_ID = 'meal_plan_store'
|
||||
import Vue from "vue"
|
||||
import {StandardToasts} from "@/utils/utils";
|
||||
/*
|
||||
* test store to play around with pinia and see if it can work for my usecases
|
||||
* dont trust that all mealplans are in store as there is no cache validation logic, its just a shared data holder
|
||||
* */
|
||||
export const useMealPlanStore = defineStore(_STORE_ID, {
|
||||
state: () => ({
|
||||
plans: {},
|
||||
currently_updating: null,
|
||||
}),
|
||||
getters: {
|
||||
plan_list: function () {
|
||||
let plan_list = []
|
||||
for (let key in this.plans) {
|
||||
plan_list.push(this.plans[key]);
|
||||
}
|
||||
return plan_list
|
||||
},
|
||||
empty_meal_plan: function () {
|
||||
return {
|
||||
date: null,
|
||||
id: -1,
|
||||
meal_type: null,
|
||||
note: "",
|
||||
note_markdown: "",
|
||||
recipe: null,
|
||||
servings: 1,
|
||||
shared: [],
|
||||
title: "",
|
||||
title_placeholder: 'Title', // meal plan edit modal should be improved to not need this
|
||||
}
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
refreshFromAPI(from_date, to_date) {
|
||||
if (this.currently_updating !== [from_date, to_date]) {
|
||||
this.currently_updating = [from_date, to_date] // certainly no perfect check but better than nothing
|
||||
|
||||
let options = {
|
||||
query: {
|
||||
from_date: from_date,
|
||||
to_date: to_date,
|
||||
},
|
||||
}
|
||||
|
||||
let apiClient = new ApiApiFactory()
|
||||
apiClient.listMealPlans(options).then(r => {
|
||||
r.data.forEach((p) => {
|
||||
Vue.set(this.plans, p.id, p)
|
||||
})
|
||||
this.currently_updating = null
|
||||
})
|
||||
}
|
||||
},
|
||||
createObject(object) {
|
||||
let apiClient = new ApiApiFactory()
|
||||
return apiClient.createMealPlan(object).then(r => {
|
||||
//StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE)
|
||||
Vue.set(this.plans, r.data.id, r.data)
|
||||
return r
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err)
|
||||
})
|
||||
},
|
||||
updateObject(object) {
|
||||
let apiClient = new ApiApiFactory()
|
||||
return apiClient.updateMealPlan(object.id, object).then(r => {
|
||||
//StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
Vue.set(this.plans, object.id, object)
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
},
|
||||
deleteObject(object) {
|
||||
let apiClient = new ApiApiFactory()
|
||||
return apiClient.destroyMealPlan(object.id).then(r => {
|
||||
//StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_DELETE)
|
||||
Vue.delete(this.plans, object.id)
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_DELETE, err)
|
||||
})
|
||||
}
|
||||
},
|
||||
})
|
85
vue/src/stores/UserPreferenceStore.js
Normal file
85
vue/src/stores/UserPreferenceStore.js
Normal file
@ -0,0 +1,85 @@
|
||||
import {defineStore} from 'pinia'
|
||||
|
||||
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
|
||||
const _STALE_TIME_IN_MS = 1000 * 30
|
||||
const _STORE_ID = 'user_preference_store'
|
||||
export const useUserPreferenceStore = defineStore(_STORE_ID, {
|
||||
state: () => ({
|
||||
data: null,
|
||||
updated_at: null,
|
||||
currently_updating: false,
|
||||
}),
|
||||
getters: {
|
||||
|
||||
},
|
||||
actions: {
|
||||
/**
|
||||
* gets data from the store either directly or refreshes from API if data is considered stale
|
||||
* @returns {UserPreference|*|Promise<axios.AxiosResponse<UserPreference>>}
|
||||
*/
|
||||
getData: function () {
|
||||
if (this.isStaleOrEmpty) {
|
||||
return this.refreshFromAPI()
|
||||
} else {
|
||||
return this.data
|
||||
}
|
||||
},
|
||||
/**
|
||||
* get data from store. Does not use API, if store is not initialized returns null.
|
||||
* @returns {null|UserPreference|*}
|
||||
*/
|
||||
getStaleData: function () {
|
||||
return this.data
|
||||
},
|
||||
/**
|
||||
* checks if update timestamp is older than configured stale time interval
|
||||
* @returns {boolean} true if data is considered stale and should be updated
|
||||
*/
|
||||
isStale() {
|
||||
return this.updated_at === null || ((new Date()) - this.updated_at) > _STALE_TIME_IN_MS;
|
||||
},
|
||||
/**
|
||||
* checks if data of store is empty/not initialized
|
||||
* @returns {boolean} true if store is empty
|
||||
*/
|
||||
isEmpty() {
|
||||
return this.data === null
|
||||
},
|
||||
/**
|
||||
* checks if store is empty or data is considered stale, see isStale() and isEmpty()
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isStaleOrEmpty() {
|
||||
return this.isStale() || this.isEmpty()
|
||||
},
|
||||
/**
|
||||
* refreshes store data if isStaleOrEmpty() is true
|
||||
* @returns {Promise<axios.AxiosResponse<UserPreference>>} returns promise with data
|
||||
*/
|
||||
updateIfStaleOrEmpty() {
|
||||
if (this.isStaleOrEmpty) {
|
||||
return this.refreshFromAPI()
|
||||
}
|
||||
},
|
||||
/**
|
||||
* refreshes store data from API
|
||||
* @returns {Promise<axios.AxiosResponse<UserPreference>>} returns promise with data
|
||||
*/
|
||||
refreshFromAPI() {
|
||||
let apiClient = new ApiApiFactory()
|
||||
if(!this.currently_updating){
|
||||
this.currently_updating = true
|
||||
return apiClient.retrieveUserPreference(localStorage.getItem('USER_ID')).then(r => {
|
||||
this.data = r.data
|
||||
this.updated_at = new Date()
|
||||
this.currently_updating = false
|
||||
return this.data
|
||||
}).catch(err => {
|
||||
this.currently_updating = false
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
})
|
0
vue/src/stores/root.js
Normal file
0
vue/src/stores/root.js
Normal file
@ -1,8 +1,9 @@
|
||||
// These JavaScript module imports need to be bundled:
|
||||
import {precacheAndRoute} from 'workbox-precaching';
|
||||
import {registerRoute, setCatchHandler} from 'workbox-routing';
|
||||
import {CacheFirst, NetworkFirst, StaleWhileRevalidate} from 'workbox-strategies';
|
||||
import {CacheFirst, NetworkFirst, NetworkOnly, StaleWhileRevalidate} from 'workbox-strategies';
|
||||
import {ExpirationPlugin} from 'workbox-expiration';
|
||||
import {BackgroundSyncPlugin, Queue} from "workbox-background-sync";
|
||||
|
||||
|
||||
const OFFLINE_CACHE_NAME = 'offline-html';
|
||||
@ -77,6 +78,39 @@ registerRoute(
|
||||
})
|
||||
)
|
||||
|
||||
const queue = new Queue('shopping-sync-queue', {
|
||||
maxRetentionTime: 7 * 24 * 60,
|
||||
});
|
||||
|
||||
registerRoute(
|
||||
new RegExp('api/shopping-list-entry/([0-9]+)'),
|
||||
new NetworkOnly({
|
||||
plugins: [
|
||||
{
|
||||
fetchDidFail: async ({request}) => {
|
||||
await queue.pushRequest({request});
|
||||
},
|
||||
}
|
||||
],
|
||||
}),
|
||||
'PATCH'
|
||||
)
|
||||
|
||||
addEventListener('message', (event) => {
|
||||
if (event.data.type === 'BGSYNC_REPLAY_REQUESTS') {
|
||||
queue.replayRequests().then((r) => {
|
||||
event.ports[0].postMessage('REPLAY_SUCCESS SW');
|
||||
}).catch((err) => {
|
||||
event.ports[0].postMessage('REPLAY_FAILURE');
|
||||
});
|
||||
}
|
||||
if (event.data.type === 'BGSYNC_COUNT_QUEUE') {
|
||||
queue.getAll().then((r) => {
|
||||
event.ports[0].postMessage(r.length);
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
registerRoute(
|
||||
new RegExp('api/*'),
|
||||
new NetworkFirst({
|
||||
|
@ -21,4 +21,5 @@ export const INTEGRATIONS = [
|
||||
{id: 'RECIPESAGE', name: "Recipesage", import: true, export: true, help_url: 'https://docs.tandoor.dev/features/import_export/#recipesage'},
|
||||
{id: 'REZKONV', name: "Rezkonv", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezkonv'},
|
||||
{id: 'SAFRON', name: "Safron", import: true, export: true, help_url: 'https://docs.tandoor.dev/features/import_export/#safron'},
|
||||
{id: 'REZEPTSUITEDE', name: "Rezeptsuite.de", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezeptsuitede'},
|
||||
]
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -137,6 +137,12 @@ export interface Automation {
|
||||
* @memberof Automation
|
||||
*/
|
||||
param_3?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
* @memberof Automation
|
||||
*/
|
||||
order?: number;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
@ -158,7 +164,9 @@ export interface Automation {
|
||||
export enum AutomationTypeEnum {
|
||||
FoodAlias = 'FOOD_ALIAS',
|
||||
UnitAlias = 'UNIT_ALIAS',
|
||||
KeywordAlias = 'KEYWORD_ALIAS'
|
||||
KeywordAlias = 'KEYWORD_ALIAS',
|
||||
DescriptionReplace = 'DESCRIPTION_REPLACE',
|
||||
InstructionReplace = 'INSTRUCTION_REPLACE'
|
||||
}
|
||||
|
||||
/**
|
||||
@ -431,6 +439,12 @@ export interface Food {
|
||||
* @memberof Food
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof Food
|
||||
*/
|
||||
plural_name?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -655,6 +669,12 @@ export interface FoodSubstitute {
|
||||
* @memberof FoodSubstitute
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof FoodSubstitute
|
||||
*/
|
||||
plural_name?: string | null;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@ -848,10 +868,10 @@ export interface Ingredient {
|
||||
food: IngredientFood | null;
|
||||
/**
|
||||
*
|
||||
* @type {FoodSupermarketCategory}
|
||||
* @type {IngredientUnit}
|
||||
* @memberof Ingredient
|
||||
*/
|
||||
unit: FoodSupermarketCategory | null;
|
||||
unit: IngredientUnit | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -894,6 +914,18 @@ export interface Ingredient {
|
||||
* @memberof Ingredient
|
||||
*/
|
||||
used_in_recipes?: string;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
* @memberof Ingredient
|
||||
*/
|
||||
always_use_plural_unit?: boolean;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
* @memberof Ingredient
|
||||
*/
|
||||
always_use_plural_food?: boolean;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@ -913,6 +945,12 @@ export interface IngredientFood {
|
||||
* @memberof IngredientFood
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof IngredientFood
|
||||
*/
|
||||
plural_name?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -1004,6 +1042,37 @@ export interface IngredientFood {
|
||||
*/
|
||||
child_inherit_fields?: Array<FoodInheritFields> | null;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @export
|
||||
* @interface IngredientUnit
|
||||
*/
|
||||
export interface IngredientUnit {
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
* @memberof IngredientUnit
|
||||
*/
|
||||
id?: number;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof IngredientUnit
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof IngredientUnit
|
||||
*/
|
||||
plural_name?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof IngredientUnit
|
||||
*/
|
||||
description?: string | null;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @export
|
||||
@ -1746,13 +1815,13 @@ export interface MealPlanRecipe {
|
||||
* @type {string}
|
||||
* @memberof MealPlanRecipe
|
||||
*/
|
||||
rating?: string;
|
||||
rating?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof MealPlanRecipe
|
||||
*/
|
||||
last_cooked?: string;
|
||||
last_cooked?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -1953,13 +2022,13 @@ export interface Recipe {
|
||||
* @type {string}
|
||||
* @memberof Recipe
|
||||
*/
|
||||
rating?: string;
|
||||
rating?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof Recipe
|
||||
*/
|
||||
last_cooked?: string;
|
||||
last_cooked?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
@ -2166,10 +2235,10 @@ export interface RecipeIngredients {
|
||||
food: IngredientFood | null;
|
||||
/**
|
||||
*
|
||||
* @type {FoodSupermarketCategory}
|
||||
* @type {IngredientUnit}
|
||||
* @memberof RecipeIngredients
|
||||
*/
|
||||
unit: FoodSupermarketCategory | null;
|
||||
unit: IngredientUnit | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -2212,6 +2281,18 @@ export interface RecipeIngredients {
|
||||
* @memberof RecipeIngredients
|
||||
*/
|
||||
used_in_recipes?: string;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
* @memberof RecipeIngredients
|
||||
*/
|
||||
always_use_plural_unit?: boolean;
|
||||
/**
|
||||
*
|
||||
* @type {boolean}
|
||||
* @memberof RecipeIngredients
|
||||
*/
|
||||
always_use_plural_food?: boolean;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@ -2412,13 +2493,13 @@ export interface RecipeOverview {
|
||||
* @type {string}
|
||||
* @memberof RecipeOverview
|
||||
*/
|
||||
rating?: string;
|
||||
rating?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof RecipeOverview
|
||||
*/
|
||||
last_cooked?: string;
|
||||
last_cooked?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@ -2703,10 +2784,10 @@ export interface ShoppingListEntries {
|
||||
food: IngredientFood | null;
|
||||
/**
|
||||
*
|
||||
* @type {FoodSupermarketCategory}
|
||||
* @type {IngredientUnit}
|
||||
* @memberof ShoppingListEntries
|
||||
*/
|
||||
unit?: FoodSupermarketCategory | null;
|
||||
unit?: IngredientUnit | null;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
@ -2794,10 +2875,10 @@ export interface ShoppingListEntry {
|
||||
food: IngredientFood | null;
|
||||
/**
|
||||
*
|
||||
* @type {FoodSupermarketCategory}
|
||||
* @type {IngredientUnit}
|
||||
* @memberof ShoppingListEntry
|
||||
*/
|
||||
unit?: FoodSupermarketCategory | null;
|
||||
unit?: IngredientUnit | null;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
@ -3191,41 +3272,16 @@ export interface Space {
|
||||
file_size_mb?: string;
|
||||
/**
|
||||
*
|
||||
* @type {SpaceImage}
|
||||
* @type {RecipeFile}
|
||||
* @memberof Space
|
||||
*/
|
||||
image?: SpaceImage;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @export
|
||||
* @interface SpaceImage
|
||||
*/
|
||||
export interface SpaceImage {
|
||||
image?: RecipeFile | null;
|
||||
/**
|
||||
*
|
||||
* @type {number}
|
||||
* @memberof SpaceImage
|
||||
* @type {boolean}
|
||||
* @memberof Space
|
||||
*/
|
||||
id?: number;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof SpaceImage
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof SpaceImage
|
||||
*/
|
||||
file_download?: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof SpaceImage
|
||||
*/
|
||||
preview?: string;
|
||||
use_plural?: boolean;
|
||||
}
|
||||
/**
|
||||
*
|
||||
@ -3563,6 +3619,12 @@ export interface Unit {
|
||||
* @memberof Unit
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
* @memberof Unit
|
||||
*/
|
||||
plural_name?: string | null;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
|
@ -359,6 +359,7 @@ export const ApiMixin = {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// if passing parameters that are not part of the offical schema of the endpoint use parameter: options: {query: {simple: 1}}
|
||||
genericAPI: function (model, action, options) {
|
||||
let setup = getConfig(model, action)
|
||||
if (setup?.config?.function) {
|
||||
@ -717,4 +718,10 @@ export const formFunctions = {
|
||||
form.fields.filter((x) => x.field === "inherit_fields")[0].value = getUserPreference("food_inherit_default")
|
||||
return form
|
||||
},
|
||||
AutomationOrderDefault: function (form) {
|
||||
if (form.fields.filter((x) => x.field === "order")[0].value === undefined) {
|
||||
form.fields.filter((x) => x.field === "order")[0].value = 1000
|
||||
}
|
||||
return form
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user