mirror of
https://github.com/hay-kot/mealie.git
synced 2025-08-22 06:23:34 -07:00
Merge branch 'mealie-next' into patch-1
This commit is contained in:
commit
81130899c3
146 changed files with 5261 additions and 4159 deletions
|
@ -1,6 +1,6 @@
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v5.0.0
|
rev: v6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
exclude: "mkdocs.yml"
|
exclude: "mkdocs.yml"
|
||||||
|
@ -12,7 +12,7 @@ repos:
|
||||||
exclude: ^tests/data/
|
exclude: ^tests/data/
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
# Ruff version.
|
# Ruff version.
|
||||||
rev: v0.12.7
|
rev: v0.12.9
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
- id: ruff-format
|
- id: ruff-format
|
||||||
|
|
|
@ -71,6 +71,7 @@ tasks:
|
||||||
desc: run code generators
|
desc: run code generators
|
||||||
cmds:
|
cmds:
|
||||||
- poetry run python dev/code-generation/main.py {{ .CLI_ARGS }}
|
- poetry run python dev/code-generation/main.py {{ .CLI_ARGS }}
|
||||||
|
- task: docs:gen
|
||||||
- task: py:format
|
- task: py:format
|
||||||
|
|
||||||
dev:services:
|
dev:services:
|
||||||
|
|
|
@ -8,8 +8,8 @@ from utils import log
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
template = """// This Code is auto generated by gen_ts_types.py
|
template = """// This Code is auto generated by gen_ts_types.py
|
||||||
{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
|
{% for name in global %}import type {{ name }} from "@/components/global/{{ name }}.vue";
|
||||||
{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
|
{% endfor %}{% for name in layout %}import type {{ name }} from "@/components/layout/{{ name }}.vue";
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
declare module "vue" {
|
declare module "vue" {
|
||||||
export interface GlobalComponents {
|
export interface GlobalComponents {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
###############################################
|
###############################################
|
||||||
# Frontend Build
|
# Frontend Build
|
||||||
###############################################
|
###############################################
|
||||||
FROM node:20 AS frontend-builder
|
FROM node:20@sha256:572a90df10a58ebb7d3f223d661d964a6c2383a9c2b5763162b4f631c53dc56a \
|
||||||
|
AS frontend-builder
|
||||||
|
|
||||||
WORKDIR /frontend
|
WORKDIR /frontend
|
||||||
|
|
||||||
|
@ -20,7 +21,8 @@ RUN yarn generate
|
||||||
###############################################
|
###############################################
|
||||||
# Base Image - Python
|
# Base Image - Python
|
||||||
###############################################
|
###############################################
|
||||||
FROM python:3.12-slim AS python-base
|
FROM python:3.12-slim@sha256:2267adc248a477c1f1a852a07a5a224d42abe54c28aafa572efa157dfb001bba \
|
||||||
|
AS python-base
|
||||||
|
|
||||||
ENV MEALIE_HOME="/app"
|
ENV MEALIE_HOME="/app"
|
||||||
|
|
||||||
|
@ -132,7 +134,7 @@ RUN apt-get update \
|
||||||
gosu \
|
gosu \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
libldap-common \
|
libldap-common \
|
||||||
libldap-2.5 \
|
libldap2 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# create directory used for Docker Secrets
|
# create directory used for Docker Secrets
|
||||||
|
|
|
@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
|
||||||
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
||||||
|
|
||||||
1. Take a backup just in case!
|
1. Take a backup just in case!
|
||||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.2`
|
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.1.0`
|
||||||
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
|
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
|
||||||
4. Restart the container
|
4. Restart the container
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v3.0.2 # (3)
|
image: ghcr.io/mealie-recipes/mealie:v3.1.0 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
|
|
|
@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v3.0.2 # (3)
|
image: ghcr.io/mealie-recipes/mealie:v3.1.0 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -70,7 +70,7 @@ import RecipeCardSection from "@/components/Domain/Recipe/RecipeCardSection.vue"
|
||||||
import { useCookbookStore } from "~/composables/store/use-cookbook-store";
|
import { useCookbookStore } from "~/composables/store/use-cookbook-store";
|
||||||
import { useCookbook } from "~/composables/use-group-cookbooks";
|
import { useCookbook } from "~/composables/use-group-cookbooks";
|
||||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||||
import type { RecipeCookBook } from "~/lib/api/types/cookbook";
|
import type { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||||
import CookbookEditor from "~/components/Domain/Cookbook/CookbookEditor.vue";
|
import CookbookEditor from "~/components/Domain/Cookbook/CookbookEditor.vue";
|
||||||
|
|
||||||
const $auth = useMealieAuth();
|
const $auth = useMealieAuth();
|
||||||
|
@ -100,7 +100,7 @@ const dialogStates = reactive({
|
||||||
edit: false,
|
edit: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const editTarget = ref<RecipeCookBook | null>(null);
|
const editTarget = ref<ReadCookBook | null>(null);
|
||||||
function handleEditCookbook() {
|
function handleEditCookbook() {
|
||||||
dialogStates.edit = true;
|
dialogStates.edit = true;
|
||||||
editTarget.value = book.value;
|
editTarget.value = book.value;
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
|
|
||||||
<RecipeRating
|
<RecipeRating
|
||||||
class="ml-n2"
|
class="ml-n2"
|
||||||
:value="rating"
|
:model-value="rating"
|
||||||
:recipe-id="recipeId"
|
:recipe-id="recipeId"
|
||||||
:slug="slug"
|
:slug="slug"
|
||||||
small
|
small
|
||||||
|
|
|
@ -123,7 +123,7 @@
|
||||||
density="comfortable"
|
density="comfortable"
|
||||||
:prepend-icon="v.icon"
|
:prepend-icon="v.icon"
|
||||||
:title="v.name"
|
:title="v.name"
|
||||||
@click="state.orderBy = v.value"
|
@click="setOrderBy(v.value)"
|
||||||
/>
|
/>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
|
@ -219,7 +219,7 @@ import {
|
||||||
useToolStore,
|
useToolStore,
|
||||||
usePublicToolStore,
|
usePublicToolStore,
|
||||||
} from "~/composables/store";
|
} from "~/composables/store";
|
||||||
import { useUserSearchQuerySession } from "~/composables/use-users/preferences";
|
import { useUserSearchQuerySession, useUserSortPreferences } from "~/composables/use-users/preferences";
|
||||||
import RecipeCardSection from "~/components/Domain/Recipe/RecipeCardSection.vue";
|
import RecipeCardSection from "~/components/Domain/Recipe/RecipeCardSection.vue";
|
||||||
import type { IngredientFood, RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/recipe";
|
import type { IngredientFood, RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/recipe";
|
||||||
import type { NoUndefinedField } from "~/lib/api/types/non-generated";
|
import type { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||||
|
@ -253,6 +253,15 @@ export default defineNuxtComponent({
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||||
const searchQuerySession = useUserSearchQuerySession();
|
const searchQuerySession = useUserSearchQuerySession();
|
||||||
|
const sortPreferences = useUserSortPreferences();
|
||||||
|
|
||||||
|
watch(() => state.value.orderBy, (newValue) => {
|
||||||
|
sortPreferences.value.orderBy = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(() => state.value.orderDirection, (newValue) => {
|
||||||
|
sortPreferences.value.orderDirection = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||||
const categories = isOwnGroup.value ? useCategoryStore() : usePublicCategoryStore(groupSlug.value);
|
const categories = isOwnGroup.value ? useCategoryStore() : usePublicCategoryStore(groupSlug.value);
|
||||||
|
@ -312,6 +321,8 @@ export default defineNuxtComponent({
|
||||||
state.value.search = queryDefaults.search;
|
state.value.search = queryDefaults.search;
|
||||||
state.value.orderBy = queryDefaults.orderBy;
|
state.value.orderBy = queryDefaults.orderBy;
|
||||||
state.value.orderDirection = queryDefaults.orderDirection;
|
state.value.orderDirection = queryDefaults.orderDirection;
|
||||||
|
sortPreferences.value.orderBy = queryDefaults.orderBy;
|
||||||
|
sortPreferences.value.orderDirection = queryDefaults.orderDirection;
|
||||||
state.value.requireAllCategories = queryDefaults.requireAllCategories;
|
state.value.requireAllCategories = queryDefaults.requireAllCategories;
|
||||||
state.value.requireAllTags = queryDefaults.requireAllTags;
|
state.value.requireAllTags = queryDefaults.requireAllTags;
|
||||||
state.value.requireAllTools = queryDefaults.requireAllTools;
|
state.value.requireAllTools = queryDefaults.requireAllTools;
|
||||||
|
@ -325,6 +336,12 @@ export default defineNuxtComponent({
|
||||||
|
|
||||||
function toggleOrderDirection() {
|
function toggleOrderDirection() {
|
||||||
state.value.orderDirection = state.value.orderDirection === "asc" ? "desc" : "asc";
|
state.value.orderDirection = state.value.orderDirection === "asc" ? "desc" : "asc";
|
||||||
|
sortPreferences.value.orderDirection = state.value.orderDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setOrderBy(value: string) {
|
||||||
|
state.value.orderBy = value;
|
||||||
|
sortPreferences.value.orderBy = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toIDArray(array: { id: string }[]) {
|
function toIDArray(array: { id: string }[]) {
|
||||||
|
@ -356,8 +373,6 @@ export default defineNuxtComponent({
|
||||||
...{
|
...{
|
||||||
auto: state.value.auto ? undefined : "false",
|
auto: state.value.auto ? undefined : "false",
|
||||||
search: passedQuery.value.search === queryDefaults.search ? undefined : passedQuery.value.search,
|
search: passedQuery.value.search === queryDefaults.search ? undefined : passedQuery.value.search,
|
||||||
orderBy: passedQuery.value.orderBy === queryDefaults.orderBy ? undefined : passedQuery.value.orderBy,
|
|
||||||
orderDirection: passedQuery.value.orderDirection === queryDefaults.orderDirection ? undefined : passedQuery.value.orderDirection,
|
|
||||||
households: !passedQuery.value.households?.length || passedQuery.value.households?.length === households.store.value.length ? undefined : passedQuery.value.households,
|
households: !passedQuery.value.households?.length || passedQuery.value.households?.length === households.store.value.length ? undefined : passedQuery.value.households,
|
||||||
requireAllCategories: passedQuery.value.requireAllCategories ? "true" : undefined,
|
requireAllCategories: passedQuery.value.requireAllCategories ? "true" : undefined,
|
||||||
requireAllTags: passedQuery.value.requireAllTags ? "true" : undefined,
|
requireAllTags: passedQuery.value.requireAllTags ? "true" : undefined,
|
||||||
|
@ -474,19 +489,8 @@ export default defineNuxtComponent({
|
||||||
state.value.search = queryDefaults.search;
|
state.value.search = queryDefaults.search;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.orderBy?.length) {
|
state.value.orderBy = sortPreferences.value.orderBy;
|
||||||
state.value.orderBy = query.orderBy as string;
|
state.value.orderDirection = sortPreferences.value.orderDirection as "asc" | "desc";
|
||||||
}
|
|
||||||
else {
|
|
||||||
state.value.orderBy = queryDefaults.orderBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (query.orderDirection?.length) {
|
|
||||||
state.value.orderDirection = query.orderDirection as "asc" | "desc";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
state.value.orderDirection = queryDefaults.orderDirection;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (query.requireAllCategories?.length) {
|
if (query.requireAllCategories?.length) {
|
||||||
state.value.requireAllCategories = query.requireAllCategories === "true";
|
state.value.requireAllCategories = query.requireAllCategories === "true";
|
||||||
|
@ -665,6 +669,7 @@ export default defineNuxtComponent({
|
||||||
|
|
||||||
sortable,
|
sortable,
|
||||||
toggleOrderDirection,
|
toggleOrderDirection,
|
||||||
|
setOrderBy,
|
||||||
hideKeyboard,
|
hideKeyboard,
|
||||||
input,
|
input,
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<v-list :class="tile ? 'd-flex flex-wrap background' : 'background'">
|
<v-list :class="tile ? 'd-flex flex-wrap background' : 'background'" style="background-color: transparent;">
|
||||||
<v-sheet
|
<v-sheet
|
||||||
v-for="recipe, index in recipes"
|
v-for="recipe, index in recipes"
|
||||||
:key="recipe.id"
|
:key="recipe.id"
|
||||||
|
@ -41,10 +41,10 @@
|
||||||
</v-list-item-subtitle>
|
</v-list-item-subtitle>
|
||||||
</div>
|
</div>
|
||||||
<template #append>
|
<template #append>
|
||||||
<slot
|
<slot
|
||||||
:name="'actions-' + recipe.id"
|
:name="'actions-' + recipe.id"
|
||||||
:v-bind="{ item: recipe }"
|
:v-bind="{ item: recipe }"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-sheet>
|
</v-sheet>
|
||||||
|
|
|
@ -390,8 +390,6 @@ const props = defineProps({
|
||||||
|
|
||||||
const emit = defineEmits(["click-instruction-field", "update:assets"]);
|
const emit = defineEmits(["click-instruction-field", "update:assets"]);
|
||||||
|
|
||||||
const BASE_URL = useRequestURL().origin;
|
|
||||||
|
|
||||||
const { isCookMode, toggleCookMode, isEditForm } = usePageState(props.recipe.slug);
|
const { isCookMode, toggleCookMode, isEditForm } = usePageState(props.recipe.slug);
|
||||||
|
|
||||||
const dialog = ref(false);
|
const dialog = ref(false);
|
||||||
|
@ -695,7 +693,7 @@ async function handleImageDrop(index: number, files: File[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
emit("update:assets", [...assets.value, data]);
|
emit("update:assets", [...assets.value, data]);
|
||||||
const assetUrl = BASE_URL + recipeAssetPath(props.recipe.id, data.fileName as string);
|
const assetUrl = recipeAssetPath(props.recipe.id, data.fileName as string);
|
||||||
const text = `<img src="${assetUrl}" height="100%" width="100%"/>`;
|
const text = `<img src="${assetUrl}" height="100%" width="100%"/>`;
|
||||||
instructionList.value[index].text += text;
|
instructionList.value[index].text += text;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
<template #activator="{ props }">
|
<template #activator="{ props }">
|
||||||
<v-btn
|
<v-btn
|
||||||
size="small"
|
size="small"
|
||||||
|
variant="text"
|
||||||
class="ml-2 handle"
|
class="ml-2 handle"
|
||||||
icon
|
icon
|
||||||
v-bind="props"
|
v-bind="props"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
v-model="listItem.checked"
|
v-model="listItem.checked"
|
||||||
hide-details
|
hide-details
|
||||||
density="compact"
|
density="compact"
|
||||||
class="mt-0"
|
class="mt-0 flex-shrink-0"
|
||||||
color="null"
|
color="null"
|
||||||
@change="$emit('checked', listItem)"
|
@change="$emit('checked', listItem)"
|
||||||
/>
|
/>
|
||||||
|
@ -27,16 +27,6 @@
|
||||||
</div>
|
</div>
|
||||||
</v-col>
|
</v-col>
|
||||||
<v-spacer />
|
<v-spacer />
|
||||||
<v-col
|
|
||||||
v-if="label && showLabel"
|
|
||||||
cols="3"
|
|
||||||
class="text-right"
|
|
||||||
>
|
|
||||||
<MultiPurposeLabel
|
|
||||||
:label="label"
|
|
||||||
size="small"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
<v-col
|
<v-col
|
||||||
cols="auto"
|
cols="auto"
|
||||||
class="text-right"
|
class="text-right"
|
||||||
|
@ -75,27 +65,6 @@
|
||||||
</template>
|
</template>
|
||||||
<span>Toggle Recipes</span>
|
<span>Toggle Recipes</span>
|
||||||
</v-tooltip>
|
</v-tooltip>
|
||||||
<!-- Dummy button so the spacing is consistent when labels are enabled -->
|
|
||||||
<v-btn
|
|
||||||
v-else
|
|
||||||
size="small"
|
|
||||||
variant="text"
|
|
||||||
class="ml-2"
|
|
||||||
icon
|
|
||||||
disabled
|
|
||||||
/>
|
|
||||||
|
|
||||||
<v-btn
|
|
||||||
size="small"
|
|
||||||
variant="text"
|
|
||||||
class="ml-2 handle"
|
|
||||||
icon
|
|
||||||
v-bind="props"
|
|
||||||
>
|
|
||||||
<v-icon>
|
|
||||||
{{ $globals.icons.arrowUpDown }}
|
|
||||||
</v-icon>
|
|
||||||
</v-btn>
|
|
||||||
<v-btn
|
<v-btn
|
||||||
size="small"
|
size="small"
|
||||||
variant="text"
|
variant="text"
|
||||||
|
@ -107,6 +76,17 @@
|
||||||
{{ $globals.icons.edit }}
|
{{ $globals.icons.edit }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
<v-btn
|
||||||
|
size="small"
|
||||||
|
variant="text"
|
||||||
|
class="handle"
|
||||||
|
icon
|
||||||
|
v-bind="props"
|
||||||
|
>
|
||||||
|
<v-icon>
|
||||||
|
{{ $globals.icons.arrowUpDown }}
|
||||||
|
</v-icon>
|
||||||
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
<v-list density="compact">
|
<v-list density="compact">
|
||||||
<v-list-item
|
<v-list-item
|
||||||
|
@ -177,7 +157,6 @@
|
||||||
import { useOnline } from "@vueuse/core";
|
import { useOnline } from "@vueuse/core";
|
||||||
import RecipeIngredientListItem from "../Recipe/RecipeIngredientListItem.vue";
|
import RecipeIngredientListItem from "../Recipe/RecipeIngredientListItem.vue";
|
||||||
import ShoppingListItemEditor from "./ShoppingListItemEditor.vue";
|
import ShoppingListItemEditor from "./ShoppingListItemEditor.vue";
|
||||||
import MultiPurposeLabel from "./MultiPurposeLabel.vue";
|
|
||||||
import type { ShoppingListItemOut } from "~/lib/api/types/household";
|
import type { ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
import type { MultiPurposeLabelOut, MultiPurposeLabelSummary } from "~/lib/api/types/labels";
|
import type { MultiPurposeLabelOut, MultiPurposeLabelSummary } from "~/lib/api/types/labels";
|
||||||
import type { IngredientFood, IngredientUnit, RecipeSummary } from "~/lib/api/types/recipe";
|
import type { IngredientFood, IngredientUnit, RecipeSummary } from "~/lib/api/types/recipe";
|
||||||
|
@ -189,16 +168,12 @@ interface actions {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default defineNuxtComponent({
|
export default defineNuxtComponent({
|
||||||
components: { ShoppingListItemEditor, MultiPurposeLabel, RecipeList, RecipeIngredientListItem },
|
components: { ShoppingListItemEditor, RecipeList, RecipeIngredientListItem },
|
||||||
props: {
|
props: {
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: Object as () => ShoppingListItemOut,
|
type: Object as () => ShoppingListItemOut,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
showLabel: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
labels: {
|
labels: {
|
||||||
type: Array as () => MultiPurposeLabelOut[],
|
type: Array as () => MultiPurposeLabelOut[],
|
||||||
required: true,
|
required: true,
|
||||||
|
@ -220,7 +195,7 @@ export default defineNuxtComponent({
|
||||||
setup(props, context) {
|
setup(props, context) {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
const displayRecipeRefs = ref(false);
|
const displayRecipeRefs = ref(false);
|
||||||
const itemLabelCols = ref<string>(props.modelValue.checked ? "auto" : props.showLabel ? "4" : "6");
|
const itemLabelCols = ref<string>(props.modelValue.checked ? "auto" : "6");
|
||||||
const isOffline = computed(() => useOnline().value === false);
|
const isOffline = computed(() => useOnline().value === false);
|
||||||
|
|
||||||
const contextMenu: actions[] = [
|
const contextMenu: actions[] = [
|
||||||
|
@ -305,7 +280,7 @@ export default defineNuxtComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
listItem.value.recipeReferences.forEach((ref) => {
|
listItem.value.recipeReferences.forEach((ref) => {
|
||||||
const recipe = props.recipes.get(ref.recipeId);
|
const recipe = props.recipes?.get(ref.recipeId);
|
||||||
if (recipe) {
|
if (recipe) {
|
||||||
recipeList.push(recipe);
|
recipeList.push(recipe);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,15 +37,16 @@
|
||||||
:name="inputField.varName"
|
:name="inputField.varName"
|
||||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate) || (disabledFields && disabledFields.includes(inputField.varName))"
|
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate) || (disabledFields && disabledFields.includes(inputField.varName))"
|
||||||
:hint="inputField.hint"
|
:hint="inputField.hint"
|
||||||
hide-details="auto"
|
:hide-details="!inputField.hint"
|
||||||
|
:persistent-hint="!!inputField.hint"
|
||||||
density="comfortable"
|
density="comfortable"
|
||||||
@change="emitBlur">
|
@change="emitBlur">
|
||||||
<template #label>
|
<template #label>
|
||||||
<span class="ml-4">
|
<span class="ml-4">
|
||||||
{{ inputField.label }}
|
{{ inputField.label }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</v-checkbox>
|
</v-checkbox>
|
||||||
|
|
||||||
<!-- Text Field -->
|
<!-- Text Field -->
|
||||||
<v-text-field
|
<v-text-field
|
||||||
|
@ -97,8 +98,8 @@
|
||||||
:label="inputField.label"
|
:label="inputField.label"
|
||||||
:name="inputField.varName"
|
:name="inputField.varName"
|
||||||
:items="inputField.options"
|
:items="inputField.options"
|
||||||
:item-title="inputField.itemText"
|
item-title="text"
|
||||||
:item-value="inputField.itemValue"
|
item-value="text"
|
||||||
:return-object="false"
|
:return-object="false"
|
||||||
:hint="inputField.hint"
|
:hint="inputField.hint"
|
||||||
density="comfortable"
|
density="comfortable"
|
||||||
|
@ -107,10 +108,11 @@
|
||||||
@blur="emitBlur"
|
@blur="emitBlur"
|
||||||
>
|
>
|
||||||
<template #item="{ item }">
|
<template #item="{ item }">
|
||||||
<div>
|
<v-list-item
|
||||||
<v-list-item-title>{{ item.raw.text }}</v-list-item-title>
|
v-bind="props"
|
||||||
<v-list-item-subtitle>{{ item.raw.description }}</v-list-item-subtitle>
|
:title="item.raw.text"
|
||||||
</div>
|
:subtitle="item.raw.description"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
</v-select>
|
</v-select>
|
||||||
|
|
||||||
|
|
|
@ -4,43 +4,39 @@ function UnknownToString(ukn: string | unknown) {
|
||||||
|
|
||||||
export const useStaticRoutes = () => {
|
export const useStaticRoutes = () => {
|
||||||
const { $config } = useNuxtApp();
|
const { $config } = useNuxtApp();
|
||||||
const serverBase = useRequestURL().origin;
|
|
||||||
|
|
||||||
const prefix = `${$config.public.SUB_PATH}/api`.replace("//", "/");
|
const prefix = `${$config.public.SUB_PATH}/api`.replace("//", "/");
|
||||||
|
|
||||||
const fullBase = serverBase + prefix;
|
|
||||||
|
|
||||||
// Methods to Generate reference urls for assets/images *
|
// Methods to Generate reference urls for assets/images *
|
||||||
function recipeImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
function recipeImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/original.webp?rnd=${key}&version=${UnknownToString(version)}`;
|
return `${prefix}/media/recipes/${recipeId}/images/original.webp?rnd=${key}&version=${UnknownToString(version)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeSmallImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
function recipeSmallImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/min-original.webp?rnd=${key}&version=${UnknownToString(
|
return `${prefix}/media/recipes/${recipeId}/images/min-original.webp?rnd=${key}&version=${UnknownToString(
|
||||||
version,
|
version,
|
||||||
)}`;
|
)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeTinyImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
function recipeTinyImage(recipeId: string, version: string | unknown = "", key: string | number = 1) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/tiny-original.webp?rnd=${key}&version=${UnknownToString(
|
return `${prefix}/media/recipes/${recipeId}/images/tiny-original.webp?rnd=${key}&version=${UnknownToString(
|
||||||
version,
|
version,
|
||||||
)}`;
|
)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeTimelineEventImage(recipeId: string, timelineEventId: string) {
|
function recipeTimelineEventImage(recipeId: string, timelineEventId: string) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/original.webp`;
|
return `${prefix}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/original.webp`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeTimelineEventSmallImage(recipeId: string, timelineEventId: string) {
|
function recipeTimelineEventSmallImage(recipeId: string, timelineEventId: string) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/min-original.webp`;
|
return `${prefix}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/min-original.webp`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeTimelineEventTinyImage(recipeId: string, timelineEventId: string) {
|
function recipeTimelineEventTinyImage(recipeId: string, timelineEventId: string) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/tiny-original.webp`;
|
return `${prefix}/media/recipes/${recipeId}/images/timeline/${timelineEventId}/tiny-original.webp`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function recipeAssetPath(recipeId: string, assetName: string) {
|
function recipeAssetPath(recipeId: string, assetName: string) {
|
||||||
return `${fullBase}/media/recipes/${recipeId}/assets/${assetName}`;
|
return `${prefix}/media/recipes/${recipeId}/assets/${assetName}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import type { ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
|
import { useCopyList } from "~/composables/use-copy";
|
||||||
|
|
||||||
|
type CopyTypes = "plain" | "markdown";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list copy functionality
|
||||||
|
*/
|
||||||
|
export function useShoppingListCopy() {
|
||||||
|
const copy = useCopyList();
|
||||||
|
|
||||||
|
function copyListItems(itemsByLabel: { [key: string]: ShoppingListItemOut[] }, copyType: CopyTypes) {
|
||||||
|
const text: string[] = [];
|
||||||
|
Object.entries(itemsByLabel).forEach(([label, items], idx) => {
|
||||||
|
if (idx) {
|
||||||
|
text.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
text.push(formatCopiedLabelHeading(copyType, label));
|
||||||
|
items.forEach(item => text.push(formatCopiedListItem(copyType, item)));
|
||||||
|
});
|
||||||
|
|
||||||
|
copy.copyPlain(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatCopiedListItem(copyType: CopyTypes, item: ShoppingListItemOut): string {
|
||||||
|
const display = item.display || "";
|
||||||
|
switch (copyType) {
|
||||||
|
case "markdown":
|
||||||
|
return `- [ ] ${display}`;
|
||||||
|
default:
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatCopiedLabelHeading(copyType: CopyTypes, label: string): string {
|
||||||
|
switch (copyType) {
|
||||||
|
case "markdown":
|
||||||
|
return `# ${label}`;
|
||||||
|
default:
|
||||||
|
return `[${label}]`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
copyListItems,
|
||||||
|
formatCopiedListItem,
|
||||||
|
formatCopiedLabelHeading,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,263 @@
|
||||||
|
import type { ShoppingListOut, ShoppingListItemOut, ShoppingListMultiPurposeLabelOut } from "~/lib/api/types/household";
|
||||||
|
import { useUserApi } from "~/composables/api";
|
||||||
|
import { uuid4 } from "~/composables/use-utils";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list item CRUD operations
|
||||||
|
*/
|
||||||
|
export function useShoppingListCrud(
|
||||||
|
shoppingList: Ref<ShoppingListOut | null>,
|
||||||
|
loadingCounter: Ref<number>,
|
||||||
|
listItems: { unchecked: ShoppingListItemOut[]; checked: ShoppingListItemOut[] },
|
||||||
|
shoppingListItemActions: any,
|
||||||
|
refresh: () => void,
|
||||||
|
sortCheckedItems: (a: ShoppingListItemOut, b: ShoppingListItemOut) => number,
|
||||||
|
updateListItemOrder: () => void,
|
||||||
|
) {
|
||||||
|
const { t } = useI18n();
|
||||||
|
const userApi = useUserApi();
|
||||||
|
|
||||||
|
const createListItemData = ref<ShoppingListItemOut>(listItemFactory());
|
||||||
|
const localLabels = ref<ShoppingListMultiPurposeLabelOut[]>();
|
||||||
|
|
||||||
|
function listItemFactory(): ShoppingListItemOut {
|
||||||
|
return {
|
||||||
|
id: uuid4(),
|
||||||
|
shoppingListId: shoppingList.value?.id || "",
|
||||||
|
checked: false,
|
||||||
|
position: shoppingList.value?.listItems?.length || 1,
|
||||||
|
quantity: 0,
|
||||||
|
note: "",
|
||||||
|
labelId: undefined,
|
||||||
|
unitId: undefined,
|
||||||
|
foodId: undefined,
|
||||||
|
} as ShoppingListItemOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check/Uncheck All operations
|
||||||
|
function checkAllItems() {
|
||||||
|
let hasChanged = false;
|
||||||
|
shoppingList.value?.listItems?.forEach((item) => {
|
||||||
|
if (!item.checked) {
|
||||||
|
hasChanged = true;
|
||||||
|
item.checked = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (hasChanged) {
|
||||||
|
updateUncheckedListItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function uncheckAllItems() {
|
||||||
|
let hasChanged = false;
|
||||||
|
shoppingList.value?.listItems?.forEach((item) => {
|
||||||
|
if (item.checked) {
|
||||||
|
hasChanged = true;
|
||||||
|
item.checked = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (hasChanged) {
|
||||||
|
listItems.unchecked = [...listItems.unchecked, ...listItems.checked];
|
||||||
|
listItems.checked = [];
|
||||||
|
updateUncheckedListItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteCheckedItems() {
|
||||||
|
const checked = shoppingList.value?.listItems?.filter(item => item.checked);
|
||||||
|
|
||||||
|
if (!checked || checked?.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
deleteListItems(checked);
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveListItem(item: ShoppingListItemOut) {
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set a temporary updatedAt timestamp prior to refresh so it appears at the top of the checked items
|
||||||
|
item.updatedAt = new Date().toISOString();
|
||||||
|
|
||||||
|
// make updates reflect immediately
|
||||||
|
if (shoppingList.value.listItems) {
|
||||||
|
shoppingList.value.listItems.forEach((oldListItem: ShoppingListItemOut, idx: number) => {
|
||||||
|
if (oldListItem.id === item.id && shoppingList.value?.listItems) {
|
||||||
|
shoppingList.value.listItems[idx] = item;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Immediately update checked/unchecked arrays for UI
|
||||||
|
listItems.unchecked = shoppingList.value.listItems.filter(i => !i.checked);
|
||||||
|
listItems.checked = shoppingList.value.listItems.filter(i => i.checked)
|
||||||
|
.sort(sortCheckedItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the item if it's checked, otherwise updateUncheckedListItems will handle it
|
||||||
|
if (item.checked) {
|
||||||
|
shoppingListItemActions.updateItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateListItemOrder();
|
||||||
|
updateUncheckedListItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteListItem(item: ShoppingListItemOut) {
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
shoppingListItemActions.deleteItem(item);
|
||||||
|
|
||||||
|
// remove the item from the list immediately so the user sees the change
|
||||||
|
if (shoppingList.value.listItems) {
|
||||||
|
shoppingList.value.listItems = shoppingList.value.listItems.filter(itm => itm.id !== item.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteListItems(items: ShoppingListItemOut[]) {
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
items.forEach((item) => {
|
||||||
|
shoppingListItemActions.deleteItem(item);
|
||||||
|
});
|
||||||
|
// remove the items from the list immediately so the user sees the change
|
||||||
|
if (shoppingList.value?.listItems) {
|
||||||
|
const deletedItems = new Set(items.map(item => item.id));
|
||||||
|
shoppingList.value.listItems = shoppingList.value.listItems.filter(itm => !deletedItems.has(itm.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createListItem() {
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!createListItemData.value.foodId && !createListItemData.value.note) {
|
||||||
|
// don't create an empty item
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
|
||||||
|
// make sure it's inserted into the end of the list, which may have been updated
|
||||||
|
createListItemData.value.position = shoppingList.value?.listItems?.length
|
||||||
|
? (shoppingList.value.listItems.reduce((a, b) => (a.position || 0) > (b.position || 0) ? a : b).position || 0) + 1
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
createListItemData.value.createdAt = new Date().toISOString();
|
||||||
|
createListItemData.value.updatedAt = createListItemData.value.createdAt;
|
||||||
|
|
||||||
|
updateListItemOrder();
|
||||||
|
|
||||||
|
shoppingListItemActions.createItem(createListItemData.value);
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
if (shoppingList.value.listItems) {
|
||||||
|
// add the item to the list immediately so the user sees the change
|
||||||
|
shoppingList.value.listItems.push(createListItemData.value);
|
||||||
|
updateListItemOrder();
|
||||||
|
}
|
||||||
|
createListItemData.value = listItemFactory();
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateUncheckedListItems() {
|
||||||
|
if (!shoppingList.value?.listItems) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set position for unchecked items
|
||||||
|
listItems.unchecked.forEach((item: ShoppingListItemOut, idx: number) => {
|
||||||
|
item.position = idx;
|
||||||
|
shoppingListItemActions.updateItem(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label management
|
||||||
|
function updateLabelOrder(labelSettings: ShoppingListMultiPurposeLabelOut[]) {
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
labelSettings.forEach((labelSetting, index) => {
|
||||||
|
labelSetting.position = index;
|
||||||
|
return labelSetting;
|
||||||
|
});
|
||||||
|
|
||||||
|
localLabels.value = labelSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelLabelOrder() {
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
if (!shoppingList.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// restore original state
|
||||||
|
localLabels.value = shoppingList.value.labelSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveLabelOrder(updateItemsByLabel: () => void) {
|
||||||
|
if (!shoppingList.value || !localLabels.value || (localLabels.value === shoppingList.value.labelSettings)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
const { data } = await userApi.shopping.lists.updateLabelSettings(shoppingList.value.id, localLabels.value);
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
// update shoppingList labels using the API response
|
||||||
|
shoppingList.value.labelSettings = (data as ShoppingListOut).labelSettings;
|
||||||
|
updateItemsByLabel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleReorderLabelsDialog(reorderLabelsDialog: Ref<boolean>) {
|
||||||
|
// stop polling and populate localLabels
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
reorderLabelsDialog.value = !reorderLabelsDialog.value;
|
||||||
|
localLabels.value = shoppingList.value?.labelSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Context menu actions
|
||||||
|
const contextActions = {
|
||||||
|
delete: "delete",
|
||||||
|
};
|
||||||
|
|
||||||
|
const contextMenu = [
|
||||||
|
{ title: t("general.delete"), action: contextActions.delete },
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
createListItemData,
|
||||||
|
localLabels,
|
||||||
|
listItemFactory,
|
||||||
|
checkAllItems,
|
||||||
|
uncheckAllItems,
|
||||||
|
deleteCheckedItems,
|
||||||
|
saveListItem,
|
||||||
|
deleteListItem,
|
||||||
|
deleteListItems,
|
||||||
|
createListItem,
|
||||||
|
updateUncheckedListItems,
|
||||||
|
updateLabelOrder,
|
||||||
|
cancelLabelOrder,
|
||||||
|
saveLabelOrder,
|
||||||
|
toggleReorderLabelsDialog,
|
||||||
|
contextActions,
|
||||||
|
contextMenu,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
import { useOnline, useIdle } from "@vueuse/core";
|
||||||
|
import type { ShoppingListOut } from "~/lib/api/types/household";
|
||||||
|
import { useShoppingListItemActions } from "~/composables/use-shopping-list-item-actions";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list data fetching and polling
|
||||||
|
*/
|
||||||
|
export function useShoppingListData(listId: string, shoppingList: Ref<ShoppingListOut | null>, loadingCounter: Ref<number>) {
|
||||||
|
const isOffline = computed(() => useOnline().value === false);
|
||||||
|
const { idle } = useIdle(5 * 60 * 1000); // 5 minutes
|
||||||
|
const shoppingListItemActions = useShoppingListItemActions(listId);
|
||||||
|
|
||||||
|
async function fetchShoppingList() {
|
||||||
|
const data = await shoppingListItemActions.getList();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function refresh(updateListItemOrder: () => void) {
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
try {
|
||||||
|
await shoppingListItemActions.process();
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
let newListValue: typeof shoppingList.value = null;
|
||||||
|
try {
|
||||||
|
newListValue = await fetchShoppingList();
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
// only update the list with the new value if we're not loading, to prevent UI jitter
|
||||||
|
if (loadingCounter.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent overwriting local changes with stale backend data when offline
|
||||||
|
if (isOffline.value) {
|
||||||
|
// Do not update shoppingList.value from backend when offline
|
||||||
|
updateListItemOrder();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we're not connected to the network, this will be null, so we don't want to clear the list
|
||||||
|
if (newListValue) {
|
||||||
|
shoppingList.value = newListValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateListItemOrder();
|
||||||
|
}
|
||||||
|
|
||||||
|
// constantly polls for changes
|
||||||
|
async function pollForChanges(updateListItemOrder: () => void) {
|
||||||
|
// pause polling if the user isn't active or we're busy
|
||||||
|
if (idle.value || loadingCounter.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await refresh(updateListItemOrder);
|
||||||
|
|
||||||
|
if (shoppingList.value) {
|
||||||
|
attempts = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the refresh was unsuccessful, the shopping list will be null, so we increment the attempt counter
|
||||||
|
attempts++;
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
attempts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we hit too many errors, stop polling
|
||||||
|
if (attempts >= maxAttempts) {
|
||||||
|
clearInterval(pollTimer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// start polling
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
// max poll time = pollFrequency * maxAttempts = 24 hours
|
||||||
|
// we use a long max poll time since polling stops when the user is idle anyway
|
||||||
|
const pollFrequency = 5000;
|
||||||
|
const maxAttempts = 17280;
|
||||||
|
let attempts = 0;
|
||||||
|
let pollTimer: ReturnType<typeof setInterval>;
|
||||||
|
|
||||||
|
function startPolling(updateListItemOrder: () => void) {
|
||||||
|
pollForChanges(updateListItemOrder); // populate initial list
|
||||||
|
|
||||||
|
pollTimer = setInterval(() => {
|
||||||
|
pollForChanges(updateListItemOrder);
|
||||||
|
}, pollFrequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopPolling() {
|
||||||
|
if (pollTimer) {
|
||||||
|
clearInterval(pollTimer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isOffline,
|
||||||
|
fetchShoppingList,
|
||||||
|
refresh,
|
||||||
|
startPolling,
|
||||||
|
stopPolling,
|
||||||
|
shoppingListItemActions,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
import { useToggle } from "@vueuse/core";
|
||||||
|
import type { ShoppingListOut, ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list label state and operations
|
||||||
|
*/
|
||||||
|
export function useShoppingListLabels(shoppingList: Ref<ShoppingListOut | null>) {
|
||||||
|
const { t } = useI18n();
|
||||||
|
const labelOpenState = ref<{ [key: string]: boolean }>({});
|
||||||
|
const [showChecked, toggleShowChecked] = useToggle(false);
|
||||||
|
|
||||||
|
const initializeLabelOpenStates = () => {
|
||||||
|
if (!shoppingList.value?.listItems) return;
|
||||||
|
|
||||||
|
const existingLabels = new Set(Object.keys(labelOpenState.value));
|
||||||
|
let hasChanges = false;
|
||||||
|
|
||||||
|
for (const item of shoppingList.value.listItems) {
|
||||||
|
const labelName = item.label?.name || t("shopping-list.no-label");
|
||||||
|
if (!existingLabels.has(labelName) && !(labelName in labelOpenState.value)) {
|
||||||
|
labelOpenState.value[labelName] = true;
|
||||||
|
hasChanges = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasChanges) {
|
||||||
|
labelOpenState.value = { ...labelOpenState.value };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const labelNames = computed(() => {
|
||||||
|
return new Set(
|
||||||
|
shoppingList.value?.listItems
|
||||||
|
?.map(item => item.label?.name || t("shopping-list.no-label"))
|
||||||
|
.filter(Boolean) ?? [],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(labelNames, initializeLabelOpenStates, { immediate: true });
|
||||||
|
|
||||||
|
function toggleShowLabel(key: string) {
|
||||||
|
labelOpenState.value[key] = !labelOpenState.value[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLabelColor(item: ShoppingListItemOut | null) {
|
||||||
|
return item?.label?.color;
|
||||||
|
}
|
||||||
|
|
||||||
|
const presentLabels = computed(() => {
|
||||||
|
const labels: Array<{ id: string; name: string }> = [];
|
||||||
|
|
||||||
|
shoppingList.value?.listItems?.forEach((item) => {
|
||||||
|
if (item.labelId && item.label) {
|
||||||
|
labels.push({
|
||||||
|
name: item.label.name,
|
||||||
|
id: item.labelId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return labels;
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
labelOpenState,
|
||||||
|
showChecked,
|
||||||
|
toggleShowChecked,
|
||||||
|
toggleShowLabel,
|
||||||
|
getLabelColor,
|
||||||
|
presentLabels,
|
||||||
|
initializeLabelOpenStates,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
import type { ShoppingListOut } from "~/lib/api/types/household";
|
||||||
|
import { useUserApi } from "~/composables/api";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list recipe references
|
||||||
|
*/
|
||||||
|
export function useShoppingListRecipes(
|
||||||
|
shoppingList: Ref<ShoppingListOut | null>,
|
||||||
|
loadingCounter: Ref<number>,
|
||||||
|
recipeReferenceLoading: Ref<boolean>,
|
||||||
|
refresh: () => void,
|
||||||
|
) {
|
||||||
|
const userApi = useUserApi();
|
||||||
|
|
||||||
|
async function addRecipeReferenceToList(recipeId: string) {
|
||||||
|
if (!shoppingList.value || recipeReferenceLoading.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
recipeReferenceLoading.value = true;
|
||||||
|
const { data } = await userApi.shopping.lists.addRecipes(shoppingList.value.id, [{ recipeId }]);
|
||||||
|
recipeReferenceLoading.value = false;
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function removeRecipeReferenceToList(recipeId: string) {
|
||||||
|
if (!shoppingList.value || recipeReferenceLoading.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingCounter.value += 1;
|
||||||
|
recipeReferenceLoading.value = true;
|
||||||
|
const { data } = await userApi.shopping.lists.removeRecipe(shoppingList.value.id, recipeId);
|
||||||
|
recipeReferenceLoading.value = false;
|
||||||
|
loadingCounter.value -= 1;
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
addRecipeReferenceToList,
|
||||||
|
removeRecipeReferenceToList,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
import type { ShoppingListOut, ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
|
|
||||||
|
interface ListItemGroup {
|
||||||
|
position: number;
|
||||||
|
createdAt: string;
|
||||||
|
items: ShoppingListItemOut[];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list item sorting and organization
|
||||||
|
*/
|
||||||
|
export function useShoppingListSorting() {
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
function sortItems(a: ShoppingListItemOut | ListItemGroup, b: ShoppingListItemOut | ListItemGroup) {
|
||||||
|
// Sort by position ASC, then by createdAt ASC
|
||||||
|
const posA = a.position ?? 0;
|
||||||
|
const posB = b.position ?? 0;
|
||||||
|
if (posA !== posB) {
|
||||||
|
return posA - posB;
|
||||||
|
}
|
||||||
|
const createdA = a.createdAt ?? "";
|
||||||
|
const createdB = b.createdAt ?? "";
|
||||||
|
if (createdA !== createdB) {
|
||||||
|
return createdA < createdB ? -1 : 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupAndSortListItemsByFood(shoppingList: ShoppingListOut) {
|
||||||
|
if (!shoppingList?.listItems?.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const checkedItemKey = "__checkedItem";
|
||||||
|
const listItemGroupsMap = new Map<string, ListItemGroup>();
|
||||||
|
listItemGroupsMap.set(checkedItemKey, { position: Number.MAX_SAFE_INTEGER, createdAt: "", items: [] });
|
||||||
|
|
||||||
|
// group items by checked status, food, or note
|
||||||
|
shoppingList.listItems.forEach((item) => {
|
||||||
|
const key = item.checked
|
||||||
|
? checkedItemKey
|
||||||
|
: item.food?.name
|
||||||
|
? item.food.name
|
||||||
|
: item.note || "";
|
||||||
|
|
||||||
|
const group = listItemGroupsMap.get(key);
|
||||||
|
if (!group) {
|
||||||
|
listItemGroupsMap.set(key, { position: item.position || 0, createdAt: item.createdAt || "", items: [item] });
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
group.items.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const listItemGroups = Array.from(listItemGroupsMap.values());
|
||||||
|
listItemGroups.sort(sortItems);
|
||||||
|
|
||||||
|
// sort group items, then aggregate them
|
||||||
|
const sortedItems: ShoppingListItemOut[] = [];
|
||||||
|
let nextPosition = 0;
|
||||||
|
listItemGroups.forEach((listItemGroup) => {
|
||||||
|
listItemGroup.items.sort(sortItems);
|
||||||
|
listItemGroup.items.forEach((item) => {
|
||||||
|
item.position = nextPosition;
|
||||||
|
nextPosition += 1;
|
||||||
|
sortedItems.push(item);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
shoppingList.listItems = sortedItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortListItems(shoppingList: ShoppingListOut) {
|
||||||
|
if (!shoppingList?.listItems?.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
shoppingList.listItems.sort(sortItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateItemsByLabel(shoppingList: ShoppingListOut) {
|
||||||
|
const items: { [prop: string]: ShoppingListItemOut[] } = {};
|
||||||
|
const noLabelText = t("shopping-list.no-label");
|
||||||
|
const noLabel = [] as ShoppingListItemOut[];
|
||||||
|
|
||||||
|
shoppingList?.listItems?.forEach((item) => {
|
||||||
|
if (item.checked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.labelId) {
|
||||||
|
if (item.label && item.label.name in items) {
|
||||||
|
items[item.label.name].push(item);
|
||||||
|
}
|
||||||
|
else if (item.label) {
|
||||||
|
items[item.label.name] = [item];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
noLabel.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (noLabel.length > 0) {
|
||||||
|
items[noLabelText] = noLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort the map by label order
|
||||||
|
const orderedLabelNames = shoppingList?.labelSettings?.map(labelSetting => labelSetting.label.name);
|
||||||
|
if (!orderedLabelNames) {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsSorted: { [prop: string]: ShoppingListItemOut[] } = {};
|
||||||
|
if (noLabelText in items) {
|
||||||
|
itemsSorted[noLabelText] = items[noLabelText];
|
||||||
|
}
|
||||||
|
|
||||||
|
orderedLabelNames.forEach((labelName) => {
|
||||||
|
if (labelName in items) {
|
||||||
|
itemsSorted[labelName] = items[labelName];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return itemsSorted;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
sortItems,
|
||||||
|
groupAndSortListItemsByFood,
|
||||||
|
sortListItems,
|
||||||
|
updateItemsByLabel,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
import type { ShoppingListOut, ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable for managing shopping list state and reactive data
|
||||||
|
*/
|
||||||
|
export function useShoppingListState() {
|
||||||
|
const shoppingList = ref<ShoppingListOut | null>(null);
|
||||||
|
const loadingCounter = ref(1);
|
||||||
|
const recipeReferenceLoading = ref(false);
|
||||||
|
const preserveItemOrder = ref(false);
|
||||||
|
|
||||||
|
// UI state
|
||||||
|
const edit = ref(false);
|
||||||
|
const threeDot = ref(false);
|
||||||
|
const reorderLabelsDialog = ref(false);
|
||||||
|
const createEditorOpen = ref(false);
|
||||||
|
|
||||||
|
// Dialog states
|
||||||
|
const state = reactive({
|
||||||
|
checkAllDialog: false,
|
||||||
|
uncheckAllDialog: false,
|
||||||
|
deleteCheckedDialog: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hydrate listItems from shoppingList.value?.listItems
|
||||||
|
const listItems = reactive({
|
||||||
|
unchecked: [] as ShoppingListItemOut[],
|
||||||
|
checked: [] as ShoppingListItemOut[],
|
||||||
|
});
|
||||||
|
|
||||||
|
function sortCheckedItems(a: ShoppingListItemOut, b: ShoppingListItemOut) {
|
||||||
|
if (a.updatedAt! === b.updatedAt!) {
|
||||||
|
return ((a.position || 0) > (b.position || 0)) ? -1 : 1;
|
||||||
|
}
|
||||||
|
return a.updatedAt! < b.updatedAt! ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => shoppingList.value?.listItems,
|
||||||
|
(items) => {
|
||||||
|
listItems.unchecked = (items?.filter(item => !item.checked) ?? []);
|
||||||
|
listItems.checked = (items?.filter(item => item.checked)
|
||||||
|
.sort(sortCheckedItems) ?? []);
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
);
|
||||||
|
|
||||||
|
const recipeMap = computed(() => new Map(
|
||||||
|
(shoppingList.value?.recipeReferences?.map(ref => ref.recipe) ?? [])
|
||||||
|
.map(recipe => [recipe.id || "", recipe])),
|
||||||
|
);
|
||||||
|
|
||||||
|
const recipeList = computed(() => Array.from(recipeMap.value.values()));
|
||||||
|
|
||||||
|
return {
|
||||||
|
shoppingList,
|
||||||
|
loadingCounter,
|
||||||
|
recipeReferenceLoading,
|
||||||
|
preserveItemOrder,
|
||||||
|
edit,
|
||||||
|
threeDot,
|
||||||
|
reorderLabelsDialog,
|
||||||
|
createEditorOpen,
|
||||||
|
state,
|
||||||
|
listItems,
|
||||||
|
recipeMap,
|
||||||
|
recipeList,
|
||||||
|
sortCheckedItems,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,194 @@
|
||||||
|
import type { ShoppingListItemOut } from "~/lib/api/types/household";
|
||||||
|
import { useShoppingListState } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-state";
|
||||||
|
import { useShoppingListData } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-data";
|
||||||
|
import { useShoppingListSorting } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-sorting";
|
||||||
|
import { useShoppingListLabels } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-labels";
|
||||||
|
import { useShoppingListCopy } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-copy";
|
||||||
|
import { useShoppingListCrud } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-crud";
|
||||||
|
import { useShoppingListRecipes } from "~/composables/shopping-list-page/sub-composables/use-shopping-list-recipes";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main composable that orchestrates all shopping list page functionality
|
||||||
|
*/
|
||||||
|
export function useShoppingListPage(listId: string) {
|
||||||
|
// Initialize state
|
||||||
|
const state = useShoppingListState();
|
||||||
|
const {
|
||||||
|
shoppingList,
|
||||||
|
loadingCounter,
|
||||||
|
recipeReferenceLoading,
|
||||||
|
preserveItemOrder,
|
||||||
|
listItems,
|
||||||
|
sortCheckedItems,
|
||||||
|
} = state;
|
||||||
|
|
||||||
|
// Initialize sorting functionality
|
||||||
|
const sorting = useShoppingListSorting();
|
||||||
|
const { groupAndSortListItemsByFood, sortListItems, updateItemsByLabel } = sorting;
|
||||||
|
|
||||||
|
// Track items organized by label
|
||||||
|
const itemsByLabel = ref<{ [key: string]: ShoppingListItemOut[] }>({});
|
||||||
|
|
||||||
|
function updateListItemOrder() {
|
||||||
|
if (!shoppingList.value) return;
|
||||||
|
|
||||||
|
if (!preserveItemOrder.value) {
|
||||||
|
groupAndSortListItemsByFood(shoppingList.value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sortListItems(shoppingList.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const labeledItems = updateItemsByLabel(shoppingList.value);
|
||||||
|
if (labeledItems) {
|
||||||
|
itemsByLabel.value = labeledItems;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize data management
|
||||||
|
const dataManager = useShoppingListData(listId, shoppingList, loadingCounter);
|
||||||
|
const { isOffline, refresh: baseRefresh, startPolling, stopPolling, shoppingListItemActions } = dataManager;
|
||||||
|
|
||||||
|
const refresh = () => baseRefresh(updateListItemOrder);
|
||||||
|
|
||||||
|
// Initialize shopping list labels
|
||||||
|
const labels = useShoppingListLabels(shoppingList);
|
||||||
|
|
||||||
|
// Initialize copy functionality
|
||||||
|
const copyManager = useShoppingListCopy();
|
||||||
|
|
||||||
|
// Initialize CRUD operations
|
||||||
|
const crud = useShoppingListCrud(
|
||||||
|
shoppingList,
|
||||||
|
loadingCounter,
|
||||||
|
listItems,
|
||||||
|
shoppingListItemActions,
|
||||||
|
refresh,
|
||||||
|
sortCheckedItems,
|
||||||
|
updateListItemOrder,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Initialize recipe management
|
||||||
|
const recipes = useShoppingListRecipes(
|
||||||
|
shoppingList,
|
||||||
|
loadingCounter,
|
||||||
|
recipeReferenceLoading,
|
||||||
|
refresh,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle item reordering by label
|
||||||
|
function updateIndexUncheckedByLabel(labelName: string, labeledUncheckedItems: ShoppingListItemOut[]) {
|
||||||
|
if (!itemsByLabel.value[labelName]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update this label's item order
|
||||||
|
itemsByLabel.value[labelName] = labeledUncheckedItems;
|
||||||
|
|
||||||
|
// reset list order of all items
|
||||||
|
const allUncheckedItems: ShoppingListItemOut[] = [];
|
||||||
|
for (const labelKey in itemsByLabel.value) {
|
||||||
|
allUncheckedItems.push(...itemsByLabel.value[labelKey]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// since the user has manually reordered the list, we should preserve this order
|
||||||
|
preserveItemOrder.value = true;
|
||||||
|
|
||||||
|
// save changes
|
||||||
|
listItems.unchecked = allUncheckedItems;
|
||||||
|
listItems.checked = shoppingList.value?.listItems?.filter(item => item.checked) || [];
|
||||||
|
crud.updateUncheckedListItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dialog helpers
|
||||||
|
function openCheckAll() {
|
||||||
|
if (shoppingList.value?.listItems?.some(item => !item.checked)) {
|
||||||
|
state.state.checkAllDialog = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function openUncheckAll() {
|
||||||
|
if (shoppingList.value?.listItems?.some(item => item.checked)) {
|
||||||
|
state.state.uncheckAllDialog = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function openDeleteChecked() {
|
||||||
|
if (shoppingList.value?.listItems?.some(item => item.checked)) {
|
||||||
|
state.state.deleteCheckedDialog = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkAll() {
|
||||||
|
state.state.checkAllDialog = false;
|
||||||
|
crud.checkAllItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
function uncheckAll() {
|
||||||
|
state.state.uncheckAllDialog = false;
|
||||||
|
crud.uncheckAllItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteChecked() {
|
||||||
|
state.state.deleteCheckedDialog = false;
|
||||||
|
crud.deleteCheckedItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy functionality wrapper
|
||||||
|
function copyListItems(copyType: "plain" | "markdown") {
|
||||||
|
copyManager.copyListItems(itemsByLabel.value, copyType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label reordering helpers
|
||||||
|
function toggleReorderLabelsDialog() {
|
||||||
|
crud.toggleReorderLabelsDialog(state.reorderLabelsDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveLabelOrder() {
|
||||||
|
await crud.saveLabelOrder(() => {
|
||||||
|
const labeledItems = updateItemsByLabel(shoppingList.value!);
|
||||||
|
if (labeledItems) {
|
||||||
|
itemsByLabel.value = labeledItems;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lifecycle management
|
||||||
|
onMounted(() => {
|
||||||
|
startPolling(updateListItemOrder);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
stopPolling();
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
itemsByLabel,
|
||||||
|
isOffline,
|
||||||
|
|
||||||
|
// Sub-composables
|
||||||
|
...state,
|
||||||
|
...labels,
|
||||||
|
...crud,
|
||||||
|
...recipes,
|
||||||
|
|
||||||
|
// Specialized functions
|
||||||
|
updateIndexUncheckedByLabel,
|
||||||
|
copyListItems,
|
||||||
|
|
||||||
|
// Dialog actions
|
||||||
|
openCheckAll,
|
||||||
|
openUncheckAll,
|
||||||
|
openDeleteChecked,
|
||||||
|
checkAll,
|
||||||
|
uncheckAll,
|
||||||
|
deleteChecked,
|
||||||
|
|
||||||
|
// Label management
|
||||||
|
toggleReorderLabelsDialog,
|
||||||
|
saveLabelOrder,
|
||||||
|
|
||||||
|
// Data refresh
|
||||||
|
refresh,
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,18 +1,18 @@
|
||||||
import type { Composer } from "vue-i18n";
|
import type { Composer } from "vue-i18n";
|
||||||
import { useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
import { useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||||
import type { RecipeCookBook } from "~/lib/api/types/cookbook";
|
import type { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||||
|
|
||||||
const store: Ref<RecipeCookBook[]> = ref([]);
|
const store: Ref<ReadCookBook[]> = ref([]);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const publicLoading = ref(false);
|
const publicLoading = ref(false);
|
||||||
|
|
||||||
export const useCookbookStore = function (i18n?: Composer) {
|
export const useCookbookStore = function (i18n?: Composer) {
|
||||||
const api = useUserApi(i18n);
|
const api = useUserApi(i18n);
|
||||||
return useStore<RecipeCookBook>(store, loading, api.cookbooks);
|
return useStore<ReadCookBook>(store, loading, api.cookbooks);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const usePublicCookbookStore = function (groupSlug: string, i18n?: Composer) {
|
export const usePublicCookbookStore = function (groupSlug: string, i18n?: Composer) {
|
||||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||||
return useReadOnlyStore<RecipeCookBook>(store, publicLoading, api.cookbooks);
|
return useReadOnlyStore<ReadCookBook>(store, publicLoading, api.cookbooks);
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,7 +33,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Svenska (Swedish)",
|
name: "Svenska (Swedish)",
|
||||||
value: "sv-SE",
|
value: "sv-SE",
|
||||||
progress: 50,
|
progress: 52,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -57,7 +57,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Pусский (Russian)",
|
name: "Pусский (Russian)",
|
||||||
value: "ru-RU",
|
value: "ru-RU",
|
||||||
progress: 37,
|
progress: 40,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -75,13 +75,13 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Português do Brasil (Brazilian Portuguese)",
|
name: "Português do Brasil (Brazilian Portuguese)",
|
||||||
value: "pt-BR",
|
value: "pt-BR",
|
||||||
progress: 36,
|
progress: 41,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Polski (Polish)",
|
name: "Polski (Polish)",
|
||||||
value: "pl-PL",
|
value: "pl-PL",
|
||||||
progress: 39,
|
progress: 40,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -105,7 +105,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Lietuvių (Lithuanian)",
|
name: "Lietuvių (Lithuanian)",
|
||||||
value: "lt-LT",
|
value: "lt-LT",
|
||||||
progress: 27,
|
progress: 26,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -123,7 +123,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Italiano (Italian)",
|
name: "Italiano (Italian)",
|
||||||
value: "it-IT",
|
value: "it-IT",
|
||||||
progress: 38,
|
progress: 39,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -141,7 +141,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Hrvatski (Croatian)",
|
name: "Hrvatski (Croatian)",
|
||||||
value: "hr-HR",
|
value: "hr-HR",
|
||||||
progress: 28,
|
progress: 27,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -153,25 +153,25 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Galego (Galician)",
|
name: "Galego (Galician)",
|
||||||
value: "gl-ES",
|
value: "gl-ES",
|
||||||
progress: 38,
|
progress: 39,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Français (French)",
|
name: "Français (French)",
|
||||||
value: "fr-FR",
|
value: "fr-FR",
|
||||||
progress: 50,
|
progress: 52,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Français canadien (Canadian French)",
|
name: "Français canadien (Canadian French)",
|
||||||
value: "fr-CA",
|
value: "fr-CA",
|
||||||
progress: 37,
|
progress: 38,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Belge (Belgian)",
|
name: "Belge (Belgian)",
|
||||||
value: "fr-BE",
|
value: "fr-BE",
|
||||||
progress: 37,
|
progress: 36,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -213,19 +213,19 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "Deutsch (German)",
|
name: "Deutsch (German)",
|
||||||
value: "de-DE",
|
value: "de-DE",
|
||||||
progress: 65,
|
progress: 66,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Dansk (Danish)",
|
name: "Dansk (Danish)",
|
||||||
value: "da-DK",
|
value: "da-DK",
|
||||||
progress: 39,
|
progress: 40,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Čeština (Czech)",
|
name: "Čeština (Czech)",
|
||||||
value: "cs-CZ",
|
value: "cs-CZ",
|
||||||
progress: 40,
|
progress: 39,
|
||||||
dir: "ltr",
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -243,7 +243,7 @@ export const LOCALES = [
|
||||||
{
|
{
|
||||||
name: "العربية (Arabic)",
|
name: "العربية (Arabic)",
|
||||||
value: "ar-SA",
|
value: "ar-SA",
|
||||||
progress: 24,
|
progress: 23,
|
||||||
dir: "rtl",
|
dir: "rtl",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,7 +4,7 @@ import type { AutoFormItems } from "~/types/auto-forms";
|
||||||
export const useCommonSettingsForm = () => {
|
export const useCommonSettingsForm = () => {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
|
|
||||||
const commonSettingsForm: AutoFormItems = [
|
const commonSettingsForm = computed<AutoFormItems>(() => [
|
||||||
{
|
{
|
||||||
section: i18n.t("profile.group-settings"),
|
section: i18n.t("profile.group-settings"),
|
||||||
label: i18n.t("group.enable-public-access"),
|
label: i18n.t("group.enable-public-access"),
|
||||||
|
@ -21,7 +21,7 @@ export const useCommonSettingsForm = () => {
|
||||||
type: fieldTypes.BOOLEAN,
|
type: fieldTypes.BOOLEAN,
|
||||||
rules: ["required"],
|
rules: ["required"],
|
||||||
},
|
},
|
||||||
];
|
]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
commonSettingsForm,
|
commonSettingsForm,
|
||||||
|
|
|
@ -33,7 +33,6 @@ export interface UserRecipePreferences {
|
||||||
|
|
||||||
export interface UserShoppingListPreferences {
|
export interface UserShoppingListPreferences {
|
||||||
viewAllLists: boolean;
|
viewAllLists: boolean;
|
||||||
viewByLabel: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserTimelinePreferences {
|
export interface UserTimelinePreferences {
|
||||||
|
@ -96,8 +95,8 @@ export function useUserSortPreferences(): Ref<UserRecipePreferences> {
|
||||||
const fromStorage = useLocalStorage(
|
const fromStorage = useLocalStorage(
|
||||||
"recipe-section-preferences",
|
"recipe-section-preferences",
|
||||||
{
|
{
|
||||||
orderBy: "name",
|
orderBy: "created_at",
|
||||||
orderDirection: "asc",
|
orderDirection: "desc",
|
||||||
filterNull: false,
|
filterNull: false,
|
||||||
sortIcon: $globals.icons.sortAlphabeticalAscending,
|
sortIcon: $globals.icons.sortAlphabeticalAscending,
|
||||||
useMobileCards: false,
|
useMobileCards: false,
|
||||||
|
@ -129,7 +128,6 @@ export function useShoppingListPreferences(): Ref<UserShoppingListPreferences> {
|
||||||
"shopping-list-preferences",
|
"shopping-list-preferences",
|
||||||
{
|
{
|
||||||
viewAllLists: false,
|
viewAllLists: false,
|
||||||
viewByLabel: true,
|
|
||||||
},
|
},
|
||||||
{ mergeDefaults: true },
|
{ mergeDefaults: true },
|
||||||
// we cast to a Ref because by default it will return an optional type ref
|
// we cast to a Ref because by default it will return an optional type ref
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { useAsyncValidator } from "~/composables/use-validators";
|
import { useAsyncValidator } from "~/composables/use-validators";
|
||||||
import type { VForm } from "~/types/vuetify";
|
import type { VForm } from "~/types/auto-forms";
|
||||||
import { usePublicApi } from "~/composables/api/api-client";
|
import { usePublicApi } from "~/composables/api/api-client";
|
||||||
|
|
||||||
const domAccountForm = ref<VForm | null>(null);
|
const domAccountForm = ref<VForm | null>(null);
|
||||||
|
@ -13,11 +13,13 @@ const advancedOptions = ref(false);
|
||||||
export const useUserRegistrationForm = () => {
|
export const useUserRegistrationForm = () => {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
|
|
||||||
function safeValidate(form: Ref<VForm | null>) {
|
async function safeValidate(form: Ref<VForm | null>) {
|
||||||
if (form.value && form.value.validate) {
|
if (!form.value) {
|
||||||
return form.value.validate();
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
const result = await form.value.validate();
|
||||||
|
return result.valid;
|
||||||
}
|
}
|
||||||
// ================================================================
|
// ================================================================
|
||||||
// Provide Group Details
|
// Provide Group Details
|
||||||
|
@ -45,11 +47,15 @@ export const useUserRegistrationForm = () => {
|
||||||
email,
|
email,
|
||||||
advancedOptions,
|
advancedOptions,
|
||||||
validate: async () => {
|
validate: async () => {
|
||||||
if (!(validUsername.value && validEmail.value)) {
|
if (!validUsername.value || !validEmail.value) {
|
||||||
await Promise.all([validateUsername(), validateEmail()]);
|
await Promise.all([validateUsername(), validateEmail()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (safeValidate(domAccountForm as Ref<VForm>) && validUsername.value && validEmail.value);
|
if (!validUsername.value || !validEmail.value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await safeValidate(domAccountForm as Ref<VForm>);
|
||||||
},
|
},
|
||||||
reset: () => {
|
reset: () => {
|
||||||
accountDetails.username.value = "";
|
accountDetails.username.value = "";
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nuwe kennisgewing",
|
"new-notification": "Nuwe kennisgewing",
|
||||||
"event-notifiers": "Gebeurteniskennisgewers",
|
"event-notifiers": "Gebeurteniskennisgewers",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (oorgeslaan indien leeg)",
|
"apprise-url-skipped-if-blank": "Apprise URL (oorgeslaan indien leeg)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Aktiveer kennisgewer",
|
"enable-notifier": "Aktiveer kennisgewer",
|
||||||
"what-events": "Op watter gebeurtenisse moet hierdie kennisgewing inteken?",
|
"what-events": "Op watter gebeurtenisse moet hierdie kennisgewing inteken?",
|
||||||
"user-events": "Gebruikersgebeurtenisse",
|
"user-events": "Gebruikersgebeurtenisse",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Merker gebeurtenisse",
|
"tag-events": "Merker gebeurtenisse",
|
||||||
"category-events": "Kategorie Gebeurtenisse",
|
"category-events": "Kategorie Gebeurtenisse",
|
||||||
"when-a-new-user-joins-your-group": "Wanneer 'n nuwe gebruiker by jou groep aansluit",
|
"when-a-new-user-joins-your-group": "Wanneer 'n nuwe gebruiker by jou groep aansluit",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Groep besonderhede",
|
"group-details": "Groep besonderhede",
|
||||||
"group-details-description": "Voordat jy 'n rekening skep, moet jy eers 'n groep skep. Jy sal die enigste lid van die groep wees, maar jy kan later ander nooi. Lede van jou groep kan maaltydplanne, inkopielyste, resepte en meer deel!",
|
"group-details-description": "Voordat jy 'n rekening skep, moet jy eers 'n groep skep. Jy sal die enigste lid van die groep wees, maar jy kan later ander nooi. Lede van jou groep kan maaltydplanne, inkopielyste, resepte en meer deel!",
|
||||||
"use-seed-data": "Gebruik voorbeelddata",
|
"use-seed-data": "Gebruik voorbeelddata",
|
||||||
"use-seed-data-description": "Mealie bevat 'n versameling bestanddele, eenhede en etikette wat gebruik kan word om jou groep met nuttige data te vul om jou resepte te organiseer.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Rekening besonderhede"
|
"account-details": "Rekening besonderhede"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "إشعار جديد",
|
"new-notification": "إشعار جديد",
|
||||||
"event-notifiers": "إشعار الحدث",
|
"event-notifiers": "إشعار الحدث",
|
||||||
"apprise-url-skipped-if-blank": "الرابط Apprise (يتم تجاهله إذا ما كان فارغً)",
|
"apprise-url-skipped-if-blank": "الرابط Apprise (يتم تجاهله إذا ما كان فارغً)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "تفعيل الإشعارات",
|
"enable-notifier": "تفعيل الإشعارات",
|
||||||
"what-events": "ما هي الأحداث التي يجب على هذا المخدم أن يستجيب لها؟",
|
"what-events": "ما هي الأحداث التي يجب على هذا المخدم أن يستجيب لها؟",
|
||||||
"user-events": "أحداث المستخدمين",
|
"user-events": "أحداث المستخدمين",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "أحداث الوسم",
|
"tag-events": "أحداث الوسم",
|
||||||
"category-events": "أحداث الفئة",
|
"category-events": "أحداث الفئة",
|
||||||
"when-a-new-user-joins-your-group": "عندما ينضم مستخدم جديد إلى مجموعتك",
|
"when-a-new-user-joins-your-group": "عندما ينضم مستخدم جديد إلى مجموعتك",
|
||||||
"recipe-events": "وصفات المناسبات"
|
"recipe-events": "وصفات المناسبات",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "أضف",
|
"add": "أضف",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "مكونات إضافية",
|
"not-linked-ingredients": "مكونات إضافية",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "البحث عن الوصفات",
|
"recipe-finder": "البحث عن الوصفات",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "تفاصيل المجموعة",
|
"group-details": "تفاصيل المجموعة",
|
||||||
"group-details-description": "قبل إنشاء حساب ستحتاج إلى إنشاء مجموعة. المجموعة الخاصة بك سوف تحتوي عليك فقط، ولكن ستتمكن من دعوة الآخرين لاحقاً. يمكن لأعضاء مجموعتك مشاركة خطط الوجبات وقوائم التسوق والوصفات، والمزيد!",
|
"group-details-description": "قبل إنشاء حساب ستحتاج إلى إنشاء مجموعة. المجموعة الخاصة بك سوف تحتوي عليك فقط، ولكن ستتمكن من دعوة الآخرين لاحقاً. يمكن لأعضاء مجموعتك مشاركة خطط الوجبات وقوائم التسوق والوصفات، والمزيد!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"use-seed-data": "Use Seed Data",
|
||||||
"use-seed-data-description": "Mealie يأتي بمجموعة من الأطعمة والوحدات والعلامات التي يمكن استخدامها لتزويد مجموعتك ببيانات مفيدة لتنظيم وصفاتك.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "تفاصيل الحساب"
|
"account-details": "تفاصيل الحساب"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Ново известие",
|
"new-notification": "Ново известие",
|
||||||
"event-notifiers": "Известия за събитие",
|
"event-notifiers": "Известия за събитие",
|
||||||
"apprise-url-skipped-if-blank": "URL за известяване (пропуска се ако е празно)",
|
"apprise-url-skipped-if-blank": "URL за известяване (пропуска се ако е празно)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Включи известията",
|
"enable-notifier": "Включи известията",
|
||||||
"what-events": "За кои събития трябва да се получават известия?",
|
"what-events": "За кои събития трябва да се получават известия?",
|
||||||
"user-events": "Потребителски събития",
|
"user-events": "Потребителски събития",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "История на етикетите",
|
"tag-events": "История на етикетите",
|
||||||
"category-events": "Събития за категория",
|
"category-events": "Събития за категория",
|
||||||
"when-a-new-user-joins-your-group": "Когато потребител се присъедини към твоята потребителска група",
|
"when-a-new-user-joins-your-group": "Когато потребител се присъедини към твоята потребителска група",
|
||||||
"recipe-events": "Събития на рецептата"
|
"recipe-events": "Събития на рецептата",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Добави",
|
"add": "Добави",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Подробности за групата",
|
"group-details": "Подробности за групата",
|
||||||
"group-details-description": "Преди да създадете акаунт, ще трябва да създадете група. Вашата група ще съдържа само Вас, но ще можете да поканите други по-късно. Членовете във вашата група могат да споделят планове за хранене, списъци за пазаруване, рецепти и други!",
|
"group-details-description": "Преди да създадете акаунт, ще трябва да създадете група. Вашата група ще съдържа само Вас, но ще можете да поканите други по-късно. Членовете във вашата група могат да споделят планове за хранене, списъци за пазаруване, рецепти и други!",
|
||||||
"use-seed-data": "Използвай предварителни данни",
|
"use-seed-data": "Използвай предварителни данни",
|
||||||
"use-seed-data-description": "Mealie се доставя с колекция от продукти, мерни единици и етикети за попълване на Вашата група с полезни данни за организиране на рецептите.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Подробни данни за акаунта"
|
"account-details": "Подробни данни за акаунта"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nova notificació",
|
"new-notification": "Nova notificació",
|
||||||
"event-notifiers": "Notificacions d'esdeveniments",
|
"event-notifiers": "Notificacions d'esdeveniments",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (si es deixa buit, s'ignorarà)",
|
"apprise-url-skipped-if-blank": "Apprise URL (si es deixa buit, s'ignorarà)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Habilita la notificació",
|
"enable-notifier": "Habilita la notificació",
|
||||||
"what-events": "Què esdeveniments vols que utilitzen aquest notificador?",
|
"what-events": "Què esdeveniments vols que utilitzen aquest notificador?",
|
||||||
"user-events": "Esdeveniments d'usuari",
|
"user-events": "Esdeveniments d'usuari",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Esdeveniments de les etiquetes",
|
"tag-events": "Esdeveniments de les etiquetes",
|
||||||
"category-events": "Esdeveniments de les categories",
|
"category-events": "Esdeveniments de les categories",
|
||||||
"when-a-new-user-joins-your-group": "Quan un nou usuari s'afegeix al grup",
|
"when-a-new-user-joins-your-group": "Quan un nou usuari s'afegeix al grup",
|
||||||
"recipe-events": "Esdeveniments de receptes"
|
"recipe-events": "Esdeveniments de receptes",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Afegeix",
|
"add": "Afegeix",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ingredients addicionals",
|
"not-linked-ingredients": "Ingredients addicionals",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Cercador de receptes",
|
"recipe-finder": "Cercador de receptes",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalls del grup",
|
"group-details": "Detalls del grup",
|
||||||
"group-details-description": "Abans de crear un compte heu de crear un grup. Al grup només hi serà vostè, però després podeu convidar d'altres. Els membres d'un grup poden compartir menús, llistes de la compra, receptes i molt més!",
|
"group-details-description": "Abans de crear un compte heu de crear un grup. Al grup només hi serà vostè, però després podeu convidar d'altres. Els membres d'un grup poden compartir menús, llistes de la compra, receptes i molt més!",
|
||||||
"use-seed-data": "Afegiu dades predeterminades",
|
"use-seed-data": "Afegiu dades predeterminades",
|
||||||
"use-seed-data-description": "Mealie ve configurat amb una col·lecció d'aliments, unitats i etiquetes que poden ser emprades pel vostre grup per a ajudar-vos a organitzar les vostres receptes.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalls del compte"
|
"account-details": "Detalls del compte"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nové oznámení",
|
"new-notification": "Nové oznámení",
|
||||||
"event-notifiers": "Notifikace událostí",
|
"event-notifiers": "Notifikace událostí",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (přeskočeno pokud je prázdné)",
|
"apprise-url-skipped-if-blank": "Apprise URL (přeskočeno pokud je prázdné)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Povolit notifikaci",
|
"enable-notifier": "Povolit notifikaci",
|
||||||
"what-events": "K jakým událostem by se měl tento oznamovatel přihlásit?",
|
"what-events": "K jakým událostem by se měl tento oznamovatel přihlásit?",
|
||||||
"user-events": "Uživatelské události",
|
"user-events": "Uživatelské události",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Události tagu",
|
"tag-events": "Události tagu",
|
||||||
"category-events": "Události kategorie",
|
"category-events": "Události kategorie",
|
||||||
"when-a-new-user-joins-your-group": "Když se nový uživatel připojí do vaší skupiny",
|
"when-a-new-user-joins-your-group": "Když se nový uživatel připojí do vaší skupiny",
|
||||||
"recipe-events": "Události receptu"
|
"recipe-events": "Události receptu",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Přidat",
|
"add": "Přidat",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Další ingredience",
|
"not-linked-ingredients": "Další ingredience",
|
||||||
"upload-another-image": "Nahrát další obrázek",
|
"upload-another-image": "Nahrát další obrázek",
|
||||||
"upload-images": "Nahrát obrázky",
|
"upload-images": "Nahrát obrázky",
|
||||||
"upload-more-images": "Nahrát více obrázků"
|
"upload-more-images": "Nahrát více obrázků",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Vyhledávač receptů",
|
"recipe-finder": "Vyhledávač receptů",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Podrobnosti o skupině",
|
"group-details": "Podrobnosti o skupině",
|
||||||
"group-details-description": "Než vytvoříte svůj účet, musíte vytvořit skupinu. Vaše skupina bude obsahovat pouze vás, ale později budete moct přizvat jiné uživatele. Členové vaší skupiny mohou sdílet jídelníčky, nákupní seznamy, recepty a další!",
|
"group-details-description": "Než vytvoříte svůj účet, musíte vytvořit skupinu. Vaše skupina bude obsahovat pouze vás, ale později budete moct přizvat jiné uživatele. Členové vaší skupiny mohou sdílet jídelníčky, nákupní seznamy, recepty a další!",
|
||||||
"use-seed-data": "Použít Seed Data",
|
"use-seed-data": "Použít Seed Data",
|
||||||
"use-seed-data-description": "Mealie obsahuje kolekci potravin, jednotek a popisků, které můžete použít ve své skupině pro organizování svých receptů.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Podrobnosti účtu"
|
"account-details": "Podrobnosti účtu"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Ny notifikation",
|
"new-notification": "Ny notifikation",
|
||||||
"event-notifiers": "Notifikation om begivenheder",
|
"event-notifiers": "Notifikation om begivenheder",
|
||||||
"apprise-url-skipped-if-blank": "Informations link (sprunget over hvis ladet være tomt)",
|
"apprise-url-skipped-if-blank": "Informations link (sprunget over hvis ladet være tomt)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Aktiver Notifikationer",
|
"enable-notifier": "Aktiver Notifikationer",
|
||||||
"what-events": "Hvilke begivenheder skal denne anmelder abonnere på?",
|
"what-events": "Hvilke begivenheder skal denne anmelder abonnere på?",
|
||||||
"user-events": "Brugerhændelser",
|
"user-events": "Brugerhændelser",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tagbegivenheder",
|
"tag-events": "Tagbegivenheder",
|
||||||
"category-events": "Kategoribegivenheder",
|
"category-events": "Kategoribegivenheder",
|
||||||
"when-a-new-user-joins-your-group": "Når en ny bruger slutter sig til din gruppe",
|
"when-a-new-user-joins-your-group": "Når en ny bruger slutter sig til din gruppe",
|
||||||
"recipe-events": "Hændelser for opskrifter"
|
"recipe-events": "Hændelser for opskrifter",
|
||||||
|
"label-events": "Navn på begivenheder"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Tilføj",
|
"add": "Tilføj",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Yderligere ingredienser",
|
"not-linked-ingredients": "Yderligere ingredienser",
|
||||||
"upload-another-image": "Upload et andet billede",
|
"upload-another-image": "Upload et andet billede",
|
||||||
"upload-images": "Upload billeder",
|
"upload-images": "Upload billeder",
|
||||||
"upload-more-images": "Upload flere billeder"
|
"upload-more-images": "Upload flere billeder",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Opskriftssøger",
|
"recipe-finder": "Opskriftssøger",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Gruppeoplysninger",
|
"group-details": "Gruppeoplysninger",
|
||||||
"group-details-description": "Før du opretter en konto, skal du oprette en gruppe. Din gruppe vil kun indeholde dig, men du vil kunne invitere andre senere. Medlemmer i din gruppe kan dele madplaner, indkøbslister, opskrifter og meget mere!",
|
"group-details-description": "Før du opretter en konto, skal du oprette en gruppe. Din gruppe vil kun indeholde dig, men du vil kunne invitere andre senere. Medlemmer i din gruppe kan dele madplaner, indkøbslister, opskrifter og meget mere!",
|
||||||
"use-seed-data": "Anved standard data",
|
"use-seed-data": "Anved standard data",
|
||||||
"use-seed-data-description": "Mealie indeholder som standard en samling af fødevarer, enheder og etiketter, som du kan bruge til at oprette og organisere dine opskrifter.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Kontodetaljer"
|
"account-details": "Kontodetaljer"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Neue Benachrichtigung",
|
"new-notification": "Neue Benachrichtigung",
|
||||||
"event-notifiers": "Ereignis-Benachrichtigungen",
|
"event-notifiers": "Ereignis-Benachrichtigungen",
|
||||||
"apprise-url-skipped-if-blank": "Apprise-URL (wird übersprungen, wenn leer)",
|
"apprise-url-skipped-if-blank": "Apprise-URL (wird übersprungen, wenn leer)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Benachrichtigen aktivieren",
|
"enable-notifier": "Benachrichtigen aktivieren",
|
||||||
"what-events": "Welche Ereignisse soll diese Benachrichtigung abonnieren?",
|
"what-events": "Welche Ereignisse soll diese Benachrichtigung abonnieren?",
|
||||||
"user-events": "Benutzer-Ereignisse",
|
"user-events": "Benutzer-Ereignisse",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Schlagwort-Ereignisse",
|
"tag-events": "Schlagwort-Ereignisse",
|
||||||
"category-events": "Kategorie-Ereignisse",
|
"category-events": "Kategorie-Ereignisse",
|
||||||
"when-a-new-user-joins-your-group": "Wenn ein neuer Benutzer deiner Gruppe beitritt",
|
"when-a-new-user-joins-your-group": "Wenn ein neuer Benutzer deiner Gruppe beitritt",
|
||||||
"recipe-events": "Rezept-Ereignisse"
|
"recipe-events": "Rezept-Ereignisse",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Hinzufügen",
|
"add": "Hinzufügen",
|
||||||
|
@ -215,7 +217,7 @@
|
||||||
"organizers": "Organisieren",
|
"organizers": "Organisieren",
|
||||||
"caution": "Vorsicht",
|
"caution": "Vorsicht",
|
||||||
"show-advanced": "Erweiterte Optionen anzeigen",
|
"show-advanced": "Erweiterte Optionen anzeigen",
|
||||||
"add-field": "Feld Hinzufügen",
|
"add-field": "Bedingung hinzufügen",
|
||||||
"date-created": "Erstellungsdatum",
|
"date-created": "Erstellungsdatum",
|
||||||
"date-updated": "Aktualisiert am"
|
"date-updated": "Aktualisiert am"
|
||||||
},
|
},
|
||||||
|
@ -583,7 +585,7 @@
|
||||||
"added-to-timeline": "Zur Zeitleiste hinzugefügt",
|
"added-to-timeline": "Zur Zeitleiste hinzugefügt",
|
||||||
"failed-to-add-to-timeline": "Fehler beim Hinzufügen zur Zeitleiste",
|
"failed-to-add-to-timeline": "Fehler beim Hinzufügen zur Zeitleiste",
|
||||||
"failed-to-update-recipe": "Fehler beim Aktualisieren des Rezepts",
|
"failed-to-update-recipe": "Fehler beim Aktualisieren des Rezepts",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Zur Zeitleiste hinzugefügt, Bild hinzufügen fehlgeschlagen",
|
"added-to-timeline-but-failed-to-add-image": "Zum Verlauf hinzugefügt, Bild hinzufügen fehlgeschlagen",
|
||||||
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Key-Value-Paare zu einem Rezept zu erstellen, um Drittanbieter-Anwendungen zu steuern. Du kannst diese dazu verwenden, um Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an bestimmte Geräte zu senden.",
|
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Key-Value-Paare zu einem Rezept zu erstellen, um Drittanbieter-Anwendungen zu steuern. Du kannst diese dazu verwenden, um Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an bestimmte Geräte zu senden.",
|
||||||
"message-key": "Nachrichten-Schlüssel",
|
"message-key": "Nachrichten-Schlüssel",
|
||||||
"parse": "Parsen",
|
"parse": "Parsen",
|
||||||
|
@ -672,11 +674,13 @@
|
||||||
"not-linked-ingredients": "Zusätzliche Zutaten",
|
"not-linked-ingredients": "Zusätzliche Zutaten",
|
||||||
"upload-another-image": "Weiteres Bild hochladen",
|
"upload-another-image": "Weiteres Bild hochladen",
|
||||||
"upload-images": "Bilder hochladen",
|
"upload-images": "Bilder hochladen",
|
||||||
"upload-more-images": "Weitere Bilder hochladen"
|
"upload-more-images": "Weitere Bilder hochladen",
|
||||||
|
"set-as-cover-image": "Als Rezept-Titelbild setzen",
|
||||||
|
"cover-image": "Titelbild"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Rezept-Suche",
|
"recipe-finder": "Rezept-Suche",
|
||||||
"recipe-finder-description": "Suche nach Rezepten basierend auf den Zutaten, die du zur Hand hast. Sie können auch nach verfügbaren Werkzeugen filtern und eine maximale Anzahl an fehlenden Zutaten oder Werkzeugen festlegen.",
|
"recipe-finder-description": "Suche nach Rezepten basierend auf den Zutaten, die du zur Hand hast. Du kannst auch nach verfügbaren Werkzeugen filtern und eine maximale Anzahl an fehlenden Zutaten oder Werkzeugen festlegen.",
|
||||||
"selected-ingredients": "Ausgewählte Zutaten",
|
"selected-ingredients": "Ausgewählte Zutaten",
|
||||||
"no-ingredients-selected": "Keine Zutaten ausgewählt",
|
"no-ingredients-selected": "Keine Zutaten ausgewählt",
|
||||||
"missing": "Fehlend",
|
"missing": "Fehlend",
|
||||||
|
@ -907,7 +911,7 @@
|
||||||
"migrations": "Migrationen",
|
"migrations": "Migrationen",
|
||||||
"profile": "Profil",
|
"profile": "Profil",
|
||||||
"search": "Suche",
|
"search": "Suche",
|
||||||
"site-settings": "Einstellungen",
|
"site-settings": "Systemeinstellungen",
|
||||||
"tags": "Schlagworte",
|
"tags": "Schlagworte",
|
||||||
"toolbox": "Werkzeuge",
|
"toolbox": "Werkzeuge",
|
||||||
"language": "Sprache",
|
"language": "Sprache",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Gruppendetails",
|
"group-details": "Gruppendetails",
|
||||||
"group-details-description": "Bevor du ein Konto erstellst, musst du eine Gruppe erstellen. Deine Gruppe wird nur dich enthalten, aber du kannst andere später einladen. Mitglieder in deiner Gruppe können Essenspläne, Einkaufslisten, Rezepte und vieles mehr teilen!",
|
"group-details-description": "Bevor du ein Konto erstellst, musst du eine Gruppe erstellen. Deine Gruppe wird nur dich enthalten, aber du kannst andere später einladen. Mitglieder in deiner Gruppe können Essenspläne, Einkaufslisten, Rezepte und vieles mehr teilen!",
|
||||||
"use-seed-data": "Musterdaten",
|
"use-seed-data": "Musterdaten",
|
||||||
"use-seed-data-description": "Mealie enthält eine Sammlung von Lebensmitteln, Maßeinheiten und Kategorien, die verwendet werden können, um deine Gruppe mit hilfreichen Daten für die Organisation deiner Rezepte zu füllen.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Kontoinformationen"
|
"account-details": "Kontoinformationen"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Νέα ειδοποίηση",
|
"new-notification": "Νέα ειδοποίηση",
|
||||||
"event-notifiers": "Ειδοποιητές Συμβάντος",
|
"event-notifiers": "Ειδοποιητές Συμβάντος",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (παραλείπεται αν είναι κενό)",
|
"apprise-url-skipped-if-blank": "Apprise URL (παραλείπεται αν είναι κενό)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Δεδομένου ότι οι διευθύνσεις URL Apprise περιέχουν συνήθως ευαίσθητες πληροφορίες, το πεδίο αυτό παραμένει σκόπιμα κενό κατά την επεξεργασία. Αν θέλετε να ενημερώσετε το URL, παρακαλώ εισάγετε το νέο εδώ, αλλιώς αφήστε το κενό για να διατηρήσετε την τρέχουσα διεύθυνση URL.",
|
||||||
"enable-notifier": "Ενεργοποίηση ειδοποιητή",
|
"enable-notifier": "Ενεργοποίηση ειδοποιητή",
|
||||||
"what-events": "Σε ποια συμβάντα θα πρέπει να εγγραφεί αυτός ο ειδοποιητής;",
|
"what-events": "Σε ποια συμβάντα θα πρέπει να εγγραφεί αυτός ο ειδοποιητής;",
|
||||||
"user-events": "Συμβάντα Χρήστη",
|
"user-events": "Συμβάντα Χρήστη",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Συμβάντα ετικέτας",
|
"tag-events": "Συμβάντα ετικέτας",
|
||||||
"category-events": "Συμβάντα κατηγορίας",
|
"category-events": "Συμβάντα κατηγορίας",
|
||||||
"when-a-new-user-joins-your-group": "Οταν ένας νέος χρήστης ενταχθεί στην ομάδα σας",
|
"when-a-new-user-joins-your-group": "Οταν ένας νέος χρήστης ενταχθεί στην ομάδα σας",
|
||||||
"recipe-events": "Συμβάντα συνταγών"
|
"recipe-events": "Συμβάντα συνταγών",
|
||||||
|
"label-events": "Ετικέτα συμβάντων"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Προσθήκη",
|
"add": "Προσθήκη",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Πρόσθετα συστατικά",
|
"not-linked-ingredients": "Πρόσθετα συστατικά",
|
||||||
"upload-another-image": "Ανέβασμα άλλης εικόνας",
|
"upload-another-image": "Ανέβασμα άλλης εικόνας",
|
||||||
"upload-images": "Ανέβασμα εικόνων",
|
"upload-images": "Ανέβασμα εικόνων",
|
||||||
"upload-more-images": "Ανέβασμα περισσότερων εικόνων"
|
"upload-more-images": "Ανέβασμα περισσότερων εικόνων",
|
||||||
|
"set-as-cover-image": "Ορισμός ως εικόνα εξώφυλλου συνταγής",
|
||||||
|
"cover-image": "Εικόνα εξώφυλλου"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Εύρεση συνταγών",
|
"recipe-finder": "Εύρεση συνταγών",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Λεπτομέρειες ομάδας",
|
"group-details": "Λεπτομέρειες ομάδας",
|
||||||
"group-details-description": "Πριν δημιουργήσετε ένα λογαριασμό θα πρέπει να δημιουργήσετε μια ομάδα. Η ομάδα σας θα περιέχει μόνο εσάς, αλλά θα μπορείτε να προσκαλέσετε άλλους αργότερα. Μέλη της ομάδας σας μπορούν να μοιραστούν προγράμματα γευμάτων, λίστες για ψώνια, συνταγές και πολλά άλλα!",
|
"group-details-description": "Πριν δημιουργήσετε ένα λογαριασμό θα πρέπει να δημιουργήσετε μια ομάδα. Η ομάδα σας θα περιέχει μόνο εσάς, αλλά θα μπορείτε να προσκαλέσετε άλλους αργότερα. Μέλη της ομάδας σας μπορούν να μοιραστούν προγράμματα γευμάτων, λίστες για ψώνια, συνταγές και πολλά άλλα!",
|
||||||
"use-seed-data": "Χρήση δεδομένων από τροφοδοσία",
|
"use-seed-data": "Χρήση δεδομένων από τροφοδοσία",
|
||||||
"use-seed-data-description": "Το Mealie έρχεται με μια συλλογή Τροφίμων, Μονάδων και Ετικετών που μπορούν να χρησιμοποιηθούν για τη συμπλήρωση της ομάδας σας με χρήσιμα δεδομένα για την οργάνωση των συνταγών σας.",
|
"use-seed-data-description": "Το Mealie έρχεται με μια συλλογή Τροφίμων, Μονάδων και Ετικετών που μπορούν να χρησιμοποιηθούν για τη συμπλήρωση της ομάδας σας με χρήσιμα δεδομένα για την οργάνωση των συνταγών σας. Αυτά είναι μεταφρασμένα στη γλώσσα που έχετε επιλέξει. Μπορείτε πάντα να προσθέσετε ή να τροποποιήσετε αυτά τα δεδομένα αργότερα.",
|
||||||
"account-details": "Λεπτομέρειες λογαριασμού"
|
"account-details": "Λεπτομέρειες λογαριασμού"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "New Notification",
|
"new-notification": "New Notification",
|
||||||
"event-notifiers": "Event Notifiers",
|
"event-notifiers": "Event Notifiers",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Enable Notifier",
|
"enable-notifier": "Enable Notifier",
|
||||||
"what-events": "What events should this notifier subscribe to?",
|
"what-events": "What events should this notifier subscribe to?",
|
||||||
"user-events": "User Events",
|
"user-events": "User Events",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tag Events",
|
"tag-events": "Tag Events",
|
||||||
"category-events": "Category Events",
|
"category-events": "Category Events",
|
||||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "New Notification",
|
"new-notification": "New Notification",
|
||||||
"event-notifiers": "Event Notifiers",
|
"event-notifiers": "Event Notifiers",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Enable Notifier",
|
"enable-notifier": "Enable Notifier",
|
||||||
"what-events": "What events should this notifier subscribe to?",
|
"what-events": "What events should this notifier subscribe to?",
|
||||||
"user-events": "User Events",
|
"user-events": "User Events",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tag Events",
|
"tag-events": "Tag Events",
|
||||||
"category-events": "Category Events",
|
"category-events": "Category Events",
|
||||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nueva notificación",
|
"new-notification": "Nueva notificación",
|
||||||
"event-notifiers": "Notificaciones de eventos",
|
"event-notifiers": "Notificaciones de eventos",
|
||||||
"apprise-url-skipped-if-blank": "URL de Apprise (omitida si está en blanco)",
|
"apprise-url-skipped-if-blank": "URL de Apprise (omitida si está en blanco)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Habilitar notificador",
|
"enable-notifier": "Habilitar notificador",
|
||||||
"what-events": "¿A qué eventos debe suscribirse este notificador?",
|
"what-events": "¿A qué eventos debe suscribirse este notificador?",
|
||||||
"user-events": "Eventos de los usuarios",
|
"user-events": "Eventos de los usuarios",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Eventos de etiqueta",
|
"tag-events": "Eventos de etiqueta",
|
||||||
"category-events": "Eventos de Categoría",
|
"category-events": "Eventos de Categoría",
|
||||||
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo",
|
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo",
|
||||||
"recipe-events": "Eventos de receta"
|
"recipe-events": "Eventos de receta",
|
||||||
|
"label-events": "Eventos de etiqueta"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Agregar",
|
"add": "Agregar",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ingredientes adicionales",
|
"not-linked-ingredients": "Ingredientes adicionales",
|
||||||
"upload-another-image": "Subir otra imagen",
|
"upload-another-image": "Subir otra imagen",
|
||||||
"upload-images": "Subir imágenes",
|
"upload-images": "Subir imágenes",
|
||||||
"upload-more-images": "Subir más imágenes"
|
"upload-more-images": "Subir más imágenes",
|
||||||
|
"set-as-cover-image": "Establecer como imagen de portada de receta",
|
||||||
|
"cover-image": "Imagen de portada"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Buscador de recetas",
|
"recipe-finder": "Buscador de recetas",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalles del grupo",
|
"group-details": "Detalles del grupo",
|
||||||
"group-details-description": "Antes de crear una cuenta, debe crear un grupo. En el grupo sólo estará usted, pero puede invitar a otros más tarde. Los miembros de un grupo pueden compartir menús, listas de la compra, recetas y más...",
|
"group-details-description": "Antes de crear una cuenta, debe crear un grupo. En el grupo sólo estará usted, pero puede invitar a otros más tarde. Los miembros de un grupo pueden compartir menús, listas de la compra, recetas y más...",
|
||||||
"use-seed-data": "Utilizar datos de ejemplo",
|
"use-seed-data": "Utilizar datos de ejemplo",
|
||||||
"use-seed-data-description": "Mealie incluye una colección de alimentos, unidades y etiquetas, que puede utilizar como ejemplo en su grupo, para ayudarle a organizar sus recetas.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Información de la cuenta"
|
"account-details": "Información de la cuenta"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Uus teade",
|
"new-notification": "Uus teade",
|
||||||
"event-notifiers": "Sündmuste märguanded",
|
"event-notifiers": "Sündmuste märguanded",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (kui on tühi, jäetakse vahele)",
|
"apprise-url-skipped-if-blank": "Apprise URL (kui on tühi, jäetakse vahele)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Luba teavitaja",
|
"enable-notifier": "Luba teavitaja",
|
||||||
"what-events": "Millised sündmused peaks see teavitaja tellimaa?",
|
"what-events": "Millised sündmused peaks see teavitaja tellimaa?",
|
||||||
"user-events": "Kasutaja sündmused",
|
"user-events": "Kasutaja sündmused",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Märksõna sündmused",
|
"tag-events": "Märksõna sündmused",
|
||||||
"category-events": "Kategooria sündmused",
|
"category-events": "Kategooria sündmused",
|
||||||
"when-a-new-user-joins-your-group": "Kui uus kasutaja liitub sinu grupiga",
|
"when-a-new-user-joins-your-group": "Kui uus kasutaja liitub sinu grupiga",
|
||||||
"recipe-events": "Retsepti sündmused"
|
"recipe-events": "Retsepti sündmused",
|
||||||
|
"label-events": "Sildista sündmused"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Lisa",
|
"add": "Lisa",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Lisa-koostisosad",
|
"not-linked-ingredients": "Lisa-koostisosad",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Retsepti otsing",
|
"recipe-finder": "Retsepti otsing",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Grupi detailid",
|
"group-details": "Grupi detailid",
|
||||||
"group-details-description": "Sa pead looma grupi enne konto loomist. Sinu grupis oled vaid sina, kuid sa saad kutsuda teisi sinna hiljem. Su grupi liikmed saavad jagada toitumisplaane, ostunimekirju, retsepte ja muud!",
|
"group-details-description": "Sa pead looma grupi enne konto loomist. Sinu grupis oled vaid sina, kuid sa saad kutsuda teisi sinna hiljem. Su grupi liikmed saavad jagada toitumisplaane, ostunimekirju, retsepte ja muud!",
|
||||||
"use-seed-data": "Kasuta baasandmete infot.",
|
"use-seed-data": "Kasuta baasandmete infot.",
|
||||||
"use-seed-data-description": "Mealsiga on kaasas toiduainete, ühikute ja siltide kogu, mida saate kasutada oma rühma täitmiseks kasuliku teabega retseptide korraldamiseks.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Konto üksikasjad"
|
"account-details": "Konto üksikasjad"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Uusi ilmoitus",
|
"new-notification": "Uusi ilmoitus",
|
||||||
"event-notifiers": "Tapahtumien ilmoitukset",
|
"event-notifiers": "Tapahtumien ilmoitukset",
|
||||||
"apprise-url-skipped-if-blank": "Ilmoitusverkko-osoite (voi jättää tyhjäksi)",
|
"apprise-url-skipped-if-blank": "Ilmoitusverkko-osoite (voi jättää tyhjäksi)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Ota ilmoittaja käyttöön",
|
"enable-notifier": "Ota ilmoittaja käyttöön",
|
||||||
"what-events": "Mistä tapahtumista tulisi ilmoittaa?",
|
"what-events": "Mistä tapahtumista tulisi ilmoittaa?",
|
||||||
"user-events": "Käyttäjän tapahtumat",
|
"user-events": "Käyttäjän tapahtumat",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Valitse tapahtumat",
|
"tag-events": "Valitse tapahtumat",
|
||||||
"category-events": "Luokkatapahtumat",
|
"category-events": "Luokkatapahtumat",
|
||||||
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen",
|
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen",
|
||||||
"recipe-events": "Reseptitapahtumat"
|
"recipe-events": "Reseptitapahtumat",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Lisää",
|
"add": "Lisää",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Muut ainesosat",
|
"not-linked-ingredients": "Muut ainesosat",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Reseptin etsijä",
|
"recipe-finder": "Reseptin etsijä",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Ryhmän tiedot",
|
"group-details": "Ryhmän tiedot",
|
||||||
"group-details-description": "Ennen kuin luot tilin, sinun on luotava ryhmä. Ryhmässäsi on vain sinä, mutta voit kutsua muita myöhemmin. Ryhmäsi jäsenet voivat jakaa ateriasuunnitelmia, ostoslistoja, reseptejä ja paljon muuta!",
|
"group-details-description": "Ennen kuin luot tilin, sinun on luotava ryhmä. Ryhmässäsi on vain sinä, mutta voit kutsua muita myöhemmin. Ryhmäsi jäsenet voivat jakaa ateriasuunnitelmia, ostoslistoja, reseptejä ja paljon muuta!",
|
||||||
"use-seed-data": "Käytä pohjatietoja",
|
"use-seed-data": "Käytä pohjatietoja",
|
||||||
"use-seed-data-description": "Mealien mukana toimitetaan kokoelma elintarvikkeita, yksiköitä ja tarroja, joiden avulla voit täyttää ryhmäsi hyödyllisillä tiedoilla reseptien järjestämiseen.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Tilitiedot"
|
"account-details": "Tilitiedot"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nouvelle notification",
|
"new-notification": "Nouvelle notification",
|
||||||
"event-notifiers": "Notifications d'événements",
|
"event-notifiers": "Notifications d'événements",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activer la notification",
|
"enable-notifier": "Activer la notification",
|
||||||
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
||||||
"user-events": "Evénements utilisateur",
|
"user-events": "Evénements utilisateur",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Événements des mots-clés",
|
"tag-events": "Événements des mots-clés",
|
||||||
"category-events": "Événements de catégories",
|
"category-events": "Événements de catégories",
|
||||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||||
"recipe-events": "Événements de recette"
|
"recipe-events": "Événements de recette",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Ajouter",
|
"add": "Ajouter",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Commentaire",
|
"comment": "Commentaire",
|
||||||
"comments": "Commentaires",
|
"comments": "Commentaires",
|
||||||
"delete-confirmation": "Voulez-vous vraiment supprimer cette recette ?",
|
"delete-confirmation": "Voulez-vous vraiment supprimer cette recette ?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Vous êtes sur le point de supprimer une recette qui n'est pas la vôtre en utilisant les permissions d'administrateur. Êtes-vous sûr(e) ?",
|
||||||
"delete-recipe": "Supprimer la recette",
|
"delete-recipe": "Supprimer la recette",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"disable-amount": "Désactiver les quantités des ingrédients",
|
"disable-amount": "Désactiver les quantités des ingrédients",
|
||||||
|
@ -587,7 +589,7 @@
|
||||||
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
||||||
"message-key": "Clé de message",
|
"message-key": "Clé de message",
|
||||||
"parse": "Analyser",
|
"parse": "Analyser",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "Il semble que vos ingrédients ne soient pas encore analysés. Cliquez sur le bouton \"{parse}\" ci-dessous pour analyser vos ingrédients en aliments structurés.",
|
||||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||||
"drop-image": "Déposer l'image",
|
"drop-image": "Déposer l'image",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
||||||
|
@ -664,15 +666,17 @@
|
||||||
"no-unit": "Pas d'unité",
|
"no-unit": "Pas d'unité",
|
||||||
"missing-unit": "Créer une unité manquante : {unit}",
|
"missing-unit": "Créer une unité manquante : {unit}",
|
||||||
"missing-food": "Créer un aliment manquant : {food}",
|
"missing-food": "Créer un aliment manquant : {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Cette unité n'a pas pu être analysée automatiquement",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Cet aliment n'a pas pu être analysé automatiquement",
|
||||||
"no-food": "Aucun aliment"
|
"no-food": "Aucun aliment"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||||
"upload-another-image": "Télécharger une autre image",
|
"upload-another-image": "Télécharger une autre image",
|
||||||
"upload-images": "Télécharger des images",
|
"upload-images": "Télécharger des images",
|
||||||
"upload-more-images": "Télécharger d'autres images"
|
"upload-more-images": "Télécharger d'autres images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recherche de recette",
|
"recipe-finder": "Recherche de recette",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Détails du groupe",
|
"group-details": "Détails du groupe",
|
||||||
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
||||||
"use-seed-data": "Utiliser l'initialisation de données",
|
"use-seed-data": "Utiliser l'initialisation de données",
|
||||||
"use-seed-data-description": "Mealie inclut avec une liste d’aliments, d’unités et d’étiquettes qui peut être utilisée pour initialiser votre groupe avec des données utiles pour organiser vos recettes.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Détails du compte"
|
"account-details": "Détails du compte"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nouvelle notification",
|
"new-notification": "Nouvelle notification",
|
||||||
"event-notifiers": "Notifications d'événements",
|
"event-notifiers": "Notifications d'événements",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activer la notification",
|
"enable-notifier": "Activer la notification",
|
||||||
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
||||||
"user-events": "Événements de l'utilisateur",
|
"user-events": "Événements de l'utilisateur",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Événements des mots-clés",
|
"tag-events": "Événements des mots-clés",
|
||||||
"category-events": "Événements de catégories",
|
"category-events": "Événements de catégories",
|
||||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||||
"recipe-events": "Événements de recette"
|
"recipe-events": "Événements de recette",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Ajouter",
|
"add": "Ajouter",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Commentaire",
|
"comment": "Commentaire",
|
||||||
"comments": "Commentaires",
|
"comments": "Commentaires",
|
||||||
"delete-confirmation": "Êtes-vous sûr(e) de vouloir supprimer cette recette?",
|
"delete-confirmation": "Êtes-vous sûr(e) de vouloir supprimer cette recette?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Vous êtes sur le point de supprimer une recette qui n'est pas la vôtre en utilisant les permissions d'administrateur. Êtes-vous sûr(e) ?",
|
||||||
"delete-recipe": "Supprimer la recette",
|
"delete-recipe": "Supprimer la recette",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"disable-amount": "Désactiver les quantités d'ingrédients",
|
"disable-amount": "Désactiver les quantités d'ingrédients",
|
||||||
|
@ -587,7 +589,7 @@
|
||||||
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
||||||
"message-key": "Clé de message",
|
"message-key": "Clé de message",
|
||||||
"parse": "Analyser",
|
"parse": "Analyser",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "Il semble que vos ingrédients ne soient pas encore analysés. Cliquez sur le bouton \"{parse}\" ci-dessous pour analyser vos ingrédients en aliments structurés.",
|
||||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||||
"drop-image": "Déposer l'image",
|
"drop-image": "Déposer l'image",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
||||||
|
@ -664,15 +666,17 @@
|
||||||
"no-unit": "Pas d'unité",
|
"no-unit": "Pas d'unité",
|
||||||
"missing-unit": "Créer une unité manquante : {unit}",
|
"missing-unit": "Créer une unité manquante : {unit}",
|
||||||
"missing-food": "Créer un aliment manquant : {food}",
|
"missing-food": "Créer un aliment manquant : {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Cette unité n'a pas pu être analysée automatiquement",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Cet aliment n'a pas pu être analysé automatiquement",
|
||||||
"no-food": "Aucun aliment"
|
"no-food": "Aucun aliment"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||||
"upload-another-image": "Télécharger une autre image",
|
"upload-another-image": "Télécharger une autre image",
|
||||||
"upload-images": "Télécharger des images",
|
"upload-images": "Télécharger des images",
|
||||||
"upload-more-images": "Télécharger d'autres images"
|
"upload-more-images": "Télécharger d'autres images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recherche de recette",
|
"recipe-finder": "Recherche de recette",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Détails du groupe",
|
"group-details": "Détails du groupe",
|
||||||
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
||||||
"use-seed-data": "Utiliser l'initialisation de données",
|
"use-seed-data": "Utiliser l'initialisation de données",
|
||||||
"use-seed-data-description": "Mealie inclut avec une liste d’aliments, d’unités et d’étiquettes qui peut être utilisée pour initialiser votre groupe avec des données utiles pour organiser vos recettes.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Détails du compte"
|
"account-details": "Détails du compte"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nouvelle notification",
|
"new-notification": "Nouvelle notification",
|
||||||
"event-notifiers": "Notifications d'événements",
|
"event-notifiers": "Notifications d'événements",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
"apprise-url-skipped-if-blank": "URL Apprise (ignoré si vide)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activer la notification",
|
"enable-notifier": "Activer la notification",
|
||||||
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
"what-events": "À quels événements cette notification doit-elle s'abonner ?",
|
||||||
"user-events": "Événements utilisateur",
|
"user-events": "Événements utilisateur",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Événements des mots-clés",
|
"tag-events": "Événements des mots-clés",
|
||||||
"category-events": "Événements de catégories",
|
"category-events": "Événements de catégories",
|
||||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||||
"recipe-events": "Événements de recette"
|
"recipe-events": "Événements de recette",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Ajouter",
|
"add": "Ajouter",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||||
"upload-another-image": "Télécharger une autre image",
|
"upload-another-image": "Télécharger une autre image",
|
||||||
"upload-images": "Télécharger des images",
|
"upload-images": "Télécharger des images",
|
||||||
"upload-more-images": "Télécharger d'autres images"
|
"upload-more-images": "Télécharger d'autres images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recherche de recette",
|
"recipe-finder": "Recherche de recette",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Détails du groupe",
|
"group-details": "Détails du groupe",
|
||||||
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
"group-details-description": "Avant de créer un compte, vous devrez créer un groupe. Votre groupe ne contiendra que vous, mais vous pourrez inviter d’autres personnes plus tard. Les membres de votre groupe peuvent partager leur menu de la semaine, leurs listes d’achat, leurs recettes et plus encore !",
|
||||||
"use-seed-data": "Utiliser l'initialisation de données",
|
"use-seed-data": "Utiliser l'initialisation de données",
|
||||||
"use-seed-data-description": "Mealie inclut avec une liste d’aliments, d’unités et d’étiquettes qui peut être utilisée pour initialiser votre groupe avec des données utiles pour organiser vos recettes.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Détails du compte"
|
"account-details": "Détails du compte"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nova Notificación",
|
"new-notification": "Nova Notificación",
|
||||||
"event-notifiers": "Notificadores de Eventos",
|
"event-notifiers": "Notificadores de Eventos",
|
||||||
"apprise-url-skipped-if-blank": "URL de Apprise (omitido se está en branco)",
|
"apprise-url-skipped-if-blank": "URL de Apprise (omitido se está en branco)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activar o Notificador",
|
"enable-notifier": "Activar o Notificador",
|
||||||
"what-events": "A que eventos debería subscribirse este notificador?",
|
"what-events": "A que eventos debería subscribirse este notificador?",
|
||||||
"user-events": "Eventos de Usuario",
|
"user-events": "Eventos de Usuario",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Eventos de Etiquetas",
|
"tag-events": "Eventos de Etiquetas",
|
||||||
"category-events": "Eventos de Categorías",
|
"category-events": "Eventos de Categorías",
|
||||||
"when-a-new-user-joins-your-group": "Cando un novo usuario se une ao teu grupo",
|
"when-a-new-user-joins-your-group": "Cando un novo usuario se une ao teu grupo",
|
||||||
"recipe-events": "Eventos de Receitas"
|
"recipe-events": "Eventos de Receitas",
|
||||||
|
"label-events": "Rotular Eventos"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Engadir",
|
"add": "Engadir",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Comentario",
|
"comment": "Comentario",
|
||||||
"comments": "Comentarios",
|
"comments": "Comentarios",
|
||||||
"delete-confirmation": "Estás seguro de que queres eliminar esta receita?",
|
"delete-confirmation": "Estás seguro de que queres eliminar esta receita?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Estás a piques de eliminar unha receita que non é tua usando permisos de administrador. Tes certeza?",
|
||||||
"delete-recipe": "Eliminar Receita",
|
"delete-recipe": "Eliminar Receita",
|
||||||
"description": "Descrición",
|
"description": "Descrición",
|
||||||
"disable-amount": "Desactivar as Cantidades de Ingredientes",
|
"disable-amount": "Desactivar as Cantidades de Ingredientes",
|
||||||
|
@ -580,14 +582,14 @@
|
||||||
"made-this": "Eu fixen isto",
|
"made-this": "Eu fixen isto",
|
||||||
"how-did-it-turn-out": "Que tal ficou?",
|
"how-did-it-turn-out": "Que tal ficou?",
|
||||||
"user-made-this": "{user} fixo isto",
|
"user-made-this": "{user} fixo isto",
|
||||||
"added-to-timeline": "Added to timeline",
|
"added-to-timeline": "Adicionado ao histórico",
|
||||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
"failed-to-add-to-timeline": "Falla ao adicionar ao histórico",
|
||||||
"failed-to-update-recipe": "Failed to update recipe",
|
"failed-to-update-recipe": "Falla ao atualizar a receita",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
"added-to-timeline-but-failed-to-add-image": "Adicionado ao histórico, mas non foi posíbel adicionar a imaxe",
|
||||||
"api-extras-description": "Os extras de receitas son unha característica clave da API de Mealie. Permítenche crear pares de clave/valor JSON personalizados dentro dunha receita, para facer referencia desde aplicacións de terceiros. Podes usar estas teclas para proporcionar información, por exemplo, para activar automatizacións ou mensaxes personalizadas para transmitir ao dispositivo que desexes.",
|
"api-extras-description": "Os extras de receitas son unha característica clave da API de Mealie. Permítenche crear pares de clave/valor JSON personalizados dentro dunha receita, para facer referencia desde aplicacións de terceiros. Podes usar estas teclas para proporcionar información, por exemplo, para activar automatizacións ou mensaxes personalizadas para transmitir ao dispositivo que desexes.",
|
||||||
"message-key": "Chave de Mensaxen",
|
"message-key": "Chave de Mensaxen",
|
||||||
"parse": "Interpretar",
|
"parse": "Interpretar",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "Parece que os teus ingredientes ainda non foron procesados. Clique no boton \"{parse}\" abaixo para converte-los en alimentos estruturados.",
|
||||||
"attach-images-hint": "Anexe imaxens arrastrando e soltandoas no editor",
|
"attach-images-hint": "Anexe imaxens arrastrando e soltandoas no editor",
|
||||||
"drop-image": "Arrastrar imaxen",
|
"drop-image": "Arrastrar imaxen",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Ative cantidades de ingredientes para usar esta funcionalidade",
|
"enable-ingredient-amounts-to-use-this-feature": "Ative cantidades de ingredientes para usar esta funcionalidade",
|
||||||
|
@ -638,7 +640,7 @@
|
||||||
"bulk-import-process-has-failed": "Erro no proceso de importación en masa",
|
"bulk-import-process-has-failed": "Erro no proceso de importación en masa",
|
||||||
"report-deletion-failed": "Erro ao eliminar relatorio",
|
"report-deletion-failed": "Erro ao eliminar relatorio",
|
||||||
"recipe-debugger": "Depurador de Receitas",
|
"recipe-debugger": "Depurador de Receitas",
|
||||||
"recipe-debugger-description": "Copie o URL da receita que quer depurar e pégueo aqui. O URL será lido polo lector de receitas e os resultados serán mostrados. Se non ves negún dato devolto, a páxina que está a tentar ler non é suportada polo Mealie ou pola sua biblioteca de 'scrapping'.",
|
"recipe-debugger-description": "Copie o URL da receita que quer depurar e pégueo aqui. O URL será lido polo lector de receitas e os resultados serán mostrados. Se non ve nengún dato devolto, a páxina que está a tentar ler non é suportada polo Mealie ou pola sua biblioteca de 'scrapping'.",
|
||||||
"use-openai": "Utilizar OpenAI",
|
"use-openai": "Utilizar OpenAI",
|
||||||
"recipe-debugger-use-openai-description": "Utilize o OpenAI para analisar os resultados en vez de depender da biblioteca de scrapers. Ao crear unha receita através dun URL, isto é feito automaticamente se a biblioteca de scrapers falla, mas pode provala manualmente aqui.",
|
"recipe-debugger-use-openai-description": "Utilize o OpenAI para analisar os resultados en vez de depender da biblioteca de scrapers. Ao crear unha receita através dun URL, isto é feito automaticamente se a biblioteca de scrapers falla, mas pode provala manualmente aqui.",
|
||||||
"debug": "Depurar",
|
"debug": "Depurar",
|
||||||
|
@ -664,19 +666,21 @@
|
||||||
"no-unit": "Sen unidades",
|
"no-unit": "Sen unidades",
|
||||||
"missing-unit": "Crear a unidade que falta: {unit}",
|
"missing-unit": "Crear a unidade que falta: {unit}",
|
||||||
"missing-food": "Crear a comida que falta: {food}",
|
"missing-food": "Crear a comida que falta: {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Non foi posíbel procesar automaticamente esta unidade",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Non foi posíbel procesar automaticamente este alimento",
|
||||||
"no-food": "Sen Comida"
|
"no-food": "Sen Comida"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Reiniciar Contador de Porcións",
|
"reset-servings-count": "Reiniciar Contador de Porcións",
|
||||||
"not-linked-ingredients": "Ingredientes Adicionais",
|
"not-linked-ingredients": "Ingredientes Adicionais",
|
||||||
"upload-another-image": "Cargar outra imaxen",
|
"upload-another-image": "Cargar outra imaxen",
|
||||||
"upload-images": "Cargar imaxens",
|
"upload-images": "Cargar imaxens",
|
||||||
"upload-more-images": "Cargar mais imaxens"
|
"upload-more-images": "Cargar mais imaxens",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Localizador de Receitas",
|
"recipe-finder": "Localizador de Receitas",
|
||||||
"recipe-finder-description": "Procure receitas con base nos ingredientes que teñas a man. Pode tamén filtrar polas ferramentas disponíveis e definir un número máximo de ingredientes ou ferramentas que faltan.",
|
"recipe-finder-description": "Procure receitas con base nos ingredientes que teña a man. Pode tamén filtrar polas ferramentas disponíbeis e definir un número máximo de ingredientes ou ferramentas que faltan.",
|
||||||
"selected-ingredients": "Ingredientes Selecionados",
|
"selected-ingredients": "Ingredientes Selecionados",
|
||||||
"no-ingredients-selected": "Nengun ingrediente selecionado",
|
"no-ingredients-selected": "Nengun ingrediente selecionado",
|
||||||
"missing": "En falta",
|
"missing": "En falta",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalles do Grupo",
|
"group-details": "Detalles do Grupo",
|
||||||
"group-details-description": "Antes de crear unha conta é necesario crear un grupo. Será o único membro do seu grupo, mas poderá convidar outros mais tarde. Os membros do seu grupo poden compartir menús, listas de compras, receitas e moito mais!",
|
"group-details-description": "Antes de crear unha conta é necesario crear un grupo. Será o único membro do seu grupo, mas poderá convidar outros mais tarde. Os membros do seu grupo poden compartir menús, listas de compras, receitas e moito mais!",
|
||||||
"use-seed-data": "Utilizar datos xerados",
|
"use-seed-data": "Utilizar datos xerados",
|
||||||
"use-seed-data-description": "O Mealie ven cunha coleción de Alimentos, Unidades e Rótulos que poden ser usados para preencher o seu grupo con datos úteis para organizar as suas receitas.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalles da Conta"
|
"account-details": "Detalles da Conta"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "התראה חדשה",
|
"new-notification": "התראה חדשה",
|
||||||
"event-notifiers": "מנגנוני התרעה על אירועים",
|
"event-notifiers": "מנגנוני התרעה על אירועים",
|
||||||
"apprise-url-skipped-if-blank": "כתובת Apprise (דלג אם ריק)",
|
"apprise-url-skipped-if-blank": "כתובת Apprise (דלג אם ריק)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "הפעלת מתריע",
|
"enable-notifier": "הפעלת מתריע",
|
||||||
"what-events": "לאילו אירועים לרשום את מתריע זה?",
|
"what-events": "לאילו אירועים לרשום את מתריע זה?",
|
||||||
"user-events": "אירועי משתמש",
|
"user-events": "אירועי משתמש",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "אירועי תגיות",
|
"tag-events": "אירועי תגיות",
|
||||||
"category-events": "אירועי קטגוריות",
|
"category-events": "אירועי קטגוריות",
|
||||||
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה",
|
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה",
|
||||||
"recipe-events": "אירועי מתכון"
|
"recipe-events": "אירועי מתכון",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "הוספה",
|
"add": "הוספה",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "מרכיבים נוספים",
|
"not-linked-ingredients": "מרכיבים נוספים",
|
||||||
"upload-another-image": "העלאת תמונה נוספת",
|
"upload-another-image": "העלאת תמונה נוספת",
|
||||||
"upload-images": "העלאת תמונות",
|
"upload-images": "העלאת תמונות",
|
||||||
"upload-more-images": "העלאת תמונות נוספות"
|
"upload-more-images": "העלאת תמונות נוספות",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "מצא מתכון",
|
"recipe-finder": "מצא מתכון",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "פרטי הקבוצה",
|
"group-details": "פרטי הקבוצה",
|
||||||
"group-details-description": "לפני יצירת חשבון יש צורך ליצור קבוצה. הקבוצה תכיל רק אותך אבל תוכל להזמין אחרים בשלב מאוחר יותר. חברים בקבוצה יכולים לשתף תוכנית ארוחות, רשימות קניות, מתכונים ועוד!",
|
"group-details-description": "לפני יצירת חשבון יש צורך ליצור קבוצה. הקבוצה תכיל רק אותך אבל תוכל להזמין אחרים בשלב מאוחר יותר. חברים בקבוצה יכולים לשתף תוכנית ארוחות, רשימות קניות, מתכונים ועוד!",
|
||||||
"use-seed-data": "השתמש בנתוני האכלוס",
|
"use-seed-data": "השתמש בנתוני האכלוס",
|
||||||
"use-seed-data-description": "Mealie מגיעה עם אוסף של מאכלים, יחידות מדידה ותוויות שניתן להשתמש לאכלוס הקבוצות עם מידע שימושי לארגון המתכונים.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "פרטי חשבון"
|
"account-details": "פרטי חשבון"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nova Obavijest",
|
"new-notification": "Nova Obavijest",
|
||||||
"event-notifiers": "Obavještavatelji Događaja",
|
"event-notifiers": "Obavještavatelji Događaja",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (preskočeno ako je prazno)",
|
"apprise-url-skipped-if-blank": "Apprise URL (preskočeno ako je prazno)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Omogući obavještavanje",
|
"enable-notifier": "Omogući obavještavanje",
|
||||||
"what-events": "Na koje događaje bi ovaj obavještavatelj trebao biti pretplaćen?",
|
"what-events": "Na koje događaje bi ovaj obavještavatelj trebao biti pretplaćen?",
|
||||||
"user-events": "Događaji Korisnika",
|
"user-events": "Događaji Korisnika",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Događaji Oznaka",
|
"tag-events": "Događaji Oznaka",
|
||||||
"category-events": "Događaji Kategorija",
|
"category-events": "Događaji Kategorija",
|
||||||
"when-a-new-user-joins-your-group": "Kada se novi korisnik pridruži vašoj grupi",
|
"when-a-new-user-joins-your-group": "Kada se novi korisnik pridruži vašoj grupi",
|
||||||
"recipe-events": "Događaji recepta"
|
"recipe-events": "Događaji recepta",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Dodaj",
|
"add": "Dodaj",
|
||||||
|
@ -297,7 +299,7 @@
|
||||||
"lock-recipe-edits-from-other-households-description": "Kada je omogućeno, samo korisnici u tvojem domaćinstvu mogu uređivati recepte izrađene u tvojem domaćinstvu",
|
"lock-recipe-edits-from-other-households-description": "Kada je omogućeno, samo korisnici u tvojem domaćinstvu mogu uređivati recepte izrađene u tvojem domaćinstvu",
|
||||||
"household-recipe-preferences": "Postavke recepata u domaćinstvu",
|
"household-recipe-preferences": "Postavke recepata u domaćinstvu",
|
||||||
"default-recipe-preferences-description": "Ovo su zadane postavke, kada se u tvojem domaćinstvu izradi novi recept. Ove postavke se mogu promijeniti za pojedinačne recepte u izborniku postavki recepata.",
|
"default-recipe-preferences-description": "Ovo su zadane postavke, kada se u tvojem domaćinstvu izradi novi recept. Ove postavke se mogu promijeniti za pojedinačne recepte u izborniku postavki recepata.",
|
||||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
|
"allow-users-outside-of-your-household-to-see-your-recipes": "Dopustite korisnicima izvan vašega kućanstva da vide vaše recepte",
|
||||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link",
|
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link",
|
||||||
"household-preferences": "Household Preferences"
|
"household-preferences": "Household Preferences"
|
||||||
},
|
},
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalji o Grupi",
|
"group-details": "Detalji o Grupi",
|
||||||
"group-details-description": "Prije nego što kreirate korisnički račun, morat ćete stvoriti grupu. Vaša grupa će sadržavati samo vas, ali kasnije ćete moći pozvati druge članove. Članovi vaše grupe mogu dijeliti planove obroka, popise za kupovinu, recepte i još mnogo toga!",
|
"group-details-description": "Prije nego što kreirate korisnički račun, morat ćete stvoriti grupu. Vaša grupa će sadržavati samo vas, ali kasnije ćete moći pozvati druge članove. Članovi vaše grupe mogu dijeliti planove obroka, popise za kupovinu, recepte i još mnogo toga!",
|
||||||
"use-seed-data": "Koristi Pridržane Podatke",
|
"use-seed-data": "Koristi Pridržane Podatke",
|
||||||
"use-seed-data-description": "Mealie dolazi s kolekcijom hrane, jedinica i oznaka koje se mogu koristiti za popunjavanje vaše grupe korisnim podacima za organiziranje vaših recepata.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalji Računa"
|
"account-details": "Detalji Računa"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Új értesítés",
|
"new-notification": "Új értesítés",
|
||||||
"event-notifiers": "Esemény értesítők",
|
"event-notifiers": "Esemény értesítők",
|
||||||
"apprise-url-skipped-if-blank": "Értesítendő URL (kihagy, ha üres)",
|
"apprise-url-skipped-if-blank": "Értesítendő URL (kihagy, ha üres)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Mivel Apprise URL-ek gyakran érzékeny információt tartalmaznak, ez a mező szándékosan üres marad szerkesztés közben. Ha frissíteni szeretnéd az URL-t, kérelk írd be ide az újat, különben hagyjad üresena jelenlegi URL megtartásához.",
|
||||||
"enable-notifier": "Értesítés engedélyezése",
|
"enable-notifier": "Értesítés engedélyezése",
|
||||||
"what-events": "Milyen eseményekre figyeljen ez az értesítés?",
|
"what-events": "Milyen eseményekre figyeljen ez az értesítés?",
|
||||||
"user-events": "Felhasználói Események",
|
"user-events": "Felhasználói Események",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Címke események",
|
"tag-events": "Címke események",
|
||||||
"category-events": "Kategória események",
|
"category-events": "Kategória események",
|
||||||
"when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba",
|
"when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba",
|
||||||
"recipe-events": "Recept esemény"
|
"recipe-events": "Recept esemény",
|
||||||
|
"label-events": "Címke Események"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Hozzáadás",
|
"add": "Hozzáadás",
|
||||||
|
@ -548,8 +550,8 @@
|
||||||
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet a menütervhez",
|
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet a menütervhez",
|
||||||
"failed-to-add-to-list": "Nem sikerült hozzáadni a listához",
|
"failed-to-add-to-list": "Nem sikerült hozzáadni a listához",
|
||||||
"yield": "Adag",
|
"yield": "Adag",
|
||||||
"yields-amount-with-text": "Yields {amount} {text}",
|
"yields-amount-with-text": "{amount} {text} készül",
|
||||||
"yield-text": "Yield Text",
|
"yield-text": "A készített étel (ha darabban lehet számolni)",
|
||||||
"quantity": "Mennyiség",
|
"quantity": "Mennyiség",
|
||||||
"choose-unit": "Válasszon mennyiségi egységet",
|
"choose-unit": "Válasszon mennyiségi egységet",
|
||||||
"press-enter-to-create": "Üssön Enter-t a létrehozáshoz",
|
"press-enter-to-create": "Üssön Enter-t a létrehozáshoz",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Kiegészítő hozzávalók",
|
"not-linked-ingredients": "Kiegészítő hozzávalók",
|
||||||
"upload-another-image": "Másik kép feltöltése",
|
"upload-another-image": "Másik kép feltöltése",
|
||||||
"upload-images": "Képek feltöltése",
|
"upload-images": "Képek feltöltése",
|
||||||
"upload-more-images": "További képek feltöltése"
|
"upload-more-images": "További képek feltöltése",
|
||||||
|
"set-as-cover-image": "Beállítás a recept borítóképének",
|
||||||
|
"cover-image": "Borítókép"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Receptkereső",
|
"recipe-finder": "Receptkereső",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Csoport részletek",
|
"group-details": "Csoport részletek",
|
||||||
"group-details-description": "Mielőtt létrehozna egy fiókot, létre kell hoznia egy csoportot. A csoportban csak ön lesz, de később másokat is meghívhat. A csoport tagjai menüterveket, bevásárlólistákat, recepteket és még sok mást is megoszthatnak egymással!",
|
"group-details-description": "Mielőtt létrehozna egy fiókot, létre kell hoznia egy csoportot. A csoportban csak ön lesz, de később másokat is meghívhat. A csoport tagjai menüterveket, bevásárlólistákat, recepteket és még sok mást is megoszthatnak egymással!",
|
||||||
"use-seed-data": "Mintaadatok használata",
|
"use-seed-data": "Mintaadatok használata",
|
||||||
"use-seed-data-description": "Mealie az alapanyagok, a mennyiségi egységek és a címkék gyűjteményét tartalmazza, amelyek megoszthatók a csoporttal és hasznos adataival segítségül szolgálhat a receptek szervezéséhez.",
|
"use-seed-data-description": "Mealie-ben alapból található sok Étel, Mértékegység, és Címke amík segíthetnek a csoportod felltöltésében a receptek csoportosításához hasznos adatokkal. Ezek a jelenlegi nyelvedre vannak lefordítva. Bármikor megváltoztathatod ezeket az adatokat később.",
|
||||||
"account-details": "A fiók részletei"
|
"account-details": "A fiók részletei"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Ný tilkynning",
|
"new-notification": "Ný tilkynning",
|
||||||
"event-notifiers": "Viðburðar tilkynningar",
|
"event-notifiers": "Viðburðar tilkynningar",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (sleppt ef tómt)",
|
"apprise-url-skipped-if-blank": "Apprise URL (sleppt ef tómt)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Virkja tilkynningar",
|
"enable-notifier": "Virkja tilkynningar",
|
||||||
"what-events": "Hvaða viðburði ætti þessi tilkynnir að vera áskrifandi að?",
|
"what-events": "Hvaða viðburði ætti þessi tilkynnir að vera áskrifandi að?",
|
||||||
"user-events": "Notenda viðburðir",
|
"user-events": "Notenda viðburðir",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Merki viðburðir",
|
"tag-events": "Merki viðburðir",
|
||||||
"category-events": "Flokka viðburðir",
|
"category-events": "Flokka viðburðir",
|
||||||
"when-a-new-user-joins-your-group": "Þegar nýr notandi bætist við í þinn hóp",
|
"when-a-new-user-joins-your-group": "Þegar nýr notandi bætist við í þinn hóp",
|
||||||
"recipe-events": "Uppskriftar viðburðir"
|
"recipe-events": "Uppskriftar viðburðir",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Bæta við",
|
"add": "Bæta við",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nuova Notifica",
|
"new-notification": "Nuova Notifica",
|
||||||
"event-notifiers": "Notifiche Evento",
|
"event-notifiers": "Notifiche Evento",
|
||||||
"apprise-url-skipped-if-blank": "Url di Apprise (ignorato se vuoto)",
|
"apprise-url-skipped-if-blank": "Url di Apprise (ignorato se vuoto)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Poiché gli URL Apprise contengono in genere informazioni sensibili, questo campo viene lasciato intenzionalmente vuoto durante la modifica. Se si desidera aggiornare l'URL, inserire qui il nuovo URL, altrimenti lasciarlo vuoto per mantenere l'URL corrente.",
|
||||||
"enable-notifier": "Abilita Notificatore",
|
"enable-notifier": "Abilita Notificatore",
|
||||||
"what-events": "Quali eventi dovrebbe sottoscrivere questo notificatore?",
|
"what-events": "Quali eventi dovrebbe sottoscrivere questo notificatore?",
|
||||||
"user-events": "Eventi Utente",
|
"user-events": "Eventi Utente",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tag Eventi",
|
"tag-events": "Tag Eventi",
|
||||||
"category-events": "Categoria Eventi",
|
"category-events": "Categoria Eventi",
|
||||||
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo",
|
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo",
|
||||||
"recipe-events": "Eventi di ricette"
|
"recipe-events": "Eventi di ricette",
|
||||||
|
"label-events": "Eventi Etichetta"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Aggiungi",
|
"add": "Aggiungi",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Commento",
|
"comment": "Commento",
|
||||||
"comments": "Commenti",
|
"comments": "Commenti",
|
||||||
"delete-confirmation": "Sei sicuro di voler eliminare questa ricetta?",
|
"delete-confirmation": "Sei sicuro di voler eliminare questa ricetta?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Stai per eliminare una ricetta che non è tua usando i permessi di amministrazione. Sei sicuro?",
|
||||||
"delete-recipe": "Elimina Ricetta",
|
"delete-recipe": "Elimina Ricetta",
|
||||||
"description": "Descrizione",
|
"description": "Descrizione",
|
||||||
"disable-amount": "Disabilita Quantità Ingredienti",
|
"disable-amount": "Disabilita Quantità Ingredienti",
|
||||||
|
@ -580,10 +582,10 @@
|
||||||
"made-this": "L'Ho Preparato",
|
"made-this": "L'Ho Preparato",
|
||||||
"how-did-it-turn-out": "Come è venuto?",
|
"how-did-it-turn-out": "Come è venuto?",
|
||||||
"user-made-this": "{user} l'ha preparato",
|
"user-made-this": "{user} l'ha preparato",
|
||||||
"added-to-timeline": "Added to timeline",
|
"added-to-timeline": "Aggiunto alla cronologia",
|
||||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
"failed-to-add-to-timeline": "Impossibile aggiungere alla cronologia",
|
||||||
"failed-to-update-recipe": "Failed to update recipe",
|
"failed-to-update-recipe": "Impossibile aggiornare la ricetta",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
"added-to-timeline-but-failed-to-add-image": "Aggiunto alla cronologia, ma non è stato possibile aggiungere l'immagine",
|
||||||
"api-extras-description": "Le opzioni extra delle ricette sono una caratteristica fondamentale dell'API Mealie. Consentono di creare json personalizzati con coppie di chiavi/valore all'interno di una ricetta a cui fare riferimento tramite applicazioni terze. È possibile utilizzare queste chiavi per inserire informazioni, per esempio per attivare automazioni oppure per inoltrare messaggi personalizzati al dispositivo desiderato.",
|
"api-extras-description": "Le opzioni extra delle ricette sono una caratteristica fondamentale dell'API Mealie. Consentono di creare json personalizzati con coppie di chiavi/valore all'interno di una ricetta a cui fare riferimento tramite applicazioni terze. È possibile utilizzare queste chiavi per inserire informazioni, per esempio per attivare automazioni oppure per inoltrare messaggi personalizzati al dispositivo desiderato.",
|
||||||
"message-key": "Chiave Messaggio",
|
"message-key": "Chiave Messaggio",
|
||||||
"parse": "Analizza",
|
"parse": "Analizza",
|
||||||
|
@ -605,10 +607,10 @@
|
||||||
"create-recipe-from-an-image": "Crea ricetta da un'immagine",
|
"create-recipe-from-an-image": "Crea ricetta da un'immagine",
|
||||||
"create-recipe-from-an-image-description": "Crea una ricetta caricando un'immagine di essa. Mealie tenterà di estrarre il testo dall'immagine usando l'IA e creare una ricetta da esso.",
|
"create-recipe-from-an-image-description": "Crea una ricetta caricando un'immagine di essa. Mealie tenterà di estrarre il testo dall'immagine usando l'IA e creare una ricetta da esso.",
|
||||||
"crop-and-rotate-the-image": "Ritaglia e ruota l'immagine in modo che solo il testo sia visibile e che sia orientato correttamente.",
|
"crop-and-rotate-the-image": "Ritaglia e ruota l'immagine in modo che solo il testo sia visibile e che sia orientato correttamente.",
|
||||||
"create-from-images": "Create from Images",
|
"create-from-images": "Crea da immagini",
|
||||||
"should-translate-description": "Traduci la ricetta nella mia lingua",
|
"should-translate-description": "Traduci la ricetta nella mia lingua",
|
||||||
"please-wait-image-procesing": "Attendere, l'immagine è in fase di elaborazione. Potrebbe volerci un po' di tempo.",
|
"please-wait-image-procesing": "Attendere, l'immagine è in fase di elaborazione. Potrebbe volerci un po' di tempo.",
|
||||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
"please-wait-images-processing": "Attendere, le immagini sono in fase di elaborazione. Potrebbe volerci un po' di tempo.",
|
||||||
"bulk-url-import": "Importazione multipla URL",
|
"bulk-url-import": "Importazione multipla URL",
|
||||||
"debug-scraper": "Debug Scraper",
|
"debug-scraper": "Debug Scraper",
|
||||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crea una ricetta fornendo il nome. Tutte le ricette devono avere nomi univoci.",
|
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crea una ricetta fornendo il nome. Tutte le ricette devono avere nomi univoci.",
|
||||||
|
@ -664,15 +666,17 @@
|
||||||
"no-unit": "Nessuna unità",
|
"no-unit": "Nessuna unità",
|
||||||
"missing-unit": "Crea unità mancante: {unit}",
|
"missing-unit": "Crea unità mancante: {unit}",
|
||||||
"missing-food": "Crea cibo mancante: {food}",
|
"missing-food": "Crea cibo mancante: {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Questa unità non può essere analizzata automaticamente",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Questo alimento non può essere analizzato automaticamente",
|
||||||
"no-food": "Nessun Alimento"
|
"no-food": "Nessun Alimento"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Reimposta conteggio porzioni",
|
"reset-servings-count": "Reimposta conteggio porzioni",
|
||||||
"not-linked-ingredients": "Ingredienti Aggiuntivi",
|
"not-linked-ingredients": "Ingredienti Aggiuntivi",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Carica un'altra immagine",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Carica immagini",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Carica altre immagini",
|
||||||
|
"set-as-cover-image": "Imposta come immagine di copertina della ricetta",
|
||||||
|
"cover-image": "Immagine di copertina"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Trova ricette",
|
"recipe-finder": "Trova ricette",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Dettagli Gruppo",
|
"group-details": "Dettagli Gruppo",
|
||||||
"group-details-description": "Prima di creare un account, è necessario creare un gruppo. Il gruppo conterrà solo voi, ma potrete invitare altre persone in seguito. I membri del gruppo possono condividere piani alimentari, liste della spesa, ricette e molto altro!",
|
"group-details-description": "Prima di creare un account, è necessario creare un gruppo. Il gruppo conterrà solo voi, ma potrete invitare altre persone in seguito. I membri del gruppo possono condividere piani alimentari, liste della spesa, ricette e molto altro!",
|
||||||
"use-seed-data": "Utilizzo Dati Generati",
|
"use-seed-data": "Utilizzo Dati Generati",
|
||||||
"use-seed-data-description": "Mealie viene fornito con una raccolta di alimenti, unità ed etichette che possono essere utilizzate per popolare il tuo gruppo con dati utili per organizzare le tue ricette.",
|
"use-seed-data-description": "Mealie include una raccolta di Alimenti, Unità ed Etichette che possono essere utilizzate per arricchire il proprio gruppo con dati utili per organizzare le proprie ricette. Questi dati vengono tradotti nella lingua selezionata. Si può sempre aggiungere o modificare questi dati in seguito.",
|
||||||
"account-details": "Dettagli dell'Account"
|
"account-details": "Dettagli dell'Account"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "新着通知",
|
"new-notification": "新着通知",
|
||||||
"event-notifiers": "イベント通知",
|
"event-notifiers": "イベント通知",
|
||||||
"apprise-url-skipped-if-blank": "通知用URL (空欄の場合はスキップ)",
|
"apprise-url-skipped-if-blank": "通知用URL (空欄の場合はスキップ)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "通知を有効にする",
|
"enable-notifier": "通知を有効にする",
|
||||||
"what-events": "この通知はどのイベントを購読すべきですか?",
|
"what-events": "この通知はどのイベントを購読すべきですか?",
|
||||||
"user-events": "ユーザーイベント",
|
"user-events": "ユーザーイベント",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "タグイベント",
|
"tag-events": "タグイベント",
|
||||||
"category-events": "カテゴリイベント",
|
"category-events": "カテゴリイベント",
|
||||||
"when-a-new-user-joins-your-group": "新しいユーザーがグループに参加したとき",
|
"when-a-new-user-joins-your-group": "新しいユーザーがグループに参加したとき",
|
||||||
"recipe-events": "レシピイベント"
|
"recipe-events": "レシピイベント",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "追加",
|
"add": "追加",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "追加の材料",
|
"not-linked-ingredients": "追加の材料",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "レシピ検索",
|
"recipe-finder": "レシピ検索",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "グループの詳細",
|
"group-details": "グループの詳細",
|
||||||
"group-details-description": "アカウントを作成する前に、グループを作成する必要があります。グループにはあなたしか含まれませんが、後で他の人を招待できます。グループのメンバーは、食事計画、買い物リスト、レシピなどを共有できます!",
|
"group-details-description": "アカウントを作成する前に、グループを作成する必要があります。グループにはあなたしか含まれませんが、後で他の人を招待できます。グループのメンバーは、食事計画、買い物リスト、レシピなどを共有できます!",
|
||||||
"use-seed-data": "シードデータを使用",
|
"use-seed-data": "シードデータを使用",
|
||||||
"use-seed-data-description": "Mealieには、レシピを整理するために役立つデータをグループに追加するために使用できる、食品、単位、ラベルのコレクションが付属しています。",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "アカウントの詳細"
|
"account-details": "アカウントの詳細"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "새 알림",
|
"new-notification": "새 알림",
|
||||||
"event-notifiers": "이벤트 알림이",
|
"event-notifiers": "이벤트 알림이",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (비워두면 생략합니다)",
|
"apprise-url-skipped-if-blank": "Apprise URL (비워두면 생략합니다)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "알림 활성화",
|
"enable-notifier": "알림 활성화",
|
||||||
"what-events": "이 알리미는 어떤 이벤트를 구독해야 합니까?",
|
"what-events": "이 알리미는 어떤 이벤트를 구독해야 합니까?",
|
||||||
"user-events": "사용자 이벤트",
|
"user-events": "사용자 이벤트",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tag 이벤트",
|
"tag-events": "Tag 이벤트",
|
||||||
"category-events": "카테고리 이벤트",
|
"category-events": "카테고리 이벤트",
|
||||||
"when-a-new-user-joins-your-group": "새로운 사용자가 그룹에 가입하면",
|
"when-a-new-user-joins-your-group": "새로운 사용자가 그룹에 가입하면",
|
||||||
"recipe-events": "레시피 이벤트"
|
"recipe-events": "레시피 이벤트",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "추가",
|
"add": "추가",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Naujas pranešimas",
|
"new-notification": "Naujas pranešimas",
|
||||||
"event-notifiers": "Įvykių pranešimai",
|
"event-notifiers": "Įvykių pranešimai",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (praleidžiama, jei tuščia)",
|
"apprise-url-skipped-if-blank": "Apprise URL (praleidžiama, jei tuščia)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Įjungti pranešiklį",
|
"enable-notifier": "Įjungti pranešiklį",
|
||||||
"what-events": "Kokie įvykiai turėtų būti sekami?",
|
"what-events": "Kokie įvykiai turėtų būti sekami?",
|
||||||
"user-events": "Naudotojų įvykiai",
|
"user-events": "Naudotojų įvykiai",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Žymų įvykiai",
|
"tag-events": "Žymų įvykiai",
|
||||||
"category-events": "Kategorijų įvykiai",
|
"category-events": "Kategorijų įvykiai",
|
||||||
"when-a-new-user-joins-your-group": "Kai prie jūsų grupės prisijungia naujas naudotojas",
|
"when-a-new-user-joins-your-group": "Kai prie jūsų grupės prisijungia naujas naudotojas",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Pridėti",
|
"add": "Pridėti",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Grupės informacija",
|
"group-details": "Grupės informacija",
|
||||||
"group-details-description": "Prieš kurdami paskyrą turite sukurti grupę. Jūsų grupėje būsite tik jūs, tačiau vėliau galėsite pakviesti ir kitus. Jūsų grupės nariai galės dalintis maitinimo planais, pirkinių sąrašais, receptais ir kita!",
|
"group-details-description": "Prieš kurdami paskyrą turite sukurti grupę. Jūsų grupėje būsite tik jūs, tačiau vėliau galėsite pakviesti ir kitus. Jūsų grupės nariai galės dalintis maitinimo planais, pirkinių sąrašais, receptais ir kita!",
|
||||||
"use-seed-data": "Naudoti pradinius duomenis",
|
"use-seed-data": "Naudoti pradinius duomenis",
|
||||||
"use-seed-data-description": "\"Mealie\" sistemoje jau yra pradinis duomenų rinkinys su produktais, vienetais ir etiketėmis. Jį galite panaudoti savo grupės užpildymui naudinga informacija, kuri padės organizuoti jūsų receptus.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Paskyros informacija"
|
"account-details": "Paskyros informacija"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Jauns paziņojums",
|
"new-notification": "Jauns paziņojums",
|
||||||
"event-notifiers": "Notikumu paziņotāji",
|
"event-notifiers": "Notikumu paziņotāji",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (izlaists, ja tukšs)",
|
"apprise-url-skipped-if-blank": "Apprise URL (izlaists, ja tukšs)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Iespējot paziņotāju",
|
"enable-notifier": "Iespējot paziņotāju",
|
||||||
"what-events": "Kādus notikumus šim paziņotājam vajadzētu abonēt?",
|
"what-events": "Kādus notikumus šim paziņotājam vajadzētu abonēt?",
|
||||||
"user-events": "Lietotāju notikumi",
|
"user-events": "Lietotāju notikumi",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Atzīmēt notikumus",
|
"tag-events": "Atzīmēt notikumus",
|
||||||
"category-events": "Kategorija Notikumi",
|
"category-events": "Kategorija Notikumi",
|
||||||
"when-a-new-user-joins-your-group": "Kad jūsu grupai pievienojas jauns lietotājs",
|
"when-a-new-user-joins-your-group": "Kad jūsu grupai pievienojas jauns lietotājs",
|
||||||
"recipe-events": "Recepšu notikumi"
|
"recipe-events": "Recepšu notikumi",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Pievienot",
|
"add": "Pievienot",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Grupas informācija",
|
"group-details": "Grupas informācija",
|
||||||
"group-details-description": "Pirms konta izveides jums būs jāizveido grupa. Jūsu grupā būs tikai jūs, bet vēlāk varēsiet uzaicināt citus. Jūsu grupas dalībnieki var dalīties maltīšu plānos, iepirkumu sarakstos, receptēs un daudz ko citu!",
|
"group-details-description": "Pirms konta izveides jums būs jāizveido grupa. Jūsu grupā būs tikai jūs, bet vēlāk varēsiet uzaicināt citus. Jūsu grupas dalībnieki var dalīties maltīšu plānos, iepirkumu sarakstos, receptēs un daudz ko citu!",
|
||||||
"use-seed-data": "Izmantojiet sēklu datus",
|
"use-seed-data": "Izmantojiet sēklu datus",
|
||||||
"use-seed-data-description": "Mealie piegādā kopā ar pārtikas produktu, vienību un etiķešu kolekciju, ko var izmantot, lai papildinātu grupu ar noderīgiem datiem recepšu sakārtošanai.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Konta informācija"
|
"account-details": "Konta informācija"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nieuwe melding",
|
"new-notification": "Nieuwe melding",
|
||||||
"event-notifiers": "Meldingen van gebeurtenissen",
|
"event-notifiers": "Meldingen van gebeurtenissen",
|
||||||
"apprise-url-skipped-if-blank": "URL van Apprise (overgeslagen als veld leeg is)",
|
"apprise-url-skipped-if-blank": "URL van Apprise (overgeslagen als veld leeg is)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activeer melding",
|
"enable-notifier": "Activeer melding",
|
||||||
"what-events": "Op welke gebeurtenissen moet deze melding zich abonneren?",
|
"what-events": "Op welke gebeurtenissen moet deze melding zich abonneren?",
|
||||||
"user-events": "Gebeurtenissen van gebruiker",
|
"user-events": "Gebeurtenissen van gebruiker",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Label-gebeurtenissen",
|
"tag-events": "Label-gebeurtenissen",
|
||||||
"category-events": "Categorie-gebeurtenissen",
|
"category-events": "Categorie-gebeurtenissen",
|
||||||
"when-a-new-user-joins-your-group": "Als een nieuwe gebruiker zich bij je groep aansluit",
|
"when-a-new-user-joins-your-group": "Als een nieuwe gebruiker zich bij je groep aansluit",
|
||||||
"recipe-events": "Recept gebeurtenissen"
|
"recipe-events": "Recept gebeurtenissen",
|
||||||
|
"label-events": "Label gebeurtenissen"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Voeg toe",
|
"add": "Voeg toe",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Extra ingrediënten",
|
"not-linked-ingredients": "Extra ingrediënten",
|
||||||
"upload-another-image": "Een andere afbeelding uploaden",
|
"upload-another-image": "Een andere afbeelding uploaden",
|
||||||
"upload-images": "Afbeelding uploaden",
|
"upload-images": "Afbeelding uploaden",
|
||||||
"upload-more-images": "Meer afbeeldingen uploaden"
|
"upload-more-images": "Meer afbeeldingen uploaden",
|
||||||
|
"set-as-cover-image": "Als recept omslagfoto instellen",
|
||||||
|
"cover-image": "Omslagfoto"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recept zoeker",
|
"recipe-finder": "Recept zoeker",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Groepsdetails",
|
"group-details": "Groepsdetails",
|
||||||
"group-details-description": "Voordat je een account aanmaakt moet je eerst een groep aanmaken. Jij bent het enige lid van de groep, maar je kunt later anderen uitnodigen. Leden van je groep kunnen maaltijdplannen, boodschappenlijstjes, recepten en nog veel meer delen!",
|
"group-details-description": "Voordat je een account aanmaakt moet je eerst een groep aanmaken. Jij bent het enige lid van de groep, maar je kunt later anderen uitnodigen. Leden van je groep kunnen maaltijdplannen, boodschappenlijstjes, recepten en nog veel meer delen!",
|
||||||
"use-seed-data": "Gebruik voorbeeldgegevens",
|
"use-seed-data": "Gebruik voorbeeldgegevens",
|
||||||
"use-seed-data-description": "Mealie bevat een verzameling ingrediënten, eenheden en labels die gebruikt kunnen worden om je groep te vullen met handige gegevens voor het organiseren van je recepten.",
|
"use-seed-data-description": "Mealie komt standaard met lijsten voor Voedsel, Eenheden en Labels. Die gebruik je om je recepten handig in te delen. Of om je groep handige informatie te geven. Ze zijn vertaald in de taal die je voor Mealie hebt ingesteld. Je kunt deze lijsten altijd aanvullen of aanpassen.",
|
||||||
"account-details": "Accountgegevens"
|
"account-details": "Accountgegevens"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nytt varsel",
|
"new-notification": "Nytt varsel",
|
||||||
"event-notifiers": "Hendelsesvarsler",
|
"event-notifiers": "Hendelsesvarsler",
|
||||||
"apprise-url-skipped-if-blank": "Apprise-URL (hoppes over hvis tom)",
|
"apprise-url-skipped-if-blank": "Apprise-URL (hoppes over hvis tom)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Aktiver varslingsagenten",
|
"enable-notifier": "Aktiver varslingsagenten",
|
||||||
"what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?",
|
"what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?",
|
||||||
"user-events": "Brukerhendelser",
|
"user-events": "Brukerhendelser",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Emneordhendelser",
|
"tag-events": "Emneordhendelser",
|
||||||
"category-events": "Kategorihendelser",
|
"category-events": "Kategorihendelser",
|
||||||
"when-a-new-user-joins-your-group": "Når en ny bruker blir med i gruppen din",
|
"when-a-new-user-joins-your-group": "Når en ny bruker blir med i gruppen din",
|
||||||
"recipe-events": "Oppskriftshendelser"
|
"recipe-events": "Oppskriftshendelser",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Legg til",
|
"add": "Legg til",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Kommentar",
|
"comment": "Kommentar",
|
||||||
"comments": "Kommentarer",
|
"comments": "Kommentarer",
|
||||||
"delete-confirmation": "Er du sikker på at du vil slette denne oppskriften?",
|
"delete-confirmation": "Er du sikker på at du vil slette denne oppskriften?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Du er i ferd med å slette en oppskrift som ikke er din ved å bruke administratortillatelser. Er du sikker?",
|
||||||
"delete-recipe": "Slett oppskrift",
|
"delete-recipe": "Slett oppskrift",
|
||||||
"description": "Beskrivelse",
|
"description": "Beskrivelse",
|
||||||
"disable-amount": "Deaktiver ingrediensmengde",
|
"disable-amount": "Deaktiver ingrediensmengde",
|
||||||
|
@ -581,7 +583,7 @@
|
||||||
"how-did-it-turn-out": "Hvordan ble det?",
|
"how-did-it-turn-out": "Hvordan ble det?",
|
||||||
"user-made-this": "{user} har laget dette",
|
"user-made-this": "{user} har laget dette",
|
||||||
"added-to-timeline": "Legg til tidslinje",
|
"added-to-timeline": "Legg til tidslinje",
|
||||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
"failed-to-add-to-timeline": "Kunne ikke legge til på tidslinjen",
|
||||||
"failed-to-update-recipe": "Kunne ikke oppdatere oppskriften",
|
"failed-to-update-recipe": "Kunne ikke oppdatere oppskriften",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Lagt til i tidslinjen, men klarte ikke å legge til bilde",
|
"added-to-timeline-but-failed-to-add-image": "Lagt til i tidslinjen, men klarte ikke å legge til bilde",
|
||||||
"api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.",
|
"api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Tilleggsingredienser",
|
"not-linked-ingredients": "Tilleggsingredienser",
|
||||||
"upload-another-image": "Last opp nytt bilde",
|
"upload-another-image": "Last opp nytt bilde",
|
||||||
"upload-images": "Last opp bilder",
|
"upload-images": "Last opp bilder",
|
||||||
"upload-more-images": "Last opp flere bilder"
|
"upload-more-images": "Last opp flere bilder",
|
||||||
|
"set-as-cover-image": "Bruk som forsidebilde for oppskriften",
|
||||||
|
"cover-image": "Forsidebilde"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Oppskriftsfinner",
|
"recipe-finder": "Oppskriftsfinner",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Gruppedetaljer",
|
"group-details": "Gruppedetaljer",
|
||||||
"group-details-description": "Før du oppretter en konto må du opprette en gruppe. Gruppen din vil bare inneholde deg, men du vil kunne invitere andre senere. Medlemmer i gruppen din kan dele måltider, handlelister, oppskrifter med mer!",
|
"group-details-description": "Før du oppretter en konto må du opprette en gruppe. Gruppen din vil bare inneholde deg, men du vil kunne invitere andre senere. Medlemmer i gruppen din kan dele måltider, handlelister, oppskrifter med mer!",
|
||||||
"use-seed-data": "Bruk tilføringsdata",
|
"use-seed-data": "Bruk tilføringsdata",
|
||||||
"use-seed-data-description": "Mealie kommer med en samling av matvarer, enheter og etiketter som kan brukes til å fylle gruppen din med nyttige data for å organisere oppskriftene dine.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Kontodetaljer"
|
"account-details": "Kontodetaljer"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nowe powiadomienie",
|
"new-notification": "Nowe powiadomienie",
|
||||||
"event-notifiers": "Powiadomienia o zdarzeniach",
|
"event-notifiers": "Powiadomienia o zdarzeniach",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (pominięty, jeśli puste)",
|
"apprise-url-skipped-if-blank": "URL Apprise (pominięty, jeśli puste)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Ponieważ adresy URL Apprise zawierają zazwyczaj poufne informacje, pole to pozostaje celowo puste podczas edycji. Jeśli chcesz zaktualizować adres URL, wprowadź ten nowy tutaj, w przeciwnym razie pozostaw puste, aby zachować bieżący adres URL.",
|
||||||
"enable-notifier": "Włącz Powiadomienie",
|
"enable-notifier": "Włącz Powiadomienie",
|
||||||
"what-events": "Jakie zdarzenia powinien subskrybować ten powiadamiający?",
|
"what-events": "Jakie zdarzenia powinien subskrybować ten powiadamiający?",
|
||||||
"user-events": "Zdarzenia użytkownika",
|
"user-events": "Zdarzenia użytkownika",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Zdarzenia tagów",
|
"tag-events": "Zdarzenia tagów",
|
||||||
"category-events": "Wydarzenia kategorii",
|
"category-events": "Wydarzenia kategorii",
|
||||||
"when-a-new-user-joins-your-group": "Kiedy nowy użytkownik dołączy do Twojej grupy",
|
"when-a-new-user-joins-your-group": "Kiedy nowy użytkownik dołączy do Twojej grupy",
|
||||||
"recipe-events": "Zdarzenia Przepisów"
|
"recipe-events": "Zdarzenia Przepisów",
|
||||||
|
"label-events": "Etykieta wydarzeń"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Dodaj",
|
"add": "Dodaj",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Dodatkowe składniki",
|
"not-linked-ingredients": "Dodatkowe składniki",
|
||||||
"upload-another-image": "Prześlij kolejny obraz",
|
"upload-another-image": "Prześlij kolejny obraz",
|
||||||
"upload-images": "Prześlij obraz",
|
"upload-images": "Prześlij obraz",
|
||||||
"upload-more-images": "Prześlij więcej obrazów"
|
"upload-more-images": "Prześlij więcej obrazów",
|
||||||
|
"set-as-cover-image": "Ustaw jako okładkę przepisu",
|
||||||
|
"cover-image": "Okładka"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Wyszukiwarka przepisów",
|
"recipe-finder": "Wyszukiwarka przepisów",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Szczegóły grupy",
|
"group-details": "Szczegóły grupy",
|
||||||
"group-details-description": "Zanim utworzysz konto musisz stworzyć grupę. Twoja grupa zawierać będzie tylko Ciebie, ale będziesz istniała możlwiość zaproszenia do niej innych. Użytkownicy Twojej grupy mogą współdzielić plany posiłków, listy zakupów, przepisy i więcej!",
|
"group-details-description": "Zanim utworzysz konto musisz stworzyć grupę. Twoja grupa zawierać będzie tylko Ciebie, ale będziesz istniała możlwiość zaproszenia do niej innych. Użytkownicy Twojej grupy mogą współdzielić plany posiłków, listy zakupów, przepisy i więcej!",
|
||||||
"use-seed-data": "Użyj przykładowych danych",
|
"use-seed-data": "Użyj przykładowych danych",
|
||||||
"use-seed-data-description": "Mealie dostarcza zestaw posiłków, jednostek i opisów które mogą zostać użyte do zapełnienia Twojej grupy przydatnymi danymi do ogranizacji Twoich przepisów.",
|
"use-seed-data-description": "Wysyłka posiłków z kolekcją żywności, jednostek i etykiet, które mogą być użyte do wypełnienia Twojej grupy pomocnymi danymi do organizacji twoich przepisów. Są one tłumaczone na wybrany język. Zawsze możesz dodać lub zmodyfikować te dane później.",
|
||||||
"account-details": "Szczegóły konta"
|
"account-details": "Szczegóły konta"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nova Notificação",
|
"new-notification": "Nova Notificação",
|
||||||
"event-notifiers": "Notificações de Eventos",
|
"event-notifiers": "Notificações de Eventos",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (ignorado se estiver em branco)",
|
"apprise-url-skipped-if-blank": "URL Apprise (ignorado se estiver em branco)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Habilitar Notificador",
|
"enable-notifier": "Habilitar Notificador",
|
||||||
"what-events": "A quais eventos este notificador deve subscrever?",
|
"what-events": "A quais eventos este notificador deve subscrever?",
|
||||||
"user-events": "Eventos do usuário",
|
"user-events": "Eventos do usuário",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Eventos de Etiqueta",
|
"tag-events": "Eventos de Etiqueta",
|
||||||
"category-events": "Eventos de Categoria",
|
"category-events": "Eventos de Categoria",
|
||||||
"when-a-new-user-joins-your-group": "Quando um novo usuário entrar no seu grupo",
|
"when-a-new-user-joins-your-group": "Quando um novo usuário entrar no seu grupo",
|
||||||
"recipe-events": "Eventos da Receita"
|
"recipe-events": "Eventos da Receita",
|
||||||
|
"label-events": "Rotular Eventos"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
|
@ -253,7 +255,7 @@
|
||||||
"default-recipe-preferences": "Preferências padrões de receita",
|
"default-recipe-preferences": "Preferências padrões de receita",
|
||||||
"group-preferences": "Preferências de Grupo",
|
"group-preferences": "Preferências de Grupo",
|
||||||
"private-group": "Grupo Privado",
|
"private-group": "Grupo Privado",
|
||||||
"private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings",
|
"private-group-description": "Configurar seu grupo para privado irá desabilitar as opções de visualização pública. Isso substitui qualquer configuração pública individual.",
|
||||||
"enable-public-access": "Ativar Acesso Público",
|
"enable-public-access": "Ativar Acesso Público",
|
||||||
"enable-public-access-description": "Tornar receitas do grupo públicas por padrão, e permitir a sua visualização por visitantes não logados",
|
"enable-public-access-description": "Tornar receitas do grupo públicas por padrão, e permitir a sua visualização por visitantes não logados",
|
||||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Permitir que usuários fora do seu grupo vejam suas receitas",
|
"allow-users-outside-of-your-group-to-see-your-recipes": "Permitir que usuários fora do seu grupo vejam suas receitas",
|
||||||
|
@ -276,30 +278,30 @@
|
||||||
"admin-group-management": "Gerenciamento de Grupos Administrativos",
|
"admin-group-management": "Gerenciamento de Grupos Administrativos",
|
||||||
"admin-group-management-text": "As alterações a este grupo serão refletidas imediatamente.",
|
"admin-group-management-text": "As alterações a este grupo serão refletidas imediatamente.",
|
||||||
"group-id-value": "ID do grupo: {0}",
|
"group-id-value": "ID do grupo: {0}",
|
||||||
"total-households": "Total Households",
|
"total-households": "Total de Familiares",
|
||||||
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
|
"you-must-select-a-group-before-selecting-a-household": "Você deve selecionar um grupo antes de selecionar uma família"
|
||||||
},
|
},
|
||||||
"household": {
|
"household": {
|
||||||
"household": "Casa",
|
"household": "Casa",
|
||||||
"households": "Casas",
|
"households": "Casas",
|
||||||
"user-household": "User Household",
|
"user-household": "Família do Usuário",
|
||||||
"create-household": "Create Household",
|
"create-household": "Criar Família",
|
||||||
"household-name": "Household Name",
|
"household-name": "Nome da Família",
|
||||||
"household-group": "Household Group",
|
"household-group": "Grupo Familiar",
|
||||||
"household-management": "Household Management",
|
"household-management": "Gerenciamento Familiar",
|
||||||
"manage-households": "Manage Households",
|
"manage-households": "Gerenciar Família",
|
||||||
"admin-household-management": "Admin Household Management",
|
"admin-household-management": "Administrador de Gerenciamento Familiar",
|
||||||
"admin-household-management-text": "Changes to this household will be reflected immediately.",
|
"admin-household-management-text": "Mudanças a esta família serão aplicadas imediatamente.",
|
||||||
"household-id-value": "Household Id: {0}",
|
"household-id-value": "Id Familiar: {0}",
|
||||||
"private-household": "Private Household",
|
"private-household": "Família Privada",
|
||||||
"private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings",
|
"private-household-description": "Configurar sua família como privado desativará todas as opções de visualização pública. Isso substitui as configurações de visualização pública individual",
|
||||||
"lock-recipe-edits-from-other-households": "Lock recipe edits from other households",
|
"lock-recipe-edits-from-other-households": "Bloquear edições de receitas de outras famílias",
|
||||||
"lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household",
|
"lock-recipe-edits-from-other-households-description": "Quando ativado apenas os usuários da sua família podem editar receitas criadas por sua família",
|
||||||
"household-recipe-preferences": "Household Recipe Preferences",
|
"household-recipe-preferences": "Preferências de Receita da Família",
|
||||||
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.",
|
"default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada em sua família. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.",
|
||||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
|
"allow-users-outside-of-your-household-to-see-your-recipes": "Permitir que os usuários fora de sua família vejam suas receitas",
|
||||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link",
|
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Quando ativado, você pode usar um link de compartilhamento público para compartilhar receitas específicas sem autorizar o usuário. Quando desativado, você só pode compartilhar receitas com usuários que estão na sua família ou com um link privado pré-gerado",
|
||||||
"household-preferences": "Household Preferences"
|
"household-preferences": "Preferências Familiares"
|
||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Criar um novo plano de refeições",
|
"create-a-new-meal-plan": "Criar um novo plano de refeições",
|
||||||
|
@ -321,10 +323,10 @@
|
||||||
"mealplan-settings": "Configurações de Plano de Refeições",
|
"mealplan-settings": "Configurações de Plano de Refeições",
|
||||||
"mealplan-update-failed": "Falha ao atualizar Plano de Refeições",
|
"mealplan-update-failed": "Falha ao atualizar Plano de Refeições",
|
||||||
"mealplan-updated": "Plano de Refeições atualizado",
|
"mealplan-updated": "Plano de Refeições atualizado",
|
||||||
"mealplan-households-description": "If no household is selected, recipes can be added from any household",
|
"mealplan-households-description": "Se nenhuma família for selecionada, as receitas podem ser adicionadas por qualquer família",
|
||||||
"any-category": "Any Category",
|
"any-category": "Qualquer Categoria",
|
||||||
"any-tag": "Any Tag",
|
"any-tag": "Qualquer Etiqueta",
|
||||||
"any-household": "Any Household",
|
"any-household": "Qualquer Família",
|
||||||
"no-meal-plan-defined-yet": "Nenhum Plano de Refeições definido ainda",
|
"no-meal-plan-defined-yet": "Nenhum Plano de Refeições definido ainda",
|
||||||
"no-meal-planned-for-today": "Nenhuma refeição planejada para hoje",
|
"no-meal-planned-for-today": "Nenhuma refeição planejada para hoje",
|
||||||
"numberOfDays-hint": "Número de dias ao carregar a página",
|
"numberOfDays-hint": "Número de dias ao carregar a página",
|
||||||
|
@ -357,7 +359,7 @@
|
||||||
"for-type-meal-types": "para {0} tipos de refeição",
|
"for-type-meal-types": "para {0} tipos de refeição",
|
||||||
"meal-plan-rules": "Regras de Plano de Refeições",
|
"meal-plan-rules": "Regras de Plano de Refeições",
|
||||||
"new-rule": "Nova Regra",
|
"new-rule": "Nova Regra",
|
||||||
"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 rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
"meal-plan-rules-description": "Você pode criar regras para selecionar receitas automaticamente para seus Planos de Refeição. Essas regras são usadas pelo servidor para determinar o conjunto aleatório de receitas a serem selecionadas ao criar os planos de refeição. Observe que se as regras tiverem as mesmas restrições de dia/tipo, os filtros de regras serão mesclados. Na prática, não é necessário criar regras duplicadas, mas é possível fazê-lo.",
|
||||||
"new-rule-description": "Ao criar uma nova regra para um Plano de Refeições, você pode restringir a regra a ser aplicada a um dia específico da semana e/ou a um tipo específico de refeição. Para aplicar uma regra a todos os dias ou a todos os tipos de refeições, você pode definir a regra para \"Qualquer\", que será aplicada a todos os valores possíveis para o dia e/ou o tipo de refeição.",
|
"new-rule-description": "Ao criar uma nova regra para um Plano de Refeições, você pode restringir a regra a ser aplicada a um dia específico da semana e/ou a um tipo específico de refeição. Para aplicar uma regra a todos os dias ou a todos os tipos de refeições, você pode definir a regra para \"Qualquer\", que será aplicada a todos os valores possíveis para o dia e/ou o tipo de refeição.",
|
||||||
"recipe-rules": "Regras das receitas",
|
"recipe-rules": "Regras das receitas",
|
||||||
"applies-to-all-days": "Aplica-se diariamente",
|
"applies-to-all-days": "Aplica-se diariamente",
|
||||||
|
@ -432,7 +434,7 @@
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Cole os dados da sua receita. Cada linha será tratado como um item em uma lista",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Cole os dados da sua receita. Cada linha será tratado como um item em uma lista",
|
||||||
"recipe-markup-specification": "Especificação da Receita",
|
"recipe-markup-specification": "Especificação da Receita",
|
||||||
"recipe-url": "URL da Receita",
|
"recipe-url": "URL da Receita",
|
||||||
"recipe-html-or-json": "Recipe HTML or JSON",
|
"recipe-html-or-json": "HMTL ou JSON da Receita",
|
||||||
"upload-a-recipe": "Enviar uma Receita",
|
"upload-a-recipe": "Enviar uma Receita",
|
||||||
"upload-individual-zip-file": "Enviar um arquivo .zip individual exportado a partir de outra instância do Mealie.",
|
"upload-individual-zip-file": "Enviar um arquivo .zip individual exportado a partir de outra instância do Mealie.",
|
||||||
"url-form-hint": "Copie e cole um link do seu site de receita favorito",
|
"url-form-hint": "Copie e cole um link do seu site de receita favorito",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Comentário",
|
"comment": "Comentário",
|
||||||
"comments": "Comentários",
|
"comments": "Comentários",
|
||||||
"delete-confirmation": "Você tem certeza que deseja apagar esta receita?",
|
"delete-confirmation": "Você tem certeza que deseja apagar esta receita?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Você está prestes a excluir uma receita que não é sua usando permissões de administrador. Tem certeza?",
|
||||||
"delete-recipe": "Excluir Receita",
|
"delete-recipe": "Excluir Receita",
|
||||||
"description": "Descrição",
|
"description": "Descrição",
|
||||||
"disable-amount": "Desativa Quantidade de Ingredientes",
|
"disable-amount": "Desativa Quantidade de Ingredientes",
|
||||||
|
@ -527,7 +529,7 @@
|
||||||
"sugar-content": "Açúcares",
|
"sugar-content": "Açúcares",
|
||||||
"title": "Título",
|
"title": "Título",
|
||||||
"total-time": "Tempo Total",
|
"total-time": "Tempo Total",
|
||||||
"trans-fat-content": "Trans-fat",
|
"trans-fat-content": "Gordura trans",
|
||||||
"unable-to-delete-recipe": "Não foi possível apagar a receita",
|
"unable-to-delete-recipe": "Não foi possível apagar a receita",
|
||||||
"unsaturated-fat-content": "Gorduras não saturadas",
|
"unsaturated-fat-content": "Gorduras não saturadas",
|
||||||
"no-recipe": "Nenhuma Receita",
|
"no-recipe": "Nenhuma Receita",
|
||||||
|
@ -548,8 +550,8 @@
|
||||||
"failed-to-add-recipe-to-mealplan": "Falha ao adicionar a receita ao plano de refeições",
|
"failed-to-add-recipe-to-mealplan": "Falha ao adicionar a receita ao plano de refeições",
|
||||||
"failed-to-add-to-list": "Falha ao adicionar à lista",
|
"failed-to-add-to-list": "Falha ao adicionar à lista",
|
||||||
"yield": "Rendimento",
|
"yield": "Rendimento",
|
||||||
"yields-amount-with-text": "Yields {amount} {text}",
|
"yields-amount-with-text": "Produtos {amount}{text}",
|
||||||
"yield-text": "Yield Text",
|
"yield-text": "Texto do Produto",
|
||||||
"quantity": "Quantidade",
|
"quantity": "Quantidade",
|
||||||
"choose-unit": "Escolher unidades",
|
"choose-unit": "Escolher unidades",
|
||||||
"press-enter-to-create": "Pressione Enter para criar",
|
"press-enter-to-create": "Pressione Enter para criar",
|
||||||
|
@ -580,14 +582,14 @@
|
||||||
"made-this": "Eu Fiz Isso",
|
"made-this": "Eu Fiz Isso",
|
||||||
"how-did-it-turn-out": "Como que ficou?",
|
"how-did-it-turn-out": "Como que ficou?",
|
||||||
"user-made-this": "{user} fez isso",
|
"user-made-this": "{user} fez isso",
|
||||||
"added-to-timeline": "Added to timeline",
|
"added-to-timeline": "Adicionado à linha do tempo",
|
||||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
"failed-to-add-to-timeline": "Falha ao adicionar à linha do tempo",
|
||||||
"failed-to-update-recipe": "Failed to update recipe",
|
"failed-to-update-recipe": "Falha ao atualizar receita",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
"added-to-timeline-but-failed-to-add-image": "Adicionado à linha do tempo, mas não foi possível adicionar imagem",
|
||||||
"api-extras-description": "Extras de receitas são atributos-chave da API do Mealie. Assim, você pode criar pares chave/valor JSON personalizados dentro de uma receita, referenciando aplicações de terceiros. Você pode usar as chaves para fornecer informações, como por ex. ativar automações ou mensagens que serão enviadas a seus dispositivos.",
|
"api-extras-description": "Extras de receitas são atributos-chave da API do Mealie. Assim, você pode criar pares chave/valor JSON personalizados dentro de uma receita, referenciando aplicações de terceiros. Você pode usar as chaves para fornecer informações, como por ex. ativar automações ou mensagens que serão enviadas a seus dispositivos.",
|
||||||
"message-key": "Chave de mensagem",
|
"message-key": "Chave de mensagem",
|
||||||
"parse": "Analisar",
|
"parse": "Analisar",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "Parece que seus ingredientes ainda não foram analisados. Clique no botão \"{parse}\" abaixo para analisar seus ingredientes em alimentos estruturados.",
|
||||||
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
||||||
"drop-image": "Arrastar imagem",
|
"drop-image": "Arrastar imagem",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Ative quantidades de ingredientes para usar esta funcionalidade",
|
"enable-ingredient-amounts-to-use-this-feature": "Ative quantidades de ingredientes para usar esta funcionalidade",
|
||||||
|
@ -604,7 +606,7 @@
|
||||||
"import-with-zip": "Importar a partir de .zip",
|
"import-with-zip": "Importar a partir de .zip",
|
||||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
"crop-and-rotate-the-image": "Corte e gire a imagem para que apenas o texto esteja visível e esteja na posição correta.",
|
||||||
"create-from-images": "Criar a partir de imagens",
|
"create-from-images": "Criar a partir de imagens",
|
||||||
"should-translate-description": "Traduza a receita para o meu idioma",
|
"should-translate-description": "Traduza a receita para o meu idioma",
|
||||||
"please-wait-image-procesing": "Por favor aguarde, a imagem está sendo processada. Isto pode levar algum tempo.",
|
"please-wait-image-procesing": "Por favor aguarde, a imagem está sendo processada. Isto pode levar algum tempo.",
|
||||||
|
@ -618,13 +620,13 @@
|
||||||
"scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas a extrair de uma vez?",
|
"scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas a extrair de uma vez?",
|
||||||
"scrape-recipe-suggest-bulk-importer": "Tente o importador em massa",
|
"scrape-recipe-suggest-bulk-importer": "Tente o importador em massa",
|
||||||
"scrape-recipe-have-raw-html-or-json-data": "Tem dados HTML ou JSON brutos?",
|
"scrape-recipe-have-raw-html-or-json-data": "Tem dados HTML ou JSON brutos?",
|
||||||
"scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly",
|
"scrape-recipe-you-can-import-from-raw-data-directly": "Você pode importar diretamente de dados brutos",
|
||||||
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
|
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
|
||||||
"stay-in-edit-mode": "Permanecer no modo de edição",
|
"stay-in-edit-mode": "Permanecer no modo de edição",
|
||||||
"import-from-zip": "Importar do .zip",
|
"import-from-zip": "Importar do .zip",
|
||||||
"import-from-zip-description": "Importar uma única receita exportada de outra instância Mealie.",
|
"import-from-zip-description": "Importar uma única receita exportada de outra instância Mealie.",
|
||||||
"import-from-html-or-json": "Import from HTML or JSON",
|
"import-from-html-or-json": "Importar de HTML ou JSON",
|
||||||
"import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.",
|
"import-from-html-or-json-description": "Importe uma única receita de HTML ou JSON. Isso é útil se você tiver uma receita de um site que a Mealie não consegue extrair normalmente, ou de alguma outra fonte externa.",
|
||||||
"json-import-format-description-colon": "Para importar via JSON, ele deve estar em formato válido:",
|
"json-import-format-description-colon": "Para importar via JSON, ele deve estar em formato válido:",
|
||||||
"json-editor": "Editor de JSON",
|
"json-editor": "Editor de JSON",
|
||||||
"zip-files-must-have-been-exported-from-mealie": "Os arquivos .zip devem ter sido exportados do Mealie",
|
"zip-files-must-have-been-exported-from-mealie": "Os arquivos .zip devem ter sido exportados do Mealie",
|
||||||
|
@ -643,9 +645,9 @@
|
||||||
"recipe-debugger-use-openai-description": "Usar OpenAI para analisar os resultados ao invés de depender da biblioteca de extração. Criando uma receita via URL, isso é feito automaticamente se essa biblioteca, mas você pode testar manualmente aqui.",
|
"recipe-debugger-use-openai-description": "Usar OpenAI para analisar os resultados ao invés de depender da biblioteca de extração. Criando uma receita via URL, isso é feito automaticamente se essa biblioteca, mas você pode testar manualmente aqui.",
|
||||||
"debug": "Depurar",
|
"debug": "Depurar",
|
||||||
"tree-view": "Visualização em árvore",
|
"tree-view": "Visualização em árvore",
|
||||||
"recipe-servings": "Recipe Servings",
|
"recipe-servings": "Porções da Receita",
|
||||||
"recipe-yield": "Rendimento da Receita",
|
"recipe-yield": "Rendimento da Receita",
|
||||||
"recipe-yield-text": "Recipe Yield Text",
|
"recipe-yield-text": "Texto de Produção da Receita",
|
||||||
"unit": "Unidade",
|
"unit": "Unidade",
|
||||||
"upload-image": "Enviar imagem",
|
"upload-image": "Enviar imagem",
|
||||||
"screen-awake": "Manter a tela ligada",
|
"screen-awake": "Manter a tela ligada",
|
||||||
|
@ -664,15 +666,17 @@
|
||||||
"no-unit": "Sem unidades",
|
"no-unit": "Sem unidades",
|
||||||
"missing-unit": "Criar unidade ausente: {unit}",
|
"missing-unit": "Criar unidade ausente: {unit}",
|
||||||
"missing-food": "Criar comida ausente: {food}",
|
"missing-food": "Criar comida ausente: {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Esta unidade não pôde ser analisada automaticamente",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Este alimento não pôde ser analisado automaticamente",
|
||||||
"no-food": "Sem Comida"
|
"no-food": "Sem Comida"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Reset Servings Count",
|
"reset-servings-count": "Redefinir Contagem de Porções",
|
||||||
"not-linked-ingredients": "Ingredientes adicionais",
|
"not-linked-ingredients": "Ingredientes adicionais",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Carregar outra imagem",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Carregar imagens",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Carregar mais imagens",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Localizador de Receitas",
|
"recipe-finder": "Localizador de Receitas",
|
||||||
|
@ -681,15 +685,15 @@
|
||||||
"no-ingredients-selected": "Nenhum ingrediente selecionado",
|
"no-ingredients-selected": "Nenhum ingrediente selecionado",
|
||||||
"missing": "Ausente",
|
"missing": "Ausente",
|
||||||
"no-recipes-found": "Nenhuma receita encontrada",
|
"no-recipes-found": "Nenhuma receita encontrada",
|
||||||
"no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters",
|
"no-recipes-found-description": "Tente adicionar mais ingredientes à sua busca ou ajuste seus filtros",
|
||||||
"include-ingredients-on-hand": "Include Ingredients On Hand",
|
"include-ingredients-on-hand": "Incluir Ingredientes Manualmente",
|
||||||
"include-tools-on-hand": "Include Tools On Hand",
|
"include-tools-on-hand": "Incluir Utensílios Manualmente",
|
||||||
"max-missing-ingredients": "Max Missing Ingredients",
|
"max-missing-ingredients": "Máximo de Ingredientes Faltando",
|
||||||
"max-missing-tools": "Max Missing Tools",
|
"max-missing-tools": "Máximo de Utensílios Faltando",
|
||||||
"selected-tools": "Ferramentas Selecionadas",
|
"selected-tools": "Ferramentas Selecionadas",
|
||||||
"other-filters": "Outros Filtros",
|
"other-filters": "Outros Filtros",
|
||||||
"ready-to-make": "Ready to Make",
|
"ready-to-make": "Pronto Para Fazer",
|
||||||
"almost-ready-to-make": "Almost Ready to Make"
|
"almost-ready-to-make": "Quase Pronto Para Fazer"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Pesquisa avançada",
|
"advanced-search": "Pesquisa avançada",
|
||||||
|
@ -1040,7 +1044,7 @@
|
||||||
"administrator": "Administrador",
|
"administrator": "Administrador",
|
||||||
"user-can-invite-other-to-group": "O usuário pode convidar outros para o grupo",
|
"user-can-invite-other-to-group": "O usuário pode convidar outros para o grupo",
|
||||||
"user-can-manage-group": "Usuário pode gerenciar o grupo",
|
"user-can-manage-group": "Usuário pode gerenciar o grupo",
|
||||||
"user-can-manage-household": "User can manage household",
|
"user-can-manage-household": "O usuário pode gerenciar a família",
|
||||||
"user-can-organize-group-data": "Usuário pode organizar dados do grupo",
|
"user-can-organize-group-data": "Usuário pode organizar dados do grupo",
|
||||||
"enable-advanced-features": "Ativar recursos avançados",
|
"enable-advanced-features": "Ativar recursos avançados",
|
||||||
"it-looks-like-this-is-your-first-time-logging-in": "Parece que este é seu primeiro login.",
|
"it-looks-like-this-is-your-first-time-logging-in": "Parece que este é seu primeiro login.",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalhes do Grupo",
|
"group-details": "Detalhes do Grupo",
|
||||||
"group-details-description": "Antes de criar uma conta é necessário criar um grupo. O seu grupo só conterá você, mas você poderá convidar os outros mais tarde. Os membros do seu grupo podem compartilhar planos de refeição, listas de compras, receitas e muito mais!",
|
"group-details-description": "Antes de criar uma conta é necessário criar um grupo. O seu grupo só conterá você, mas você poderá convidar os outros mais tarde. Os membros do seu grupo podem compartilhar planos de refeição, listas de compras, receitas e muito mais!",
|
||||||
"use-seed-data": "Usar dados semeados",
|
"use-seed-data": "Usar dados semeados",
|
||||||
"use-seed-data-description": "O Mealie é fornecido com uma coleção de alimentos, unidades e rótulos que podem ser usados para preencher seu grupo com dados úteis para organizar suas receitas.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalhes da Conta"
|
"account-details": "Detalhes da Conta"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
@ -1300,8 +1304,8 @@
|
||||||
"debug-openai-services-description": "Use esta página para depurar serviços OpenAI. Você pode testar a sua conexão OpenAI e ver os resultados aqui. Se você tiver os serviços de imagem ativados, você também pode fornecer uma imagem.",
|
"debug-openai-services-description": "Use esta página para depurar serviços OpenAI. Você pode testar a sua conexão OpenAI e ver os resultados aqui. Se você tiver os serviços de imagem ativados, você também pode fornecer uma imagem.",
|
||||||
"run-test": "Executar teste",
|
"run-test": "Executar teste",
|
||||||
"test-results": "Resultados do teste",
|
"test-results": "Resultados do teste",
|
||||||
"group-delete-note": "Groups with users or households cannot be deleted",
|
"group-delete-note": "Grupos com usuários ou famílias não podem ser excluídos",
|
||||||
"household-delete-note": "Households with users cannot be deleted"
|
"household-delete-note": "Famílias com usuários não podem ser excluídas"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"welcome-user": "👋 Bem-vindo(a), {0}!",
|
"welcome-user": "👋 Bem-vindo(a), {0}!",
|
||||||
|
@ -1313,8 +1317,8 @@
|
||||||
"account-summary-description": "Aqui está um resumo das informações do seu grupo.",
|
"account-summary-description": "Aqui está um resumo das informações do seu grupo.",
|
||||||
"group-statistics": "Estatísticas do Grupo",
|
"group-statistics": "Estatísticas do Grupo",
|
||||||
"group-statistics-description": "Suas Estatísticas em Grupo fornecem algumas informações sobre como você está usando o Mealie.",
|
"group-statistics-description": "Suas Estatísticas em Grupo fornecem algumas informações sobre como você está usando o Mealie.",
|
||||||
"household-statistics": "Household Statistics",
|
"household-statistics": "Estatísticas da Família",
|
||||||
"household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.",
|
"household-statistics-description": "Suas Estatísticas da Família fornecem algumas dicas de como você está usando o Mealie.",
|
||||||
"storage-capacity": "Capacidade de armazenamento",
|
"storage-capacity": "Capacidade de armazenamento",
|
||||||
"storage-capacity-description": "Sua capacidade de armazenamento é um cálculo das imagens e arquivos que você carregou.",
|
"storage-capacity-description": "Sua capacidade de armazenamento é um cálculo das imagens e arquivos que você carregou.",
|
||||||
"personal": "Pessoal",
|
"personal": "Pessoal",
|
||||||
|
@ -1324,13 +1328,13 @@
|
||||||
"api-tokens-description": "Gerencie seus Tokens de API para acessar de aplicações externas.",
|
"api-tokens-description": "Gerencie seus Tokens de API para acessar de aplicações externas.",
|
||||||
"group-description": "Esses itens são compartilhados dentro do seu grupo. Ao editar um deles vai mudá-lo para todo o grupo!",
|
"group-description": "Esses itens são compartilhados dentro do seu grupo. Ao editar um deles vai mudá-lo para todo o grupo!",
|
||||||
"group-settings": "Configurações do Grupo",
|
"group-settings": "Configurações do Grupo",
|
||||||
"group-settings-description": "Manage your common group settings, like privacy settings.",
|
"group-settings-description": "Gerencie suas configurações comuns de grupo, como configurações de privacidade.",
|
||||||
"household-description": "These items are shared within your household. Editing one of them will change it for the whole household!",
|
"household-description": "Esses itens são compartilhados dentro de sua família. Editar um deles irá alterá-lo para toda a família!",
|
||||||
"household-settings": "Household Settings",
|
"household-settings": "Configurações da Família",
|
||||||
"household-settings-description": "Manage your household settings, like mealplan and privacy settings.",
|
"household-settings-description": "Gerencie suas configurações familiares, como planos de refeição e configurações de privacidade.",
|
||||||
"cookbooks-description": "Gerencie uma coleção de categorias de receita e gere páginas para elas.",
|
"cookbooks-description": "Gerencie uma coleção de categorias de receita e gere páginas para elas.",
|
||||||
"members": "Membros",
|
"members": "Membros",
|
||||||
"members-description": "See who's in your household and manage their permissions.",
|
"members-description": "Ver quem está na sua família e gerenciar suas permissões.",
|
||||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||||
"notifiers": "Notificadores",
|
"notifiers": "Notificadores",
|
||||||
"notifiers-description": "Configure e-mails e notificações push que desencadeiam eventos específicos.",
|
"notifiers-description": "Configure e-mails e notificações push que desencadeiam eventos específicos.",
|
||||||
|
@ -1355,9 +1359,9 @@
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "Livros de Receita",
|
"cookbooks": "Livros de Receita",
|
||||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.",
|
"description": "Livros de receitas são outra maneira de criar sessões cruzadas de receitas, organizadores e outros filtros. Criar um livro de receitas adicionará um acesso à barra lateral e todas as receitas com filtros selecionados serão exibidos no livro de receitas.",
|
||||||
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households",
|
"hide-cookbooks-from-other-households": "Ocultar Livros de Receitas de Outras Famílias",
|
||||||
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar",
|
"hide-cookbooks-from-other-households-description": "Quando ativo, apenas livros de receitas da sua família aparecerão na barra lateral",
|
||||||
"public-cookbook": "Livro de Receitas público",
|
"public-cookbook": "Livro de Receitas público",
|
||||||
"public-cookbook-description": "Cookbooks públicos podem ser compartilhados com usuários que não sejam não-mealiee serão exibidos na sua página de grupos.",
|
"public-cookbook-description": "Cookbooks públicos podem ser compartilhados com usuários que não sejam não-mealiee serão exibidos na sua página de grupos.",
|
||||||
"filter-options": "Opções de filtro",
|
"filter-options": "Opções de filtro",
|
||||||
|
@ -1367,7 +1371,7 @@
|
||||||
"require-all-tools": "Exigir todas as ferramentas",
|
"require-all-tools": "Exigir todas as ferramentas",
|
||||||
"cookbook-name": "Nome do Livro de Receitas",
|
"cookbook-name": "Nome do Livro de Receitas",
|
||||||
"cookbook-with-name": "Livro de Receitas {0}",
|
"cookbook-with-name": "Livro de Receitas {0}",
|
||||||
"household-cookbook-name": "{0} Cookbook {1}",
|
"household-cookbook-name": "{0} Livro de Receitas {1}",
|
||||||
"create-a-cookbook": "Criar um Livro de Receitas",
|
"create-a-cookbook": "Criar um Livro de Receitas",
|
||||||
"cookbook": "Livro de Receitas"
|
"cookbook": "Livro de Receitas"
|
||||||
},
|
},
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nova Notificação",
|
"new-notification": "Nova Notificação",
|
||||||
"event-notifiers": "Notificadores de eventos",
|
"event-notifiers": "Notificadores de eventos",
|
||||||
"apprise-url-skipped-if-blank": "URL da Apprise (ignorado se vazio)",
|
"apprise-url-skipped-if-blank": "URL da Apprise (ignorado se vazio)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Ativar Notificador",
|
"enable-notifier": "Ativar Notificador",
|
||||||
"what-events": "Que eventos este notificador deve subscrever?",
|
"what-events": "Que eventos este notificador deve subscrever?",
|
||||||
"user-events": "Eventos do utilizador",
|
"user-events": "Eventos do utilizador",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Eventos de Etiquetagem",
|
"tag-events": "Eventos de Etiquetagem",
|
||||||
"category-events": "Eventos de Categoria",
|
"category-events": "Eventos de Categoria",
|
||||||
"when-a-new-user-joins-your-group": "Quando um novo utilizador entra no seu grupo",
|
"when-a-new-user-joins-your-group": "Quando um novo utilizador entra no seu grupo",
|
||||||
"recipe-events": "Eventos de receita"
|
"recipe-events": "Eventos de receita",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ingredientes Adicionais",
|
"not-linked-ingredients": "Ingredientes Adicionais",
|
||||||
"upload-another-image": "Carregar outra imagem",
|
"upload-another-image": "Carregar outra imagem",
|
||||||
"upload-images": "Carregar imagens",
|
"upload-images": "Carregar imagens",
|
||||||
"upload-more-images": "Carregar mais imagens"
|
"upload-more-images": "Carregar mais imagens",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Localizador de Receitas",
|
"recipe-finder": "Localizador de Receitas",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detalhes do Grupo",
|
"group-details": "Detalhes do Grupo",
|
||||||
"group-details-description": "Antes de criar uma conta é necessário criar um grupo. Será o único membro do seu grupo, mas poderá convidar outros mais tarde. Os membros do seu grupo podem partilhar planos de refeição, listas de compras, receitas e muito mais!",
|
"group-details-description": "Antes de criar uma conta é necessário criar um grupo. Será o único membro do seu grupo, mas poderá convidar outros mais tarde. Os membros do seu grupo podem partilhar planos de refeição, listas de compras, receitas e muito mais!",
|
||||||
"use-seed-data": "Utilizar dados gerados",
|
"use-seed-data": "Utilizar dados gerados",
|
||||||
"use-seed-data-description": "O Mealie vem com uma coleção de Alimentos, Unidades e Rótulos que podem ser usados para popular o seu grupo com dados úteis para organizar as suas receitas.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalhes da Conta"
|
"account-details": "Detalhes da Conta"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Notificare nouă",
|
"new-notification": "Notificare nouă",
|
||||||
"event-notifiers": "Notificatori de evenimente",
|
"event-notifiers": "Notificatori de evenimente",
|
||||||
"apprise-url-skipped-if-blank": "URL Apprise (ignorat daca e gol)",
|
"apprise-url-skipped-if-blank": "URL Apprise (ignorat daca e gol)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Activare notificator",
|
"enable-notifier": "Activare notificator",
|
||||||
"what-events": "La ce evenimente ar trebui să se înscrie acest notificator?",
|
"what-events": "La ce evenimente ar trebui să se înscrie acest notificator?",
|
||||||
"user-events": "Evenimente Utilizator",
|
"user-events": "Evenimente Utilizator",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Etichetele de Evenimente",
|
"tag-events": "Etichetele de Evenimente",
|
||||||
"category-events": "Categorie de Evenimente",
|
"category-events": "Categorie de Evenimente",
|
||||||
"when-a-new-user-joins-your-group": "Când un utilizator nou se alătură grupului tău",
|
"when-a-new-user-joins-your-group": "Când un utilizator nou se alătură grupului tău",
|
||||||
"recipe-events": "Evenimente rețetă"
|
"recipe-events": "Evenimente rețetă",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Adaugă",
|
"add": "Adaugă",
|
||||||
|
@ -587,6 +589,7 @@
|
||||||
"api-extras-description": "Recipes extras sunt o caracteristică cheie a API-ului Mealie. Îți permit să creezi perechi personalizate de cheie/valoare JSON într-o rețetă, ca să faci referire la aplicații terțe. Puteți utiliza aceste chei pentru a furniza informații, de exemplu pentru a declanșa automatizări sau mesaje personalizate pentru a transmite dispozitivul dorit.",
|
"api-extras-description": "Recipes extras sunt o caracteristică cheie a API-ului Mealie. Îți permit să creezi perechi personalizate de cheie/valoare JSON într-o rețetă, ca să faci referire la aplicații terțe. Puteți utiliza aceste chei pentru a furniza informații, de exemplu pentru a declanșa automatizări sau mesaje personalizate pentru a transmite dispozitivul dorit.",
|
||||||
"message-key": "Cheie mesaj",
|
"message-key": "Cheie mesaj",
|
||||||
"parse": "Parsează",
|
"parse": "Parsează",
|
||||||
|
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||||
"attach-images-hint": "Atașează imagini trăgându-le cu mouse-ul și plasându-le în editor",
|
"attach-images-hint": "Atașează imagini trăgându-le cu mouse-ul și plasându-le în editor",
|
||||||
"drop-image": "Trage imaginea",
|
"drop-image": "Trage imaginea",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Activaţi cantităţile de ingrediente pentru a utiliza această funcționalitate",
|
"enable-ingredient-amounts-to-use-this-feature": "Activaţi cantităţile de ingrediente pentru a utiliza această funcționalitate",
|
||||||
|
@ -671,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ingrediente suplimentare",
|
"not-linked-ingredients": "Ingrediente suplimentare",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Căutător de rețete",
|
"recipe-finder": "Căutător de rețete",
|
||||||
|
@ -1164,7 +1169,7 @@
|
||||||
"group-details": "Detalii grup",
|
"group-details": "Detalii grup",
|
||||||
"group-details-description": "Înainte de a crea un cont, va trebui să creezi un grup. Grupul tău va conține inițial doar pe tine, dar vei putea invita și alte persoane ulterior. Membrii din grupul tău vor putea să partajeze planuri de mese, liste de cumpărături, rețete și multe altele!",
|
"group-details-description": "Înainte de a crea un cont, va trebui să creezi un grup. Grupul tău va conține inițial doar pe tine, dar vei putea invita și alte persoane ulterior. Membrii din grupul tău vor putea să partajeze planuri de mese, liste de cumpărături, rețete și multe altele!",
|
||||||
"use-seed-data": "Utilizează setul de date a populării",
|
"use-seed-data": "Utilizează setul de date a populării",
|
||||||
"use-seed-data-description": "Mealie vine cu o colecție de Alimente, Unități, și Etichete care pot fi utilizate pentru a popula grupul tău cu date utile pentru organizarea rețetelor.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detalii Cont"
|
"account-details": "Detalii Cont"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Новое уведомление",
|
"new-notification": "Новое уведомление",
|
||||||
"event-notifiers": "Уведомления о событии",
|
"event-notifiers": "Уведомления о событии",
|
||||||
"apprise-url-skipped-if-blank": "URL-адрес (пропущен, если пусто)",
|
"apprise-url-skipped-if-blank": "URL-адрес (пропущен, если пусто)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Включить уведомления",
|
"enable-notifier": "Включить уведомления",
|
||||||
"what-events": "На какие события следует настроить уведомления?",
|
"what-events": "На какие события следует настроить уведомления?",
|
||||||
"user-events": "События пользователя",
|
"user-events": "События пользователя",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "События тегов",
|
"tag-events": "События тегов",
|
||||||
"category-events": "События категорий",
|
"category-events": "События категорий",
|
||||||
"when-a-new-user-joins-your-group": "Когда новый пользователь присоединяется к вашей группе",
|
"when-a-new-user-joins-your-group": "Когда новый пользователь присоединяется к вашей группе",
|
||||||
"recipe-events": "События Рецепта"
|
"recipe-events": "События Рецепта",
|
||||||
|
"label-events": "Ярлыки событий"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Добавить",
|
"add": "Добавить",
|
||||||
|
@ -645,7 +647,7 @@
|
||||||
"tree-view": "В виде дерева",
|
"tree-view": "В виде дерева",
|
||||||
"recipe-servings": "Порции",
|
"recipe-servings": "Порции",
|
||||||
"recipe-yield": "Количество порций",
|
"recipe-yield": "Количество порций",
|
||||||
"recipe-yield-text": "Recipe Yield Text",
|
"recipe-yield-text": "Количество порций рецепта",
|
||||||
"unit": "Единица измерения",
|
"unit": "Единица измерения",
|
||||||
"upload-image": "Загрузить изображение",
|
"upload-image": "Загрузить изображение",
|
||||||
"screen-awake": "Держать экран включенным",
|
"screen-awake": "Держать экран включенным",
|
||||||
|
@ -654,25 +656,27 @@
|
||||||
"recipe-actions": "Действия с рецептом",
|
"recipe-actions": "Действия с рецептом",
|
||||||
"parser": {
|
"parser": {
|
||||||
"ingredient-parser": "Разделитель ингредиентов",
|
"ingredient-parser": "Разделитель ингредиентов",
|
||||||
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
|
"explanation": "Чтобы использовать парсер ингредиентов, нажмите кнопку «Обработать все». Как только обработанные ингредиенты будут доступны, Вы можете просмотреть элементы и убедиться, что они были обработаны правильно. Показатель достоверности модели отображается справа от названия элемента. Этот показатель рассчитывается как среднее всех индивидуальных результатов и не всегда полностью точен.",
|
||||||
"alerts-explainer": "Оповещение появится если подходящие продукты или единица измерения найдены, но не занесены в базу данных.",
|
"alerts-explainer": "Оповещение появится если подходящие продукты или единица измерения найдены, но не занесены в базу данных.",
|
||||||
"select-parser": "Выбрать Разделитель",
|
"select-parser": "Выбрать Разделитель",
|
||||||
"natural-language-processor": "Обработчик естественного языка",
|
"natural-language-processor": "Обработчик естественного языка",
|
||||||
"brute-parser": "Brute Parser",
|
"brute-parser": "Грубый Парсер",
|
||||||
"openai-parser": "OpenAI Parser",
|
"openai-parser": "OpenAI Parser",
|
||||||
"parse-all": "Обработать все",
|
"parse-all": "Обработать все",
|
||||||
"no-unit": "Без единиц",
|
"no-unit": "Без единиц",
|
||||||
"missing-unit": "Создать недостающую единицу: {unit}",
|
"missing-unit": "Создать недостающую единицу: {unit}",
|
||||||
"missing-food": "Создать недостающую еду: {food}",
|
"missing-food": "Создать недостающую еду: {food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "Эта единица не может быть обработана автоматически",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "Этот продукт не может быть обработан автоматически",
|
||||||
"no-food": "Нет еды"
|
"no-food": "Нет еды"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "Сбросить количество порций",
|
"reset-servings-count": "Сбросить количество порций",
|
||||||
"not-linked-ingredients": "Дополнительные ингредиенты",
|
"not-linked-ingredients": "Дополнительные ингредиенты",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Загрузите другое изображение",
|
||||||
"upload-images": "Загрузить изображения",
|
"upload-images": "Загрузить изображения",
|
||||||
"upload-more-images": "Загрузить больше изображений"
|
"upload-more-images": "Загрузить больше изображений",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Поиск рецептов",
|
"recipe-finder": "Поиск рецептов",
|
||||||
|
@ -682,8 +686,8 @@
|
||||||
"missing": "Отсутствует",
|
"missing": "Отсутствует",
|
||||||
"no-recipes-found": "Рецепты не найдены",
|
"no-recipes-found": "Рецепты не найдены",
|
||||||
"no-recipes-found-description": "Попробуйте добавить больше ингредиентов для поиска или измените настройки фильтров",
|
"no-recipes-found-description": "Попробуйте добавить больше ингредиентов для поиска или измените настройки фильтров",
|
||||||
"include-ingredients-on-hand": "Include Ingredients On Hand",
|
"include-ingredients-on-hand": "Включать ингредиенты в наличии, под рукой",
|
||||||
"include-tools-on-hand": "Include Tools On Hand",
|
"include-tools-on-hand": "Включать инструменты в наличии, под рукой",
|
||||||
"max-missing-ingredients": "Максимальное количество отсутствующих ингредиентов",
|
"max-missing-ingredients": "Максимальное количество отсутствующих ингредиентов",
|
||||||
"max-missing-tools": "Максимальное количество отсутствующих инструментов",
|
"max-missing-tools": "Максимальное количество отсутствующих инструментов",
|
||||||
"selected-tools": "Выбранные инструменты",
|
"selected-tools": "Выбранные инструменты",
|
||||||
|
@ -1072,7 +1076,7 @@
|
||||||
"example-food-singular": "пр. Луковица",
|
"example-food-singular": "пр. Луковица",
|
||||||
"example-food-plural": "пр. Луковиц",
|
"example-food-plural": "пр. Луковиц",
|
||||||
"label-overwrite-warning": "Это назначит выбранную метку всем выбранным продуктам и потенциально перезапишет существующие метки.",
|
"label-overwrite-warning": "Это назначит выбранную метку всем выбранным продуктам и потенциально перезапишет существующие метки.",
|
||||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
"on-hand-checkbox-label": "Установка этого флага сделает этот продукт неотмеченным по умолчанию при добавлении рецепта в список покупок."
|
||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "Заполняет базу данных рядовыми единицами измерений на основе выбранного языка.",
|
"seed-dialog-text": "Заполняет базу данных рядовыми единицами измерений на основе выбранного языка.",
|
||||||
|
@ -1125,9 +1129,9 @@
|
||||||
"source-unit-will-be-deleted": "Первая единица измерения будет удалена"
|
"source-unit-will-be-deleted": "Первая единица измерения будет удалена"
|
||||||
},
|
},
|
||||||
"recipe-actions": {
|
"recipe-actions": {
|
||||||
"recipe-actions-data": "Recipe Actions Data",
|
"recipe-actions-data": "Данные действий рецепта",
|
||||||
"new-recipe-action": "New Recipe Action",
|
"new-recipe-action": "Новое действие с рецептом",
|
||||||
"edit-recipe-action": "Edit Recipe Action",
|
"edit-recipe-action": "Редактировать действие рецепта",
|
||||||
"action-type": "Тип Действия"
|
"action-type": "Тип Действия"
|
||||||
},
|
},
|
||||||
"create-alias": "Создать псевдоним",
|
"create-alias": "Создать псевдоним",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Сведения о группе",
|
"group-details": "Сведения о группе",
|
||||||
"group-details-description": "Прежде чем создать учетную запись, вам нужно создать группу. В вашей группе будете только вы, но вы сможете пригласить других позже. Участники группы могут обмениваться планами питания, списками покупок, рецептами и многим другим!",
|
"group-details-description": "Прежде чем создать учетную запись, вам нужно создать группу. В вашей группе будете только вы, но вы сможете пригласить других позже. Участники группы могут обмениваться планами питания, списками покупок, рецептами и многим другим!",
|
||||||
"use-seed-data": "Использовать дефолтные значения",
|
"use-seed-data": "Использовать дефолтные значения",
|
||||||
"use-seed-data-description": "Mealie идёт с коллекцией продуктов, единиц измерения и меток, которые могут быть использованы для заполнения вашей группы полезными данными для организации ваших рецептов.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Параметры учетной записи"
|
"account-details": "Параметры учетной записи"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
@ -1290,18 +1294,18 @@
|
||||||
"first-time-setup": "Первоначальная Настройка",
|
"first-time-setup": "Первоначальная Настройка",
|
||||||
"welcome-to-mealie-get-started": "Добро пожаловать в Mealie! Давайте начнем",
|
"welcome-to-mealie-get-started": "Добро пожаловать в Mealie! Давайте начнем",
|
||||||
"already-set-up-bring-to-homepage": "Я уже готов, просто открой домашнюю страницу",
|
"already-set-up-bring-to-homepage": "Я уже готов, просто открой домашнюю страницу",
|
||||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
"common-settings-for-new-sites": "Ниже приведены общие настройки для новых сайтов",
|
||||||
"setup-complete": "Настройка завершена!",
|
"setup-complete": "Настройка завершена!",
|
||||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
"here-are-a-few-things-to-help-you-get-started": "Вот несколько вещей, которые помогут Вам начать работу с Mealie",
|
||||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
"restore-from-v1-backup": "У вас есть резервная копия предыдущего экземпляра Mealie v1? Вы можете восстановить ее здесь.",
|
||||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
"manage-profile-or-get-invite-link": "Управляйте своим профилем или получите ссылку-приглашение, чтобы поделиться ею с другими."
|
||||||
},
|
},
|
||||||
"debug-openai-services": "Отладка OpenAI сервисов",
|
"debug-openai-services": "Отладка OpenAI сервисов",
|
||||||
"debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.",
|
"debug-openai-services-description": "Используйте эту страницу для отладки служб OpenAI. Вы можете проверить подключение к OpenAI и посмотреть результаты здесь. Если у Вас включены службы изображений, Вы также можете предоставить изображение.",
|
||||||
"run-test": "Запустить тест",
|
"run-test": "Запустить тест",
|
||||||
"test-results": "Результаты тестов",
|
"test-results": "Результаты тестов",
|
||||||
"group-delete-note": "Groups with users or households cannot be deleted",
|
"group-delete-note": "Группы, в которых есть пользователи или домохозяйства, не могут быть удалены",
|
||||||
"household-delete-note": "Households with users cannot be deleted"
|
"household-delete-note": "Домохозяйства, в которых есть пользователи, не могут быть удалены"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"welcome-user": "👋 Добро пожаловать, {0}!",
|
"welcome-user": "👋 Добро пожаловать, {0}!",
|
||||||
|
@ -1314,7 +1318,7 @@
|
||||||
"group-statistics": "Статистика группы",
|
"group-statistics": "Статистика группы",
|
||||||
"group-statistics-description": "Статистика вашей группы дает некоторую информацию о том, как вы используете Mealie.",
|
"group-statistics-description": "Статистика вашей группы дает некоторую информацию о том, как вы используете Mealie.",
|
||||||
"household-statistics": "Статистика домохозяйства",
|
"household-statistics": "Статистика домохозяйства",
|
||||||
"household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.",
|
"household-statistics-description": "Статистика Вашего домохозяйства дает Вам некоторое представление о том, как Вы используете Mealie.",
|
||||||
"storage-capacity": "Емкость хранилища",
|
"storage-capacity": "Емкость хранилища",
|
||||||
"storage-capacity-description": "Указанный размер хранилища - это подсчёт размера изображений и приложений рецептов загруженных вами.",
|
"storage-capacity-description": "Указанный размер хранилища - это подсчёт размера изображений и приложений рецептов загруженных вами.",
|
||||||
"personal": "Личное",
|
"personal": "Личное",
|
||||||
|
@ -1324,8 +1328,8 @@
|
||||||
"api-tokens-description": "Управляйте вашими API-токенами для доступа сторонних приложений.",
|
"api-tokens-description": "Управляйте вашими API-токенами для доступа сторонних приложений.",
|
||||||
"group-description": "Эти элементы доступны внутри вашей группы. Редактирование одного из них изменит их для всей группы!",
|
"group-description": "Эти элементы доступны внутри вашей группы. Редактирование одного из них изменит их для всей группы!",
|
||||||
"group-settings": "Настройки группы",
|
"group-settings": "Настройки группы",
|
||||||
"group-settings-description": "Manage your common group settings, like privacy settings.",
|
"group-settings-description": "Управляйте общими настройками группы, такими как настройки конфиденциальности.",
|
||||||
"household-description": "These items are shared within your household. Editing one of them will change it for the whole household!",
|
"household-description": "Эти элементы доступны внутри Вашего домохозяйства. Редактирование одного из них изменит их для всего домохозяйства!",
|
||||||
"household-settings": "Настройки домохозяйства",
|
"household-settings": "Настройки домохозяйства",
|
||||||
"household-settings-description": "Управляйте настройками вашего домохозяйства, такими как настройки плана питания и конфиденциальности.",
|
"household-settings-description": "Управляйте настройками вашего домохозяйства, такими как настройки плана питания и конфиденциальности.",
|
||||||
"cookbooks-description": "Управление коллекцией категорий рецептов и созданием страниц для них.",
|
"cookbooks-description": "Управление коллекцией категорий рецептов и созданием страниц для них.",
|
||||||
|
@ -1355,9 +1359,9 @@
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "Книги рецептов",
|
"cookbooks": "Книги рецептов",
|
||||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.",
|
"description": "Книги рецептов – это еще один способ организовать рецепты путем создания разделов рецептов, органайзеров и других фильтров. Создание книги рецептов добавит запись в боковую панель, и все рецепты с выбранными фильтрами будут отображаться в книге рецептов.",
|
||||||
"hide-cookbooks-from-other-households": "Скрыть книги рецептов от других домохозяйств",
|
"hide-cookbooks-from-other-households": "Скрыть книги рецептов от других домохозяйств",
|
||||||
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar",
|
"hide-cookbooks-from-other-households-description": "Если эта функция включена, на боковой панели будут отображаться только книги рецептов из Вашего домохозяйства",
|
||||||
"public-cookbook": "Публичные книги рецептов",
|
"public-cookbook": "Публичные книги рецептов",
|
||||||
"public-cookbook-description": "Публичными книгами рецептов можно делиться с людьми без аккаунта в Mealie, и они будут отображаться на странице вашей группы.",
|
"public-cookbook-description": "Публичными книгами рецептов можно делиться с людьми без аккаунта в Mealie, и они будут отображаться на странице вашей группы.",
|
||||||
"filter-options": "Параметры фильтрации",
|
"filter-options": "Параметры фильтрации",
|
||||||
|
@ -1385,13 +1389,13 @@
|
||||||
"is-less-than-or-equal-to": "меньше или равно"
|
"is-less-than-or-equal-to": "меньше или равно"
|
||||||
},
|
},
|
||||||
"relational-keywords": {
|
"relational-keywords": {
|
||||||
"is": "is",
|
"is": "соответствует",
|
||||||
"is-not": "is not",
|
"is-not": "не соответствует",
|
||||||
"is-one-of": "один из",
|
"is-one-of": "один из",
|
||||||
"is-not-one-of": "не один из",
|
"is-not-one-of": "не один из",
|
||||||
"contains-all-of": "содержит все",
|
"contains-all-of": "содержит все",
|
||||||
"is-like": "is like",
|
"is-like": "содержит",
|
||||||
"is-not-like": "is not like"
|
"is-not-like": "не содержит"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Nové upozornenie",
|
"new-notification": "Nové upozornenie",
|
||||||
"event-notifiers": "Upozornenia udalostí",
|
"event-notifiers": "Upozornenia udalostí",
|
||||||
"apprise-url-skipped-if-blank": "Informačná URL (preskočená, ak je prázdna)",
|
"apprise-url-skipped-if-blank": "Informačná URL (preskočená, ak je prázdna)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Zapnúť notifikátor",
|
"enable-notifier": "Zapnúť notifikátor",
|
||||||
"what-events": "Pre ktoré udalosti si želáte zapnúť notifikátor?",
|
"what-events": "Pre ktoré udalosti si želáte zapnúť notifikátor?",
|
||||||
"user-events": "Udalosti používateľa",
|
"user-events": "Udalosti používateľa",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Udalosti štítkov",
|
"tag-events": "Udalosti štítkov",
|
||||||
"category-events": "Udalosti kategórií",
|
"category-events": "Udalosti kategórií",
|
||||||
"when-a-new-user-joins-your-group": "Keď sa k vašej skupine pripojí nový používateľ",
|
"when-a-new-user-joins-your-group": "Keď sa k vašej skupine pripojí nový používateľ",
|
||||||
"recipe-events": "Udalosti receptov"
|
"recipe-events": "Udalosti receptov",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Pridať",
|
"add": "Pridať",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ďalšie suroviny",
|
"not-linked-ingredients": "Ďalšie suroviny",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Nahrať obrázky",
|
"upload-images": "Nahrať obrázky",
|
||||||
"upload-more-images": "Nahrať ďalšie obrázky"
|
"upload-more-images": "Nahrať ďalšie obrázky",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Hľadač receptov",
|
"recipe-finder": "Hľadač receptov",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Podrobnosti o skupine",
|
"group-details": "Podrobnosti o skupine",
|
||||||
"group-details-description": "Pred vytvorením účtu musíte vytvoriť skupinu. Vaša skupina bude obsahovať iba vás, ale neskôr budete môcť pozvať ostatných. Členovia vašej skupiny môžu zdieľať stravovacie plány, nákupné zoznamy, recepty a ďalšie!",
|
"group-details-description": "Pred vytvorením účtu musíte vytvoriť skupinu. Vaša skupina bude obsahovať iba vás, ale neskôr budete môcť pozvať ostatných. Členovia vašej skupiny môžu zdieľať stravovacie plány, nákupné zoznamy, recepty a ďalšie!",
|
||||||
"use-seed-data": "Použiť predvolené dáta",
|
"use-seed-data": "Použiť predvolené dáta",
|
||||||
"use-seed-data-description": "Mealie prichádza so zbierkou potravín, jednotiek a štítkov, ktoré možno použiť na naplnenie vašej skupiny užitočnými údajmi na organizáciu vašich receptov.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Detaily účtu"
|
"account-details": "Detaily účtu"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Novo obvestilo",
|
"new-notification": "Novo obvestilo",
|
||||||
"event-notifiers": "Obvestila o dogodkih",
|
"event-notifiers": "Obvestila o dogodkih",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (preskočeno, če je prazno)",
|
"apprise-url-skipped-if-blank": "Apprise URL (preskočeno, če je prazno)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Vključi obvestila",
|
"enable-notifier": "Vključi obvestila",
|
||||||
"what-events": "Katere dogodke naj spremlja obveščevalni sistem?",
|
"what-events": "Katere dogodke naj spremlja obveščevalni sistem?",
|
||||||
"user-events": "Dogodki uporabnika",
|
"user-events": "Dogodki uporabnika",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Dogodki značk",
|
"tag-events": "Dogodki značk",
|
||||||
"category-events": "Dogodki kategorij",
|
"category-events": "Dogodki kategorij",
|
||||||
"when-a-new-user-joins-your-group": "Ko se novi uporabnik pridruži tvoji skupini",
|
"when-a-new-user-joins-your-group": "Ko se novi uporabnik pridruži tvoji skupini",
|
||||||
"recipe-events": "Dogodki receptov"
|
"recipe-events": "Dogodki receptov",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Dodaj",
|
"add": "Dodaj",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Dodatne sestavine",
|
"not-linked-ingredients": "Dodatne sestavine",
|
||||||
"upload-another-image": "Naloži drugo sliko",
|
"upload-another-image": "Naloži drugo sliko",
|
||||||
"upload-images": "Naloži slike",
|
"upload-images": "Naloži slike",
|
||||||
"upload-more-images": "Naloži več slik"
|
"upload-more-images": "Naloži več slik",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Iskalnik receptov",
|
"recipe-finder": "Iskalnik receptov",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Detajli skupine",
|
"group-details": "Detajli skupine",
|
||||||
"group-details-description": "Preden kreirate račun, morate kreirati skupino. V skupini boste sprva samo vi, vendar imate možnost povabiti še ostale člane. Člani v vaši skupini lahko delijo načrte obrokov, nakupovalne sezname, recepte in še več!",
|
"group-details-description": "Preden kreirate račun, morate kreirati skupino. V skupini boste sprva samo vi, vendar imate možnost povabiti še ostale člane. Člani v vaši skupini lahko delijo načrte obrokov, nakupovalne sezname, recepte in še več!",
|
||||||
"use-seed-data": "Uporabi privzete podatke",
|
"use-seed-data": "Uporabi privzete podatke",
|
||||||
"use-seed-data-description": "Meali vključuje zbirko jedi, enot in oznak, ki se lahko uporabno uporabijo v vaši skupini za organizacijo receptov.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Podatki o računu"
|
"account-details": "Podatki o računu"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Ново обавештење",
|
"new-notification": "Ново обавештење",
|
||||||
"event-notifiers": "Обавештавач о догађају",
|
"event-notifiers": "Обавештавач о догађају",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (прескочено ако је празно)",
|
"apprise-url-skipped-if-blank": "Apprise URL (прескочено ако је празно)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Омогући обавештење",
|
"enable-notifier": "Омогући обавештење",
|
||||||
"what-events": "На које догађаје би требао да се претплати овај обавештавач?",
|
"what-events": "На које догађаје би требао да се претплати овај обавештавач?",
|
||||||
"user-events": "Догађаји корисника",
|
"user-events": "Догађаји корисника",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Догађаји ознаке",
|
"tag-events": "Догађаји ознаке",
|
||||||
"category-events": "Догађаји категорије",
|
"category-events": "Догађаји категорије",
|
||||||
"when-a-new-user-joins-your-group": "Када се нови корисник придружи вашој групи",
|
"when-a-new-user-joins-your-group": "Када се нови корисник придружи вашој групи",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"group-details": "Group Details",
|
||||||
"group-details-description": "Пре него што креирате налог, морате креирати групу. Ваша група ће садржавати само вас, али касније ћете моћи позвати друге. Чланови ваше групе могу делити јеловнике, спискове за куповину, рецепте и још много тога!",
|
"group-details-description": "Пре него што креирате налог, морате креирати групу. Ваша група ће садржавати само вас, али касније ћете моћи позвати друге. Чланови ваше групе могу делити јеловнике, спискове за куповину, рецепте и још много тога!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Ny avisering",
|
"new-notification": "Ny avisering",
|
||||||
"event-notifiers": "Händelseavisering",
|
"event-notifiers": "Händelseavisering",
|
||||||
"apprise-url-skipped-if-blank": "Apprise-URL (hoppa över om tom)",
|
"apprise-url-skipped-if-blank": "Apprise-URL (hoppa över om tom)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Aktivera avisering",
|
"enable-notifier": "Aktivera avisering",
|
||||||
"what-events": "Vilka händelser ska denna avisering prenumerera på?",
|
"what-events": "Vilka händelser ska denna avisering prenumerera på?",
|
||||||
"user-events": "Användarhändelser",
|
"user-events": "Användarhändelser",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tagga händelser",
|
"tag-events": "Tagga händelser",
|
||||||
"category-events": "Kategorihändelser",
|
"category-events": "Kategorihändelser",
|
||||||
"when-a-new-user-joins-your-group": "När en ny användare går med i din grupp",
|
"when-a-new-user-joins-your-group": "När en ny användare går med i din grupp",
|
||||||
"recipe-events": "Recepthändelser"
|
"recipe-events": "Recepthändelser",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Lägg till",
|
"add": "Lägg till",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "Kommentar",
|
"comment": "Kommentar",
|
||||||
"comments": "Kommentarer",
|
"comments": "Kommentarer",
|
||||||
"delete-confirmation": "Är du säker på att du vill ta bort detta recept?",
|
"delete-confirmation": "Är du säker på att du vill ta bort detta recept?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "Du är på väg att ta bort ett recept som inte är ditt med administratörsbehörigheter. Är du säker?",
|
||||||
"delete-recipe": "Radera recept",
|
"delete-recipe": "Radera recept",
|
||||||
"description": "Beskrivning",
|
"description": "Beskrivning",
|
||||||
"disable-amount": "Inaktivera ingredienser mängder",
|
"disable-amount": "Inaktivera ingredienser mängder",
|
||||||
|
@ -587,7 +589,7 @@
|
||||||
"api-extras-description": "Recept API-tillägg är en viktig funktion i Mealie's API. Med hjälp av dem kan du skapa anpassade JSON-nyckel/värdepar i ett recept, som du kan referera till från tredjepartsapplikationer. Du kan använda dessa nycklar för att tillhandahålla information, till exempel för att trigga automatiseringar eller anpassade meddelanden som ska vidarebefordras till önskad enhet.",
|
"api-extras-description": "Recept API-tillägg är en viktig funktion i Mealie's API. Med hjälp av dem kan du skapa anpassade JSON-nyckel/värdepar i ett recept, som du kan referera till från tredjepartsapplikationer. Du kan använda dessa nycklar för att tillhandahålla information, till exempel för att trigga automatiseringar eller anpassade meddelanden som ska vidarebefordras till önskad enhet.",
|
||||||
"message-key": "Meddelandenyckel",
|
"message-key": "Meddelandenyckel",
|
||||||
"parse": "Läs in",
|
"parse": "Läs in",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "Det verkar som om dina ingredienser inte är tolkade ännu. Klicka på knappen \"{parse}\" nedan för att tolka dina ingredienser till strukturerade livsmedel.",
|
||||||
"attach-images-hint": "Bifoga bilder genom att dra och släppa dem i redigeraren",
|
"attach-images-hint": "Bifoga bilder genom att dra och släppa dem i redigeraren",
|
||||||
"drop-image": "Släpp bild",
|
"drop-image": "Släpp bild",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Aktivera ingrediensmängd för att använda denna funktion",
|
"enable-ingredient-amounts-to-use-this-feature": "Aktivera ingrediensmängd för att använda denna funktion",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ytterligare ingredienser",
|
"not-linked-ingredients": "Ytterligare ingredienser",
|
||||||
"upload-another-image": "Ladda upp en annan bild",
|
"upload-another-image": "Ladda upp en annan bild",
|
||||||
"upload-images": "Ladda upp bilder",
|
"upload-images": "Ladda upp bilder",
|
||||||
"upload-more-images": "Ladda upp fler bilder"
|
"upload-more-images": "Ladda upp fler bilder",
|
||||||
|
"set-as-cover-image": "Använd som receptbild",
|
||||||
|
"cover-image": "Receptbild"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Sök recept",
|
"recipe-finder": "Sök recept",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Gruppuppgifter",
|
"group-details": "Gruppuppgifter",
|
||||||
"group-details-description": "Innan du skapar ett konto måste du skapa en grupp. Din grupp kommer bara att innehålla dig, men du kommer att kunna bjuda in andra senare. Medlemmarna i din grupp kan dela måltidsplaner, inköpslistor, recept och mycket mer!",
|
"group-details-description": "Innan du skapar ett konto måste du skapa en grupp. Din grupp kommer bara att innehålla dig, men du kommer att kunna bjuda in andra senare. Medlemmarna i din grupp kan dela måltidsplaner, inköpslistor, recept och mycket mer!",
|
||||||
"use-seed-data": "Använd exempeldata",
|
"use-seed-data": "Använd exempeldata",
|
||||||
"use-seed-data-description": "Mealie innehåller en samling av livsmedel, enheter och etiketter som kan användas för att fylla din grupp med användbara data för att organisera dina recept.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Kontouppgifter"
|
"account-details": "Kontouppgifter"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Yeni bildirim",
|
"new-notification": "Yeni bildirim",
|
||||||
"event-notifiers": "Etkinlik Bildirimleri",
|
"event-notifiers": "Etkinlik Bildirimleri",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL'si (boşsa geçilir)",
|
"apprise-url-skipped-if-blank": "Apprise URL'si (boşsa geçilir)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Bildiriciyi Etkinleştir",
|
"enable-notifier": "Bildiriciyi Etkinleştir",
|
||||||
"what-events": "Bu bildirimci hangi olaylara abone olmalıdır?",
|
"what-events": "Bu bildirimci hangi olaylara abone olmalıdır?",
|
||||||
"user-events": "Kullanıcı Etkinlikleri",
|
"user-events": "Kullanıcı Etkinlikleri",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Etiket Etkinlikleri",
|
"tag-events": "Etiket Etkinlikleri",
|
||||||
"category-events": "Kategori Etkinlikleri",
|
"category-events": "Kategori Etkinlikleri",
|
||||||
"when-a-new-user-joins-your-group": "Grubunuza yeni bir kullanıcı katıldığında",
|
"when-a-new-user-joins-your-group": "Grubunuza yeni bir kullanıcı katıldığında",
|
||||||
"recipe-events": "Tarif Etkinlikleri"
|
"recipe-events": "Tarif Etkinlikleri",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Ekle",
|
"add": "Ekle",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Ek Malzemeler",
|
"not-linked-ingredients": "Ek Malzemeler",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Tarif Bulucu",
|
"recipe-finder": "Tarif Bulucu",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Grup Detayları",
|
"group-details": "Grup Detayları",
|
||||||
"group-details-description": "Hesap oluşturmadan önce bir grup oluşturmanız gerekir. Grubunuzda yalnızca siz yer alacaksınız ancak daha sonra başkalarını da davet edebileceksiniz. Grubunuzdaki üyeler yemek planlarını, alışveriş listelerini, tarifleri ve daha fazlasını paylaşabilir!",
|
"group-details-description": "Hesap oluşturmadan önce bir grup oluşturmanız gerekir. Grubunuzda yalnızca siz yer alacaksınız ancak daha sonra başkalarını da davet edebileceksiniz. Grubunuzdaki üyeler yemek planlarını, alışveriş listelerini, tarifleri ve daha fazlasını paylaşabilir!",
|
||||||
"use-seed-data": "Tohum Verisi Kullan",
|
"use-seed-data": "Tohum Verisi Kullan",
|
||||||
"use-seed-data-description": "Mealie, grubunuzu tariflerinizi düzenlemenize yardımcı olacak yararlı verilerle doldurmak için kullanılabilecek bir Yiyecek, Birim ve Etiket koleksiyonuyla birlikte gelir.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Hesap Detayları"
|
"account-details": "Hesap Detayları"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Нове сповіщення",
|
"new-notification": "Нове сповіщення",
|
||||||
"event-notifiers": "Сповіщувачі",
|
"event-notifiers": "Сповіщувачі",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (пропущено якщо порожній)",
|
"apprise-url-skipped-if-blank": "Apprise URL (пропущено якщо порожній)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Увімкнути сповіщувач",
|
"enable-notifier": "Увімкнути сповіщувач",
|
||||||
"what-events": "На які події цей сповіщувач має бути підписаний?",
|
"what-events": "На які події цей сповіщувач має бути підписаний?",
|
||||||
"user-events": "Події користувача",
|
"user-events": "Події користувача",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Події міток",
|
"tag-events": "Події міток",
|
||||||
"category-events": "Події категорій",
|
"category-events": "Події категорій",
|
||||||
"when-a-new-user-joins-your-group": "Коли новий користувач приєднується до групи",
|
"when-a-new-user-joins-your-group": "Коли новий користувач приєднується до групи",
|
||||||
"recipe-events": "Події рецепту"
|
"recipe-events": "Події рецепту",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Додати",
|
"add": "Додати",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Додаткові продукти",
|
"not-linked-ingredients": "Додаткові продукти",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Шукач рецептів",
|
"recipe-finder": "Шукач рецептів",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Деталі групи",
|
"group-details": "Деталі групи",
|
||||||
"group-details-description": "Перед створенням облікового запису вам потрібно створити групу. Спочатку ваша група буде містити тільки вас, але ви зможете запрошувати інших пізніше. Учасники вашої групи можуть обмінюватися планами харчування, списками покупок, рецептами і багато чим іншим!",
|
"group-details-description": "Перед створенням облікового запису вам потрібно створити групу. Спочатку ваша група буде містити тільки вас, але ви зможете запрошувати інших пізніше. Учасники вашої групи можуть обмінюватися планами харчування, списками покупок, рецептами і багато чим іншим!",
|
||||||
"use-seed-data": "Використати початкові дані",
|
"use-seed-data": "Використати початкові дані",
|
||||||
"use-seed-data-description": "Mealie має вбудований набір продуктів, одиниць виміру, та етикеток що можуть бути додані до вашої групи для допомоги в організації рецептів.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Деталі акаунта"
|
"account-details": "Деталі акаунта"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "Thông báo mới",
|
"new-notification": "Thông báo mới",
|
||||||
"event-notifiers": "Event Notifiers",
|
"event-notifiers": "Event Notifiers",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "Enable Notifier",
|
"enable-notifier": "Enable Notifier",
|
||||||
"what-events": "What events should this notifier subscribe to?",
|
"what-events": "What events should this notifier subscribe to?",
|
||||||
"user-events": "User Events",
|
"user-events": "User Events",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "Tag Events",
|
"tag-events": "Tag Events",
|
||||||
"category-events": "Category Events",
|
"category-events": "Category Events",
|
||||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recipe Events",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Thêm",
|
"add": "Thêm",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "新通知",
|
"new-notification": "新通知",
|
||||||
"event-notifiers": "事件通知器",
|
"event-notifiers": "事件通知器",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (如果为空则跳过)",
|
"apprise-url-skipped-if-blank": "Apprise URL (如果为空则跳过)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "由于Apprise URL通常包含敏感信息,编辑时此字段留空。 如果您想要更新URL,请在这里输入新URL,否则留空保留当前URL。",
|
||||||
"enable-notifier": "打开消息通知",
|
"enable-notifier": "打开消息通知",
|
||||||
"what-events": "该通知器需要订阅哪些事件?",
|
"what-events": "该通知器需要订阅哪些事件?",
|
||||||
"user-events": "用户事件",
|
"user-events": "用户事件",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "标签事件",
|
"tag-events": "标签事件",
|
||||||
"category-events": "分类事件",
|
"category-events": "分类事件",
|
||||||
"when-a-new-user-joins-your-group": "当新用户加入您的群组时",
|
"when-a-new-user-joins-your-group": "当新用户加入您的群组时",
|
||||||
"recipe-events": "食谱事件"
|
"recipe-events": "食谱事件",
|
||||||
|
"label-events": "活动标签"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "添加",
|
"add": "添加",
|
||||||
|
@ -190,7 +192,7 @@
|
||||||
"a-name-is-required": "必须输入名称",
|
"a-name-is-required": "必须输入名称",
|
||||||
"delete-with-name": "删除{name}",
|
"delete-with-name": "删除{name}",
|
||||||
"confirm-delete-generic-with-name": "确定要删除{name} 么?",
|
"confirm-delete-generic-with-name": "确定要删除{name} 么?",
|
||||||
"confirm-delete-own-admin-account": "请注意,您正在试图删除您的管理员帐户!此操作不能撤销并且您的账户将被永久删除",
|
"confirm-delete-own-admin-account": "请注意,您正在尝试删除自己的管理员帐户!此操作无法撤消,您的帐户将被永久删除?",
|
||||||
"organizer": "组织者",
|
"organizer": "组织者",
|
||||||
"transfer": "转移",
|
"transfer": "转移",
|
||||||
"copy": "复制",
|
"copy": "复制",
|
||||||
|
@ -202,7 +204,7 @@
|
||||||
"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": "没有条目被复制 | 已复制一个条目到剪贴板 | 已复制{count}个条目到剪贴板",
|
"copied-items-to-clipboard": "没有项目复制到剪贴板|一个项目复制到剪贴板|复制{count}项到剪贴板",
|
||||||
"actions": "操作",
|
"actions": "操作",
|
||||||
"selected-count": "已选择:{count}",
|
"selected-count": "已选择:{count}",
|
||||||
"export-all": "全部导出",
|
"export-all": "全部导出",
|
||||||
|
@ -292,7 +294,7 @@
|
||||||
"admin-household-management-text": "对家庭的更改将立即生效。",
|
"admin-household-management-text": "对家庭的更改将立即生效。",
|
||||||
"household-id-value": "家庭ID: {0}",
|
"household-id-value": "家庭ID: {0}",
|
||||||
"private-household": "私有家庭",
|
"private-household": "私有家庭",
|
||||||
"private-household-description": "将家庭设置为私有后,群组内每个食谱单独配置的可见性选项都将被覆盖,所有食谱都无法被公开访问。",
|
"private-household-description": "将家庭设置为私有后,群组内每个食谱单独配置的可见性选项都将被覆盖,所有食谱都无法被公开访问",
|
||||||
"lock-recipe-edits-from-other-households": "禁止其他家庭编辑食谱",
|
"lock-recipe-edits-from-other-households": "禁止其他家庭编辑食谱",
|
||||||
"lock-recipe-edits-from-other-households-description": "启用时,只有家庭成员可以编辑由您家庭创建的食谱",
|
"lock-recipe-edits-from-other-households-description": "启用时,只有家庭成员可以编辑由您家庭创建的食谱",
|
||||||
"household-recipe-preferences": "家庭食谱偏好设置",
|
"household-recipe-preferences": "家庭食谱偏好设置",
|
||||||
|
@ -348,10 +350,10 @@
|
||||||
"meal-note": "用餐笔记",
|
"meal-note": "用餐笔记",
|
||||||
"note-only": "仅备注",
|
"note-only": "仅备注",
|
||||||
"random-meal": "随机用餐",
|
"random-meal": "随机用餐",
|
||||||
"random-dinner": "随即晚餐",
|
"random-dinner": "随机晚餐",
|
||||||
"random-side": "随机零食",
|
"random-side": "随机配菜",
|
||||||
"this-rule-will-apply": "此规则将应用于{dayCriteria}{mealTypeCriteria}。",
|
"this-rule-will-apply": "此规则将应用于{dayCriteria}{mealTypeCriteria}。",
|
||||||
"to-all-days": "所有天",
|
"to-all-days": "全天",
|
||||||
"on-days": "在{0}",
|
"on-days": "在{0}",
|
||||||
"for-all-meal-types": "所有用餐时段",
|
"for-all-meal-types": "所有用餐时段",
|
||||||
"for-type-meal-types": "作为 {0}",
|
"for-type-meal-types": "作为 {0}",
|
||||||
|
@ -472,7 +474,7 @@
|
||||||
"comment": "评论",
|
"comment": "评论",
|
||||||
"comments": "评论",
|
"comments": "评论",
|
||||||
"delete-confirmation": "您确定要删除此食谱吗?",
|
"delete-confirmation": "您确定要删除此食谱吗?",
|
||||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
"admin-delete-confirmation": "您即将使用管理员权限删除一个不属于您的食谱。您确定要删除吗?",
|
||||||
"delete-recipe": "删除食谱",
|
"delete-recipe": "删除食谱",
|
||||||
"description": "描述",
|
"description": "描述",
|
||||||
"disable-amount": "关闭显示成分数量",
|
"disable-amount": "关闭显示成分数量",
|
||||||
|
@ -491,7 +493,7 @@
|
||||||
"insert-below": "在下方插入",
|
"insert-below": "在下方插入",
|
||||||
"instructions": "做法",
|
"instructions": "做法",
|
||||||
"key-name-required": "必须输入关键字",
|
"key-name-required": "必须输入关键字",
|
||||||
"landscape-view-coming-soon": "横向视图 (即将到来)",
|
"landscape-view-coming-soon": "横向视图 (即将上线)",
|
||||||
"milligrams": "毫克",
|
"milligrams": "毫克",
|
||||||
"new-key-name": "新键名",
|
"new-key-name": "新键名",
|
||||||
"no-white-space-allowed": "不允许有空格",
|
"no-white-space-allowed": "不允许有空格",
|
||||||
|
@ -535,8 +537,8 @@
|
||||||
"join-the-conversation": "一起聊聊吧",
|
"join-the-conversation": "一起聊聊吧",
|
||||||
"add-recipe-to-mealplan": "把该食谱添加到饮食计划",
|
"add-recipe-to-mealplan": "把该食谱添加到饮食计划",
|
||||||
"entry-type": "条目类型",
|
"entry-type": "条目类型",
|
||||||
"date-format-hint": "MM/DD/YYYY 格式",
|
"date-format-hint": "月/日/年 格式",
|
||||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD 格式",
|
"date-format-hint-yyyy-mm-dd": "年-月-日 格式",
|
||||||
"add-to-list": "添加到购物清单",
|
"add-to-list": "添加到购物清单",
|
||||||
"add-to-plan": "添加到计划",
|
"add-to-plan": "添加到计划",
|
||||||
"add-to-timeline": "添加到时间轴",
|
"add-to-timeline": "添加到时间轴",
|
||||||
|
@ -567,27 +569,27 @@
|
||||||
"move-to-bottom": "置底",
|
"move-to-bottom": "置底",
|
||||||
"move-to-top": "置顶",
|
"move-to-top": "置顶",
|
||||||
"reset-scale": "重置倍数",
|
"reset-scale": "重置倍数",
|
||||||
"decrease-scale-label": "减1倍",
|
"decrease-scale-label": "减1份",
|
||||||
"increase-scale-label": "加1倍",
|
"increase-scale-label": "加1份",
|
||||||
"locked": "已锁定",
|
"locked": "已锁定",
|
||||||
"public-link": "公开链接",
|
"public-link": "公开链接",
|
||||||
"edit-timeline-event": "编辑时间轴事件",
|
"edit-timeline-event": "编辑时间轴事件",
|
||||||
"timeline": "时间轴",
|
"timeline": "时间轴",
|
||||||
"timeline-is-empty": "时间轴还空空如也,试着先去制作一个食谱吧!",
|
"timeline-is-empty": "时间轴还空空如也,试着先去制作一个食谱吧!",
|
||||||
"timeline-no-events-found-try-adjusting-filters": "没有找到事件。请尝试调整你的搜索过滤器。",
|
"timeline-no-events-found-try-adjusting-filters": "没有找到事件。请尝试调整你的搜索过滤器。",
|
||||||
"group-global-timeline": "{groupName}的全局时间轴",
|
"group-global-timeline": "{groupName}全球的时间表",
|
||||||
"open-timeline": "查看时间轴",
|
"open-timeline": "查看时间轴",
|
||||||
"made-this": "我做了这道菜",
|
"made-this": "我做了这道菜",
|
||||||
"how-did-it-turn-out": "成品怎么样?",
|
"how-did-it-turn-out": "成品怎么样?",
|
||||||
"user-made-this": "{user}做了",
|
"user-made-this": "{user}制作了这个",
|
||||||
"added-to-timeline": "Added to timeline",
|
"added-to-timeline": "添加到时间轴",
|
||||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
"failed-to-add-to-timeline": "未能添加到时间轴",
|
||||||
"failed-to-update-recipe": "Failed to update recipe",
|
"failed-to-update-recipe": "更新配方失败",
|
||||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
"added-to-timeline-but-failed-to-add-image": "已添加到时间轴,但未能添加图像",
|
||||||
"api-extras-description": "食谱扩展是Mealie API的关键功能之一。它允许你在食谱中添加自定义JSON键值对,以供第三方程序使用。你可以利用这些键提供信息,实现更多功能,例如触发自动化,或转发自定义信息到指定的设备上。",
|
"api-extras-description": "食谱扩展是Mealie API的关键功能之一。它允许你在食谱中添加自定义JSON键值对,以供第三方程序使用。你可以利用这些键提供信息,实现更多功能,例如触发自动化,或转发自定义信息到指定的设备上。",
|
||||||
"message-key": "键名",
|
"message-key": "键名",
|
||||||
"parse": "自动解析",
|
"parse": "自动解析",
|
||||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
"ingredients-not-parsed-description": "看起来你的食材还没有被解析。点击下面的“{parse}”按钮,将您的配料解析为结构化食品。",
|
||||||
"attach-images-hint": "如需添加图片,可将其拖拽到编辑器",
|
"attach-images-hint": "如需添加图片,可将其拖拽到编辑器",
|
||||||
"drop-image": "拖放图片",
|
"drop-image": "拖放图片",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "使用此项功能需启用食材用量",
|
"enable-ingredient-amounts-to-use-this-feature": "使用此项功能需启用食材用量",
|
||||||
|
@ -602,8 +604,8 @@
|
||||||
"create-recipe-description": "从头创建一个新食谱。",
|
"create-recipe-description": "从头创建一个新食谱。",
|
||||||
"create-recipes": "创建食谱",
|
"create-recipes": "创建食谱",
|
||||||
"import-with-zip": "使用 .zip 导入",
|
"import-with-zip": "使用 .zip 导入",
|
||||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
"create-recipe-from-an-image": "用图片创建食谱",
|
||||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
"create-recipe-from-an-image-description": "通过上传食谱文本的图片来创建一个食谱。Mealie将尝试使用人工智能从图像中提取文本,并从中创建一个新的食谱。",
|
||||||
"crop-and-rotate-the-image": "裁剪并旋转图片,使仅文字可见且方向正确。",
|
"crop-and-rotate-the-image": "裁剪并旋转图片,使仅文字可见且方向正确。",
|
||||||
"create-from-images": "从图片创建",
|
"create-from-images": "从图片创建",
|
||||||
"should-translate-description": "翻译该食谱",
|
"should-translate-description": "翻译该食谱",
|
||||||
|
@ -664,15 +666,17 @@
|
||||||
"no-unit": "没有计量单位",
|
"no-unit": "没有计量单位",
|
||||||
"missing-unit": "创建缺失的计量单位:{unit}",
|
"missing-unit": "创建缺失的计量单位:{unit}",
|
||||||
"missing-food": "创建缺失的食物:{food}",
|
"missing-food": "创建缺失的食物:{food}",
|
||||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
"this-unit-could-not-be-parsed-automatically": "无法自动解析此单元",
|
||||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
"this-food-could-not-be-parsed-automatically": "这种食物不能被自动解析",
|
||||||
"no-food": "没有食物"
|
"no-food": "没有食物"
|
||||||
},
|
},
|
||||||
"reset-servings-count": "重置份量数量",
|
"reset-servings-count": "重置份量数量",
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "附加配料",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "上传其他图片",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "上传图片",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "上传更多图片",
|
||||||
|
"set-as-cover-image": "设置为食谱封面图片",
|
||||||
|
"cover-image": "封面图片"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "食谱搜索",
|
"recipe-finder": "食谱搜索",
|
||||||
|
@ -682,14 +686,14 @@
|
||||||
"missing": "缺失",
|
"missing": "缺失",
|
||||||
"no-recipes-found": "未找到匹配食谱",
|
"no-recipes-found": "未找到匹配食谱",
|
||||||
"no-recipes-found-description": "尝试添加更多食材到您的搜索或调整筛选器",
|
"no-recipes-found-description": "尝试添加更多食材到您的搜索或调整筛选器",
|
||||||
"include-ingredients-on-hand": "Include Ingredients On Hand",
|
"include-ingredients-on-hand": "包括手头的食材",
|
||||||
"include-tools-on-hand": "Include Tools On Hand",
|
"include-tools-on-hand": "包括手头的工具",
|
||||||
"max-missing-ingredients": "Max Missing Ingredients",
|
"max-missing-ingredients": "缺少最多得的食材",
|
||||||
"max-missing-tools": "Max Missing Tools",
|
"max-missing-tools": "缺少最多的工具",
|
||||||
"selected-tools": "Selected Tools",
|
"selected-tools": "选择工具",
|
||||||
"other-filters": "Other Filters",
|
"other-filters": "其他过滤器",
|
||||||
"ready-to-make": "Ready to Make",
|
"ready-to-make": "准备完成",
|
||||||
"almost-ready-to-make": "Almost Ready to Make"
|
"almost-ready-to-make": "即将准备完成"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "高级搜索",
|
"advanced-search": "高级搜索",
|
||||||
|
@ -700,7 +704,7 @@
|
||||||
"or": "或",
|
"or": "或",
|
||||||
"has-any": "包含任意",
|
"has-any": "包含任意",
|
||||||
"has-all": "包含所有",
|
"has-all": "包含所有",
|
||||||
"clear-selection": "Clear Selection",
|
"clear-selection": "清空选择",
|
||||||
"results": "结果",
|
"results": "结果",
|
||||||
"search": "搜索",
|
"search": "搜索",
|
||||||
"search-mealie": "搜索Mealie (按 /)",
|
"search-mealie": "搜索Mealie (按 /)",
|
||||||
|
@ -719,7 +723,7 @@
|
||||||
"backup-created-at-response-export_path": "备份创建于 {path}",
|
"backup-created-at-response-export_path": "备份创建于 {path}",
|
||||||
"backup-deleted": "备份已删除",
|
"backup-deleted": "备份已删除",
|
||||||
"restore-success": "还原成功",
|
"restore-success": "还原成功",
|
||||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
"restore-fail": "恢复失败。查看服务器日志了解更多详细信息",
|
||||||
"backup-tag": "标签备份",
|
"backup-tag": "标签备份",
|
||||||
"create-heading": "创建备份",
|
"create-heading": "创建备份",
|
||||||
"delete-backup": "删除备份",
|
"delete-backup": "删除备份",
|
||||||
|
@ -732,7 +736,7 @@
|
||||||
"backup-restore": "备份恢复",
|
"backup-restore": "备份恢复",
|
||||||
"back-restore-description": "恢复该备份将覆盖当前数据库和数据文件夹的数据。 {cannot-be-undone} 若恢复成功,你需要重新登录。",
|
"back-restore-description": "恢复该备份将覆盖当前数据库和数据文件夹的数据。 {cannot-be-undone} 若恢复成功,你需要重新登录。",
|
||||||
"cannot-be-undone": "该操作无法撤销,请谨慎使用!",
|
"cannot-be-undone": "该操作无法撤销,请谨慎使用!",
|
||||||
"postgresql-note": "If you are using PostgreSQL, please review the {backup-restore-process} prior to restoring.",
|
"postgresql-note": "如果您正在使用PostgreSQL,请在恢复之前查看{backup-restore-process}。",
|
||||||
"backup-restore-process-in-the-documentation": "文档中的备份/恢复流程",
|
"backup-restore-process-in-the-documentation": "文档中的备份/恢复流程",
|
||||||
"irreversible-acknowledgment": "我已悉知该操作是不可逆的、有破坏性的,并可能造成数据丢失",
|
"irreversible-acknowledgment": "我已悉知该操作是不可逆的、有破坏性的,并可能造成数据丢失",
|
||||||
"restore-backup": "恢复备份"
|
"restore-backup": "恢复备份"
|
||||||
|
@ -772,7 +776,7 @@
|
||||||
"accent": "Accent(强调)",
|
"accent": "Accent(强调)",
|
||||||
"dark": "深色",
|
"dark": "深色",
|
||||||
"default-to-system": "默认为系统",
|
"default-to-system": "默认为系统",
|
||||||
"error": "Error(错误)",
|
"error": "错误",
|
||||||
"error-creating-theme-see-log-file": "创建主题时出错。请查看日志文件.",
|
"error-creating-theme-see-log-file": "创建主题时出错。请查看日志文件.",
|
||||||
"error-deleting-theme": "删除主题时出错",
|
"error-deleting-theme": "删除主题时出错",
|
||||||
"error-updating-theme": "更新主题时出错",
|
"error-updating-theme": "更新主题时出错",
|
||||||
|
@ -816,7 +820,7 @@
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"test-webhooks": "测试Webhooks",
|
"test-webhooks": "测试Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "下列URL将会在预定日期收到当日饮食计划包含的食谱数据。当前webhooks将于执行于:",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "下列URL将会在预定日期收到当日饮食计划包含的食谱数据。当前webhooks将于执行于:",
|
||||||
"webhook-url": "Webhook网址",
|
"webhook-url": "Webhook URL",
|
||||||
"webhooks-caps": "WEBHOOKS",
|
"webhooks-caps": "WEBHOOKS",
|
||||||
"webhooks": "Webhooks",
|
"webhooks": "Webhooks",
|
||||||
"webhook-name": "Webhook名称",
|
"webhook-name": "Webhook名称",
|
||||||
|
@ -857,7 +861,7 @@
|
||||||
"oidc-ready": "OIDC 已就绪",
|
"oidc-ready": "OIDC 已就绪",
|
||||||
"oidc-ready-error-text": "某些OIDC环境变量尚未配置。(如果你不使用OIDC验证可以忽略该报错)",
|
"oidc-ready-error-text": "某些OIDC环境变量尚未配置。(如果你不使用OIDC验证可以忽略该报错)",
|
||||||
"oidc-ready-success-text": "OIDC所需的环境变量均已配置。",
|
"oidc-ready-success-text": "OIDC所需的环境变量均已配置。",
|
||||||
"openai-ready": "OpenAI Ready",
|
"openai-ready": "OpenAI 准备好了",
|
||||||
"openai-ready-error-text": "并非所有的 OpenAI 值都已配置。如果您不使用 OpenAI 功能,这将被忽略。",
|
"openai-ready-error-text": "并非所有的 OpenAI 值都已配置。如果您不使用 OpenAI 功能,这将被忽略。",
|
||||||
"openai-ready-success-text": "所需的 OpenAI 变量已全部设置。"
|
"openai-ready-success-text": "所需的 OpenAI 变量已全部设置。"
|
||||||
},
|
},
|
||||||
|
@ -885,16 +889,16 @@
|
||||||
"reorder-labels": "重新排列标签",
|
"reorder-labels": "重新排列标签",
|
||||||
"uncheck-all-items": "取消勾选所有项目",
|
"uncheck-all-items": "取消勾选所有项目",
|
||||||
"check-all-items": "勾选所有项目",
|
"check-all-items": "勾选所有项目",
|
||||||
"linked-recipes-count": "没有关联食谱|1个关联食谱|{count}个关联食谱",
|
"linked-recipes-count": "无关联食谱|一个关联食谱|{count}关联食谱",
|
||||||
"items-checked-count": "未选中条目|已选中1个条目|已选中{count}个条目",
|
"items-checked-count": "未选中条目|已选中1个条目|已选中{count}个条目",
|
||||||
"no-label": "无标签",
|
"no-label": "无标签",
|
||||||
"completed-on": "于 {date} 完成",
|
"completed-on": "于 {date} 完成",
|
||||||
"you-are-offline": "你已离线",
|
"you-are-offline": "你已离线",
|
||||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
"you-are-offline-description": "离线时并非所有功能都可用。您仍然可以添加、修改和删除项目,但在重新联机之前,您将无法将更改同步到服务器。",
|
||||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
"are-you-sure-you-want-to-check-all-items": "您确定要选择所有项目吗?",
|
||||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
"are-you-sure-you-want-to-uncheck-all-items": "您确定要取消选中所有项目吗?",
|
||||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?",
|
"are-you-sure-you-want-to-delete-checked-items": "您确定要删除所有选中的项目吗?",
|
||||||
"no-shopping-lists-found": "No Shopping Lists Found"
|
"no-shopping-lists-found": "没有发现购物清单"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"all-recipes": "全部食谱",
|
"all-recipes": "全部食谱",
|
||||||
|
@ -926,7 +930,7 @@
|
||||||
"sign-up-links": "注册链接",
|
"sign-up-links": "注册链接",
|
||||||
"sign-up-token-deleted": "注册令牌已删除",
|
"sign-up-token-deleted": "注册令牌已删除",
|
||||||
"sign-up-token-deletion-failed": "注册令牌删除失败",
|
"sign-up-token-deletion-failed": "注册令牌删除失败",
|
||||||
"welcome-to-mealie": "欢迎来到Mealie!要成为此实例的用户,您必须有一个有效的邀请链接。 如果您没有收到邀请,您无法注册。要接收链接,请联系站点管理员。"
|
"welcome-to-mealie": "欢迎来到Mealie!要成为此实例的用户,您需要有一个有效的邀请链接。如果您没有收到邀请,您将无法注册。需要邀请链接,请与站点管理员联系。"
|
||||||
},
|
},
|
||||||
"tag": {
|
"tag": {
|
||||||
"tag-created": "标签已创建",
|
"tag-created": "标签已创建",
|
||||||
|
@ -1035,12 +1039,12 @@
|
||||||
"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": "指定用户将如何使用Mealie进行身份验证。如果你不确定,选择“Mealie”。",
|
||||||
"permissions": "权限",
|
"permissions": "权限",
|
||||||
"administrator": "管理员",
|
"administrator": "管理员",
|
||||||
"user-can-invite-other-to-group": "User can invite others to group",
|
"user-can-invite-other-to-group": "用户可以邀请其他人加入群组",
|
||||||
"user-can-manage-group": "用户可以管理群组",
|
"user-can-manage-group": "用户可以管理群组",
|
||||||
"user-can-manage-household": "User can manage household",
|
"user-can-manage-household": "用户可以管理家庭",
|
||||||
"user-can-organize-group-data": "用户可以整理群组数据",
|
"user-can-organize-group-data": "用户可以整理群组数据",
|
||||||
"enable-advanced-features": "启用高级功能",
|
"enable-advanced-features": "启用高级功能",
|
||||||
"it-looks-like-this-is-your-first-time-logging-in": "看起来这是你第一次登录。",
|
"it-looks-like-this-is-your-first-time-logging-in": "看起来这是你第一次登录。",
|
||||||
|
@ -1053,15 +1057,15 @@
|
||||||
"translated": "已翻译",
|
"translated": "已翻译",
|
||||||
"choose-language": "选择语言",
|
"choose-language": "选择语言",
|
||||||
"select-description": "选择Mealie UI的语言。该设置仅对你生效,不会影响其他用户。",
|
"select-description": "选择Mealie UI的语言。该设置仅对你生效,不会影响其他用户。",
|
||||||
"how-to-contribute-description": "是否存在未翻译、错翻译的地方,或是列表根本没有你的语言?{read-the-docs-link}了解如何贡献翻译!",
|
"how-to-contribute-description": "是否存在未翻译、错翻译的地方,或是列表根本没有你的语言?{read-the-docs-link} 了解如何贡献翻译!",
|
||||||
"read-the-docs": "阅读文档"
|
"read-the-docs": "阅读文档"
|
||||||
},
|
},
|
||||||
"data-pages": {
|
"data-pages": {
|
||||||
"foods": {
|
"foods": {
|
||||||
"merge-dialog-text": "此操作将把“待合并食物”和“目标食物”合并为一个食物(即“目标食物”)。 “待合并食物”将会被删除 ,之前所有对“待合并食物”的引用都会指向“目标食物”。",
|
"merge-dialog-text": "此操作将把“待合并食物”和“目标食物”合并为一个食物(即“目标食物”)。 “待合并食物”将会被删除 ,之前所有对“待合并食物”的引用都会指向“目标食物”。",
|
||||||
"merge-food-example": "正在将{food1}合并到{food2}",
|
"merge-food-example": "正在将{food1}合并到{food2} ",
|
||||||
"seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.",
|
"seed-dialog-text": "根据你当地的语言在数据库中输入食物。这将创建大约2700种常见的食物,可以用来组织你的数据库。食物是通过社区努力翻译的。",
|
||||||
"seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.",
|
"seed-dialog-warning": "您的数据库中已经有一些项目。如果已经存在同名的项,则不会添加新项。",
|
||||||
"combine-food": "合并食品",
|
"combine-food": "合并食品",
|
||||||
"source-food": "待合并食物",
|
"source-food": "待合并食物",
|
||||||
"target-food": "目标食物",
|
"target-food": "目标食物",
|
||||||
|
@ -1071,8 +1075,8 @@
|
||||||
"food-data": "食品数据",
|
"food-data": "食品数据",
|
||||||
"example-food-singular": "例如:洋葱",
|
"example-food-singular": "例如:洋葱",
|
||||||
"example-food-plural": "中文用户可忽略",
|
"example-food-plural": "中文用户可忽略",
|
||||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
"label-overwrite-warning": "这将为所有选定的食品分配选定的标签,可能会覆盖您现有的标签。",
|
||||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
"on-hand-checkbox-label": "在将食谱添加到购物清单时,设置此标志将默认不检查该食物。"
|
||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "基于你的本地语言,将一些常见单位添加到数据库。",
|
"seed-dialog-text": "基于你的本地语言,将一些常见单位添加到数据库。",
|
||||||
|
@ -1101,7 +1105,7 @@
|
||||||
"edit-label": "编辑标注",
|
"edit-label": "编辑标注",
|
||||||
"new-label": "新标注",
|
"new-label": "新标注",
|
||||||
"labels": "标注",
|
"labels": "标注",
|
||||||
"assign-label": "Assign Label"
|
"assign-label": "指定标签"
|
||||||
},
|
},
|
||||||
"recipes": {
|
"recipes": {
|
||||||
"purge-exports": "清除导出",
|
"purge-exports": "清除导出",
|
||||||
|
@ -1109,7 +1113,7 @@
|
||||||
"confirm-delete-recipes": "你确定要删除以下食谱吗?此操作无法撤消。",
|
"confirm-delete-recipes": "你确定要删除以下食谱吗?此操作无法撤消。",
|
||||||
"the-following-recipes-selected-length-will-be-exported": "以下食谱 ({0}) 将被导出。",
|
"the-following-recipes-selected-length-will-be-exported": "以下食谱 ({0}) 将被导出。",
|
||||||
"settings-chosen-explanation": "除被锁定选项外,下列选择将被应用于所有已选中的食谱。",
|
"settings-chosen-explanation": "除被锁定选项外,下列选择将被应用于所有已选中的食谱。",
|
||||||
"selected-length-recipe-s-settings-will-be-updated": "{count}个食谱配置将被更新。",
|
"selected-length-recipe-s-settings-will-be-updated": "{count} 个食谱配置将被更新。",
|
||||||
"recipe-data": "食谱数据",
|
"recipe-data": "食谱数据",
|
||||||
"recipe-data-description": "使用此部分来管理与食谱相关的数据。你可以对食谱进行一些批量操作,包括导出、删除、以及添加标签和分类。",
|
"recipe-data-description": "使用此部分来管理与食谱相关的数据。你可以对食谱进行一些批量操作,包括导出、删除、以及添加标签和分类。",
|
||||||
"recipe-columns": "食谱可选表头",
|
"recipe-columns": "食谱可选表头",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "群组详情",
|
"group-details": "群组详情",
|
||||||
"group-details-description": "在你创建账户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、饮食计划、购物清单等!",
|
"group-details-description": "在你创建账户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、饮食计划、购物清单等!",
|
||||||
"use-seed-data": "使用初始数据",
|
"use-seed-data": "使用初始数据",
|
||||||
"use-seed-data-description": "Mealie附带一套现成的“食品”、“单位”、“标签”数据,可以帮助你的群组管理食谱。",
|
"use-seed-data-description": "Mealie提供了一个食品、单位和标签的集合,可以用有用的数据填充您的组,以便组织您的食谱。这些将被翻译成您当前选择的语言。您可以随时添加或修改这些数据。",
|
||||||
"account-details": "账户详情"
|
"account-details": "账户详情"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
@ -1199,12 +1203,12 @@
|
||||||
"preview-markdown-button-label": "预览Markdown"
|
"preview-markdown-button-label": "预览Markdown"
|
||||||
},
|
},
|
||||||
"demo": {
|
"demo": {
|
||||||
"info_message_with_version": "这是{version}版本的演示模式",
|
"info_message_with_version": "这是{version} 版本的演示模式",
|
||||||
"demo_username": "\n用户名:{username}",
|
"demo_username": "用户名:{username}",
|
||||||
"demo_password": "密码:{password}"
|
"demo_password": "密码:{password}"
|
||||||
},
|
},
|
||||||
"ocr-editor": {
|
"ocr-editor": {
|
||||||
"ocr-editor": "OCR编辑器",
|
"ocr-editor": "Ocr编辑器",
|
||||||
"toolbar": "工具栏",
|
"toolbar": "工具栏",
|
||||||
"selection-mode": "选择模式",
|
"selection-mode": "选择模式",
|
||||||
"pan-and-zoom-picture": "平移和缩放图片",
|
"pan-and-zoom-picture": "平移和缩放图片",
|
||||||
|
@ -1279,7 +1283,7 @@
|
||||||
"openai": "OpenAI",
|
"openai": "OpenAI",
|
||||||
"show-individual-confidence": "显示个体置信度",
|
"show-individual-confidence": "显示个体置信度",
|
||||||
"ingredient-text": "食材文本",
|
"ingredient-text": "食材文本",
|
||||||
"average-confident": "{0}置信度",
|
"average-confident": "{0} 准确度",
|
||||||
"try-an-example": "尝试一下示例吧",
|
"try-an-example": "尝试一下示例吧",
|
||||||
"parser": "解析器",
|
"parser": "解析器",
|
||||||
"background-tasks": "后台任务",
|
"background-tasks": "后台任务",
|
||||||
|
@ -1296,25 +1300,25 @@
|
||||||
"restore-from-v1-backup": "有之前Mealie v1实例的备份数据?你可以在这里恢复它们。",
|
"restore-from-v1-backup": "有之前Mealie v1实例的备份数据?你可以在这里恢复它们。",
|
||||||
"manage-profile-or-get-invite-link": "管理你自己的个人资料,或者获取邀请链接分享给其他人。"
|
"manage-profile-or-get-invite-link": "管理你自己的个人资料,或者获取邀请链接分享给其他人。"
|
||||||
},
|
},
|
||||||
"debug-openai-services": "Debug OpenAI Services",
|
"debug-openai-services": "调试 OpenAI 服务",
|
||||||
"debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.",
|
"debug-openai-services-description": "使用此页面调试OpenAI服务。您可以在这里测试您的OpenAI连接并查看结果。如果启用了映像服务,还可以提供映像。",
|
||||||
"run-test": "Run Test",
|
"run-test": "进行测试",
|
||||||
"test-results": "Test Results",
|
"test-results": "测试结果",
|
||||||
"group-delete-note": "Groups with users or households cannot be deleted",
|
"group-delete-note": "不能删除包含用户或家庭的组",
|
||||||
"household-delete-note": "Households with users cannot be deleted"
|
"household-delete-note": "不能删除有用户的家庭"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"welcome-user": "👋 欢迎,{0}!",
|
"welcome-user": "👋 欢迎,{0}!",
|
||||||
"description": "管理您的个人资料、食谱谱和群组设置。",
|
"description": "管理您的个人资料、食谱谱和群组设置。",
|
||||||
"invite-link": "Invite Link",
|
"invite-link": "邀请链接",
|
||||||
"get-invite-link": "生成邀请链接",
|
"get-invite-link": "生成邀请链接",
|
||||||
"get-public-link": "生成公开链接",
|
"get-public-link": "生成公开链接",
|
||||||
"account-summary": "账户概况",
|
"account-summary": "账户概况",
|
||||||
"account-summary-description": "以下是你群组信息的摘要。",
|
"account-summary-description": "以下是你群组信息的摘要。",
|
||||||
"group-statistics": "群组统计",
|
"group-statistics": "群组统计",
|
||||||
"group-statistics-description": "群组统计为你如何使用Mealie提供一些深入信息。",
|
"group-statistics-description": "群组统计为你如何使用Mealie提供一些深入信息。",
|
||||||
"household-statistics": "Household Statistics",
|
"household-statistics": "家庭统计",
|
||||||
"household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.",
|
"household-statistics-description": "您的家庭数据统计提供了一些如何使用Mealie的见解。",
|
||||||
"storage-capacity": "总储存容量",
|
"storage-capacity": "总储存容量",
|
||||||
"storage-capacity-description": "你的存储容量基于你上传的图片和资源计算得出。",
|
"storage-capacity-description": "你的存储容量基于你上传的图片和资源计算得出。",
|
||||||
"personal": "个人",
|
"personal": "个人",
|
||||||
|
@ -1324,13 +1328,13 @@
|
||||||
"api-tokens-description": "管理用于外部程序访问的API令牌。",
|
"api-tokens-description": "管理用于外部程序访问的API令牌。",
|
||||||
"group-description": "这些项目已在你的群组中共享,一旦被编辑,更改之处会对所有群组成员生效!",
|
"group-description": "这些项目已在你的群组中共享,一旦被编辑,更改之处会对所有群组成员生效!",
|
||||||
"group-settings": "基础选项",
|
"group-settings": "基础选项",
|
||||||
"group-settings-description": "Manage your common group settings, like privacy settings.",
|
"group-settings-description": "管理您的群组设置,比如隐私设置。",
|
||||||
"household-description": "These items are shared within your household. Editing one of them will change it for the whole household!",
|
"household-description": "这些物品是在你的家庭中共享的。编辑其中一个将同步到整个家庭!",
|
||||||
"household-settings": "Household Settings",
|
"household-settings": "家庭设置",
|
||||||
"household-settings-description": "Manage your household settings, like mealplan and privacy settings.",
|
"household-settings-description": "管理你的家庭设置,比如用餐计划和隐私设置。",
|
||||||
"cookbooks-description": "管理一套食谱分类并为它们生成页面。",
|
"cookbooks-description": "管理一套食谱分类并为它们生成页面。",
|
||||||
"members": "成员列表",
|
"members": "成员列表",
|
||||||
"members-description": "See who's in your household and manage their permissions.",
|
"members-description": "看看谁在你的家庭并管理他们的权限。",
|
||||||
"webhooks-description": "配置在你某天有饮食计划时,当日触发的webhooks。",
|
"webhooks-description": "配置在你某天有饮食计划时,当日触发的webhooks。",
|
||||||
"notifiers": "通知方案",
|
"notifiers": "通知方案",
|
||||||
"notifiers-description": "设置基于特定事件触发的邮件提醒和通知推送。",
|
"notifiers-description": "设置基于特定事件触发的邮件提醒和通知推送。",
|
||||||
|
@ -1342,7 +1346,7 @@
|
||||||
"error-sending-email": "发送邮件出错",
|
"error-sending-email": "发送邮件出错",
|
||||||
"personal-information": "个人信息",
|
"personal-information": "个人信息",
|
||||||
"preferences": "偏好设置",
|
"preferences": "偏好设置",
|
||||||
"show-advanced-description": "显示高级功能(食谱扩展键值对、Webhooks和数据管理)",
|
"show-advanced-description": "显示高级功能 (食谱扩展键值对、Webhooks和数据管理)",
|
||||||
"back-to-profile": "返回设置主页",
|
"back-to-profile": "返回设置主页",
|
||||||
"looking-for-privacy-settings": "正在寻找隐私设置?",
|
"looking-for-privacy-settings": "正在寻找隐私设置?",
|
||||||
"manage-your-api-tokens": "管理API令牌",
|
"manage-your-api-tokens": "管理API令牌",
|
||||||
|
@ -1355,9 +1359,9 @@
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "食谱合集",
|
"cookbooks": "食谱合集",
|
||||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.",
|
"description": "食谱合集是通过结合分类、标签两套系统来归纳食谱的方案。每创建一个合集,侧栏都会新增一个对应入口,所有满足该合集所指定标签与分类的食谱都会显示在此。",
|
||||||
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households",
|
"hide-cookbooks-from-other-households": "隐藏其他家庭的合集",
|
||||||
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar",
|
"hide-cookbooks-from-other-households-description": "启用后,侧边栏上只会出现你家庭的合集",
|
||||||
"public-cookbook": "公开食谱合集",
|
"public-cookbook": "公开食谱合集",
|
||||||
"public-cookbook-description": "公开食谱合集可以分享和非Mealie用户,同时也会显示在你的群组页面上。",
|
"public-cookbook-description": "公开食谱合集可以分享和非Mealie用户,同时也会显示在你的群组页面上。",
|
||||||
"filter-options": "过滤器选项",
|
"filter-options": "过滤器选项",
|
||||||
|
@ -1366,8 +1370,8 @@
|
||||||
"require-all-tags": "包含全部标签",
|
"require-all-tags": "包含全部标签",
|
||||||
"require-all-tools": "包含全部工具",
|
"require-all-tools": "包含全部工具",
|
||||||
"cookbook-name": "食谱名称",
|
"cookbook-name": "食谱名称",
|
||||||
"cookbook-with-name": "{0}合集",
|
"cookbook-with-name": "合集 {0}",
|
||||||
"household-cookbook-name": "{0} Cookbook {1}",
|
"household-cookbook-name": "{0} 合集 {1}",
|
||||||
"create-a-cookbook": "创建一个食谱合集",
|
"create-a-cookbook": "创建一个食谱合集",
|
||||||
"cookbook": "食谱合集"
|
"cookbook": "食谱合集"
|
||||||
},
|
},
|
||||||
|
@ -1390,8 +1394,8 @@
|
||||||
"is-one-of": "其中之一",
|
"is-one-of": "其中之一",
|
||||||
"is-not-one-of": "不是其中之一",
|
"is-not-one-of": "不是其中之一",
|
||||||
"contains-all-of": "包含所有",
|
"contains-all-of": "包含所有",
|
||||||
"is-like": "is like",
|
"is-like": "匹配",
|
||||||
"is-not-like": "is not like"
|
"is-not-like": "不匹配"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"new-notification": "新通知",
|
"new-notification": "新通知",
|
||||||
"event-notifiers": "事件通知",
|
"event-notifiers": "事件通知",
|
||||||
"apprise-url-skipped-if-blank": "Apprise 網址(空白則略過)",
|
"apprise-url-skipped-if-blank": "Apprise 網址(空白則略過)",
|
||||||
|
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||||
"enable-notifier": "啟用通知功能",
|
"enable-notifier": "啟用通知功能",
|
||||||
"what-events": "要訂閱哪些事件通知?",
|
"what-events": "要訂閱哪些事件通知?",
|
||||||
"user-events": "用戶相關事件",
|
"user-events": "用戶相關事件",
|
||||||
|
@ -79,7 +80,8 @@
|
||||||
"tag-events": "標籤事件",
|
"tag-events": "標籤事件",
|
||||||
"category-events": "類別事件",
|
"category-events": "類別事件",
|
||||||
"when-a-new-user-joins-your-group": "當新用戶加入您的群組時",
|
"when-a-new-user-joins-your-group": "當新用戶加入您的群組時",
|
||||||
"recipe-events": "食譜事件"
|
"recipe-events": "食譜事件",
|
||||||
|
"label-events": "Label Events"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
|
@ -672,7 +674,9 @@
|
||||||
"not-linked-ingredients": "Additional Ingredients",
|
"not-linked-ingredients": "Additional Ingredients",
|
||||||
"upload-another-image": "Upload another image",
|
"upload-another-image": "Upload another image",
|
||||||
"upload-images": "Upload images",
|
"upload-images": "Upload images",
|
||||||
"upload-more-images": "Upload more images"
|
"upload-more-images": "Upload more images",
|
||||||
|
"set-as-cover-image": "Set as recipe cover image",
|
||||||
|
"cover-image": "Cover image"
|
||||||
},
|
},
|
||||||
"recipe-finder": {
|
"recipe-finder": {
|
||||||
"recipe-finder": "Recipe Finder",
|
"recipe-finder": "Recipe Finder",
|
||||||
|
@ -1165,7 +1169,7 @@
|
||||||
"group-details": "Group Details",
|
"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": "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!",
|
||||||
"use-seed-data": "Use Seed Data",
|
"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.",
|
"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. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||||
"account-details": "Account Details"
|
"account-details": "Account Details"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients";
|
import { BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients";
|
||||||
import { RecipeCookBook } from "~/lib/api/types/cookbook";
|
import { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||||
import { ApiRequestInstance } from "~/lib/api/types/non-generated";
|
import { ApiRequestInstance } from "~/lib/api/types/non-generated";
|
||||||
|
|
||||||
const prefix = "/api";
|
const prefix = "/api";
|
||||||
|
@ -10,7 +10,7 @@ const routes = {
|
||||||
cookbooksGroupSlugCookbookId: (groupSlug: string | number, cookbookId: string | number) => `${exploreGroupSlug(groupSlug)}/cookbooks/${cookbookId}`,
|
cookbooksGroupSlugCookbookId: (groupSlug: string | number, cookbookId: string | number) => `${exploreGroupSlug(groupSlug)}/cookbooks/${cookbookId}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export class PublicCookbooksApi extends BaseCRUDAPIReadOnly<RecipeCookBook> {
|
export class PublicCookbooksApi extends BaseCRUDAPIReadOnly<ReadCookBook> {
|
||||||
constructor(requests: ApiRequestInstance, groupSlug: string) {
|
constructor(requests: ApiRequestInstance, groupSlug: string) {
|
||||||
super(
|
super(
|
||||||
requests,
|
requests,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
@ -117,6 +117,7 @@ export interface CustomPageBase {
|
||||||
export interface RecipeCategoryResponse {
|
export interface RecipeCategoryResponse {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
recipes?: RecipeSummary[];
|
recipes?: RecipeSummary[];
|
||||||
}
|
}
|
||||||
|
@ -149,18 +150,21 @@ export interface RecipeSummary {
|
||||||
}
|
}
|
||||||
export interface RecipeCategory {
|
export interface RecipeCategory {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTag {
|
export interface RecipeTag {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTool {
|
export interface RecipeTool {
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
@ -41,65 +41,6 @@ export interface QueryFilterJSONPart {
|
||||||
value?: string | string[] | null;
|
value?: string | string[] | null;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeCookBook {
|
|
||||||
name: string;
|
|
||||||
description?: string;
|
|
||||||
slug?: string | null;
|
|
||||||
position?: number;
|
|
||||||
public?: boolean;
|
|
||||||
queryFilterString?: string;
|
|
||||||
groupId: string;
|
|
||||||
householdId: string;
|
|
||||||
id: string;
|
|
||||||
queryFilter?: QueryFilterJSON;
|
|
||||||
recipes: RecipeSummary[];
|
|
||||||
}
|
|
||||||
export interface RecipeSummary {
|
|
||||||
id?: string | null;
|
|
||||||
userId?: string;
|
|
||||||
householdId?: string;
|
|
||||||
groupId?: string;
|
|
||||||
name?: string | null;
|
|
||||||
slug?: string;
|
|
||||||
image?: unknown;
|
|
||||||
recipeServings?: number;
|
|
||||||
recipeYieldQuantity?: number;
|
|
||||||
recipeYield?: string | null;
|
|
||||||
totalTime?: string | null;
|
|
||||||
prepTime?: string | null;
|
|
||||||
cookTime?: string | null;
|
|
||||||
performTime?: string | null;
|
|
||||||
description?: string | null;
|
|
||||||
recipeCategory?: RecipeCategory[] | null;
|
|
||||||
tags?: RecipeTag[] | null;
|
|
||||||
tools?: RecipeTool[];
|
|
||||||
rating?: number | null;
|
|
||||||
orgURL?: string | null;
|
|
||||||
dateAdded?: string | null;
|
|
||||||
dateUpdated?: string | null;
|
|
||||||
createdAt?: string | null;
|
|
||||||
updatedAt?: string | null;
|
|
||||||
lastMade?: string | null;
|
|
||||||
}
|
|
||||||
export interface RecipeCategory {
|
|
||||||
id?: string | null;
|
|
||||||
name: string;
|
|
||||||
slug: string;
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
export interface RecipeTag {
|
|
||||||
id?: string | null;
|
|
||||||
name: string;
|
|
||||||
slug: string;
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
export interface RecipeTool {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
slug: string;
|
|
||||||
householdsWithTool?: string[];
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
export interface SaveCookBook {
|
export interface SaveCookBook {
|
||||||
name: string;
|
name: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
@ -70,6 +70,9 @@ export interface GroupEventNotifierOptions {
|
||||||
categoryCreated?: boolean;
|
categoryCreated?: boolean;
|
||||||
categoryUpdated?: boolean;
|
categoryUpdated?: boolean;
|
||||||
categoryDeleted?: boolean;
|
categoryDeleted?: boolean;
|
||||||
|
labelCreated?: boolean;
|
||||||
|
labelUpdated?: boolean;
|
||||||
|
labelDeleted?: boolean;
|
||||||
}
|
}
|
||||||
export interface GroupEventNotifierOptionsOut {
|
export interface GroupEventNotifierOptionsOut {
|
||||||
testMessage?: boolean;
|
testMessage?: boolean;
|
||||||
|
@ -94,6 +97,9 @@ export interface GroupEventNotifierOptionsOut {
|
||||||
categoryCreated?: boolean;
|
categoryCreated?: boolean;
|
||||||
categoryUpdated?: boolean;
|
categoryUpdated?: boolean;
|
||||||
categoryDeleted?: boolean;
|
categoryDeleted?: boolean;
|
||||||
|
labelCreated?: boolean;
|
||||||
|
labelUpdated?: boolean;
|
||||||
|
labelDeleted?: boolean;
|
||||||
id: string;
|
id: string;
|
||||||
}
|
}
|
||||||
export interface GroupEventNotifierOptionsSave {
|
export interface GroupEventNotifierOptionsSave {
|
||||||
|
@ -119,6 +125,9 @@ export interface GroupEventNotifierOptionsSave {
|
||||||
categoryCreated?: boolean;
|
categoryCreated?: boolean;
|
||||||
categoryUpdated?: boolean;
|
categoryUpdated?: boolean;
|
||||||
categoryDeleted?: boolean;
|
categoryDeleted?: boolean;
|
||||||
|
labelCreated?: boolean;
|
||||||
|
labelUpdated?: boolean;
|
||||||
|
labelDeleted?: boolean;
|
||||||
notifierId: string;
|
notifierId: string;
|
||||||
}
|
}
|
||||||
export interface GroupEventNotifierOut {
|
export interface GroupEventNotifierOut {
|
||||||
|
@ -166,6 +175,7 @@ export interface GroupRecipeActionOut {
|
||||||
export interface GroupRecipeActionPayload {
|
export interface GroupRecipeActionPayload {
|
||||||
action: GroupRecipeActionOut;
|
action: GroupRecipeActionOut;
|
||||||
content: unknown;
|
content: unknown;
|
||||||
|
recipeScale: number;
|
||||||
}
|
}
|
||||||
export interface HouseholdCreate {
|
export interface HouseholdCreate {
|
||||||
groupId?: string | null;
|
groupId?: string | null;
|
||||||
|
@ -587,18 +597,21 @@ export interface RecipeSummary {
|
||||||
}
|
}
|
||||||
export interface RecipeCategory {
|
export interface RecipeCategory {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTag {
|
export interface RecipeTag {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTool {
|
export interface RecipeTool {
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { HouseholdSummary } from "./household";
|
|
||||||
|
|
||||||
export type PlanEntryType = "breakfast" | "lunch" | "dinner" | "side";
|
export type PlanEntryType = "breakfast" | "lunch" | "dinner" | "side";
|
||||||
export type PlanRulesDay = "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday" | "sunday" | "unset";
|
export type PlanRulesDay = "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday" | "sunday" | "unset";
|
||||||
export type PlanRulesType = "breakfast" | "lunch" | "dinner" | "side" | "unset";
|
export type PlanRulesType = "breakfast" | "lunch" | "dinner" | "side" | "unset";
|
||||||
|
@ -44,9 +42,6 @@ export interface PlanRulesOut {
|
||||||
householdId: string;
|
householdId: string;
|
||||||
id: string;
|
id: string;
|
||||||
queryFilter?: QueryFilterJSON;
|
queryFilter?: QueryFilterJSON;
|
||||||
categories?: RecipeCategory[];
|
|
||||||
tags?: RecipeTag[];
|
|
||||||
households?: HouseholdSummary[];
|
|
||||||
}
|
}
|
||||||
export interface QueryFilterJSON {
|
export interface QueryFilterJSON {
|
||||||
parts?: QueryFilterJSONPart[];
|
parts?: QueryFilterJSONPart[];
|
||||||
|
@ -108,18 +103,21 @@ export interface RecipeSummary {
|
||||||
}
|
}
|
||||||
export interface RecipeCategory {
|
export interface RecipeCategory {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTag {
|
export interface RecipeTag {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
export interface RecipeTool {
|
export interface RecipeTool {
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
|
|
|
@ -19,6 +19,7 @@ export interface AssignCategories {
|
||||||
export interface CategoryBase {
|
export interface CategoryBase {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface AssignSettings {
|
export interface AssignSettings {
|
||||||
|
@ -40,6 +41,7 @@ export interface AssignTags {
|
||||||
export interface TagBase {
|
export interface TagBase {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface CategoryIn {
|
export interface CategoryIn {
|
||||||
|
@ -48,8 +50,8 @@ export interface CategoryIn {
|
||||||
export interface CategoryOut {
|
export interface CategoryOut {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
slug: string;
|
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface CategorySave {
|
export interface CategorySave {
|
||||||
name: string;
|
name: string;
|
||||||
|
@ -97,11 +99,13 @@ export interface CreateRecipeBulk {
|
||||||
}
|
}
|
||||||
export interface RecipeCategory {
|
export interface RecipeCategory {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface RecipeTag {
|
export interface RecipeTag {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
|
@ -223,7 +227,7 @@ export interface Recipe {
|
||||||
groupId?: string;
|
groupId?: string;
|
||||||
name?: string | null;
|
name?: string | null;
|
||||||
slug?: string;
|
slug?: string;
|
||||||
image?: string;
|
image?: unknown;
|
||||||
recipeServings?: number;
|
recipeServings?: number;
|
||||||
recipeYieldQuantity?: number;
|
recipeYieldQuantity?: number;
|
||||||
recipeYield?: string | null;
|
recipeYield?: string | null;
|
||||||
|
@ -255,6 +259,7 @@ export interface Recipe {
|
||||||
}
|
}
|
||||||
export interface RecipeTool {
|
export interface RecipeTool {
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
|
@ -293,6 +298,7 @@ export interface UserBase {
|
||||||
export interface RecipeCategoryResponse {
|
export interface RecipeCategoryResponse {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
recipes?: RecipeSummary[];
|
recipes?: RecipeSummary[];
|
||||||
}
|
}
|
||||||
|
@ -399,6 +405,7 @@ export interface RecipeSuggestionResponseItem {
|
||||||
export interface RecipeTagResponse {
|
export interface RecipeTagResponse {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
recipes?: RecipeSummary[];
|
recipes?: RecipeSummary[];
|
||||||
}
|
}
|
||||||
|
@ -447,12 +454,14 @@ export interface RecipeToolOut {
|
||||||
name: string;
|
name: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface RecipeToolResponse {
|
export interface RecipeToolResponse {
|
||||||
name: string;
|
name: string;
|
||||||
householdsWithTool?: string[];
|
householdsWithTool?: string[];
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
recipes?: RecipeSummary[];
|
recipes?: RecipeSummary[];
|
||||||
}
|
}
|
||||||
|
@ -507,7 +516,7 @@ export interface ScrapeRecipeTest {
|
||||||
url: string;
|
url: string;
|
||||||
useOpenAI?: boolean;
|
useOpenAI?: boolean;
|
||||||
}
|
}
|
||||||
export interface SlugResponse { }
|
export interface SlugResponse {}
|
||||||
export interface TagIn {
|
export interface TagIn {
|
||||||
name: string;
|
name: string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
/**
|
/**
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||||
|
@ -63,6 +63,7 @@ export interface GroupInDB {
|
||||||
export interface CategoryBase {
|
export interface CategoryBase {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
groupId?: string | null;
|
||||||
slug: string;
|
slug: string;
|
||||||
}
|
}
|
||||||
export interface ReadWebhook {
|
export interface ReadWebhook {
|
||||||
|
@ -197,7 +198,6 @@ export interface UserBase {
|
||||||
canManage?: boolean;
|
canManage?: boolean;
|
||||||
canManageHousehold?: boolean;
|
canManageHousehold?: boolean;
|
||||||
canOrganize?: boolean;
|
canOrganize?: boolean;
|
||||||
advancedOptions?: boolean;
|
|
||||||
}
|
}
|
||||||
export interface UserIn {
|
export interface UserIn {
|
||||||
id?: string | null;
|
id?: string | null;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { BaseCRUDAPI } from "../base/base-clients";
|
import { BaseCRUDAPI } from "../base/base-clients";
|
||||||
import type { CreateCookBook, RecipeCookBook, UpdateCookBook } from "~/lib/api/types/cookbook";
|
import type { CreateCookBook, ReadCookBook, UpdateCookBook } from "~/lib/api/types/cookbook";
|
||||||
|
|
||||||
const prefix = "/api";
|
const prefix = "/api";
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ const routes = {
|
||||||
cookbooksId: (id: number) => `${prefix}/households/cookbooks/${id}`,
|
cookbooksId: (id: number) => `${prefix}/households/cookbooks/${id}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
export class CookbookAPI extends BaseCRUDAPI<CreateCookBook, RecipeCookBook, UpdateCookBook> {
|
export class CookbookAPI extends BaseCRUDAPI<CreateCookBook, ReadCookBook, UpdateCookBook> {
|
||||||
baseRoute: string = routes.cookbooks;
|
baseRoute: string = routes.cookbooks;
|
||||||
itemRoute = routes.cookbooksId;
|
itemRoute = routes.cookbooksId;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "mealie",
|
"name": "mealie",
|
||||||
"version": "3.0.2",
|
"version": "3.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "nuxt dev",
|
"dev": "nuxt dev",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
:headers="headers"
|
:headers="headers"
|
||||||
:items="backups.imports || []"
|
:items="backups.imports || []"
|
||||||
class="elevation-0"
|
class="elevation-0"
|
||||||
|
:items-per-page="-1"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
disable-pagination
|
disable-pagination
|
||||||
:search="search"
|
:search="search"
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
:items="groups || []"
|
:items="groups || []"
|
||||||
item-key="id"
|
item-key="id"
|
||||||
class="elevation-0"
|
class="elevation-0"
|
||||||
|
:items-per-page="-1"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
disable-pagination
|
disable-pagination
|
||||||
:search="search"
|
:search="search"
|
||||||
|
|
|
@ -66,6 +66,7 @@
|
||||||
:items="households"
|
:items="households"
|
||||||
item-key="id"
|
item-key="id"
|
||||||
class="elevation-0"
|
class="elevation-0"
|
||||||
|
:items-per-page="-1"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
disable-pagination
|
disable-pagination
|
||||||
:search="search"
|
:search="search"
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
item-key="id"
|
item-key="id"
|
||||||
class="elevation-0"
|
class="elevation-0"
|
||||||
elevation="0"
|
elevation="0"
|
||||||
|
:items-per-page="-1"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
disable-pagination
|
disable-pagination
|
||||||
:search="search"
|
:search="search"
|
||||||
|
|
|
@ -1,70 +1,81 @@
|
||||||
<template>
|
<template>
|
||||||
<v-container fill-height
|
<v-container
|
||||||
fluid
|
fill-height
|
||||||
class="d-flex justify-center align-center"
|
fluid
|
||||||
width="1200px"
|
class="d-flex justify-center align-center"
|
||||||
min-height="700px"
|
width="1200px"
|
||||||
:class="{
|
min-height="700px"
|
||||||
'bg-off-white': !$vuetify.theme.current.dark,
|
:class="{
|
||||||
}"
|
'bg-off-white': !$vuetify.theme.current.dark,
|
||||||
|
}"
|
||||||
>
|
>
|
||||||
<BaseWizard v-model="currentPage"
|
<BaseWizard
|
||||||
:max-page-number="totalPages"
|
v-model="currentPage"
|
||||||
:title="$t('admin.setup.first-time-setup')"
|
:max-page-number="totalPages"
|
||||||
:prev-button-show="activeConfig.showPrevButton"
|
:title="$t('admin.setup.first-time-setup')"
|
||||||
:next-button-show="activeConfig.showNextButton"
|
:prev-button-show="activeConfig.showPrevButton"
|
||||||
:next-button-text="activeConfig.nextButtonText"
|
:next-button-show="activeConfig.showNextButton"
|
||||||
:next-button-icon="activeConfig.nextButtonIcon"
|
:next-button-text="activeConfig.nextButtonText"
|
||||||
:next-button-color="activeConfig.nextButtonColor"
|
:next-button-icon="activeConfig.nextButtonIcon"
|
||||||
:next-button-is-submit="activeConfig.isSubmit"
|
:next-button-color="activeConfig.nextButtonColor"
|
||||||
:is-submitting="isSubmitting"
|
:next-button-is-submit="activeConfig.isSubmit"
|
||||||
@submit="handleSubmit"
|
:is-submitting="isSubmitting"
|
||||||
|
@submit="handleSubmit"
|
||||||
>
|
>
|
||||||
<v-container v-if="currentPage === Pages.LANDING"
|
<v-container
|
||||||
class="mb-12"
|
v-if="currentPage === Pages.LANDING"
|
||||||
|
class="mb-12"
|
||||||
>
|
>
|
||||||
<v-card-title class="text-h4 justify-center text-center">
|
<v-card-title class="text-h4 justify-center text-center">
|
||||||
{{ $t('admin.setup.welcome-to-mealie-get-started') }}
|
{{ $t('admin.setup.welcome-to-mealie-get-started') }}
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-btn :to="groupSlug ? `/g/${groupSlug}` : '/login'"
|
<v-btn
|
||||||
rounded
|
:to="groupSlug ? `/g/${groupSlug}` : '/login'"
|
||||||
variant="outlined"
|
rounded
|
||||||
color="grey-lighten-1"
|
variant="outlined"
|
||||||
class="text-subtitle-2 d-flex mx-auto"
|
color="grey-lighten-1"
|
||||||
style="width: fit-content;"
|
class="text-subtitle-2 d-flex mx-auto"
|
||||||
|
style="width: fit-content;"
|
||||||
>
|
>
|
||||||
{{ $t('admin.setup.already-set-up-bring-to-homepage') }}
|
{{ $t('admin.setup.already-set-up-bring-to-homepage') }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-container>
|
</v-container>
|
||||||
|
|
||||||
<v-container v-if="currentPage === Pages.USER_INFO">
|
<v-container v-if="currentPage === Pages.USER_INFO">
|
||||||
<UserRegistrationForm />
|
<UserRegistrationForm />
|
||||||
</v-container>
|
</v-container>
|
||||||
|
|
||||||
<v-container v-if="currentPage === Pages.PAGE_2">
|
<v-container v-if="currentPage === Pages.PAGE_2">
|
||||||
<v-card-title class="headline justify-center">
|
<v-card-title class="headline justify-center pa-0">
|
||||||
{{ $t('admin.setup.common-settings-for-new-sites') }}
|
{{ $t('admin.setup.common-settings-for-new-sites') }}
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<AutoForm v-model="commonSettings"
|
<AutoForm
|
||||||
:items="commonSettingsForm"
|
v-model="commonSettings"
|
||||||
|
:items="commonSettingsForm"
|
||||||
/>
|
/>
|
||||||
</v-container>
|
</v-container>
|
||||||
|
|
||||||
<v-container v-if="currentPage === Pages.CONFIRM">
|
<v-container v-if="currentPage === Pages.CONFIRM">
|
||||||
<v-card-title class="headline justify-center">
|
<v-card-title class="headline justify-center">
|
||||||
{{ $t("general.confirm-how-does-everything-look") }}
|
{{ $t("general.confirm-how-does-everything-look") }}
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-list>
|
<v-list>
|
||||||
<template v-for="(item, idx) in confirmationData">
|
<template v-for="(item, idx) in confirmationData">
|
||||||
<v-list-item v-if="item.display"
|
<v-list-item
|
||||||
:key="idx"
|
v-if="item.display"
|
||||||
|
:key="idx"
|
||||||
>
|
>
|
||||||
<v-list-item-title> {{ item.text }} </v-list-item-title>
|
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||||
<v-list-item-subtitle> {{ item.value }} </v-list-item-subtitle>
|
<v-list-item-subtitle>{{ item.value }}</v-list-item-subtitle>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-divider v-if="idx !== confirmationData.length - 1"
|
<v-divider
|
||||||
:key="`divider-${idx}`"
|
v-if="idx !== confirmationData.length - 1"
|
||||||
|
:key="`divider-${idx}`"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-container>
|
</v-container>
|
||||||
|
|
||||||
<v-container v-if="currentPage === Pages.END">
|
<v-container v-if="currentPage === Pages.END">
|
||||||
<v-card-title class="text-h4 justify-center">
|
<v-card-title class="text-h4 justify-center">
|
||||||
{{ $t('admin.setup.setup-complete') }}
|
{{ $t('admin.setup.setup-complete') }}
|
||||||
|
@ -72,9 +83,10 @@
|
||||||
<v-card-title class="text-h6 justify-center">
|
<v-card-title class="text-h6 justify-center">
|
||||||
{{ $t('admin.setup.here-are-a-few-things-to-help-you-get-started') }}
|
{{ $t('admin.setup.here-are-a-few-things-to-help-you-get-started') }}
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<div v-for="link, idx in setupCompleteLinks"
|
<div
|
||||||
:key="idx"
|
v-for="link, idx in setupCompleteLinks"
|
||||||
class="px-4 pt-4"
|
:key="idx"
|
||||||
|
class="px-4 pt-4"
|
||||||
>
|
>
|
||||||
<div v-if="link.section">
|
<div v-if="link.section">
|
||||||
<v-divider v-if="idx" />
|
<v-divider v-if="idx" />
|
||||||
|
@ -82,8 +94,9 @@
|
||||||
{{ link.section }}
|
{{ link.section }}
|
||||||
</v-card-text>
|
</v-card-text>
|
||||||
</div>
|
</div>
|
||||||
<v-btn :to="link.to"
|
<v-btn
|
||||||
color="info"
|
:to="link.to"
|
||||||
|
color="info"
|
||||||
>
|
>
|
||||||
{{ link.text }}
|
{{ link.text }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
|
|
@ -32,15 +32,30 @@
|
||||||
lg="4"
|
lg="4"
|
||||||
xl="3"
|
xl="3"
|
||||||
>
|
>
|
||||||
<ImageCropper
|
<v-col>
|
||||||
:img="imageUrl"
|
<ImageCropper
|
||||||
cropper-height="100%"
|
:img="imageUrl"
|
||||||
cropper-width="100%"
|
cropper-height="100%"
|
||||||
:submitted="loading"
|
cropper-width="100%"
|
||||||
class="mt-4"
|
:submitted="loading"
|
||||||
@save="(croppedImage) => updateUploadedImage(index, croppedImage)"
|
class="mt-4 mb-2"
|
||||||
@delete="clearImage(index)"
|
@save="(croppedImage) => updateUploadedImage(index, croppedImage)"
|
||||||
/>
|
@delete="clearImage(index)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<v-btn
|
||||||
|
v-if="uploadedImages.length > 1"
|
||||||
|
:disabled="loading || index === 0"
|
||||||
|
color="primary"
|
||||||
|
@click="() => setCoverImage(index)"
|
||||||
|
>
|
||||||
|
<v-icon start>
|
||||||
|
{{ index === 0 ? $globals.icons.check : $globals.icons.fileImage }}
|
||||||
|
</v-icon>
|
||||||
|
|
||||||
|
{{ index === 0 ? $t("recipe.cover-image") : $t("recipe.set-as-cover-image") }}
|
||||||
|
</v-btn>
|
||||||
|
</v-col>
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
</div>
|
</div>
|
||||||
|
@ -106,11 +121,12 @@ export default defineNuxtComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearImage(index: number) {
|
function clearImage(index: number) {
|
||||||
|
// Revoke _before_ splicing
|
||||||
URL.revokeObjectURL(uploadedImagesPreviewUrls.value[index]);
|
URL.revokeObjectURL(uploadedImagesPreviewUrls.value[index]);
|
||||||
|
|
||||||
uploadedImages.value = uploadedImages.value.filter((_, i) => i !== index);
|
uploadedImages.value.splice(index, 1);
|
||||||
uploadedImageNames.value = uploadedImageNames.value.filter((_, i) => i !== index);
|
uploadedImageNames.value.splice(index, 1);
|
||||||
uploadedImagesPreviewUrls.value = uploadedImagesPreviewUrls.value.filter((_, i) => i !== index);
|
uploadedImagesPreviewUrls.value.splice(index, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createRecipe() {
|
async function createRecipe() {
|
||||||
|
@ -119,6 +135,7 @@ export default defineNuxtComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
state.loading = true;
|
state.loading = true;
|
||||||
|
|
||||||
const translateLanguage = shouldTranslate.value ? i18n.locale : undefined;
|
const translateLanguage = shouldTranslate.value ? i18n.locale : undefined;
|
||||||
const { data, error } = await api.recipes.createOneFromImages(uploadedImages.value, translateLanguage?.value);
|
const { data, error } = await api.recipes.createOneFromImages(uploadedImages.value, translateLanguage?.value);
|
||||||
if (error || !data) {
|
if (error || !data) {
|
||||||
|
@ -135,6 +152,32 @@ export default defineNuxtComponent({
|
||||||
uploadedImagesPreviewUrls.value[index] = URL.createObjectURL(croppedImage);
|
uploadedImagesPreviewUrls.value[index] = URL.createObjectURL(croppedImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function swapItem(array: any[], i: number, j: number) {
|
||||||
|
if (i < 0 || j < 0 || i >= array.length || j >= array.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const temp = array[i];
|
||||||
|
array[i] = array[j];
|
||||||
|
array[j] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function swapImages(i: number, j: number) {
|
||||||
|
swapItem(uploadedImages.value, i, j);
|
||||||
|
swapItem(uploadedImageNames.value, i, j);
|
||||||
|
swapItem(uploadedImagesPreviewUrls.value, i, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put the intended cover image at the start of the array
|
||||||
|
// The backend currently sets the first image as the cover image
|
||||||
|
function setCoverImage(index: number) {
|
||||||
|
if (index < 0 || index >= uploadedImages.value.length || index === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
swapImages(0, index);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
domUrlForm,
|
domUrlForm,
|
||||||
|
@ -145,6 +188,7 @@ export default defineNuxtComponent({
|
||||||
clearImage,
|
clearImage,
|
||||||
createRecipe,
|
createRecipe,
|
||||||
updateUploadedImage,
|
updateUploadedImage,
|
||||||
|
setCoverImage,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
:items="members || []"
|
:items="members || []"
|
||||||
item-key="id"
|
item-key="id"
|
||||||
class="elevation-0"
|
class="elevation-0"
|
||||||
|
:items-per-page="-1"
|
||||||
hide-default-footer
|
hide-default-footer
|
||||||
disable-pagination
|
disable-pagination
|
||||||
>
|
>
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
<v-text-field
|
<v-text-field
|
||||||
v-model="notifiers[index].appriseUrl"
|
v-model="notifiers[index].appriseUrl"
|
||||||
:label="$t('events.apprise-url-skipped-if-blank')"
|
:label="$t('events.apprise-url-skipped-if-blank')"
|
||||||
|
:hint="$t('events.apprise-url-is-left-intentionally-blank')"
|
||||||
/>
|
/>
|
||||||
<v-checkbox
|
<v-checkbox
|
||||||
v-model="notifiers[index].enabled"
|
v-model="notifiers[index].enabled"
|
||||||
|
@ -368,6 +369,24 @@ export default defineNuxtComponent({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 8,
|
||||||
|
text: i18n.t("events.label-events"),
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
text: i18n.t("general.create") as string,
|
||||||
|
key: "labelCreated",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: i18n.t("general.update") as string,
|
||||||
|
key: "labelUpdated",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: i18n.t("general.delete") as string,
|
||||||
|
key: "labelDeleted",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -18,10 +18,20 @@
|
||||||
{{ $t('user.it-looks-like-this-is-your-first-time-logging-in') }}
|
{{ $t('user.it-looks-like-this-is-your-first-time-logging-in') }}
|
||||||
</p>
|
</p>
|
||||||
<p class="mb-1">
|
<p class="mb-1">
|
||||||
<strong>{{ $t('user.username') }}:</strong> changeme@example.com
|
<strong>{{ $t('user.username') }}: </strong>changeme@example.com
|
||||||
|
<AppButtonCopy
|
||||||
|
copy-text="changeme@example.com"
|
||||||
|
color="info"
|
||||||
|
btn-class="h-auto"
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p class="mb-3">
|
<p class="mb-3">
|
||||||
<strong>{{ $t('user.password') }}:</strong> MyPassword
|
<strong>{{ $t('user.password') }}: </strong>MyPassword
|
||||||
|
<AppButtonCopy
|
||||||
|
copy-text="MyPassword"
|
||||||
|
color="info"
|
||||||
|
btn-class="h-auto"
|
||||||
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('user.dont-want-to-see-this-anymore-be-sure-to-change-your-email') }}
|
{{ $t('user.dont-want-to-see-this-anymore-be-sure-to-change-your-email') }}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,48 @@
|
||||||
|
"""'Add label notifier CRUD bools'
|
||||||
|
|
||||||
|
Revision ID: e6bb583aac2d
|
||||||
|
Revises: d7b3ce6fa31a
|
||||||
|
Create Date: 2025-08-09 19:32:37.285172
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from alembic import op
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = "e6bb583aac2d"
|
||||||
|
down_revision: str | None = "d7b3ce6fa31a"
|
||||||
|
branch_labels: str | tuple[str, ...] | None = None
|
||||||
|
depends_on: str | tuple[str, ...] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table("group_events_notifier_options", schema=None) as batch_op:
|
||||||
|
batch_op.add_column(
|
||||||
|
sa.Column(
|
||||||
|
"label_created", sa.Boolean(), nullable=False, default=False, server_default=sa.sql.expression.false()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
batch_op.add_column(
|
||||||
|
sa.Column(
|
||||||
|
"label_updated", sa.Boolean(), nullable=False, default=False, server_default=sa.sql.expression.false()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
batch_op.add_column(
|
||||||
|
sa.Column(
|
||||||
|
"label_deleted", sa.Boolean(), nullable=False, default=False, server_default=sa.sql.expression.false()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table("group_events_notifier_options", schema=None) as batch_op:
|
||||||
|
batch_op.drop_column("label_deleted")
|
||||||
|
batch_op.drop_column("label_updated")
|
||||||
|
batch_op.drop_column("label_created")
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
|
@ -46,6 +46,10 @@ class GroupEventNotifierOptionsModel(SqlAlchemyBase, BaseMixins):
|
||||||
category_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
category_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
category_deleted: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
category_deleted: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
|
||||||
|
label_created: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
label_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
label_deleted: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
|
||||||
@auto_init()
|
@auto_init()
|
||||||
def __init__(self, **_) -> None:
|
def __init__(self, **_) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
"step-text": "Passos das receitas, assim como outros campos na página da receita, suportam sintaxe \"markdown\".\n\n**Adicione um link**\n\n[Meu Link](https://demo.mealie.io)\n"
|
"step-text": "Passos das receitas, assim como outros campos na página da receita, suportam sintaxe \"markdown\".\n\n**Adicione um link**\n\n[Meu Link](https://demo.mealie.io)\n"
|
||||||
},
|
},
|
||||||
"servings-text": {
|
"servings-text": {
|
||||||
"makes": "Makes",
|
"makes": "Produz",
|
||||||
"serves": "Porções",
|
"serves": "Porções",
|
||||||
"serving": "Porção",
|
"serving": "Porção",
|
||||||
"servings": "Porções",
|
"servings": "Porções",
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
"serves": "Порций",
|
"serves": "Порций",
|
||||||
"serving": "Порция",
|
"serving": "Порция",
|
||||||
"servings": "Порции",
|
"servings": "Порции",
|
||||||
"yield": "Выход",
|
"yield": "Количество порций",
|
||||||
"yields": "Можно получить"
|
"yields": "Можно получить"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue