mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-07-09 03:04:54 -04:00
Merge branch 'mealie-next' into manage-data-improve-delete-prompt
This commit is contained in:
commit
49b4ee2b90
145
frontend/components/Domain/Group/GroupMealPlanDayContextMenu.vue
Normal file
145
frontend/components/Domain/Group/GroupMealPlanDayContextMenu.vue
Normal file
@ -0,0 +1,145 @@
|
||||
<template>
|
||||
<div class="text-center">
|
||||
<RecipeDialogAddToShoppingList
|
||||
v-if="shoppingLists"
|
||||
v-model="shoppingListDialog"
|
||||
:recipes="recipesWithScales"
|
||||
:shopping-lists="shoppingLists"
|
||||
/>
|
||||
<v-menu
|
||||
offset-y
|
||||
left
|
||||
:bottom="!menuTop"
|
||||
:nudge-bottom="!menuTop ? '5' : '0'"
|
||||
:top="menuTop"
|
||||
:nudge-top="menuTop ? '5' : '0'"
|
||||
allow-overflow
|
||||
close-delay="125"
|
||||
:open-on-hover="$vuetify.breakpoint.mdAndUp"
|
||||
content-class="d-print-none"
|
||||
>
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent>
|
||||
<v-icon>{{ icon }}</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list dense>
|
||||
<v-list-item v-for="(item, index) in menuItems" :key="index" @click="contextMenuEventHandler(item.event)">
|
||||
<v-list-item-icon>
|
||||
<v-icon :color="item.color"> {{ item.icon }} </v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.title }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, ref, toRefs, useContext } from "@nuxtjs/composition-api";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
import RecipeDialogAddToShoppingList from "~/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
|
||||
export interface ContextMenuItem {
|
||||
title: string;
|
||||
icon: string;
|
||||
color: string | undefined;
|
||||
event: string;
|
||||
isPublic: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeDialogAddToShoppingList,
|
||||
},
|
||||
props: {
|
||||
recipes: {
|
||||
type: Array as () => Recipe[],
|
||||
default: () => [],
|
||||
},
|
||||
menuTop: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
fab: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
default: "primary",
|
||||
},
|
||||
menuIcon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { $globals, i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
shoppingListDialog: false,
|
||||
menuItems: [
|
||||
{
|
||||
title: i18n.tc("recipe.add-to-list"),
|
||||
icon: $globals.icons.cartCheck,
|
||||
color: undefined,
|
||||
event: "shoppingList",
|
||||
isPublic: false,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const icon = props.menuIcon || $globals.icons.dotsVertical;
|
||||
|
||||
const shoppingLists = ref<ShoppingListSummary[]>();
|
||||
const recipesWithScales = computed(() => {
|
||||
return props.recipes.map((recipe) => {
|
||||
return {
|
||||
scale: 1,
|
||||
...recipe,
|
||||
};
|
||||
})
|
||||
})
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
if (data) {
|
||||
shoppingLists.value = data.items ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
const eventHandlers: { [key: string]: () => void | Promise<any> } = {
|
||||
shoppingList: () => {
|
||||
getShoppingLists();
|
||||
state.shoppingListDialog = true;
|
||||
},
|
||||
};
|
||||
|
||||
function contextMenuEventHandler(eventKey: string) {
|
||||
const handler = eventHandlers[eventKey];
|
||||
|
||||
if (handler && typeof handler === "function") {
|
||||
handler();
|
||||
state.loading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
context.emit(eventKey);
|
||||
state.loading = false;
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
contextMenuEventHandler,
|
||||
icon,
|
||||
recipesWithScales,
|
||||
shoppingLists,
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
@ -69,77 +69,12 @@
|
||||
></v-select>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog v-model="shoppingListDialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingLists"
|
||||
:key="list.id"
|
||||
hover
|
||||
class="my-2 left-border"
|
||||
@click="openShoppingListIngredientDialog(list)"
|
||||
>
|
||||
<v-card-title class="py-2">
|
||||
{{ list.name }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog
|
||||
v-model="shoppingListIngredientDialog"
|
||||
:title="selectedShoppingList ? selectedShoppingList.name : $t('recipe.add-to-list')"
|
||||
:icon="$globals.icons.cartCheck"
|
||||
width="70%"
|
||||
:submit-text="$tc('recipe.add-to-list')"
|
||||
@submit="addRecipeToList()"
|
||||
>
|
||||
<v-card
|
||||
elevation="0"
|
||||
height="fit-content"
|
||||
max-height="60vh"
|
||||
width="100%"
|
||||
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
||||
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(recipeIngredients.length / 2)}, min-content)` }"
|
||||
style="overflow-y: auto"
|
||||
>
|
||||
<v-list-item
|
||||
v-for="(ingredientData, i) in recipeIngredients"
|
||||
:key="'ingredient' + i"
|
||||
dense
|
||||
@click="recipeIngredients[i].checked = !recipeIngredients[i].checked"
|
||||
>
|
||||
<v-checkbox
|
||||
hide-details
|
||||
:input-value="ingredientData.checked"
|
||||
class="pt-0 my-auto py-auto"
|
||||
color="secondary"
|
||||
/>
|
||||
<v-list-item-content :key="ingredientData.ingredient.quantity">
|
||||
<RecipeIngredientListItem
|
||||
:ingredient="ingredientData.ingredient"
|
||||
:disable-amount="ingredientData.disableAmount"
|
||||
:scale="recipeScale" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
</v-card>
|
||||
<div class="d-flex justify-end mb-4 mt-2">
|
||||
<BaseButtonGroup
|
||||
:buttons="[
|
||||
{
|
||||
icon: $globals.icons.checkboxBlankOutline,
|
||||
text: $tc('shopping-list.uncheck-all-items'),
|
||||
event: 'uncheck',
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.checkboxOutline,
|
||||
text: $tc('shopping-list.check-all-items'),
|
||||
event: 'check',
|
||||
},
|
||||
]"
|
||||
@uncheck="bulkCheckIngredients(false)"
|
||||
@check="bulkCheckIngredients(true)"
|
||||
/>
|
||||
</div>
|
||||
</BaseDialog>
|
||||
<RecipeDialogAddToShoppingList
|
||||
v-if="shoppingLists && recipeRefWithScale"
|
||||
v-model="shoppingListDialog"
|
||||
:recipes="[recipeRefWithScale]"
|
||||
:shopping-lists="shoppingLists"
|
||||
/>
|
||||
<v-menu
|
||||
offset-y
|
||||
left
|
||||
@ -171,14 +106,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, toRefs, useContext, useRoute, useRouter, ref } from "@nuxtjs/composition-api";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import RecipeDialogAddToShoppingList from "./RecipeDialogAddToShoppingList.vue";
|
||||
import RecipeDialogPrintPreferences from "./RecipeDialogPrintPreferences.vue";
|
||||
import RecipeDialogShare from "./RecipeDialogShare.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { usePlanTypeOptions } from "~/composables/use-group-mealplan";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { PlanEntryType } from "~/lib/api/types/meal-plan";
|
||||
import { useAxiosDownloader } from "~/composables/api/use-axios-download";
|
||||
@ -204,9 +139,9 @@ export interface ContextMenuItem {
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeDialogAddToShoppingList,
|
||||
RecipeDialogPrintPreferences,
|
||||
RecipeDialogShare,
|
||||
RecipeIngredientListItem
|
||||
},
|
||||
props: {
|
||||
useItems: {
|
||||
@ -279,7 +214,6 @@ export default defineComponent({
|
||||
recipeDeleteDialog: false,
|
||||
mealplannerDialog: false,
|
||||
shoppingListDialog: false,
|
||||
shoppingListIngredientDialog: false,
|
||||
recipeDuplicateDialog: false,
|
||||
recipeName: props.name,
|
||||
loading: false,
|
||||
@ -374,7 +308,7 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
// Add leading and Apppending Items
|
||||
// Add leading and Appending Items
|
||||
state.menuItems = [...state.menuItems, ...props.leadingItems, ...props.appendItems];
|
||||
|
||||
const icon = props.menuIcon || $globals.icons.dotsVertical;
|
||||
@ -383,9 +317,8 @@ export default defineComponent({
|
||||
// Context Menu Event Handler
|
||||
|
||||
const shoppingLists = ref<ShoppingListSummary[]>();
|
||||
const selectedShoppingList = ref<ShoppingListSummary>();
|
||||
const recipeRef = ref<Recipe>(props.recipe);
|
||||
const recipeIngredients = ref<{ checked: boolean; ingredient: RecipeIngredient, disableAmount: boolean }[]>([]);
|
||||
const recipeRefWithScale = computed(() => recipeRef.value ? { scale: props.recipeScale, ...recipeRef.value } : undefined);
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
@ -401,61 +334,6 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
async function openShoppingListIngredientDialog(list: ShoppingListSummary) {
|
||||
selectedShoppingList.value = list;
|
||||
if (!recipeRef.value) {
|
||||
await refreshRecipe();
|
||||
}
|
||||
|
||||
if (recipeRef.value?.recipeIngredient) {
|
||||
recipeIngredients.value = recipeRef.value.recipeIngredient.map((ingredient) => {
|
||||
return {
|
||||
checked: true,
|
||||
ingredient,
|
||||
disableAmount: recipeRef.value.settings?.disableAmount || false
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = true;
|
||||
}
|
||||
|
||||
function bulkCheckIngredients(value = true) {
|
||||
recipeIngredients.value.forEach((data) => {
|
||||
data.checked = value;
|
||||
});
|
||||
}
|
||||
|
||||
async function addRecipeToList() {
|
||||
if (!selectedShoppingList.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const ingredients: RecipeIngredient[] = [];
|
||||
recipeIngredients.value.forEach((data) => {
|
||||
if (data.checked) {
|
||||
ingredients.push(data.ingredient);
|
||||
}
|
||||
});
|
||||
|
||||
if (!ingredients.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.shopping.lists.addRecipe(
|
||||
selectedShoppingList.value.id,
|
||||
props.recipeId,
|
||||
props.recipeScale,
|
||||
ingredients
|
||||
);
|
||||
if (data) {
|
||||
alert.success(i18n.t("recipe.recipe-added-to-list") as string);
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
}
|
||||
}
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
async function deleteRecipe() {
|
||||
@ -516,10 +394,12 @@ export default defineComponent({
|
||||
state.printPreferencesDialog = true;
|
||||
},
|
||||
shoppingList: () => {
|
||||
getShoppingLists();
|
||||
const promises: Promise<void>[] = [getShoppingLists()];
|
||||
if (!recipeRef.value) {
|
||||
promises.push(refreshRecipe());
|
||||
}
|
||||
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
Promise.allSettled(promises).then(() => { state.shoppingListDialog = true });
|
||||
},
|
||||
share: () => {
|
||||
state.shareDialog = true;
|
||||
@ -544,28 +424,15 @@ export default defineComponent({
|
||||
return {
|
||||
...toRefs(state),
|
||||
recipeRef,
|
||||
recipeRefWithScale,
|
||||
shoppingLists,
|
||||
selectedShoppingList,
|
||||
openShoppingListIngredientDialog,
|
||||
addRecipeToList,
|
||||
bulkCheckIngredients,
|
||||
duplicateRecipe,
|
||||
contextMenuEventHandler,
|
||||
deleteRecipe,
|
||||
addRecipeToPlan,
|
||||
icon,
|
||||
planTypeOptions,
|
||||
recipeIngredients,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="css">
|
||||
.ingredient-grid {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
|
@ -0,0 +1,303 @@
|
||||
<template>
|
||||
<div v-if="dialog">
|
||||
<BaseDialog v-if="shoppingListDialog" v-model="dialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingLists"
|
||||
:key="list.id"
|
||||
hover
|
||||
class="my-2 left-border"
|
||||
@click="openShoppingListIngredientDialog(list)"
|
||||
>
|
||||
<v-card-title class="py-2">
|
||||
{{ list.name }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog
|
||||
v-if="shoppingListIngredientDialog"
|
||||
v-model="dialog"
|
||||
:title="selectedShoppingList ? selectedShoppingList.name : $t('recipe.add-to-list')"
|
||||
:icon="$globals.icons.cartCheck"
|
||||
width="70%"
|
||||
:submit-text="$tc('recipe.add-to-list')"
|
||||
@submit="addRecipesToList()"
|
||||
>
|
||||
<div style="max-height: 70vh; overflow-y: auto">
|
||||
<v-card
|
||||
v-for="(section, sectionIndex) in recipeIngredientSections" :key="section.recipeId + sectionIndex"
|
||||
elevation="0"
|
||||
height="fit-content"
|
||||
width="100%"
|
||||
>
|
||||
<v-divider v-if="sectionIndex > 0" class="mt-3" />
|
||||
<v-card-title
|
||||
v-if="recipeIngredientSections.length > 1"
|
||||
class="justify-center"
|
||||
width="100%"
|
||||
>
|
||||
<v-container style="width: 100%;">
|
||||
<v-row no-gutters class="ma-0 pa-0">
|
||||
<v-col cols="12" align-self="center" class="text-center">
|
||||
{{ section.recipeName }}
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row v-if="section.recipeScale > 1" no-gutters class="ma-0 pa-0">
|
||||
<!-- TODO: make this editable in the dialog and visible on single-recipe lists -->
|
||||
<v-col cols="12" align-self="center" class="text-center">
|
||||
({{ $tc("recipe.quantity") }}: {{ section.recipeScale }})
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card-title>
|
||||
<div
|
||||
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
||||
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(section.ingredients.length / 2)}, min-content)` }"
|
||||
>
|
||||
<v-list-item
|
||||
v-for="(ingredientData, i) in section.ingredients"
|
||||
:key="'ingredient' + i"
|
||||
dense
|
||||
@click="recipeIngredientSections[sectionIndex].ingredients[i].checked = !recipeIngredientSections[sectionIndex].ingredients[i].checked"
|
||||
>
|
||||
<v-checkbox
|
||||
hide-details
|
||||
:input-value="ingredientData.checked"
|
||||
class="pt-0 my-auto py-auto"
|
||||
color="secondary"
|
||||
/>
|
||||
<v-list-item-content :key="ingredientData.ingredient.quantity">
|
||||
<RecipeIngredientListItem
|
||||
:ingredient="ingredientData.ingredient"
|
||||
:disable-amount="ingredientData.disableAmount"
|
||||
:scale="section.recipeScale" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
</div>
|
||||
</v-card>
|
||||
</div>
|
||||
<div class="d-flex justify-end mb-4 mt-2">
|
||||
<BaseButtonGroup
|
||||
:buttons="[
|
||||
{
|
||||
icon: $globals.icons.checkboxBlankOutline,
|
||||
text: $tc('shopping-list.uncheck-all-items'),
|
||||
event: 'uncheck',
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.checkboxOutline,
|
||||
text: $tc('shopping-list.check-all-items'),
|
||||
event: 'check',
|
||||
},
|
||||
]"
|
||||
@uncheck="bulkCheckIngredients(false)"
|
||||
@check="bulkCheckIngredients(true)"
|
||||
/>
|
||||
</div>
|
||||
</BaseDialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { toRefs } from "@vueuse/core";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface RecipeWithScale extends Recipe {
|
||||
scale: number;
|
||||
}
|
||||
|
||||
export interface ShoppingListRecipeIngredient {
|
||||
checked: boolean;
|
||||
ingredient: RecipeIngredient;
|
||||
disableAmount: boolean;
|
||||
}
|
||||
|
||||
export interface ShoppingListRecipeIngredientSection {
|
||||
recipeId: string;
|
||||
recipeName: string;
|
||||
recipeScale: number;
|
||||
ingredients: ShoppingListRecipeIngredient[];
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeIngredientListItem,
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
recipes: {
|
||||
type: Array as () => RecipeWithScale[],
|
||||
default: undefined,
|
||||
},
|
||||
shoppingLists: {
|
||||
type: Array as () => ShoppingListSummary[],
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
|
||||
// v-model support
|
||||
const dialog = computed({
|
||||
get: () => {
|
||||
return props.value;
|
||||
},
|
||||
set: (val) => {
|
||||
context.emit("input", val);
|
||||
initState();
|
||||
},
|
||||
});
|
||||
|
||||
const state = reactive({
|
||||
shoppingListDialog: true,
|
||||
shoppingListIngredientDialog: false,
|
||||
});
|
||||
|
||||
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
|
||||
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
|
||||
|
||||
async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
const recipeSectionMap = new Map<string, ShoppingListRecipeIngredientSection>();
|
||||
for (const recipe of recipes) {
|
||||
if (!recipe.slug) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (recipeSectionMap.has(recipe.slug)) {
|
||||
// @ts-ignore not undefined, see above
|
||||
recipeSectionMap.get(recipe.slug).recipeScale += recipe.scale;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(recipe.id && recipe.name && recipe.recipeIngredient)) {
|
||||
const { data } = await api.recipes.getOne(recipe.slug);
|
||||
if (!data?.recipeIngredient?.length) {
|
||||
continue;
|
||||
}
|
||||
recipe.id = data.id || "";
|
||||
recipe.name = data.name || "";
|
||||
recipe.recipeIngredient = data.recipeIngredient;
|
||||
} else if (!recipe.recipeIngredient.length) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const shoppingListIngredients: ShoppingListRecipeIngredient[] = recipe.recipeIngredient.map((ing) => {
|
||||
return {
|
||||
checked: true,
|
||||
ingredient: ing,
|
||||
disableAmount: recipe.settings?.disableAmount || false,
|
||||
}
|
||||
});
|
||||
|
||||
recipeSectionMap.set(recipe.slug, {
|
||||
recipeId: recipe.id,
|
||||
recipeName: recipe.name,
|
||||
recipeScale: recipe.scale,
|
||||
ingredients: shoppingListIngredients,
|
||||
})
|
||||
}
|
||||
|
||||
recipeIngredientSections.value = Array.from(recipeSectionMap.values());
|
||||
}
|
||||
|
||||
function initState() {
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
recipeIngredientSections.value = [];
|
||||
selectedShoppingList.value = null;
|
||||
}
|
||||
|
||||
initState();
|
||||
|
||||
async function openShoppingListIngredientDialog(list: ShoppingListSummary) {
|
||||
if (!props.recipes?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
selectedShoppingList.value = list;
|
||||
await consolidateRecipesIntoSections(props.recipes);
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = true;
|
||||
}
|
||||
|
||||
function bulkCheckIngredients(value = true) {
|
||||
recipeIngredientSections.value.forEach((section) => {
|
||||
section.ingredients.forEach((ing) => {
|
||||
ing.checked = value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function addRecipesToList() {
|
||||
const promises: Promise<any>[] = [];
|
||||
recipeIngredientSections.value.forEach((section) => {
|
||||
if (!selectedShoppingList.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const ingredients: RecipeIngredient[] = [];
|
||||
section.ingredients.forEach((ing) => {
|
||||
if (ing.checked) {
|
||||
ingredients.push(ing.ingredient);
|
||||
}
|
||||
});
|
||||
|
||||
if (!ingredients.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
promises.push(api.shopping.lists.addRecipe(
|
||||
selectedShoppingList.value.id,
|
||||
section.recipeId,
|
||||
section.recipeScale,
|
||||
ingredients,
|
||||
));
|
||||
});
|
||||
|
||||
let success = true;
|
||||
const results = await Promise.allSettled(promises);
|
||||
results.forEach((result) => {
|
||||
if (result.status === "rejected") {
|
||||
success = false;
|
||||
}
|
||||
})
|
||||
|
||||
success ? alert.success(i18n.t("recipe.recipes-added-to-list") as string)
|
||||
: alert.error(i18n.t("failed-to-add-recipes-to-list") as string)
|
||||
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
dialog.value = false;
|
||||
}
|
||||
|
||||
return {
|
||||
dialog,
|
||||
...toRefs(state),
|
||||
addRecipesToList,
|
||||
bulkCheckIngredients,
|
||||
openShoppingListIngredientDialog,
|
||||
recipeIngredientSections,
|
||||
selectedShoppingList,
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="css">
|
||||
.ingredient-grid {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 0.5rem;
|
||||
}
|
||||
</style>
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Kies data",
|
||||
"select-language": "Kies taal",
|
||||
"columns": "Kolomme",
|
||||
"combine": "Kombineer"
|
||||
"combine": "Kombineer",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Gebruiker registrasie",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Изберете данни",
|
||||
"select-language": "Изберете език",
|
||||
"columns": "Колони",
|
||||
"combine": "Обедини"
|
||||
"combine": "Обедини",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Регистрации на потребител",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registre d'usuari",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Vybrat data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Sloupce",
|
||||
"combine": "Kombinovat"
|
||||
"combine": "Kombinovat",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registrace uživatele",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "vælg data",
|
||||
"select-language": "Vælg sprog",
|
||||
"columns": "Kolonner",
|
||||
"combine": "Kombinér"
|
||||
"combine": "Kombinér",
|
||||
"categories": {
|
||||
"edit-category": "Rediger kategori",
|
||||
"new-category": "Ny kategori",
|
||||
"category-data": "Kategoridata"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Nyt mærke",
|
||||
"edit-tag": "Rediger Mærke",
|
||||
"tag-data": "Mærke data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Nyt Værktøj",
|
||||
"edit-tool": "Redigér værktøjer",
|
||||
"tool-data": "Værktøjs Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Brugerregistrering",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Daten auswählen",
|
||||
"select-language": "Sprache wählen",
|
||||
"columns": "Spalten",
|
||||
"combine": "Zusammenführen"
|
||||
"combine": "Zusammenführen",
|
||||
"categories": {
|
||||
"edit-category": "Kategorie bearbeiten",
|
||||
"new-category": "Neue Kategorie",
|
||||
"category-data": "Kategorie-Daten"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Neues Schlagwort",
|
||||
"edit-tag": "Schlagwort bearbeiten",
|
||||
"tag-data": "Schlagwort-Daten"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Neues Utensil",
|
||||
"edit-tool": "Utensil bearbeiten",
|
||||
"tool-data": "Utensil-Daten"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Benutzerregistrierung",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -463,7 +463,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Seleccionar datos",
|
||||
"select-language": "Seleccionar idioma",
|
||||
"columns": "Columnas",
|
||||
"combine": "Combinar"
|
||||
"combine": "Combinar",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registro de usuario",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Valitse Tiedot",
|
||||
"select-language": "Valitse kieli",
|
||||
"columns": "Sarakkeet",
|
||||
"combine": "Yhdistä"
|
||||
"combine": "Yhdistä",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Käyttäjien rekisteröinti",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Sélectionner les données",
|
||||
"select-language": "Sélectionnez une langue",
|
||||
"columns": "Colonnes",
|
||||
"combine": "Combiner"
|
||||
"combine": "Combiner",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Inscription d’utilisateur",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Sélectionner les données",
|
||||
"select-language": "Sélectionnez une langue",
|
||||
"columns": "Colonnes",
|
||||
"combine": "Combiner"
|
||||
"combine": "Combiner",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Inscription d’utilisateur",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "בחר נתונים",
|
||||
"select-language": "בחירת שפה",
|
||||
"columns": "עמודות",
|
||||
"combine": "שילוב"
|
||||
"combine": "שילוב",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "רישום משתמשים",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Označite Podatke",
|
||||
"select-language": "Odaberite Jezik",
|
||||
"columns": "Stupci",
|
||||
"combine": "Kombiniraj"
|
||||
"combine": "Kombiniraj",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registracija Korisnika",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Válassza ki az adatot",
|
||||
"select-language": "Nyelv kiválasztása",
|
||||
"columns": "Oszlopok",
|
||||
"combine": "Összevonás"
|
||||
"combine": "Összevonás",
|
||||
"categories": {
|
||||
"edit-category": "Kategória szerkesztése",
|
||||
"new-category": "Új kategória",
|
||||
"category-data": "Kategória adatai"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Új címke",
|
||||
"edit-tag": "Címke szerkesztése",
|
||||
"tag-data": "Címke adatok"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Új eszköz",
|
||||
"edit-tool": "Eszköz szerkesztése",
|
||||
"tool-data": "Eszköz adatai"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Felhasználó regisztráció",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Seleziona Dati",
|
||||
"select-language": "Seleziona Lingua",
|
||||
"columns": "Colonne",
|
||||
"combine": "Unisci"
|
||||
"combine": "Unisci",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registrazione Utente",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Pasirinkti duomenis",
|
||||
"select-language": "Pasirinkti kalbą",
|
||||
"columns": "Stulpeliai",
|
||||
"combine": "Sujungti"
|
||||
"combine": "Sujungti",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Vartotojo registracija",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Selecteer gegevens",
|
||||
"select-language": "Selecteer taal",
|
||||
"columns": "Kolommen",
|
||||
"combine": "Samenvoegen"
|
||||
"combine": "Samenvoegen",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Gebruikersregistratie",
|
||||
|
@ -886,36 +886,36 @@
|
||||
"seed-dialog-text": "Legg til databasen med mat basert på ditt lokale språk. Dette vil opprette 200+ felles matvarer som kan brukes til å organisere databasen. Næringsmidler oversettes via en samfunnsinnsats.",
|
||||
"seed-dialog-warning": "Du har allerede elementer i databasen. Denne handlingen vil ikke rekonfigurere duplikater, du må administrere dem manuelt.",
|
||||
"combine-food": "Kombiner mat",
|
||||
"source-food": "Source Food",
|
||||
"target-food": "Target Food",
|
||||
"source-food": "Kilde mat",
|
||||
"target-food": "Mål Mat",
|
||||
"create-food": "Lag mat",
|
||||
"food-label": "Mat etikett",
|
||||
"edit-food": "Rediger mat",
|
||||
"food-data": "Mat data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
"example-food-singular": "Feks: Tomat",
|
||||
"example-food-plural": "Feks: Tomater"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Lag en database med vanlige enheter basert på ditt lokale språk.",
|
||||
"combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.",
|
||||
"combine-unit-description": "Ved å kombinere de valgte enhetene vil kildeenheten og målenheten slås sammen i en enkelt enhet. {source-unit-will-be-deleted} og alle referansene til kildeenheten vil bli oppdatert til å peke til målenheten.",
|
||||
"combine-unit": "Kombiner enhet",
|
||||
"source-unit": "Source Unit",
|
||||
"target-unit": "Target Unit",
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"source-unit": "Kildeenhet",
|
||||
"target-unit": "Målenhet",
|
||||
"merging-unit-into-unit": "Slår sammen {0} til {1}",
|
||||
"create-unit": "Opprett enhet",
|
||||
"abbreviation": "Forkortelse",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"plural-abbreviation": "Flertallsforkortelse",
|
||||
"description": "Beskrivelse",
|
||||
"display-as-fraction": "Vis som brøkdel",
|
||||
"use-abbreviation": "Bruk forkortelse",
|
||||
"edit-unit": "Rediger enhet",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"unit-data": "Enhetsdata",
|
||||
"use-abbv": "Bruk forkortelse.",
|
||||
"fraction": "Brøk",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
"example-unit-singular": "Feks: Spiseskje",
|
||||
"example-unit-plural": "Feks: Spiseskjeer",
|
||||
"example-unit-abbreviation-singular": "Feks: SS",
|
||||
"example-unit-abbreviation-plural": "Feks: SS"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Lag en database med vanlige enheter basert på ditt lokale språk.",
|
||||
@ -927,9 +927,9 @@
|
||||
"purge-exports": "Fjern eksporter",
|
||||
"are-you-sure-you-want-to-delete-all-export-data": "Er du sikker på at du vil slette all historikk?",
|
||||
"confirm-delete-recipes": "Er du sikker på at du vil slette denne oppskriften? Denne handlingen kan ikke angres.",
|
||||
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
|
||||
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
|
||||
"the-following-recipes-selected-length-will-be-exported": "Følgende oppskrifter ({0}) vil bli eksportert.",
|
||||
"settings-chosen-explanation": "Innstillinger valgt her, bortsett fra det låste alternativet, vil bli brukt på alle valgte oppskrifter.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "Innstillingene til {count} oppskrift(er) vil bli oppdatert.",
|
||||
"recipe-data": "Oppskriftsdata",
|
||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||
"recipe-columns": "Recipe Columns",
|
||||
@ -953,7 +953,22 @@
|
||||
"select-data": "Velg data",
|
||||
"select-language": "Velg språk",
|
||||
"columns": "Kolonner",
|
||||
"combine": "Kombiner"
|
||||
"combine": "Kombiner",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Brukerregistrering",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Wybierz Dane",
|
||||
"select-language": "Wybierz język",
|
||||
"columns": "Kolumny",
|
||||
"combine": "Połącz"
|
||||
"combine": "Połącz",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Rejestracja użytkownika",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Selecionar dados",
|
||||
"select-language": "Selecionar idioma",
|
||||
"columns": "Colunas",
|
||||
"combine": "Combinar"
|
||||
"combine": "Combinar",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Cadastro de usuário",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Selecionar dados",
|
||||
"select-language": "Selecionar idioma",
|
||||
"columns": "Colunas",
|
||||
"combine": "Combinar"
|
||||
"combine": "Combinar",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registo de Utilizador",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Выберите данные",
|
||||
"select-language": "Выберите язык",
|
||||
"columns": "Столбцы",
|
||||
"combine": "Объединить"
|
||||
"combine": "Объединить",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Регистрация",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Vyberte dáta",
|
||||
"select-language": "Vyberte jazyk",
|
||||
"columns": "Stĺpce",
|
||||
"combine": "Kombinovať"
|
||||
"combine": "Kombinovať",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registrácia",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registracija uporabnika",
|
||||
|
@ -1,18 +1,18 @@
|
||||
{
|
||||
"about": {
|
||||
"about": "О апликацији",
|
||||
"about-mealie": "О Меалие-у",
|
||||
"api-docs": "АПИ Документација",
|
||||
"about-mealie": "О Мили",
|
||||
"api-docs": "API документација",
|
||||
"api-port": "API прикључак",
|
||||
"application-mode": "Мод Апликације",
|
||||
"database-type": "Тип Базе Података",
|
||||
"database-url": "URL базе",
|
||||
"default-group": "Подразумевана Група",
|
||||
"application-mode": "Режим апликације",
|
||||
"database-type": "Тип базе података",
|
||||
"database-url": "URL базе података",
|
||||
"default-group": "Подразумевана група",
|
||||
"demo": "Демо",
|
||||
"demo-status": "Статус Демоа",
|
||||
"demo-status": "Демо статус",
|
||||
"development": "Развој",
|
||||
"docs": "Документација",
|
||||
"download-log": "Преузми евиденцију",
|
||||
"download-log": "Преузми дневник евиденције",
|
||||
"download-recipe-json": "Последњи прикупљени JSON",
|
||||
"github": "Github",
|
||||
"log-lines": "Log Lines",
|
||||
@ -56,7 +56,7 @@
|
||||
"event-delete-confirmation": "Да ли сте сигурни да желите да обришете овај догађај?",
|
||||
"event-deleted": "Догађај је избрисан",
|
||||
"event-updated": "Догађај је ажуриран",
|
||||
"new-notification-form-description": "Mealie користи Apprise библиотеку за генерисање обавештења. Они нуде много опција за услуге које можете користити за обавештења. Погледајте њихову вики страницу за свеобухватан водич о томе како креирати URL за вашу услугу. Ако је доступно, одабир врсте вашег обавештења може укључивати додатне функције.",
|
||||
"new-notification-form-description": "Mили користи Apprise библиотеку за генерисање обавештења. Они нуде много опција за услуге које можете користити за обавештења. Погледајте њихову вики страницу за свеобухватан водич о томе како креирати URL за вашу услугу. Ако је доступно, одабир врсте вашег обавештења може укључивати додатне функције.",
|
||||
"new-version": "Доступна је нова верзија!",
|
||||
"notification": "Обавештење",
|
||||
"refresh": "Освежи",
|
||||
@ -70,8 +70,8 @@
|
||||
"enable-notifier": "Омогући обавештење",
|
||||
"what-events": "На које догађаје би требао да се претплати овај обавештавач?",
|
||||
"user-events": "Догађаји корисника",
|
||||
"mealplan-events": "Догађаји планирања оброка",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Када корисник у вашој групи креира нови план оброка",
|
||||
"mealplan-events": "Догађаји јеловника",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Када корисник у вашој групи креира нови јеловник",
|
||||
"shopping-list-events": "Догађаји списка за куповину",
|
||||
"cookbook-events": "Догађаји кувара",
|
||||
"tag-events": "Догађаји ознаке",
|
||||
@ -146,66 +146,66 @@
|
||||
"submit": "Пошаљи",
|
||||
"success-count": "Успешно {count}",
|
||||
"sunday": "недеља",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"templates": "Шаблони:",
|
||||
"test": "Тест",
|
||||
"themes": "Теме",
|
||||
"thursday": "четвртак",
|
||||
"token": "Token",
|
||||
"token": "Токен",
|
||||
"tuesday": "уторак",
|
||||
"type": "Тип",
|
||||
"update": "Ажурирај",
|
||||
"updated": "Ажурирано",
|
||||
"upload": "Upload",
|
||||
"upload": "Отпреми",
|
||||
"url": "URL",
|
||||
"view": "View",
|
||||
"view": "Преглед",
|
||||
"wednesday": "среда",
|
||||
"yes": "Да",
|
||||
"foods": "Foods",
|
||||
"foods": "Храна",
|
||||
"units": "Јединице",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
"owner": "Owner",
|
||||
"date-added": "Date Added",
|
||||
"none": "None",
|
||||
"run": "Run",
|
||||
"menu": "Menu",
|
||||
"a-name-is-required": "A Name is Required",
|
||||
"delete-with-name": "Delete {name}",
|
||||
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
|
||||
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
||||
"back": "Назад",
|
||||
"next": "Сљедећи",
|
||||
"toggle-view": "Промени приказ",
|
||||
"date": "Датум",
|
||||
"id": "Ид",
|
||||
"owner": "Власник",
|
||||
"date-added": "Датум додавања",
|
||||
"none": "Ниједно",
|
||||
"run": "Покрени",
|
||||
"menu": "Мени",
|
||||
"a-name-is-required": "Име је неопходно",
|
||||
"delete-with-name": "Обриши {name}",
|
||||
"confirm-delete-generic-with-name": "Да ли сте сигурни да желите да обришете {name}?",
|
||||
"confirm-delete-own-admin-account": "Обратите пажњу да покушавате избрисати свој администраторски налог! Ова акција не може бити поништена и трајно ће избрисати ваш налог?",
|
||||
"organizer": "Организатор",
|
||||
"transfer": "Transfer",
|
||||
"copy": "Copy",
|
||||
"color": "Color",
|
||||
"timestamp": "Timestamp",
|
||||
"transfer": "Пренос",
|
||||
"copy": "Копирај",
|
||||
"color": "Боја",
|
||||
"timestamp": "Временска ознака",
|
||||
"last-made": "Последњи пут прављено",
|
||||
"learn-more": "Learn More",
|
||||
"this-feature-is-currently-inactive": "This feature is currently inactive",
|
||||
"clipboard-not-supported": "Clipboard not supported",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
||||
"actions": "Actions",
|
||||
"selected-count": "Selected: {count}",
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "Upload File",
|
||||
"created-on-date": "Created on: {0}"
|
||||
"learn-more": "Сазнај више",
|
||||
"this-feature-is-currently-inactive": "Ова функција је тренутно неактивна",
|
||||
"clipboard-not-supported": "Привремена меморија није подржана",
|
||||
"copied-to-clipboard": "Копирано у привремену меморију",
|
||||
"your-browser-does-not-support-clipboard": "Ваш прегледач не подржава привремену меморију",
|
||||
"copied-items-to-clipboard": "Ниједна ставка није копирана на привремену меморију|Једна ставка је копирана на привремену меморију|Копираних {count} ставки на привремену меморију",
|
||||
"actions": "Радње",
|
||||
"selected-count": "Изабрано: {count}",
|
||||
"export-all": "Извези све",
|
||||
"refresh": "Освежи",
|
||||
"upload-file": "Учитај датотеку",
|
||||
"created-on-date": "Крерирано: {0}"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||
"cannot-delete-default-group": "Cannot delete default group",
|
||||
"cannot-delete-group-with-users": "Cannot delete group with users",
|
||||
"confirm-group-deletion": "Confirm Group Deletion",
|
||||
"create-group": "Create Group",
|
||||
"error-updating-group": "Error updating group",
|
||||
"group": "Group",
|
||||
"group-deleted": "Group deleted",
|
||||
"group-deletion-failed": "Group deletion failed",
|
||||
"group-id-with-value": "Group ID: {groupID}",
|
||||
"are-you-sure-you-want-to-delete-the-group": "Да ли сте сигурни да желите да обришете <b>{groupName}<b/>?",
|
||||
"cannot-delete-default-group": "Није могуће обрисати подразумевану групу",
|
||||
"cannot-delete-group-with-users": "Није могуће обрисати групу у којој има корисника",
|
||||
"confirm-group-deletion": "Потврди брисање групе",
|
||||
"create-group": "Направи групу",
|
||||
"error-updating-group": "Грешка при ажурирању групе",
|
||||
"group": "Група",
|
||||
"group-deleted": "Група је обрисана",
|
||||
"group-deletion-failed": "Неуспело брисање групе",
|
||||
"group-id-with-value": "ID групе: {groupID}",
|
||||
"group-name": "Назив групе",
|
||||
"group-not-found": "Група није пронађена",
|
||||
"group-with-value": "Група: {groupID}",
|
||||
@ -239,49 +239,49 @@
|
||||
"disable-users-from-commenting-on-recipes": "Онемогући кориснике да коментаришу рецепте",
|
||||
"disable-users-from-commenting-on-recipes-description": "Сакрива секцију коментара на страници рецепта и онемогућава коментаре",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Онемогући организацију састојака рецепта по јединицама и намирницама",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields.",
|
||||
"general-preferences": "General Preferences",
|
||||
"group-recipe-preferences": "Group Recipe Preferences",
|
||||
"report": "Report",
|
||||
"group-management": "Group Management",
|
||||
"admin-group-management": "Admin Group Management",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Скрива поља за храну, јединицу мере и количину за намирнице и третира их као обична текстуална поља.",
|
||||
"general-preferences": "Општа подешавања",
|
||||
"group-recipe-preferences": "Подешавања групе рецепта",
|
||||
"report": "Извештај",
|
||||
"group-management": "Управљање групом",
|
||||
"admin-group-management": "Управљање администраторском групом",
|
||||
"admin-group-management-text": "Промене у овој групи биће одмах видљиве.",
|
||||
"group-id-value": "Group Id: {0}"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||
"create-a-new-meal-plan": "Направи нови јеловник",
|
||||
"dinner-this-week": "Dinner This Week",
|
||||
"dinner-today": "Dinner Today",
|
||||
"dinner-tonight": "DINNER TONIGHT",
|
||||
"edit-meal-plan": "Edit Meal Plan",
|
||||
"edit-meal-plan": "Уреди јеловник",
|
||||
"end-date": "End Date",
|
||||
"group": "Group (Beta)",
|
||||
"main": "Main",
|
||||
"meal-planner": "Meal Planner",
|
||||
"meal-plans": "Meal Plans",
|
||||
"meal-planner": "Јеловник",
|
||||
"meal-plans": "Јеловници",
|
||||
"mealplan-categories": "КАТЕГОРИЈЕ ЈЕЛОВНИКА",
|
||||
"mealplan-created": "Mealplan created",
|
||||
"mealplan-creation-failed": "Mealplan creation failed",
|
||||
"mealplan-deleted": "Mealplan Deleted",
|
||||
"mealplan-deletion-failed": "Mealplan deletion failed",
|
||||
"mealplan-settings": "Mealplan Settings",
|
||||
"mealplan-update-failed": "Mealplan update failed",
|
||||
"mealplan-updated": "Mealplan Updated",
|
||||
"mealplan-created": "Јеловник је креиран",
|
||||
"mealplan-creation-failed": "Неуспело креирање јеловника",
|
||||
"mealplan-deleted": "Јеловник је обрисан",
|
||||
"mealplan-deletion-failed": "Неуспешно брисање јеловника",
|
||||
"mealplan-settings": "Подешавања јеловника",
|
||||
"mealplan-update-failed": "Неуспешно ажурирање јеловника",
|
||||
"mealplan-updated": "Јеловник је ажуриран",
|
||||
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
||||
"no-meal-planned-for-today": "No meal planned for today",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Само рецепти са овим категоријама ће бити коришћени у јеловницима",
|
||||
"planner": "Planner",
|
||||
"planner": "Планер",
|
||||
"quick-week": "Quick Week",
|
||||
"side": "Side",
|
||||
"sides": "Sides",
|
||||
"start-date": "Start Date",
|
||||
"start-date": "Датум почетка",
|
||||
"rule-day": "Rule Day",
|
||||
"meal-type": "Meal Type",
|
||||
"breakfast": "Breakfast",
|
||||
"lunch": "Lunch",
|
||||
"dinner": "Dinner",
|
||||
"type-any": "Any",
|
||||
"day-any": "Any",
|
||||
"breakfast": "Доручак",
|
||||
"lunch": "Ручак",
|
||||
"dinner": "Вечера",
|
||||
"type-any": "Било који",
|
||||
"day-any": "Било који",
|
||||
"editor": "Editor",
|
||||
"meal-recipe": "Meal Recipe",
|
||||
"meal-title": "Meal Title",
|
||||
@ -296,10 +296,10 @@
|
||||
"for-all-meal-types": "for all meal types",
|
||||
"for-type-meal-types": "for {0} meal types",
|
||||
"meal-plan-rules": "Meal Plan Rules",
|
||||
"new-rule": "New Rule",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
||||
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"new-rule": "Ново правило",
|
||||
"meal-plan-rules-description": "Можете креирати правила за аутоматски избор рецепата за ваше јеловнике. Ова правила користи сервер за одређивање случајног сета рецепата из којег ће бити изабране при креирању јеловника. Обратите пажњу да ако правила имају исто ограничење дана/типа, категорије правила ће бити спојене. У пракси, није потребно креирати дупла правила, али је могуће то учинити.",
|
||||
"new-rule-description": "При креирању новог правила за јеловник, можете ограничити примену правила на одређени дан у недељи и/или на одређени тип оброка. Како бисте применили правило на све дане или све типове оброка, можете поставити правило на 'Било који', што ће га применити на све могуће вредности за дан и/или тип оброка.",
|
||||
"recipe-rules": "Правила за рецепт",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
@ -360,24 +360,24 @@
|
||||
"github-issues": "GitHub Issues",
|
||||
"google-ld-json-info": "Google ld+json Info",
|
||||
"must-be-a-valid-url": "Must be a Valid URL",
|
||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Налепите ваше податке о рецепту. Свака линија ће бити третирана као ставка на списку",
|
||||
"recipe-markup-specification": "Recipe Markup Specification",
|
||||
"recipe-url": "Recipe URL",
|
||||
"upload-a-recipe": "Upload a Recipe",
|
||||
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||
"url-form-hint": "Копирајте и налепите везу са вашег омиљеног сајта за рецепте",
|
||||
"view-scraped-data": "View Scraped Data",
|
||||
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
|
||||
"trim-prefix-description": "Trim first character from each line",
|
||||
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
|
||||
"import-by-url": "Import a recipe by URL",
|
||||
"create-manually": "Create a recipe manually",
|
||||
"import-by-url": "Увези рецепт помоћу URL везе",
|
||||
"create-manually": "Направи рецепт ручно",
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page not found",
|
||||
"all-recipes": "All Recipes",
|
||||
"new-page-created": "New page created",
|
||||
"new-page-created": "Нова страна је креирана",
|
||||
"page": "Page",
|
||||
"page-creation-failed": "Page creation failed",
|
||||
"page-deleted": "Page deleted",
|
||||
@ -391,7 +391,7 @@
|
||||
},
|
||||
"recipe": {
|
||||
"add-key": "Add Key",
|
||||
"add-to-favorites": "Add to Favorites",
|
||||
"add-to-favorites": "Додај у омиљене",
|
||||
"api-extras": "API Extras",
|
||||
"calories": "Calories",
|
||||
"calories-suffix": "calories",
|
||||
@ -430,7 +430,7 @@
|
||||
"prep-time": "Време припреме",
|
||||
"protein-content": "Protein",
|
||||
"public-recipe": "Public Recipe",
|
||||
"recipe-created": "Recipe created",
|
||||
"recipe-created": "Рецепт је направљен",
|
||||
"recipe-creation-failed": "Recipe creation failed",
|
||||
"recipe-deleted": "Recipe deleted",
|
||||
"recipe-image": "Recipe Image",
|
||||
@ -439,7 +439,7 @@
|
||||
"recipe-settings": "Recipe Settings",
|
||||
"recipe-update-failed": "Recipe update failed",
|
||||
"recipe-updated": "Recipe updated",
|
||||
"remove-from-favorites": "Remove from Favorites",
|
||||
"remove-from-favorites": "Уклони из омиљених",
|
||||
"remove-section": "Remove Section",
|
||||
"save-recipe-before-use": "Save recipe before use",
|
||||
"section-title": "Section Title",
|
||||
@ -455,21 +455,21 @@
|
||||
"no-recipe": "No Recipe",
|
||||
"locked-by-owner": "Locked by Owner",
|
||||
"join-the-conversation": "Join the Conversation",
|
||||
"add-recipe-to-mealplan": "Add Recipe to Mealplan",
|
||||
"add-recipe-to-mealplan": "Додај рецепт у јеловник",
|
||||
"entry-type": "Entry Type",
|
||||
"date-format-hint": "MM/DD/YYYY format",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
|
||||
"add-to-list": "Add to List",
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Додај на временску линију",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"recipe-added-to-mealplan": "Рецепт је додат у јеловник",
|
||||
"failed-to-add-recipe-to-mealplan": "Неуспешно додавање рецепта у јеловник",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
"choose-unit": "Choose Unit",
|
||||
"press-enter-to-create": "Press Enter to Create",
|
||||
"choose-food": "Choose Food",
|
||||
"press-enter-to-create": "Притисни Ентер да направиш",
|
||||
"choose-food": "Изабери храну",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
@ -492,16 +492,16 @@
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
},
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"edit-timeline-event": "Уреди догађај на временској линији",
|
||||
"timeline": "Временска линија",
|
||||
"timeline-is-empty": "Још увек нема ништа на временској линији. Покушајте направити овај рецепт!",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"open-timeline": "Отвори временску линију",
|
||||
"made-this": "I Made This",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"user-made-this": "{user} made this",
|
||||
"last-made-date": "Последњи пут прављено {date}",
|
||||
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom json key/value pairs within a recipe to reference from 3rd part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.",
|
||||
"api-extras-description": "Додаци рецепата су кључна карактеристика Mили API-а. Омогућавају вам да креирате прилагођене JSON парове кључ/вредност унутар рецепта за референцу из других апликација. Можете користити ове кључеве за садржај информација за покретање аутоматизације или прилагођених порука које ће бити прослеђене на ваш уређај по жељи.",
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
@ -510,29 +510,29 @@
|
||||
"parse-ingredients": "Разложи састојке",
|
||||
"edit-markdown": "Edit Markdown",
|
||||
"recipe-creation": "Recipe Creation",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Изаберите један од различитих начина за прављење рецепта",
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"import-with-url": "Увези помоћу URL везе",
|
||||
"create-recipe": "Направи рецепт",
|
||||
"import-with-zip": "Увези помоћу .zip архиве",
|
||||
"create-recipe-from-an-image": "Направи рецепт са слике",
|
||||
"bulk-url-import": "Масовни увоз помоћу URL",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Направи рецепт додајући име. Сви рецепти морају имати јединствена имена.",
|
||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||
"scrape-recipe": "Scrape Recipe",
|
||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||
"import-original-keywords-as-tags": "Увези оригиналне кључне речи као ознаке",
|
||||
"stay-in-edit-mode": "Stay in Edit mode",
|
||||
"import-from-zip": "Import from Zip",
|
||||
"import-from-zip": "Увези из Zip архиве",
|
||||
"import-from-zip-description": "Import a single recipe that was exported from another Mealie instance.",
|
||||
"zip-files-must-have-been-exported-from-mealie": ".zip files must have been exported from Mealie",
|
||||
"create-a-recipe-by-uploading-a-scan": "Create a recipe by uploading a scan.",
|
||||
"create-a-recipe-by-uploading-a-scan": "Направи рецепт учитавањем скениране слике.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Upload a png image from a recipe book",
|
||||
"recipe-bulk-importer": "Recipe Bulk Importer",
|
||||
"recipe-bulk-importer-description": "The Bulk recipe importer allows you to import multiple recipes at once by queueing the sites on the backend and running the task in the background. This can be useful when initially migrating to Mealie, or when you want to import a large number of recipes.",
|
||||
"set-categories-and-tags": "Постави категорије и ознаке",
|
||||
"bulk-imports": "Bulk Imports",
|
||||
"bulk-imports": "Масовни увоз",
|
||||
"bulk-import-process-has-started": "Bulk Import process has started",
|
||||
"bulk-import-process-has-failed": "Bulk import process has failed",
|
||||
"report-deletion-failed": "Report deletion failed",
|
||||
@ -547,28 +547,28 @@
|
||||
"remove-image": "Remove image"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Advanced Search",
|
||||
"and": "and",
|
||||
"exclude": "Exclude",
|
||||
"include": "Include",
|
||||
"max-results": "Max Results",
|
||||
"or": "Or",
|
||||
"has-any": "Has Any",
|
||||
"has-all": "Has All",
|
||||
"results": "Results",
|
||||
"advanced-search": "Напредна претрага",
|
||||
"and": "и",
|
||||
"exclude": "Искључи",
|
||||
"include": "Укључи",
|
||||
"max-results": "Макс. резултата",
|
||||
"or": "Или",
|
||||
"has-any": "Садржи било који",
|
||||
"has-all": "Садржи све",
|
||||
"results": "Резултати",
|
||||
"search": "Претрага",
|
||||
"search-mealie": "Претражи Мили (стисни /)",
|
||||
"search-placeholder": "Претражи...",
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Аутоматско тражење"
|
||||
"tag-filter": "Филтер по ознакама",
|
||||
"search-hint": "Стисни '/'",
|
||||
"advanced": "Напредна",
|
||||
"auto-search": "Аутоматска претрага"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-created-at-response-export_path": "Резервна копија је креирана на {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
@ -655,7 +655,7 @@
|
||||
"toolbox": {
|
||||
"assign-all": "Assign All",
|
||||
"bulk-assign": "Bulk Assign",
|
||||
"new-name": "New Name",
|
||||
"new-name": "Нови назив",
|
||||
"no-unused-items": "No Unused Items",
|
||||
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
|
||||
"remove-unused": "Remove Unused",
|
||||
@ -690,7 +690,7 @@
|
||||
"general-about": "General About",
|
||||
"application-version": "Application Version",
|
||||
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
|
||||
"mealie-is-up-to-date": "Mealie is up to date",
|
||||
"mealie-is-up-to-date": "Мили је ажуриран на последњу верзију",
|
||||
"secure-site": "Secure Site",
|
||||
"secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.",
|
||||
"secure-site-success-text": "Site is accessed by localhost or https",
|
||||
@ -704,20 +704,20 @@
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
"create-shopping-list": "Create Shopping List",
|
||||
"all-lists": "Сви спискови",
|
||||
"create-shopping-list": "Направи списак за куповину",
|
||||
"from-recipe": "From Recipe",
|
||||
"list-name": "List Name",
|
||||
"new-list": "New List",
|
||||
"new-list": "Novi spisak",
|
||||
"quantity": "Quantity: {0}",
|
||||
"shopping-list": "Shopping List",
|
||||
"shopping-lists": "Shopping Lists",
|
||||
"food": "Food",
|
||||
"shopping-lists": "Списак за куповину",
|
||||
"food": "Храна",
|
||||
"note": "Note",
|
||||
"label": "Label",
|
||||
"label": "Natpis",
|
||||
"linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.",
|
||||
"toggle-food": "Toggle Food",
|
||||
"manage-labels": "Manage Labels",
|
||||
"manage-labels": "Управљај натписима",
|
||||
"are-you-sure-you-want-to-delete-this-item": "Are you sure you want to delete this item?",
|
||||
"copy-as-text": "Copy as Text",
|
||||
"copy-as-markdown": "Copy as Markdown",
|
||||
@ -728,7 +728,7 @@
|
||||
"check-all-items": "Check All Items",
|
||||
"linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes",
|
||||
"items-checked-count": "No items checked|One item checked|{count} items checked",
|
||||
"no-label": "No Label",
|
||||
"no-label": "Без натписа",
|
||||
"completed-on": "Completed on {date}"
|
||||
},
|
||||
"sidebar": {
|
||||
@ -741,7 +741,7 @@
|
||||
"manage-users": "Manage Users",
|
||||
"migrations": "Migrations",
|
||||
"profile": "Profile",
|
||||
"search": "Search",
|
||||
"search": "Претрага",
|
||||
"site-settings": "Site Settings",
|
||||
"tags": "Ознаке",
|
||||
"toolbox": "Toolbox",
|
||||
@ -750,8 +750,8 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"parser": "Parser",
|
||||
"developer": "Developer",
|
||||
"cookbook": "Cookbook",
|
||||
"create-cookbook": "Create a new cookbook"
|
||||
"cookbook": "Кувар",
|
||||
"create-cookbook": "Направи нови кувар"
|
||||
},
|
||||
"signup": {
|
||||
"error-signing-up": "Error Signing Up",
|
||||
@ -764,7 +764,7 @@
|
||||
"welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator."
|
||||
},
|
||||
"tag": {
|
||||
"tag-created": "Tag created",
|
||||
"tag-created": "Ознака је креирана",
|
||||
"tag-creation-failed": "Tag creation failed",
|
||||
"tag-deleted": "Tag deleted",
|
||||
"tag-deletion-failed": "Tag deletion failed",
|
||||
@ -776,13 +776,13 @@
|
||||
"tag-name": "Tag Name"
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Tools",
|
||||
"tools": "Прибор",
|
||||
"on-hand": "On Hand",
|
||||
"create-a-tool": "Create a Tool",
|
||||
"tool-name": "Tool Name",
|
||||
"tool-name": "Назив прибора",
|
||||
"create-new-tool": "Create New Tool",
|
||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||
"required-tools": "Required Tools"
|
||||
"required-tools": "Потребан прибор"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Admin",
|
||||
@ -807,7 +807,7 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"logout": "Logout",
|
||||
"logout": "Одјава",
|
||||
"manage-users": "Manage Users",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
@ -820,11 +820,11 @@
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
"total-mealplans": "Total MealPlans",
|
||||
"total-mealplans": "Укупно рецепата",
|
||||
"total-users": "Total Users",
|
||||
"upload-photo": "Upload Photo",
|
||||
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
||||
"user-created": "User created",
|
||||
"user-created": "Корисник је креиран",
|
||||
"user-creation-failed": "User creation failed",
|
||||
"user-deleted": "User deleted",
|
||||
"user-id-with-value": "User ID: {id}",
|
||||
@ -842,27 +842,27 @@
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user",
|
||||
"enable-advanced-content": "Enable Advanced Content",
|
||||
"enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later",
|
||||
"favorite-recipes": "Favorite Recipes",
|
||||
"enable-advanced-content-description": "Омогућава напредне функције као што су промена рецепта, API кључеви, Webhooks и управљање подацима. Немојте се бринути, увек можете касније променити ово",
|
||||
"favorite-recipes": "Омиљени рецепти",
|
||||
"email-or-username": "Email or Username",
|
||||
"remember-me": "Remember Me",
|
||||
"please-enter-your-email-and-password": "Please enter your email and password",
|
||||
"invalid-credentials": "Invalid Credentials",
|
||||
"account-locked-please-try-again-later": "Account Locked. Please try again later",
|
||||
"user-favorites": "User Favorites",
|
||||
"user-favorites": "Корисникови омиљени рецепти",
|
||||
"password-strength-values": {
|
||||
"weak": "Weak",
|
||||
"good": "Good",
|
||||
"strong": "Strong",
|
||||
"very-strong": "Very Strong"
|
||||
},
|
||||
"user-management": "User Management",
|
||||
"user-management": "Управљање корисницима",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"authentication-method-hint": "Ово одређује како ће се корисник аутентификовати са Mили. Ако нисте сигурни, изаберите 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
@ -921,7 +921,7 @@
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
"edit-label": "Edit Label",
|
||||
"new-label": "New Label",
|
||||
"labels": "Labels"
|
||||
"labels": "Натписи"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Purge Exports",
|
||||
@ -948,12 +948,27 @@
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
"data-management-description": "Select which data set you want to make changes to.",
|
||||
"data-management": "Управљање подацима",
|
||||
"data-management-description": "Изаберите који скуп података желите изменити.",
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
@ -961,7 +976,7 @@
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
"group-details": "Group Details",
|
||||
"group-details-description": "Before you create an account you'll need to create a group. Your group will only contain you, but you'll be able to invite others later. Members in your group can share meal plans, shopping lists, recipes, and more!",
|
||||
"group-details-description": "Пре него што креирате налог, морате креирати групу. Ваша група ће садржавати само вас, али касније ћете моћи позвати друге. Чланови ваше групе могу делити јеловнике, спискове за куповину, рецепте и још много тога!",
|
||||
"use-seed-data": "Use Seed Data",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes.",
|
||||
"account-details": "Account Details"
|
||||
@ -991,7 +1006,7 @@
|
||||
"issue-link-text": "Track our progress here"
|
||||
},
|
||||
"form": {
|
||||
"quantity-label-abbreviated": "Qty"
|
||||
"quantity-label-abbreviated": "Кол."
|
||||
},
|
||||
"markdown-editor": {
|
||||
"preview-markdown-button-label": "Preview Markdown"
|
||||
@ -1036,7 +1051,7 @@
|
||||
"page-title": "Site Maintenance",
|
||||
"summary-title": "Summary",
|
||||
"button-label-get-summary": "Get Summary",
|
||||
"button-label-open-details": "Details",
|
||||
"button-label-open-details": "Детаљи",
|
||||
"info-description-data-dir-size": "Data Directory Size",
|
||||
"info-description-log-file-size": "Log File Size",
|
||||
"info-description-cleanable-directories": "Cleanable Directories",
|
||||
@ -1099,7 +1114,7 @@
|
||||
"api-tokens-description": "Manage your API Tokens for access from external applications",
|
||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
||||
"group-settings": "Group Settings",
|
||||
"group-settings-description": "Manage your common group settings like mealplan and privacy settings.",
|
||||
"group-settings-description": "Управљајте општим подешавањима групе као што су подешавања јеловника и приватности.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"members": "Members",
|
||||
"members-description": "See who's in your group and manage their permissions.",
|
||||
@ -1114,7 +1129,7 @@
|
||||
"error-sending-email": "Error Sending Email",
|
||||
"personal-information": "Personal Information",
|
||||
"preferences": "Preferences",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"show-advanced-description": "Прикажи напредне функције (API кључеви, Webhooks и управљање подацима)",
|
||||
"back-to-profile": "Back to Profile",
|
||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
@ -1128,14 +1143,14 @@
|
||||
"cookbook": {
|
||||
"cookbooks": "Кувари",
|
||||
"description": "Кувари су још један начин за организовање рецепата креирањем пресека рецепата и ознака. Креирање кувара додаће ставку на бочну траку и све рецепте са изабраним ознакама и категоријама биће приказане у кувару.",
|
||||
"public-cookbook": "Public Cookbook",
|
||||
"public-cookbook": "Јавни кувар",
|
||||
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
||||
"filter-options": "Filter Options",
|
||||
"filter-options": "Опције филтера",
|
||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
||||
"require-all-categories": "Захтевај све категорије",
|
||||
"require-all-tags": "Захтевај све ознаке",
|
||||
"require-all-tools": "Require All Tools",
|
||||
"require-all-tools": "Захтева сав прибор",
|
||||
"cookbook-name": "Cookbook Name",
|
||||
"cookbook-with-name": "Cookbook {0}"
|
||||
"cookbook-with-name": "Кувар {0}"
|
||||
}
|
||||
}
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Välj data",
|
||||
"select-language": "Välj språk",
|
||||
"columns": "Kolumner",
|
||||
"combine": "Kombinera"
|
||||
"combine": "Kombinera",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Användarregistrering",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Birleştir"
|
||||
"combine": "Birleştir",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Вибір даних",
|
||||
"select-language": "Вибір мови",
|
||||
"columns": "Стовпці",
|
||||
"combine": "Об'єднати"
|
||||
"combine": "Об'єднати",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Реєстрація користувачів",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -953,7 +953,22 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
|
@ -1,51 +1,65 @@
|
||||
<template>
|
||||
<v-row>
|
||||
<v-col
|
||||
v-for="(day, index) in plan"
|
||||
:key="index"
|
||||
cols="12"
|
||||
sm="12"
|
||||
md="4"
|
||||
lg="4"
|
||||
xl="2"
|
||||
class="col-borders my-1 d-flex flex-column"
|
||||
>
|
||||
<v-card class="mb-2 border-left-primary rounded-sm pa-2">
|
||||
<p class="pl-2 mb-1">
|
||||
{{ $d(day.date, "short") }}
|
||||
</p>
|
||||
</v-card>
|
||||
<div v-for="section in day.sections" :key="section.title">
|
||||
<div class="py-2 d-flex flex-column">
|
||||
<div class="primary" style="width: 50px; height: 2.5px"></div>
|
||||
<p class="text-overline my-0">
|
||||
{{ section.title }}
|
||||
</p>
|
||||
</div>
|
||||
<v-container class="mx-0 my-3 pa">
|
||||
<v-row>
|
||||
<v-col
|
||||
v-for="(day, index) in plan"
|
||||
:key="index"
|
||||
cols="12"
|
||||
sm="12"
|
||||
md="4"
|
||||
lg="4"
|
||||
xl="2"
|
||||
class="col-borders my-1 d-flex flex-column"
|
||||
>
|
||||
<v-card class="mb-2 border-left-primary rounded-sm px-2">
|
||||
<v-container class="px-0">
|
||||
<v-row no-gutters style="width: 100%;">
|
||||
<v-col cols="10">
|
||||
<p class="pl-2 my-1">
|
||||
{{ $d(day.date, "short") }}
|
||||
</p>
|
||||
</v-col>
|
||||
<v-col class="d-flex justify-top" cols="2">
|
||||
<GroupMealPlanDayContextMenu v-if="day.recipes.length" :recipes="day.recipes" />
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card>
|
||||
<div v-for="section in day.sections" :key="section.title">
|
||||
<div class="py-2 d-flex flex-column">
|
||||
<div class="primary" style="width: 50px; height: 2.5px"></div>
|
||||
<p class="text-overline my-0">
|
||||
{{ section.title }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<RecipeCardMobile
|
||||
v-for="mealplan in section.meals"
|
||||
:key="mealplan.id"
|
||||
:recipe-id="mealplan.recipe ? mealplan.recipe.id : ''"
|
||||
class="mb-2"
|
||||
:route="mealplan.recipe ? true : false"
|
||||
:slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title"
|
||||
:description="mealplan.recipe ? mealplan.recipe.description : mealplan.text"
|
||||
:name="mealplan.recipe ? mealplan.recipe.name : mealplan.title"
|
||||
/>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<RecipeCardMobile
|
||||
v-for="mealplan in section.meals"
|
||||
:key="mealplan.id"
|
||||
:recipe-id="mealplan.recipe ? mealplan.recipe.id : ''"
|
||||
class="mb-2"
|
||||
:route="mealplan.recipe ? true : false"
|
||||
:slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title"
|
||||
:description="mealplan.recipe ? mealplan.recipe.description : mealplan.text"
|
||||
:name="mealplan.recipe ? mealplan.recipe.name : mealplan.title"
|
||||
/>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
|
||||
import { MealsByDate } from "./types";
|
||||
import { ReadPlanEntry } from "~/lib/api/types/meal-plan";
|
||||
import GroupMealPlanDayContextMenu from "~/components/Domain/Group/GroupMealPlanDayContextMenu.vue";
|
||||
import RecipeCardMobile from "~/components/Domain/Recipe/RecipeCardMobile.vue";
|
||||
import { RecipeSummary } from "~/lib/api/types/recipe";
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
GroupMealPlanDayContextMenu,
|
||||
RecipeCardMobile,
|
||||
},
|
||||
props: {
|
||||
@ -63,6 +77,7 @@ export default defineComponent({
|
||||
type Days = {
|
||||
date: Date;
|
||||
sections: DaySection[];
|
||||
recipes: RecipeSummary[];
|
||||
};
|
||||
|
||||
const { i18n } = useContext();
|
||||
@ -77,6 +92,7 @@ export default defineComponent({
|
||||
{ title: i18n.tc("meal-plan.dinner"), meals: [] },
|
||||
{ title: i18n.tc("meal-plan.side"), meals: [] },
|
||||
],
|
||||
recipes: [],
|
||||
};
|
||||
|
||||
for (const meal of day.meals) {
|
||||
@ -89,6 +105,10 @@ export default defineComponent({
|
||||
} else if (meal.entryType === "side") {
|
||||
out.sections[3].meals.push(meal);
|
||||
}
|
||||
|
||||
if (meal.recipe) {
|
||||
out.recipes.push(meal.recipe);
|
||||
}
|
||||
}
|
||||
|
||||
// Drop empty sections
|
||||
|
@ -1,35 +1,35 @@
|
||||
{
|
||||
"generic": {
|
||||
"server-error": "An unexpected error occurred"
|
||||
"server-error": "Догодила се неочекивана грешка"
|
||||
},
|
||||
"recipe": {
|
||||
"unique-name-error": "Recipe names must be unique"
|
||||
"unique-name-error": "Назив рецепта мора бити јединствен"
|
||||
},
|
||||
"mealplan": {
|
||||
"no-recipes-match-your-rules": "No recipes match your rules"
|
||||
"no-recipes-match-your-rules": "Нема рецепата који одговарају вашим правилима"
|
||||
},
|
||||
"user": {
|
||||
"user-updated": "User updated",
|
||||
"password-updated": "Password updated",
|
||||
"invalid-current-password": "Invalid current password",
|
||||
"ldap-update-password-unavailable": "Unable to update password, user is controlled by LDAP"
|
||||
"user-updated": "Корисник је ажуриран",
|
||||
"password-updated": "Лозинка је ажурирана",
|
||||
"invalid-current-password": "Тренутна лозинка је неисправна",
|
||||
"ldap-update-password-unavailable": "Лозинку није могуће ажурирати, корисник је контролисан од стране LDAP-а"
|
||||
},
|
||||
"group": {
|
||||
"report-deleted": "Report deleted."
|
||||
"report-deleted": "Рецепт је избрисан."
|
||||
},
|
||||
"exceptions": {
|
||||
"permission_denied": "You do not have permission to perform this action",
|
||||
"no-entry-found": "The requested resource was not found",
|
||||
"integrity-error": "Database integrity error",
|
||||
"username-conflict-error": "This username is already taken",
|
||||
"email-conflict-error": "This email is already in use"
|
||||
"permission_denied": "Немате дозволу за извршење ове радње",
|
||||
"no-entry-found": "Захтевани ресурс није пронађен",
|
||||
"integrity-error": "Грешка у интегритету базе података",
|
||||
"username-conflict-error": "Корисничко име је већ заузето",
|
||||
"email-conflict-error": "Овај е-мејл је већ у употреби"
|
||||
},
|
||||
"notifications": {
|
||||
"generic-created": "{name} was created",
|
||||
"generic-updated": "{name} was updated",
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-created": "{name} је крериран",
|
||||
"generic-updated": "{name} је ажуриран",
|
||||
"generic-created-with-url": "{name} је направљено, {url}",
|
||||
"generic-updated-with-url": "{name} је ажурирано, {url}",
|
||||
"generic-duplicated": "{name} је дуплиран",
|
||||
"generic-deleted": "{name} је обрисан"
|
||||
}
|
||||
}
|
||||
|
@ -1,65 +1,65 @@
|
||||
[
|
||||
{
|
||||
"name": "Produce"
|
||||
"name": "Домаћи производи"
|
||||
},
|
||||
{
|
||||
"name": "Grains"
|
||||
"name": "Житарице"
|
||||
},
|
||||
{
|
||||
"name": "Fruits"
|
||||
"name": "Воће"
|
||||
},
|
||||
{
|
||||
"name": "Vegetables"
|
||||
"name": "Поврће"
|
||||
},
|
||||
{
|
||||
"name": "Meat"
|
||||
"name": "Месо"
|
||||
},
|
||||
{
|
||||
"name": "Seafood"
|
||||
"name": "Морски плодови"
|
||||
},
|
||||
{
|
||||
"name": "Beverages"
|
||||
"name": "Пића"
|
||||
},
|
||||
{
|
||||
"name": "Baked Goods"
|
||||
"name": "Пецива"
|
||||
},
|
||||
{
|
||||
"name": "Canned Goods"
|
||||
"name": "Конзервирана храна"
|
||||
},
|
||||
{
|
||||
"name": "Condiments"
|
||||
"name": "Зачини"
|
||||
},
|
||||
{
|
||||
"name": "Confectionary"
|
||||
"name": "Кондиторски производи"
|
||||
},
|
||||
{
|
||||
"name": "Dairy Products"
|
||||
"name": "Млечни производи"
|
||||
},
|
||||
{
|
||||
"name": "Frozen Foods"
|
||||
"name": "Смрзнута храна"
|
||||
},
|
||||
{
|
||||
"name": "Health Foods"
|
||||
"name": "Здрава храна"
|
||||
},
|
||||
{
|
||||
"name": "Household"
|
||||
"name": "Домаћинство"
|
||||
},
|
||||
{
|
||||
"name": "Meat Products"
|
||||
"name": "Месни производи"
|
||||
},
|
||||
{
|
||||
"name": "Snacks"
|
||||
"name": "Грицкалице"
|
||||
},
|
||||
{
|
||||
"name": "Spices"
|
||||
"name": "Зачини"
|
||||
},
|
||||
{
|
||||
"name": "Sweets"
|
||||
"name": "Слаткиши"
|
||||
},
|
||||
{
|
||||
"name": "Alcohol"
|
||||
"name": "Алкохол"
|
||||
},
|
||||
{
|
||||
"name": "Other"
|
||||
"name": "Остало"
|
||||
}
|
||||
]
|
||||
|
@ -1,86 +1,86 @@
|
||||
{
|
||||
"teaspoon": {
|
||||
"name": "teaspoon",
|
||||
"name": "кашичица",
|
||||
"description": "",
|
||||
"abbreviation": "tsp"
|
||||
"abbreviation": "кашичица"
|
||||
},
|
||||
"tablespoon": {
|
||||
"name": "tablespoon",
|
||||
"name": "кашика",
|
||||
"description": "",
|
||||
"abbreviation": "tbsp"
|
||||
"abbreviation": "кашика"
|
||||
},
|
||||
"cup": {
|
||||
"name": "cup",
|
||||
"name": "шоља",
|
||||
"description": "",
|
||||
"abbreviation": "cup"
|
||||
"abbreviation": "шоља"
|
||||
},
|
||||
"fluid-ounce": {
|
||||
"name": "fluid ounce",
|
||||
"name": "течна унца",
|
||||
"description": "",
|
||||
"abbreviation": "fl oz"
|
||||
"abbreviation": "течна унца"
|
||||
},
|
||||
"pint": {
|
||||
"name": "pint",
|
||||
"name": "пинта",
|
||||
"description": "",
|
||||
"abbreviation": "pt"
|
||||
},
|
||||
"quart": {
|
||||
"name": "quart",
|
||||
"name": "четврт галона",
|
||||
"description": "",
|
||||
"abbreviation": "qt"
|
||||
},
|
||||
"gallon": {
|
||||
"name": "gallon",
|
||||
"name": "галон",
|
||||
"description": "",
|
||||
"abbreviation": "gal"
|
||||
"abbreviation": "гал"
|
||||
},
|
||||
"milliliter": {
|
||||
"name": "milliliter",
|
||||
"name": "милиметар",
|
||||
"description": "",
|
||||
"abbreviation": "ml"
|
||||
"abbreviation": "мл"
|
||||
},
|
||||
"liter": {
|
||||
"name": "liter",
|
||||
"name": "литар",
|
||||
"description": "",
|
||||
"abbreviation": "l"
|
||||
"abbreviation": "л"
|
||||
},
|
||||
"pound": {
|
||||
"name": "pound",
|
||||
"name": "фунта",
|
||||
"description": "",
|
||||
"abbreviation": "lb"
|
||||
},
|
||||
"ounce": {
|
||||
"name": "ounce",
|
||||
"name": "унца",
|
||||
"description": "",
|
||||
"abbreviation": "oz"
|
||||
"abbreviation": "унца (oz)"
|
||||
},
|
||||
"gram": {
|
||||
"name": "gram",
|
||||
"name": "грам",
|
||||
"description": "",
|
||||
"abbreviation": "g"
|
||||
"abbreviation": "г"
|
||||
},
|
||||
"kilogram": {
|
||||
"name": "kilogram",
|
||||
"name": "килограм",
|
||||
"description": "",
|
||||
"abbreviation": "kg"
|
||||
"abbreviation": "кг"
|
||||
},
|
||||
"milligram": {
|
||||
"name": "milligram",
|
||||
"name": "милиграм",
|
||||
"description": "",
|
||||
"abbreviation": "mg"
|
||||
"abbreviation": "мг"
|
||||
},
|
||||
"splash": {
|
||||
"name": "splash",
|
||||
"name": "мала количина (splash)",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"dash": {
|
||||
"name": "dash",
|
||||
"name": "осмина кашичице",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"serving": {
|
||||
"name": "serving",
|
||||
"name": "порција",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
@ -90,12 +90,12 @@
|
||||
"abbreviation": ""
|
||||
},
|
||||
"clove": {
|
||||
"name": "clove",
|
||||
"name": "клинчић",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"can": {
|
||||
"name": "can",
|
||||
"name": "конзерва",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user