mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-25 09:13:11 -05:00
Compare commits
32 Commits
auto-local
...
v3.10.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4101797c0e | ||
|
|
6110200a04 | ||
|
|
49f1e76776 | ||
|
|
24e9417d02 | ||
|
|
69d6985f3b | ||
|
|
84cdeb2398 | ||
|
|
6d439de144 | ||
|
|
1b586f8c67 | ||
|
|
f82f387146 | ||
|
|
d31c07a6c5 | ||
|
|
84372c2f4f | ||
|
|
168ac79daa | ||
|
|
22296277a8 | ||
|
|
6e006458be | ||
|
|
76a2fea076 | ||
|
|
3de4024619 | ||
|
|
194771653d | ||
|
|
24aa8f3525 | ||
|
|
fb8e318739 | ||
|
|
6255c71609 | ||
|
|
f2d1569488 | ||
|
|
987c7209fc | ||
|
|
f6dbd1f1f1 | ||
|
|
d30118899d | ||
|
|
af241dad57 | ||
|
|
b86de79c6f | ||
|
|
86e86f8c81 | ||
|
|
d795f91938 | ||
|
|
a59511cc81 | ||
|
|
a5d4cae6d0 | ||
|
|
2987cf8ba6 | ||
|
|
46b46978ff |
47
.github/workflows/auto-merge-l10n.yml
vendored
47
.github/workflows/auto-merge-l10n.yml
vendored
@@ -14,19 +14,16 @@ jobs:
|
||||
if: contains(github.event.pull_request.labels.*.name, 'l10n')
|
||||
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Validate PR author
|
||||
env:
|
||||
AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
run: |
|
||||
if [[ "$AUTHOR" != "hay-kot" && "$AUTHOR" != "github-actions[bot]" ]]; then
|
||||
echo "::error::PR author must be hay-kot or github-actions[bot] for auto-merge (got: $AUTHOR)"
|
||||
if [[
|
||||
"$AUTHOR" != "hay-kot" &&
|
||||
"$AUTHOR" != "github-actions[bot]" &&
|
||||
"$AUTHOR" != "mealie-actions[bot]"
|
||||
]]; then
|
||||
echo "::error::PR author must be hay-kot, github-actions[bot], or mealie-actions[bot] for auto-merge (got: $AUTHOR)"
|
||||
exit 1
|
||||
fi
|
||||
echo "Author validated: $AUTHOR"
|
||||
@@ -43,8 +40,8 @@ jobs:
|
||||
|
||||
echo "PR changes: +$ADDITIONS -$DELETIONS (total: $TOTAL lines)"
|
||||
|
||||
if [ "$TOTAL" -gt 200 ]; then
|
||||
echo "::error::PR exceeds 200 line change limit ($TOTAL lines)"
|
||||
if [ "$TOTAL" -gt 400 ]; then
|
||||
echo "::error::PR exceeds 400 line change limit ($TOTAL lines)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -57,18 +54,27 @@ jobs:
|
||||
FILES=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json files --jq '.files[].path')
|
||||
|
||||
for file in $FILES; do
|
||||
if [[ ! "$file" =~ ^frontend/lang/ ]] && [[ ! "$file" =~ ^mealie/repos/seed/resources/[^/]+/locales/ ]]; then
|
||||
echo "::error::Invalid file path: $file"
|
||||
echo "Only files in frontend/lang/ or mealie/repos/seed/resources/*/locales/ are allowed"
|
||||
exit 1
|
||||
# Check if file matches any allowed path
|
||||
if [[ "$file" == "frontend/composables/use-locales/available-locales.ts" ]] || \
|
||||
[[ "$file" =~ ^frontend/lang/ ]] || \
|
||||
[[ "$file" =~ ^mealie/repos/seed/resources/[^/]+/locales/ ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# File doesn't match allowed paths
|
||||
echo "::error::Invalid file path: $file"
|
||||
echo "Only the following paths are allowed:"
|
||||
echo " - frontend/composables/use-locales/available-locales.ts"
|
||||
echo " - frontend/lang/"
|
||||
echo " - mealie/repos/seed/resources/*/locales/"
|
||||
exit 1
|
||||
done
|
||||
|
||||
echo "All files are in allowed paths"
|
||||
|
||||
- name: Approve PR
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
REPO: ${{ github.repository }}
|
||||
run: |
|
||||
@@ -88,9 +94,16 @@ jobs:
|
||||
--approve \
|
||||
--body "Auto-approved: l10n PR from trusted author with valid file paths"
|
||||
|
||||
- name: Generate GitHub App Token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Enable auto-merge
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
REPO: ${{ github.repository }}
|
||||
run: |
|
||||
|
||||
@@ -12,7 +12,7 @@ repos:
|
||||
exclude: ^tests/data/
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.14.14
|
||||
rev: v0.15.0
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
###############################################
|
||||
# Frontend Build
|
||||
###############################################
|
||||
FROM node:24@sha256:b2b2184ba9b78c022e1d6a7924ec6fba577adf28f15c9d9c457730cc4ad3807a \
|
||||
FROM node:24@sha256:1de022d8459f896fff2e7b865823699dc7a8d5567507e8b87b14a7442e07f206 \
|
||||
AS frontend-builder
|
||||
|
||||
WORKDIR /frontend
|
||||
|
||||
@@ -6,7 +6,7 @@ While this guide aims to simplify the migration process for developers, it's not
|
||||
|
||||
## V1 → V2
|
||||
|
||||
The biggest change between V1 and V2 is the introduction of Households. For more information on how households work in relation to groups/users, check out the [Groups and Households](./features.md#groups-and-households) section in the Features guide.
|
||||
The biggest change between V1 and V2 is the introduction of Households. For more information on how households work in relation to groups/users, check out the [Groups and Households](../../documentation/getting-started/features.md#groups-and-households) section in the Features guide.
|
||||
|
||||
### `updateAt` is now `updatedAt`
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Recipes extras are a key feature of the Mealie API. They allow you to create cus
|
||||
For example you could add `{"message": "Remember to thaw the chicken"}` to a recipe and use the webhooks built into mealie to send that message payload to a destination to be processed.
|
||||
|
||||
#### Shopping List and Food Extras
|
||||
Similarly to recipes, extras are supported on shopping lists, shopping list items, and foods. At this time they are only accessible through the API. Extras for these objects allow for rich integrations between the Mealie shopping list and your favorite list manager, such as Alexa, ToDoist, Trello, or any other list manager with an API.
|
||||
Similarly to recipes, extras are supported on shopping lists, shopping list items, and foods. At this time they are only accessible through the API. Extras for these objects allow for rich integrations between the Mealie shopping list and your favorite list manager, such as Todoist, Trello, or any other list manager with an API.
|
||||
|
||||
To keep shopping lists in sync, for instance, you can store your Trello list id on your Mealie shopping list: <br />
|
||||
`{"trello_list_id": "5abbe4b7ddc1b351ef961414"}`
|
||||
@@ -52,6 +52,7 @@ Many applications will keep track of the query and adjust the page parameter app
|
||||
Notice that the route does not contain the baseurl (e.g. `https://mymealieapplication.com/api`).
|
||||
|
||||
There are a few shorthands available to reduce the number of calls for certain common requests:
|
||||
|
||||
- if you want to return _all_ results, effectively disabling pagination, set `perPage = -1` (and fetch the first page)
|
||||
- if you want to fetch the _last_ page, set `page = -1`
|
||||
|
||||
@@ -89,6 +90,28 @@ This filter will find all recipes that don't start with the word "Test": <br>
|
||||
This filter will find all recipes that have particular slugs: <br>
|
||||
`slug IN ["pasta-fagioli", "delicious-ramen"]`
|
||||
|
||||
##### Placeholder Keywords
|
||||
You can use placeholders to insert dynamic values as opposed to static values. Currently the only supported placeholder keyword is `$NOW`, to insert the current date/time.
|
||||
|
||||
`$NOW` can optionally be paired with basic offsets. Here is an example of a filter which gives you recipes not made within the past 30 days: <br>
|
||||
`lastMade <= "$NOW-30d"`
|
||||
|
||||
Supported offset operations include:
|
||||
|
||||
- `-` for subtracting a time (i.e. in the past)
|
||||
- `+` for adding a time (i.e. in the future)
|
||||
|
||||
Supported offset intervals include:
|
||||
|
||||
- `y` for years
|
||||
- `m` for months
|
||||
- `d` for days
|
||||
- `H` for hours
|
||||
- `M` for minutes
|
||||
- `S` for seconds
|
||||
|
||||
Note that intervals are _case sensitive_ (e.g. `s` is an invalid interval).
|
||||
|
||||
##### Nested Property filters
|
||||
When querying tables with relationships, you can filter properties on related tables. For instance, if you want to query all recipes owned by a particular user: <br>
|
||||
`user.username = "SousChef20220320"`
|
||||
@@ -96,7 +119,7 @@ When querying tables with relationships, you can filter properties on related ta
|
||||
This timeline event filter will return all timeline events for recipes that were created after a particular date: <br>
|
||||
`recipe.createdAt >= "2023-02-25"`
|
||||
|
||||
This recipe filter will return all recipes that contains a particular set of tags: <br>
|
||||
This recipe filter will return all recipes that contain a particular set of tags: <br>
|
||||
`tags.name CONTAINS ALL ["Easy", "Cajun"]`
|
||||
|
||||
##### Compound Filters
|
||||
|
||||
@@ -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:
|
||||
|
||||
1. Take a backup just in case!
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.9.2`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.10.2`
|
||||
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
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.9.2 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.10.2 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.9.2 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.10.2 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -91,7 +91,7 @@ const state = reactive({
|
||||
shoppingListDialog: false,
|
||||
menuItems: [
|
||||
{
|
||||
title: i18n.t("recipe.add-to-list"),
|
||||
title: i18n.t("meal-plan.add-day-to-list"),
|
||||
icon: $globals.icons.cartCheck,
|
||||
color: undefined,
|
||||
event: "shoppingList",
|
||||
@@ -123,8 +123,8 @@ async function getShoppingLists() {
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
|
||||
const eventHandlers: { [key: string]: () => void | Promise<any> } = {
|
||||
shoppingList: () => {
|
||||
getShoppingLists();
|
||||
shoppingList: async () => {
|
||||
await getShoppingLists();
|
||||
state.shoppingListDialog = true;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
import QueryFilterBuilder from "~/components/Domain/QueryFilterBuilder.vue";
|
||||
import type { FieldDefinition } from "~/composables/use-query-filter-builder";
|
||||
import { Organizer } from "~/lib/api/types/non-generated";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/response";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
|
||||
|
||||
interface Props {
|
||||
queryFilter?: QueryFilterJSON | null;
|
||||
|
||||
@@ -319,7 +319,7 @@ import { useDebounceFn } from "@vueuse/core";
|
||||
import { useHouseholdSelf } from "~/composables/use-households";
|
||||
import RecipeOrganizerSelector from "~/components/Domain/Recipe/RecipeOrganizerSelector.vue";
|
||||
import { Organizer } from "~/lib/api/types/non-generated";
|
||||
import type { LogicalOperator, QueryFilterJSON, QueryFilterJSONPart, RelationalKeyword, RelationalOperator } from "~/lib/api/types/response";
|
||||
import type { LogicalOperator, QueryFilterJSON, QueryFilterJSONPart, RelationalKeyword, RelationalOperator } from "~/lib/api/types/non-generated";
|
||||
import { useCategoryStore, useFoodStore, useHouseholdStore, useTagStore, useToolStore } from "~/composables/store";
|
||||
import { useUserStore } from "~/composables/store/use-user-store";
|
||||
import { type Field, type FieldDefinition, type FieldValue, type OrganizerBase, useQueryFilterBuilder } from "~/composables/use-query-filter-builder";
|
||||
|
||||
@@ -227,7 +227,7 @@ const currentHouseholdSlug = ref("");
|
||||
const filteredShoppingLists = ref<ShoppingListSummary[]>([]);
|
||||
|
||||
const state = reactive({
|
||||
shoppingListDialog: true,
|
||||
shoppingListDialog: false,
|
||||
shoppingListIngredientDialog: false,
|
||||
shoppingListShowAllToggled: false,
|
||||
});
|
||||
@@ -249,6 +249,7 @@ watch([dialog, () => preferences.value.viewAllLists], () => {
|
||||
openShoppingListIngredientDialog(selectedShoppingList.value);
|
||||
}
|
||||
else {
|
||||
state.shoppingListDialog = true;
|
||||
ready.value = true;
|
||||
}
|
||||
}
|
||||
@@ -371,7 +372,7 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
}
|
||||
|
||||
function initState() {
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
state.shoppingListShowAllToggled = false;
|
||||
recipeIngredientSections.value = [];
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
clearable
|
||||
/>
|
||||
<div />
|
||||
<div class="d-flex py-4 px-1 align-center">
|
||||
<div class="d-flex flex-wrap py-4 px-1 align-center">
|
||||
<v-btn-toggle
|
||||
v-if="requireAll != undefined"
|
||||
v-model="combinator"
|
||||
@@ -46,6 +46,7 @@
|
||||
density="compact"
|
||||
variant="outlined"
|
||||
color="primary"
|
||||
class="my-1"
|
||||
>
|
||||
<v-btn value="hasAll">
|
||||
{{ $t('search.has-all') }}
|
||||
@@ -58,6 +59,7 @@
|
||||
<v-btn
|
||||
size="small"
|
||||
color="accent"
|
||||
class="my-1"
|
||||
@click="clearSelection"
|
||||
>
|
||||
{{ $t("search.clear-selection") }}
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
import DOMPurify from "isomorphic-dompurify";
|
||||
import { marked } from "marked";
|
||||
|
||||
enum DOMPurifyHook {
|
||||
UponSanitizeAttribute = "uponSanitizeAttribute",
|
||||
}
|
||||
|
||||
export default defineNuxtComponent({
|
||||
props: {
|
||||
source: {
|
||||
@@ -15,14 +19,26 @@ export default defineNuxtComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const ALLOWED_STYLE_TAGS = [
|
||||
"background-color", "color", "font-style", "font-weight", "text-decoration", "text-align",
|
||||
];
|
||||
|
||||
function sanitizeMarkdown(rawHtml: string | null | undefined): string {
|
||||
if (!rawHtml) {
|
||||
return "";
|
||||
}
|
||||
|
||||
DOMPurify.addHook(DOMPurifyHook.UponSanitizeAttribute, (node, data) => {
|
||||
if (data.attrName === "style") {
|
||||
const styles = data.attrValue.split(";").filter((style) => {
|
||||
const [property] = style.split(":");
|
||||
return ALLOWED_STYLE_TAGS.includes(property.trim().toLowerCase());
|
||||
});
|
||||
data.attrValue = styles.join(";");
|
||||
}
|
||||
});
|
||||
|
||||
const sanitized = DOMPurify.sanitize(rawHtml, {
|
||||
// List based on
|
||||
// https://support.zendesk.com/hc/en-us/articles/4408824584602-Allowing-unsafe-HTML-in-help-center-articles
|
||||
ALLOWED_TAGS: [
|
||||
"strong", "em", "b", "i", "u", "p", "code", "pre", "samp", "kbd", "var", "sub", "sup", "dfn", "cite",
|
||||
"small", "address", "hr", "br", "id", "div", "span", "h1", "h2", "h3", "h4", "h5", "h6",
|
||||
@@ -31,10 +47,14 @@ export default defineNuxtComponent({
|
||||
],
|
||||
ALLOWED_ATTR: [
|
||||
"href", "src", "alt", "height", "width", "class", "allow", "title", "allowfullscreen", "frameborder",
|
||||
"scrolling", "cite", "datetime", "name", "abbr", "target", "border", "start",
|
||||
"scrolling", "cite", "datetime", "name", "abbr", "target", "border", "start", "style",
|
||||
],
|
||||
});
|
||||
|
||||
Object.values(DOMPurifyHook).forEach((hook) => {
|
||||
DOMPurify.removeHook(hook);
|
||||
});
|
||||
|
||||
return sanitized;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,19 +21,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Українська (Ukrainian)",
|
||||
value: "uk-UA",
|
||||
progress: 100,
|
||||
progress: 83,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Türkçe (Turkish)",
|
||||
value: "tr-TR",
|
||||
progress: 41,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 68,
|
||||
progress: 61,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -45,55 +45,55 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Slovenščina (Slovenian)",
|
||||
value: "sl-SI",
|
||||
progress: 41,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Slovenčina (Slovak)",
|
||||
value: "sk-SK",
|
||||
progress: 46,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 46,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Română (Romanian)",
|
||||
value: "ro-RO",
|
||||
progress: 45,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Português (Portuguese)",
|
||||
value: "pt-PT",
|
||||
progress: 40,
|
||||
progress: 39,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Português do Brasil (Brazilian Portuguese)",
|
||||
value: "pt-BR",
|
||||
progress: 49,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Polski (Polish)",
|
||||
value: "pl-PL",
|
||||
progress: 53,
|
||||
progress: 49,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 43,
|
||||
progress: 42,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 59,
|
||||
progress: 54,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -105,13 +105,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Lietuvių (Lithuanian)",
|
||||
value: "lt-LT",
|
||||
progress: 31,
|
||||
progress: 30,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "한국어 (Korean)",
|
||||
value: "ko-KR",
|
||||
progress: 39,
|
||||
progress: 38,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -123,73 +123,73 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Italiano (Italian)",
|
||||
value: "it-IT",
|
||||
progress: 52,
|
||||
progress: 49,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Íslenska (Icelandic)",
|
||||
value: "is-IS",
|
||||
progress: 46,
|
||||
progress: 43,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 48,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Hrvatski (Croatian)",
|
||||
value: "hr-HR",
|
||||
progress: 29,
|
||||
progress: 30,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "עברית (Hebrew)",
|
||||
value: "he-IL",
|
||||
progress: 72,
|
||||
progress: 64,
|
||||
dir: "rtl",
|
||||
},
|
||||
{
|
||||
name: "Galego (Galician)",
|
||||
value: "gl-ES",
|
||||
progress: 39,
|
||||
progress: 38,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 74,
|
||||
progress: 67,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Français canadien (Canadian French)",
|
||||
value: "fr-CA",
|
||||
progress: 99,
|
||||
progress: 83,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Belge (Belgian)",
|
||||
value: "fr-BE",
|
||||
progress: 40,
|
||||
progress: 39,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Suomi (Finnish)",
|
||||
value: "fi-FI",
|
||||
progress: 41,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Eesti (Estonian)",
|
||||
value: "et-EE",
|
||||
progress: 47,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 47,
|
||||
progress: 45,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -201,43 +201,43 @@ export const LOCALES = [
|
||||
{
|
||||
name: "British English",
|
||||
value: "en-GB",
|
||||
progress: 45,
|
||||
progress: 42,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Ελληνικά (Greek)",
|
||||
value: "el-GR",
|
||||
progress: 42,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 98,
|
||||
progress: 83,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Dansk (Danish)",
|
||||
value: "da-DK",
|
||||
progress: 66,
|
||||
progress: 63,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Čeština (Czech)",
|
||||
value: "cs-CZ",
|
||||
progress: 45,
|
||||
progress: 43,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Català (Catalan)",
|
||||
value: "ca-ES",
|
||||
progress: 41,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Български (Bulgarian)",
|
||||
value: "bg-BG",
|
||||
progress: 51,
|
||||
progress: 49,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Organizer, type RecipeOrganizer } from "~/lib/api/types/non-generated";
|
||||
import type { LogicalOperator, RelationalKeyword, RelationalOperator } from "~/lib/api/types/response";
|
||||
import { Organizer } from "~/lib/api/types/non-generated";
|
||||
import type { LogicalOperator, RecipeOrganizer, RelationalKeyword, RelationalOperator } from "~/lib/api/types/non-generated";
|
||||
|
||||
export interface FieldLogicalOperator {
|
||||
label: string;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useLocalStorage, useSessionStorage } from "@vueuse/core";
|
||||
import { ActivityKey } from "~/lib/api/types/activity";
|
||||
import type { RegisteredParser, TimelineEventType } from "~/lib/api/types/recipe";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/response";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
|
||||
|
||||
export interface UserPrintPreferences {
|
||||
imagePosition: string;
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Resepreëls",
|
||||
"applies-to-all-days": "Van toepassing op alle dae",
|
||||
"applies-on-days": "Van toepassing op {0}s",
|
||||
"meal-plan-settings": "Maaltydplan verstellings"
|
||||
"meal-plan-settings": "Maaltydplan verstellings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrasiedata is uitgevee",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "قواعد الوصفات",
|
||||
"applies-to-all-days": "ينطبق على جميع الأيام",
|
||||
"applies-on-days": "يطبق على أيام {0}",
|
||||
"meal-plan-settings": "إعدادات خِطَّة الوجبات الغذائية"
|
||||
"meal-plan-settings": "إعدادات خِطَّة الوجبات الغذائية",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "حذف بيانات الهجرة",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Правила на рецептата",
|
||||
"applies-to-all-days": "Прилага се за всички дни",
|
||||
"applies-on-days": "Всеки/всяка {0}",
|
||||
"meal-plan-settings": "Настройки на плана за хранене"
|
||||
"meal-plan-settings": "Настройки на плана за хранене",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Данните за мигриране са премахнати",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Normes per la recepta",
|
||||
"applies-to-all-days": "Aplica a tots els dies",
|
||||
"applies-on-days": "S'aplicarà en {0}s",
|
||||
"meal-plan-settings": "Opcions de planificació de menús"
|
||||
"meal-plan-settings": "Opcions de planificació de menús",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "S'han suprimit les dades migrades",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Pravidla receptu",
|
||||
"applies-to-all-days": "Použije se na všechny dny",
|
||||
"applies-on-days": "Platí pro {0}",
|
||||
"meal-plan-settings": "Nastavení jídelníčku"
|
||||
"meal-plan-settings": "Nastavení jídelníčku",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Data z migrace byla smazána",
|
||||
|
||||
@@ -212,8 +212,8 @@
|
||||
"upload-file": "Upload fil",
|
||||
"created-on-date": "Oprettet den: {0}",
|
||||
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard-changes": "Kassér ændringer",
|
||||
"discard-changes-description": "Du har ændringer, der ikke er gemt. Er du sikker på, at du vil kassere dem?",
|
||||
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
|
||||
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?",
|
||||
"organizers": "Organisatorer",
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Opskriftsregler",
|
||||
"applies-to-all-days": "Gælder for alle dage",
|
||||
"applies-on-days": "Gælder for {0}e",
|
||||
"meal-plan-settings": "Indstillinger for madplanlægning"
|
||||
"meal-plan-settings": "Indstillinger for madplanlægning",
|
||||
"add-all-to-list": "Tilføj alle til liste",
|
||||
"add-day-to-list": "Tilføj dag til liste"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migreringsdata fjernet",
|
||||
@@ -642,7 +644,7 @@
|
||||
"scrape-recipe-website-being-blocked": "Bliver hjemmesiden blokeret?",
|
||||
"scrape-recipe-try-importing-raw-html-instead": "Forsøg at importere den rå HTML i stedet.",
|
||||
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
|
||||
"import-original-categories": "Import original categories",
|
||||
"import-original-categories": "Importér originale kategorier",
|
||||
"stay-in-edit-mode": "Bliv i redigeringstilstand",
|
||||
"parse-recipe-ingredients-after-import": "Fortolk opskrift ingredienser efter import",
|
||||
"import-from-zip": "Importer fra zip-fil",
|
||||
|
||||
@@ -212,8 +212,8 @@
|
||||
"upload-file": "Datei hochladen",
|
||||
"created-on-date": "Erstellt am: {0}",
|
||||
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard-changes": "Änderungen verwerfen",
|
||||
"discard-changes-description": "Du hast ungespeicherte Änderungen. Bist du sicher, dass du sie verwerfen möchtest?",
|
||||
"clipboard-copy-failure": "Fehler beim Kopieren in die Zwischenablage.",
|
||||
"confirm-delete-generic-items": "Bist du dir sicher, dass du die folgenden Einträge löschen möchtest?",
|
||||
"organizers": "Organisieren",
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Rezeptregeln",
|
||||
"applies-to-all-days": "Gilt an allen Tagen",
|
||||
"applies-on-days": "Gilt {0}s",
|
||||
"meal-plan-settings": "Essensplan Einstellungen"
|
||||
"meal-plan-settings": "Essensplan Einstellungen",
|
||||
"add-all-to-list": "Alle zur Einkaufsliste hinzufügen",
|
||||
"add-day-to-list": "Tag zur Einkaufsliste hinzufügen"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrationsdaten entfernt",
|
||||
@@ -642,7 +644,7 @@
|
||||
"scrape-recipe-website-being-blocked": "Die Website wird blockiert?",
|
||||
"scrape-recipe-try-importing-raw-html-instead": "Versuche stattdessen das reine HTML zu importieren.",
|
||||
"import-original-keywords-as-tags": "Importiere ursprüngliche Stichwörter als Schlagwörter",
|
||||
"import-original-categories": "Import original categories",
|
||||
"import-original-categories": "Importiere ursprüngliche Kategorien",
|
||||
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
|
||||
"parse-recipe-ingredients-after-import": "Zutaten nach dem Import parsen",
|
||||
"import-from-zip": "Von Zip importieren",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Κανόνες Συνταγής",
|
||||
"applies-to-all-days": "Εφαρμόζεται για όλες τις ημέρες",
|
||||
"applies-on-days": "Εφαρμόζεται κάθε {0}",
|
||||
"meal-plan-settings": "Ρυθμίσεις προγράμματος γευμάτων"
|
||||
"meal-plan-settings": "Ρυθμίσεις προγράμματος γευμάτων",
|
||||
"add-all-to-list": "Προσθήκη όλων στη λίστα",
|
||||
"add-day-to-list": "Προσθήκη ημέρας στη λίστα"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Τα δεδομένα μετεγκατάστασης καταργήθηκαν",
|
||||
@@ -642,7 +644,7 @@
|
||||
"scrape-recipe-website-being-blocked": "Η ιστοσελίδα μπλοκάρεται;",
|
||||
"scrape-recipe-try-importing-raw-html-instead": "Δοκιμάστε να εισάγετε τον ακατέργαστο κώδικα HTML.",
|
||||
"import-original-keywords-as-tags": "Εισαγωγή αρχικών λέξεων-κλειδιών ως ετικέτες",
|
||||
"import-original-categories": "Import original categories",
|
||||
"import-original-categories": "Εισαγωγή αρχικών κατηγοριών",
|
||||
"stay-in-edit-mode": "Παραμονή σε λειτουργία επεξεργασίας",
|
||||
"parse-recipe-ingredients-after-import": "Ανάλυση συστατικών συνταγής μετά την εισαγωγή",
|
||||
"import-from-zip": "Εισαγωγή μέσω zip",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
"meal-plan-settings": "Meal Plan Settings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migration data removed",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
"meal-plan-settings": "Meal Plan Settings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migration data removed",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Reglas de Recetas",
|
||||
"applies-to-all-days": "Aplica para todos los días",
|
||||
"applies-on-days": "Se aplica en {0}s",
|
||||
"meal-plan-settings": "Configuración del Plan de Comidas"
|
||||
"meal-plan-settings": "Configuración del Plan de Comidas",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Datos de migración eliminados",
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
"upload-file": "Lae fail üles",
|
||||
"created-on-date": "Loodud: {0}",
|
||||
"unsaved-changes": "Sul on salvestamata muudatusi. Kas sa tahad salvestada enne lehelt lahkumist? Vajuta OK salvestamiseks või Tühista, et muudatused tühistada.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes": "Loobu muudatustest",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"clipboard-copy-failure": "Lõikepuhvrisse kopeerimine ebaõnnestus.",
|
||||
"confirm-delete-generic-items": "Kas oled kindel, et tahad kustutada järgnevad asjad?",
|
||||
@@ -344,9 +344,9 @@
|
||||
"breakfast": "Hommikusöök",
|
||||
"lunch": "Lõuna",
|
||||
"dinner": "Õhtusöök",
|
||||
"snack": "Snack",
|
||||
"drink": "Drink",
|
||||
"dessert": "Dessert",
|
||||
"snack": "Snäkk",
|
||||
"drink": "Jook",
|
||||
"dessert": "Magustoit",
|
||||
"type-any": "Kõik",
|
||||
"day-any": "Kõik",
|
||||
"editor": "Editor",
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Retsepti reeglid",
|
||||
"applies-to-all-days": "Kehtib kõikide päevade kohta",
|
||||
"applies-on-days": "Kehtib {0}l",
|
||||
"meal-plan-settings": "Toitumisplaani sätted"
|
||||
"meal-plan-settings": "Toitumisplaani sätted",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Ületoomiste andmed eemaldatud",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Reseptimääritykset",
|
||||
"applies-to-all-days": "Sovelletaan kaikkiin päiviin",
|
||||
"applies-on-days": "Käytetään {0}",
|
||||
"meal-plan-settings": "Ateriasuunnitelman asetukset"
|
||||
"meal-plan-settings": "Ateriasuunnitelman asetukset",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Tuodut tiedot poistettu",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Règles de recette",
|
||||
"applies-to-all-days": "S'applique à tous les jours",
|
||||
"applies-on-days": "S'applique les {0}s",
|
||||
"meal-plan-settings": "Paramètres des menus"
|
||||
"meal-plan-settings": "Paramètres des menus",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Données de migration supprimées",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Règles de recette",
|
||||
"applies-to-all-days": "S'applique à tous les jours",
|
||||
"applies-on-days": "S'applique les {0}s",
|
||||
"meal-plan-settings": "Paramètres des menus"
|
||||
"meal-plan-settings": "Paramètres des menus",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Données de migration supprimées",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Règles de recette",
|
||||
"applies-to-all-days": "S'applique à tous les jours",
|
||||
"applies-on-days": "S'applique les {0}s",
|
||||
"meal-plan-settings": "Paramètres des menus"
|
||||
"meal-plan-settings": "Paramètres des menus",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Données de migration supprimées",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Regras da Receita",
|
||||
"applies-to-all-days": "Aplícase a todos os días",
|
||||
"applies-on-days": "Aplícase en {0}s",
|
||||
"meal-plan-settings": "Axustes do Menú"
|
||||
"meal-plan-settings": "Axustes do Menú",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Elimináronse os datos de migración",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "חוקי מתכון",
|
||||
"applies-to-all-days": "החל על כל הימים",
|
||||
"applies-on-days": "חל על {0}",
|
||||
"meal-plan-settings": "הגדרות תכנון ארוחות"
|
||||
"meal-plan-settings": "הגדרות תכנון ארוחות",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "מידע ממוגרץ נמחק",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Pravila Recepata",
|
||||
"applies-to-all-days": "Primjeni na sve dane",
|
||||
"applies-on-days": "Primjeni na {0}",
|
||||
"meal-plan-settings": "Postavke Plana Obroka"
|
||||
"meal-plan-settings": "Postavke Plana Obroka",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Podaci o migraciji su uklonjeni",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recept szabályok",
|
||||
"applies-to-all-days": "Minden napra vonatkozóan",
|
||||
"applies-on-days": "Érvényes {0}-ként",
|
||||
"meal-plan-settings": "Menütervező beállításai"
|
||||
"meal-plan-settings": "Menütervező beállításai",
|
||||
"add-all-to-list": "Összes hozzáadása a listához",
|
||||
"add-day-to-list": "Nap hozzáadása a listához"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrációs adatok eltávolítva",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Uppskriftar reglur",
|
||||
"applies-to-all-days": "Á við alla daga",
|
||||
"applies-on-days": "Gildir þegar er {0},",
|
||||
"meal-plan-settings": "Stillingar matarplans"
|
||||
"meal-plan-settings": "Stillingar matarplans",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Gagnaflutningur fjarlægður",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Regole per le ricette",
|
||||
"applies-to-all-days": "Si applica a ogni giorno",
|
||||
"applies-on-days": "Si applica ai {0}",
|
||||
"meal-plan-settings": "Impostazioni del piano alimentare"
|
||||
"meal-plan-settings": "Impostazioni del piano alimentare",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Dati di migrazione rimossi",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "レシピのルール",
|
||||
"applies-to-all-days": "すべての日に適用",
|
||||
"applies-on-days": "{0}曜日に適用",
|
||||
"meal-plan-settings": "献立設定"
|
||||
"meal-plan-settings": "献立設定",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "移行データが削除されました",
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"category-deleted": "카테고리 삭제됨",
|
||||
"category-deletion-failed": "카테고리 삭제 실패",
|
||||
"category-filter": "카테고리 필터",
|
||||
"category-update-failed": "Category 업데이트 실패",
|
||||
"category-updated": "카테고리 업데이트",
|
||||
"category-update-failed": "카테고리 수정 실패",
|
||||
"category-updated": "카테고리 수정됨",
|
||||
"uncategorized-count": "카테고리 없음 {count}",
|
||||
"create-a-category": "카테고리 생성",
|
||||
"category-name": "카테고리 이름",
|
||||
@@ -56,7 +56,7 @@
|
||||
"delete-event": "이벤트 삭제",
|
||||
"event-delete-confirmation": "정말로 이 이벤트를 삭제하시겠어요?",
|
||||
"event-deleted": "이벤트 삭제됨",
|
||||
"event-updated": "이벤트 업데이트됨",
|
||||
"event-updated": "이벤트 수정됨",
|
||||
"new-notification-form-description": "Mealie는 Apprise 라이브러리를 사용하여 알림을 생성합니다. 알림에 사용할 서비스에 대한 다양한 옵션을 제공합니다. 서비스의 URL을 만드는 방법에 대한 종합적인 가이드는 해당 Wiki 문서를 참조하세요. 알림 유형에 따라 추가 기능이 포함될 수 있습니다.",
|
||||
"new-version": "새로운 버전 사용 가능",
|
||||
"notification": "알림",
|
||||
@@ -69,12 +69,12 @@
|
||||
"new-notification": "새 알림",
|
||||
"event-notifiers": "이벤트 알림이",
|
||||
"apprise-url-skipped-if-blank": "Apprise URL (비워두면 생략합니다)",
|
||||
"apprise-url-is-left-intentionally-blank": "Apprise URL에는 일반적으로 민감한 정보가 포함되므로, 편집 시 이 필드는 의도적으로 비워둡니다. URL을 업데이트하려면 여기에 새 주소를 입력하시고, 현재 URL을 유지하려면 비워두십시오.",
|
||||
"apprise-url-is-left-intentionally-blank": "Apprise URL에는 일반적으로 민감한 정보가 포함되므로, 편집 시 이 필드는 의도적으로 비워둡니다. URL을 수정하려면 여기에 새 주소를 입력하시고, 현재 URL을 유지하려면 비워두십시오.",
|
||||
"enable-notifier": "알림 활성화",
|
||||
"what-events": "이 알리미는 어떤 이벤트를 구독해야 합니까?",
|
||||
"user-events": "사용자 이벤트",
|
||||
"mealplan-events": "Mealplan 이벤트",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "그룹의 사용자가 새로운 식사 계획을 만들 때",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "그룹의 사용자가 새로운 식단 계획을 만들 때",
|
||||
"shopping-list-events": "장보기 목록 이벤트",
|
||||
"cookbook-events": "요리책 이벤트",
|
||||
"tag-events": "Tag 이벤트",
|
||||
@@ -92,7 +92,7 @@
|
||||
"confirm-how-does-everything-look": "모든 게 어떻게 보이나요?",
|
||||
"confirm-delete-generic": "이 항목을 삭제하시겠습니까?",
|
||||
"copied_message": "복사됨!",
|
||||
"create": "만들기",
|
||||
"create": "생성",
|
||||
"created": "생성됨",
|
||||
"custom": "사용자 정의",
|
||||
"dashboard": "대시보드",
|
||||
@@ -212,11 +212,11 @@
|
||||
"upload-file": "파일 업로드",
|
||||
"created-on-date": "생성일: {0}",
|
||||
"unsaved-changes": "저장되지 않은 변경 사항이 있습니다. 떠나기 전에 저장하시겠습니까? 저장하려면 확인을 클릭하고, 변경 사항을 삭제하려면 취소를 클릭합니다.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard-changes": "변경사항 취소",
|
||||
"discard-changes-description": "저장되지 않은 변경사항이 있습니다. 삭제하시겠습니까?",
|
||||
"clipboard-copy-failure": "클립보드에 복사하는 데 실패했습니다.",
|
||||
"confirm-delete-generic-items": "이 항목을 삭제하시겠습니까?",
|
||||
"organizers": "분류자",
|
||||
"organizers": "정리 도구",
|
||||
"caution": "주의",
|
||||
"show-advanced": "고급 표시",
|
||||
"add-field": "필드 추가",
|
||||
@@ -228,8 +228,8 @@
|
||||
"cannot-delete-default-group": "기본 그룹은 삭제할 수 없습니다",
|
||||
"cannot-delete-group-with-users": "사용자가 있는 그룹은 삭제할 수 없습니다.",
|
||||
"confirm-group-deletion": "그룹을 삭제할까요?",
|
||||
"create-group": "그룹 만들기",
|
||||
"error-updating-group": "그룹 업데이트 오류",
|
||||
"create-group": "그룹 생성",
|
||||
"error-updating-group": "그룹 수정 오류",
|
||||
"group": "그룹",
|
||||
"group-deleted": "그룹 삭제됨",
|
||||
"group-deletion-failed": "그룹 삭제 실패",
|
||||
@@ -252,7 +252,7 @@
|
||||
"manage": "관리",
|
||||
"manage-household": "가구 관리",
|
||||
"invite": "초대하기",
|
||||
"looking-to-update-your-profile": "프로필을 업데이트하시겠습니까?",
|
||||
"looking-to-update-your-profile": "프로필을 업데이트하고 싶으신가요?",
|
||||
"default-recipe-preferences-description": "이 설정은 그룹에서 새 레시피를 생성할 때 적용되는 기본값입니다. 레시피 설정 메뉴에서 개별 레시피별로 변경할 수 있습니다.",
|
||||
"default-recipe-preferences": "기본 레시피 설정",
|
||||
"group-preferences": "그룹 설정",
|
||||
@@ -306,34 +306,34 @@
|
||||
"household-preferences": "가구 설정"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "새로운 식사 계획 생성",
|
||||
"update-this-meal-plan": "이 식사 계획 업데이트",
|
||||
"create-a-new-meal-plan": "새로운 식단 계획 생성",
|
||||
"update-this-meal-plan": "이 식단 계획 수정",
|
||||
"dinner-this-week": "이번 주 저녁 식사",
|
||||
"dinner-today": "오늘 저녁 식사",
|
||||
"dinner-tonight": "오늘 밤 저녁 식사",
|
||||
"edit-meal-plan": "식사 계획 편집",
|
||||
"edit-meal-plan": "식단 계획 편집",
|
||||
"end-date": "종료 날짜",
|
||||
"group": "그룹(베타)",
|
||||
"main": "메인",
|
||||
"meal-planner": "식단 플래너",
|
||||
"meal-plans": "식단 계획",
|
||||
"mealplan-categories": "식사 계획 카테고리",
|
||||
"mealplan-created": "식사 계획이 생성됨",
|
||||
"mealplan-creation-failed": "식사 계획 생성 실패",
|
||||
"mealplan-deleted": "식사 계획 삭제됨",
|
||||
"mealplan-deletion-failed": "식사계획 삭제 실패",
|
||||
"mealplan-settings": "식사 계획 설정",
|
||||
"mealplan-update-failed": "식사 계획 업데이트 실패",
|
||||
"mealplan-updated": "식사 계획이 업데이트됨",
|
||||
"mealplan-categories": "식단 계획 카테고리",
|
||||
"mealplan-created": "식단 계획이 생성됨",
|
||||
"mealplan-creation-failed": "식단 계획 생성 실패",
|
||||
"mealplan-deleted": "식단 계획 삭제됨",
|
||||
"mealplan-deletion-failed": "식단 계획 삭제 실패",
|
||||
"mealplan-settings": "식단 계획 설정",
|
||||
"mealplan-update-failed": "식단 계획 수정 실패",
|
||||
"mealplan-updated": "식단 계획 수정됨",
|
||||
"mealplan-households-description": "가구를 선택하지 않은 경우 모든 가구의 레시피를 추가할 수 있습니다.",
|
||||
"any-category": "모든 카테고리",
|
||||
"any-tag": "모든 태그",
|
||||
"any-household": "모든 가구",
|
||||
"no-meal-plan-defined-yet": "아직 식사 계획이 정의되지 않았습니다.",
|
||||
"no-meal-planned-for-today": "오늘은 식사 계획이 없습니다",
|
||||
"no-meal-plan-defined-yet": "아직 식단 계획이 정의되지 않았습니다.",
|
||||
"no-meal-planned-for-today": "오늘은 식단 계획이 없습니다",
|
||||
"numberOfDays-hint": "페이지 로드 일수",
|
||||
"numberOfDays-label": "기본 일수",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "이 카테고리의 레시피만 식사 계획에 사용됩니다.",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "이 카테고리의 레시피만 식단 계획에 사용됩니다.",
|
||||
"planner": "플래너",
|
||||
"quick-week": "빠른 주",
|
||||
"side": "사이드",
|
||||
@@ -364,12 +364,14 @@
|
||||
"for-type-meal-types": "{0} 식사 종류에",
|
||||
"meal-plan-rules": "식단 계획 규칙",
|
||||
"new-rule": "새 규칙",
|
||||
"meal-plan-rules-description": "식단 계획에 사용할 레시피를 자동 선택하는 규칙을 생성할 수 있습니다. 이 규칙들은 서버가 식사 플랜을 생성할 때 선택할 무작위 레시피 풀을 결정하는 데 사용됩니다. 동일한 요일/유형 제약 조건을 가진 규칙들은 필터가 병합된다는 점에 유의하세요. 실제로 중복 규칙을 생성할 필요는 없지만, 생성하는 것은 가능합니다.",
|
||||
"meal-plan-rules-description": "식단 계획에 사용할 레시피를 자동 선택하는 규칙을 생성할 수 있습니다. 이 규칙들은 서버가 식단 계획을 생성할 때 선택할 무작위 레시피 풀을 결정하는 데 사용됩니다. 동일한 요일/유형 제약 조건을 가진 규칙들은 필터가 병합된다는 점에 유의하세요. 실제로 중복 규칙을 생성할 필요는 없지만, 생성하는 것은 가능합니다.",
|
||||
"new-rule-description": "식단 계획에 새 규칙을 생성할 때, 특정 요일 및/또는 특정 식사 유형에만 적용되도록 규칙을 제한할 수 있습니다. 모든 요일 또는 모든 식사 유형에 규칙을 적용하려면 규칙을 \"모든\"으로 설정하면 됩니다. 이렇게 하면 해당 요일 및/또는 식사 유형의 모든 가능한 값에 규칙이 적용됩니다.",
|
||||
"recipe-rules": "레시피 규칙",
|
||||
"applies-to-all-days": "모든 날짜에 적용됨",
|
||||
"applies-on-days": "{0}에 적용됨",
|
||||
"meal-plan-settings": "식단 계획 설정"
|
||||
"meal-plan-settings": "식단 계획 설정",
|
||||
"add-all-to-list": "목록에 전체 추가",
|
||||
"add-day-to-list": "목록에 날짜 추가"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "이전된 데이터 제거됨",
|
||||
@@ -453,7 +455,7 @@
|
||||
"trim-prefix-description": "각 줄의 첫 문자 제거하기",
|
||||
"split-by-numbered-line-description": "'1)' 또는 '1.' 패턴을 일치시켜 문단을 분할하려고 시도합니다.",
|
||||
"import-by-url": "URL로 레시피 가져오기",
|
||||
"create-manually": "수동으로 레시피 만들기",
|
||||
"create-manually": "수동으로 레시피 생성",
|
||||
"make-recipe-image": "이것을 레시피 이미지로 만드세요.",
|
||||
"add-food": "식품 추가",
|
||||
"add-recipe": "레시피 추가"
|
||||
@@ -466,10 +468,10 @@
|
||||
"page-creation-failed": "페이지 생성 실패",
|
||||
"page-deleted": "페이지 삭제됨",
|
||||
"page-deletion-failed": "페이지 삭제 실패",
|
||||
"page-update-failed": "페이지 업데이트 실패",
|
||||
"page-updated": "페이지 업데이트됨",
|
||||
"pages-update-failed": "페이지 업데이트 실패",
|
||||
"pages-updated": "페이지 업데이트됨",
|
||||
"page-update-failed": "페이지 수정 실패",
|
||||
"page-updated": "페이지 수정됨",
|
||||
"pages-update-failed": "페이지 수정 실패",
|
||||
"pages-updated": "페이지 수정됨",
|
||||
"404-not-found": "404 찾을 수 없음",
|
||||
"an-error-occurred": "오류가 발생했습니다!"
|
||||
},
|
||||
@@ -522,7 +524,7 @@
|
||||
"recipe-creation-failed": "레시피 생성 실패",
|
||||
"recipe-deleted": "레시피 삭제됨",
|
||||
"recipe-image": "레시피 사진",
|
||||
"recipe-image-updated": "레시피 사진 업데이트됨",
|
||||
"recipe-image-updated": "레시피 사진 수정됨",
|
||||
"delete-image": "레시피 사진 삭제",
|
||||
"delete-image-confirmation": "이 레시피 이미지를 삭제하시겠습니까?",
|
||||
"recipe-image-deleted": "레시피 이미지 삭제됨",
|
||||
@@ -550,7 +552,7 @@
|
||||
"no-recipe": "레시피 없음",
|
||||
"locked-by-owner": "소유자에 의해 잠김",
|
||||
"join-the-conversation": "대화에 참여하기",
|
||||
"add-recipe-to-mealplan": "식사 계획에 레시피 추가",
|
||||
"add-recipe-to-mealplan": "식단 계획에 레시피 추가",
|
||||
"entry-type": "항목 유형",
|
||||
"date-format-hint": "MM/DD/YYYY 형식",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD 형식",
|
||||
@@ -622,8 +624,8 @@
|
||||
"create-recipe-description": "처음부터 새로운 레시피를 만드세요.",
|
||||
"create-recipes": "레시피 생성",
|
||||
"import-with-zip": ".zip 파일로 가져오기",
|
||||
"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": "이미지에서 레시피생성",
|
||||
"create-recipe-from-an-image-description": "레시피 텍스트 이미지를 업로드하여 레시피를 생성하세요. Mealie는 AI를 사용하여 이미지에서 텍스트를 추출하고 이를 통해 새로운 레시피를 생성하려고 시도합니다.",
|
||||
"crop-and-rotate-the-image": "이미지를 잘라내고 회전시켜 텍스트만 보이도록 하고 올바른 방향으로 배치하십시오.",
|
||||
"create-from-images": "이미지에서 생성",
|
||||
"should-translate-description": "레시피를 내 언어로 번역하기",
|
||||
@@ -642,7 +644,7 @@
|
||||
"scrape-recipe-website-being-blocked": "웹사이트가 차단되고 있나요?",
|
||||
"scrape-recipe-try-importing-raw-html-instead": "대신 원본 HTML 가져오기를 시도해보세요.",
|
||||
"import-original-keywords-as-tags": "원본 키워드를 태그로 가져오기",
|
||||
"import-original-categories": "Import original categories",
|
||||
"import-original-categories": "원래 카테고리 불러오기",
|
||||
"stay-in-edit-mode": "편집 모드 유지",
|
||||
"parse-recipe-ingredients-after-import": "가져오기 후 레시피 재료 추출",
|
||||
"import-from-zip": "Zip 파일에서 가져오기",
|
||||
@@ -741,7 +743,7 @@
|
||||
"search-mealie": "Mealie 검색 (/를 눌러보세요)",
|
||||
"search-placeholder": "검색...",
|
||||
"tag-filter": "태그 필터",
|
||||
"search-hint": "'/'를 누르세요",
|
||||
"search-hint": "'/'를 눌러보세요",
|
||||
"advanced": "고급",
|
||||
"auto-search": "자동 검색",
|
||||
"no-results": "검색 결과가 없습니다.",
|
||||
@@ -757,7 +759,7 @@
|
||||
"restore-success": "복원 성공!",
|
||||
"restore-fail": "복원이 실패했습니다. 자세한 내용은 서버 로그를 확인하십시오.",
|
||||
"backup-tag": "백업 태그",
|
||||
"create-heading": "Create a Backup",
|
||||
"create-heading": "백업 생성하기",
|
||||
"delete-backup": "백업 삭제",
|
||||
"error-creating-backup-see-log-file": "백업 생성 중 오류 발생. 로그 파일을 참조하십시오.",
|
||||
"full-backup": "전체 백업",
|
||||
@@ -801,7 +803,7 @@
|
||||
"profile": "프로필",
|
||||
"remove-existing-entries-matching-imported-entries": "가져온 항목과 일치하는 기존 항목을 제거합니다",
|
||||
"set-new-time": "새 시간 설정",
|
||||
"settings-update-failed": "설정 업데이트 실패",
|
||||
"settings-update-failed": "설정 수정 실패",
|
||||
"settings-updated": "설정 업데이트",
|
||||
"site-settings": "사이트 설정",
|
||||
"theme": {
|
||||
@@ -1027,7 +1029,7 @@
|
||||
"register": "등록",
|
||||
"reset-password": "비밀번호 재설정",
|
||||
"sign-in": "로그인",
|
||||
"total-mealplans": "전체 MealPlan 수",
|
||||
"total-mealplans": "전체 식단 계획 수",
|
||||
"total-users": "전체 사용자 수",
|
||||
"upload-photo": "사진 업로드",
|
||||
"use-8-characters-or-more-for-your-password": "비밀번호는 8자 이상으로 설정하십시오",
|
||||
@@ -1071,7 +1073,7 @@
|
||||
"user-details": "사용자 정보",
|
||||
"user-name": "사용자 이름",
|
||||
"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": "권한",
|
||||
"administrator": "관리자",
|
||||
"user-can-invite-other-to-group": "사용자는 다른 사용자를 그룹에 초대할 수 있습니다",
|
||||
@@ -1098,8 +1100,8 @@
|
||||
"foods": {
|
||||
"merge-dialog-text": "선택한 식품을 병합하면 원본 식품과 대상 식품이 하나의 식품으로 합쳐집니다. 원본 식품은 삭제되며, 원본 식품에 대한 모든 참조는 대상 식품을 가리키도록 업데이트됩니다.",
|
||||
"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-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-text": "당신이 사용하는 언어에 맞춰 데이터베이스에 음식 정보를 추가하세요. 이렇게 하면 데이터베이스를 구성하는 데 사용할 수 있는 약 2700가지의 일반적인 음식 정보가 생성됩니다. 음식 정보는 커뮤니티 참여를 통해 번역됩니다.",
|
||||
"seed-dialog-warning": "데이터베이스에 이미 일부 항목이 있습니다. 이름이 같은 항목이 이미 존재하는 경우 새 항목은 추가되지 않습니다.",
|
||||
"combine-food": "식품 병합",
|
||||
"source-food": "원본 식품",
|
||||
"target-food": "대상 식품",
|
||||
@@ -1369,9 +1371,9 @@
|
||||
"cookbooks-description": "레시피 카테고리 모음을 관리하고 해당 카테고리별 페이지를 생성합니다.",
|
||||
"members": "회원",
|
||||
"members-description": "가구 구성원을 확인하고 권한을 관리하세요.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"webhooks-description": "식단 계획이 예정된 날짜에 발동되는 웹훅을 설정하세요.",
|
||||
"notifiers": "알리미",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"notifiers-description": "특정 이벤트 발생 시 이메일 및 푸시 알림이 전송되도록 설정하세요.",
|
||||
"manage-data": "데이터 관리하기",
|
||||
"manage-data-description": "Mealie 데이터를 관리하세요; 식품, 단위, 카테고리, 태그 등.",
|
||||
"data-migrations": "데이터 이전",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recepto taisyklės",
|
||||
"applies-to-all-days": "Galioja visoms dienoms",
|
||||
"applies-on-days": "Galioja {0}",
|
||||
"meal-plan-settings": "Valgių plano nustatymai"
|
||||
"meal-plan-settings": "Valgių plano nustatymai",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Perkėlimo duomenys pašalinti",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recepšu noteikumi",
|
||||
"applies-to-all-days": "Attiecas uz visām dienām",
|
||||
"applies-on-days": "Attiecas uz {0} s",
|
||||
"meal-plan-settings": "Maltītes plāna iestatījumi"
|
||||
"meal-plan-settings": "Maltītes plāna iestatījumi",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrācijas dati noņemti",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"about-mealie": "Over Mealie",
|
||||
"api-docs": "API-documentatie",
|
||||
"api-port": "API-poort",
|
||||
"application-mode": "Toepassingsmodus",
|
||||
"application-mode": "Applicatiemodus",
|
||||
"database-type": "Databasetype",
|
||||
"database-url": "Database URL",
|
||||
"default-group": "Standaardgroep",
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Receptregels",
|
||||
"applies-to-all-days": "Van toepassing op alle dagen",
|
||||
"applies-on-days": "Van toepassing op {0}s",
|
||||
"meal-plan-settings": "Maaltijdplan-instellingen"
|
||||
"meal-plan-settings": "Maaltijdplan-instellingen",
|
||||
"add-all-to-list": "Alles aan lijst toevoegen",
|
||||
"add-day-to-list": "Dag aan lijst toevoegen"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migratiegegevens verwijderd",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Regler for oppskrifter",
|
||||
"applies-to-all-days": "Gjelder for alle dager",
|
||||
"applies-on-days": "Gjelder på {0}er",
|
||||
"meal-plan-settings": "Innstillinger for måltidsplan"
|
||||
"meal-plan-settings": "Innstillinger for måltidsplan",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Overføringsdata er fjernet",
|
||||
|
||||
@@ -212,8 +212,8 @@
|
||||
"upload-file": "Prześlij plik",
|
||||
"created-on-date": "Utworzono dnia: {0}",
|
||||
"unsaved-changes": "Masz niezapisane zmiany. Czy chcesz zapisać przed wyjściem? Ok, aby zapisać, Anuluj, żeby odrzucić zmiany.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard-changes": "Odrzuć zmiany",
|
||||
"discard-changes-description": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?",
|
||||
"clipboard-copy-failure": "Nie udało się skopiować do schowka.",
|
||||
"confirm-delete-generic-items": "Czy na pewno chcesz usunąć następujące elementy?",
|
||||
"organizers": "Organizatory",
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Reguły przepisów",
|
||||
"applies-to-all-days": "Dotyczy wszystkich dni",
|
||||
"applies-on-days": "Dotyczy {0}",
|
||||
"meal-plan-settings": "Ustawienia planera posiłków"
|
||||
"meal-plan-settings": "Ustawienia planera posiłków",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Dane migracji usunięte",
|
||||
@@ -642,7 +644,7 @@
|
||||
"scrape-recipe-website-being-blocked": "Witryna jest zablokowana?",
|
||||
"scrape-recipe-try-importing-raw-html-instead": "Zamiast tego spróbuj zaimportować surowy HTML.",
|
||||
"import-original-keywords-as-tags": "Importuj oryginalne słowa kluczowe jako tagi",
|
||||
"import-original-categories": "Import original categories",
|
||||
"import-original-categories": "Importuj oryginalne kategorie",
|
||||
"stay-in-edit-mode": "Pozostań w trybie edycji",
|
||||
"parse-recipe-ingredients-after-import": "Analizuj składniki receptury po zaimportowaniu",
|
||||
"import-from-zip": "Importuj z pliku Zip",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Regras das receitas",
|
||||
"applies-to-all-days": "Aplica-se diariamente",
|
||||
"applies-on-days": "Aplica-se em:",
|
||||
"meal-plan-settings": "Configurações de plano de refeições"
|
||||
"meal-plan-settings": "Configurações de plano de refeições",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Dados de migração removidos",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Regras das receitas",
|
||||
"applies-to-all-days": "Aplica-se a todos os dias",
|
||||
"applies-on-days": "Aplica-se em {0}s",
|
||||
"meal-plan-settings": "Definições do Plano de Refeições"
|
||||
"meal-plan-settings": "Definições do Plano de Refeições",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Dados de migração removidos",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Reguli rețetă",
|
||||
"applies-to-all-days": "Se aplică pentru toate zilele",
|
||||
"applies-on-days": "Aplică pe {0}s",
|
||||
"meal-plan-settings": "Setările Planului de Masă"
|
||||
"meal-plan-settings": "Setările Planului de Masă",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Datele migrării au fost șterse",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Правила рецептов",
|
||||
"applies-to-all-days": "Применяется к всем дням",
|
||||
"applies-on-days": "Применяется по {0}",
|
||||
"meal-plan-settings": "Настройки плана питания"
|
||||
"meal-plan-settings": "Настройки плана питания",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Данные миграции удалены",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Pravidlá receptov",
|
||||
"applies-to-all-days": "Platí pre všetky dni",
|
||||
"applies-on-days": "Platí v {0}",
|
||||
"meal-plan-settings": "Nastavenia jedálnička"
|
||||
"meal-plan-settings": "Nastavenia jedálnička",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Prenesené dáta odstránené",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Pravila za recepte",
|
||||
"applies-to-all-days": "Velja za vse dneve",
|
||||
"applies-on-days": "Velja za {0}",
|
||||
"meal-plan-settings": "Nastavitve jedilnika"
|
||||
"meal-plan-settings": "Nastavitve jedilnika",
|
||||
"add-all-to-list": "Dodaj vse na seznam",
|
||||
"add-day-to-list": "Dodaj dan na seznam"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrirani podatki so odstranjeni",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"about": {
|
||||
"about": "О апликацији",
|
||||
"about-mealie": "О Мили",
|
||||
"about-mealie": "О Mealie",
|
||||
"api-docs": "API документација",
|
||||
"api-port": "API прикључак",
|
||||
"application-mode": "Режим апликације",
|
||||
"database-type": "Тип базе података",
|
||||
"database-url": "URL базе података",
|
||||
"default-group": "Подразумевана група",
|
||||
"default-household": "Default Household",
|
||||
"default-household": "Подразумевано домаћинство",
|
||||
"demo": "Демо",
|
||||
"demo-status": "Демо статус",
|
||||
"development": "Развој",
|
||||
@@ -16,7 +16,7 @@
|
||||
"download-log": "Преузми дневник евиденције",
|
||||
"download-recipe-json": "Последњи прикупљени JSON",
|
||||
"github": "GitHub",
|
||||
"log-lines": "Log Lines",
|
||||
"log-lines": "Лог",
|
||||
"not-demo": "Није демо",
|
||||
"portfolio": "Портфолио",
|
||||
"production": "У продукцији",
|
||||
@@ -65,11 +65,11 @@
|
||||
"something-went-wrong": "Нешто је кренуло погрешно!",
|
||||
"subscribed-events": "Догађаји на које сте претплаћени",
|
||||
"test-message-sent": "Тест порука је послата",
|
||||
"message-sent": "Message Sent",
|
||||
"message-sent": "Порука послата",
|
||||
"new-notification": "Ново обавештење",
|
||||
"event-notifiers": "Обавештавач о догађају",
|
||||
"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.",
|
||||
"apprise-url-is-left-intentionally-blank": "Како Apprise URL обично садржи сензитивне информације, ово поље је намерно остављено празно. Ако желите да промените URL, упишите нови овде или оставите поље празно да задржите тренутни URL.",
|
||||
"enable-notifier": "Омогући обавештење",
|
||||
"what-events": "На које догађаје би требао да се претплати овај обавештавач?",
|
||||
"user-events": "Догађаји корисника",
|
||||
@@ -84,12 +84,12 @@
|
||||
"label-events": "Label Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"add": "Додај",
|
||||
"cancel": "Откажи",
|
||||
"clear": "Обриши",
|
||||
"close": "Затвори",
|
||||
"confirm": "Потврди",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-how-does-everything-look": "Како све изгледа?",
|
||||
"confirm-delete-generic": "Да ли сте сигурни да желите обрисати ово?",
|
||||
"copied_message": "Копирано!",
|
||||
"create": "Креирај",
|
||||
@@ -118,12 +118,12 @@
|
||||
"image-upload-failed": "Неуспешно додавање слике",
|
||||
"import": "Увоз",
|
||||
"json": "JSON",
|
||||
"keyword": "Ključna reč",
|
||||
"keyword": "Кључна реч",
|
||||
"link-copied": "Линк је копиран",
|
||||
"loading": "Loading",
|
||||
"loading": "Учитавање",
|
||||
"loading-events": "Учитавање догађаја",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipe": "Рецепт се учитава...",
|
||||
"loading-ocr-data": "Учитавање OCR података...",
|
||||
"loading-recipes": "Учитавање рецепата",
|
||||
"message": "Порука",
|
||||
"monday": "Понедељак",
|
||||
@@ -134,7 +134,7 @@
|
||||
"no-recipe-found": "Рецепт није пронађен",
|
||||
"ok": "У реду",
|
||||
"options": "Опције:",
|
||||
"plural-name": "Ime u množini",
|
||||
"plural-name": "Име у множини",
|
||||
"print": "Штампа",
|
||||
"print-preferences": "Подешавање штампе",
|
||||
"random": "Насумично",
|
||||
@@ -148,23 +148,23 @@
|
||||
"save": "Сачувај",
|
||||
"settings": "Подешавања",
|
||||
"share": "Подели",
|
||||
"show-all": "Show All",
|
||||
"show-all": "Прикажи све",
|
||||
"shuffle": "Помешано",
|
||||
"sort": "Сортирај",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-ascending": "Сложи по реду - растуће",
|
||||
"sort-descending": "Сложи по реду - опадајуће",
|
||||
"sort-alphabetically": "Азбучно",
|
||||
"status": "Статус",
|
||||
"subject": "Наслов",
|
||||
"submit": "Пошаљи",
|
||||
"success-count": "Успешно {count}",
|
||||
"sunday": "недеља",
|
||||
"system": "System",
|
||||
"system": "Систем",
|
||||
"templates": "Шаблони:",
|
||||
"test": "Тест",
|
||||
"themes": "Теме",
|
||||
"thursday": "четвртак",
|
||||
"title": "Title",
|
||||
"title": "Наслов",
|
||||
"token": "Токен",
|
||||
"tuesday": "уторак",
|
||||
"type": "Тип",
|
||||
@@ -179,12 +179,12 @@
|
||||
"units": "Јединице",
|
||||
"back": "Назад",
|
||||
"next": "Сљедећи",
|
||||
"start": "Start",
|
||||
"start": "Старт",
|
||||
"toggle-view": "Промени приказ",
|
||||
"date": "Датум",
|
||||
"id": "Ид",
|
||||
"id": "ИД",
|
||||
"owner": "Власник",
|
||||
"change-owner": "Change Owner",
|
||||
"change-owner": "Промени власника",
|
||||
"date-added": "Датум додавања",
|
||||
"none": "Ниједно",
|
||||
"run": "Покрени",
|
||||
@@ -211,17 +211,17 @@
|
||||
"refresh": "Освежи",
|
||||
"upload-file": "Учитај датотеку",
|
||||
"created-on-date": "Крерирано: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||
"discard-changes": "Discard Changes",
|
||||
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
|
||||
"organizers": "Organizers",
|
||||
"caution": "Caution",
|
||||
"show-advanced": "Show Advanced",
|
||||
"add-field": "Add Field",
|
||||
"date-created": "Date Created",
|
||||
"date-updated": "Date Updated"
|
||||
"unsaved-changes": "Имате несачуване измене. Да ли желите да их сачувате пре изласка? ОК за потврду, Откажи да откажете измене.",
|
||||
"discard-changes": "Откажи измене",
|
||||
"discard-changes-description": "Имате несачуване измене. Да ли желите да их откажете?",
|
||||
"clipboard-copy-failure": "Копирање није успело.",
|
||||
"confirm-delete-generic-items": "Да ли желите да обришете следеће ставке?",
|
||||
"organizers": "Организатор",
|
||||
"caution": "Пажња",
|
||||
"show-advanced": "Прикажи напредно",
|
||||
"add-field": "Додај поље",
|
||||
"date-created": "Датум креирања",
|
||||
"date-updated": "Датум измене"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Да ли сте сигурни да желите да обришете <b>{groupName}<b/>?",
|
||||
@@ -236,7 +236,7 @@
|
||||
"group-id-with-value": "ID групе: {groupID}",
|
||||
"group-name": "Назив групе",
|
||||
"group-not-found": "Група није пронађена",
|
||||
"group-token": "Group Token",
|
||||
"group-token": "Групни токен",
|
||||
"group-with-value": "Група: {groupID}",
|
||||
"groups": "Групе",
|
||||
"manage-groups": "Управљај групама",
|
||||
@@ -248,18 +248,18 @@
|
||||
"keep-my-recipes-private-description": "Поставља вашу групу и све рецепте као подразумевано приватне. Увек можете касније променити ово."
|
||||
},
|
||||
"manage-members": "Управљај члановима",
|
||||
"manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
||||
"manage-members-description": "Управљање дозволама у сопственом домаћинству. {manage} дозвољава кориснику приступ менаџменту података, а {invite} омогућава кориснику да генерише позивнице за друге кориснике. Власници групе не могу променити сопствене дозволе.",
|
||||
"manage": "Управљај",
|
||||
"manage-household": "Manage Household",
|
||||
"manage-household": "Менаџмент домаћинства",
|
||||
"invite": "Позови",
|
||||
"looking-to-update-your-profile": "Желите ли да ажурирате свој профил?",
|
||||
"default-recipe-preferences-description": "Ово су подразумевана подешавања када се креира нови рецепт у вашој групи. Ова подешавања могу бити промењена за појединачне рецепте у менију подешавања рецепата.",
|
||||
"default-recipe-preferences": "Подразумевана подешавања рецепта",
|
||||
"group-preferences": "Подешавања групе",
|
||||
"private-group": "Приватна група",
|
||||
"private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings",
|
||||
"enable-public-access": "Enable Public Access",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"private-group-description": "Подешавњем групе као приватне ће онемогућити јавни преглед у потпуности. Ово поништава све индивидуална подешавања јавног приступа",
|
||||
"enable-public-access": "Дозволи јавни приступ",
|
||||
"enable-public-access-description": "Подеси рецепте у групи уобичајно као јавне и дозволи гостима преглед рецепата без логовања",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Дозволите корисницима, који су ван ваше групе, да виде ваше рецепте",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Када је омогућено, можете користити јавну везу за дељење одређених рецепата без одобравања корисника. Када је онемогућено, рецепте можете делити само са корисницима који су у вашој групи или помоћу претходно генерисане приватне везе",
|
||||
"show-nutrition-information": "Прикажи информације о исхрани",
|
||||
@@ -271,37 +271,37 @@
|
||||
"disable-users-from-commenting-on-recipes": "Онемогући кориснике да коментаришу рецепте",
|
||||
"disable-users-from-commenting-on-recipes-description": "Сакрива секцију коментара на страници рецепта и онемогућава коментаре",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Онемогући организацију састојака рецепта по јединицама и намирницама",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Сакриј тип, јединицу мере и количину за састојке и третирај их као поље са обичним текстом",
|
||||
"general-preferences": "Општа подешавања",
|
||||
"group-recipe-preferences": "Подешавања групе рецепта",
|
||||
"report": "Извештај",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"report-with-id": "ИД извештаја: {id}",
|
||||
"group-management": "Управљање групом",
|
||||
"admin-group-management": "Управљање администраторском групом",
|
||||
"admin-group-management-text": "Промене у овој групи биће одмах видљиве.",
|
||||
"group-id-value": "Group Id: {0}",
|
||||
"total-households": "Total Households",
|
||||
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
|
||||
"group-id-value": "ИД групе: {0}",
|
||||
"total-households": "Укупно домаћинстава",
|
||||
"you-must-select-a-group-before-selecting-a-household": "Морате селектовати групу пре селектовања домаћинства"
|
||||
},
|
||||
"household": {
|
||||
"household": "Household",
|
||||
"households": "Households",
|
||||
"user-household": "User Household",
|
||||
"create-household": "Create Household",
|
||||
"household-name": "Household Name",
|
||||
"household-group": "Household Group",
|
||||
"household-management": "Household Management",
|
||||
"manage-households": "Manage Households",
|
||||
"admin-household-management": "Admin Household Management",
|
||||
"admin-household-management-text": "Changes to this household will be reflected immediately.",
|
||||
"household-id-value": "Household Id: {0}",
|
||||
"private-household": "Private Household",
|
||||
"private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings",
|
||||
"lock-recipe-edits-from-other-households": "Lock recipe edits from other households",
|
||||
"lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household",
|
||||
"household-recipe-preferences": "Household Recipe Preferences",
|
||||
"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.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
|
||||
"household": "Домаћинство",
|
||||
"households": "Домаћинства",
|
||||
"user-household": "Корисниково домаћинство",
|
||||
"create-household": "Креирај домаћинство",
|
||||
"household-name": "Назив домаћинства",
|
||||
"household-group": "Група домаћинства",
|
||||
"household-management": "Управљање домаћинством",
|
||||
"manage-households": "Управљање домаћинствима",
|
||||
"admin-household-management": "Административно управљање домаћинством",
|
||||
"admin-household-management-text": "Промене за ово домаћинство ће бити видљиве одмах.",
|
||||
"household-id-value": "ИД домаћинства {0}",
|
||||
"private-household": "Приватно домаћинство",
|
||||
"private-household-description": "Подешавање сопственог домаћинства као приватно ће онемогућити сав јавни преглед. Ово поништава сва индивидуална подешавања за преглед",
|
||||
"lock-recipe-edits-from-other-households": "Забрани измене рецепата од стране других домаћинстава",
|
||||
"lock-recipe-edits-from-other-households-description": "Када је опција укључена, само корисници из вашег домаћинства могу мењати рецепте креиране унутар њега",
|
||||
"household-recipe-preferences": "Подешавање рецепата за домаћинство",
|
||||
"default-recipe-preferences-description": "Ово су уобичајна подешавања када се нови рецепт креира у вашем домаћинству. Подешавања могу бити промењена за појединачне рецепте из менија за подешавања.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Дозволите корисницима ван вашег домаћинства да прегледају ваше рецепте",
|
||||
"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"
|
||||
},
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Правила за рецепт",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
"meal-plan-settings": "Meal Plan Settings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migration data removed",
|
||||
@@ -505,7 +507,7 @@
|
||||
"insert-below": "Insert Below",
|
||||
"instructions": "Instructions",
|
||||
"key-name-required": "Key Name Required",
|
||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||
"landscape-view-coming-soon": "Хорижонтални поглед (Ускоро)",
|
||||
"milligrams": "milligrams",
|
||||
"new-key-name": "New Key Name",
|
||||
"no-white-space-allowed": "No White Space Allowed",
|
||||
@@ -622,7 +624,7 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"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.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-images": "Create from Images",
|
||||
@@ -757,7 +759,7 @@
|
||||
"restore-success": "Restore successful",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
"create-heading": "Креирај бекап",
|
||||
"delete-backup": "Delete Backup",
|
||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||
"full-backup": "Full Backup",
|
||||
@@ -902,13 +904,13 @@
|
||||
"create-shopping-list": "Направи списак за куповину",
|
||||
"from-recipe": "From Recipe",
|
||||
"list-name": "List Name",
|
||||
"new-list": "Novi spisak",
|
||||
"new-list": "Нови списак",
|
||||
"quantity": "Quantity: {0}",
|
||||
"shopping-list": "Shopping List",
|
||||
"shopping-lists": "Списак за куповину",
|
||||
"food": "Храна",
|
||||
"note": "Note",
|
||||
"label": "Natpis",
|
||||
"label": "Натпис",
|
||||
"save-label": "Save Label",
|
||||
"linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.",
|
||||
"toggle-food": "Toggle Food",
|
||||
@@ -1411,33 +1413,33 @@
|
||||
},
|
||||
"query-filter": {
|
||||
"logical-operators": {
|
||||
"and": "AND",
|
||||
"or": "OR"
|
||||
"and": "И",
|
||||
"or": "ИЛИ"
|
||||
},
|
||||
"relational-operators": {
|
||||
"equals": "equals",
|
||||
"does-not-equal": "does not equal",
|
||||
"is-greater-than": "is greater than",
|
||||
"is-greater-than-or-equal-to": "is greater than or equal to",
|
||||
"is-less-than": "is less than",
|
||||
"is-less-than-or-equal-to": "is less than or equal to"
|
||||
"equals": "једнако са",
|
||||
"does-not-equal": "није једнако са",
|
||||
"is-greater-than": "је веће од",
|
||||
"is-greater-than-or-equal-to": "је веће или једнако са",
|
||||
"is-less-than": "је мање од",
|
||||
"is-less-than-or-equal-to": "је мање или једнако са"
|
||||
},
|
||||
"relational-keywords": {
|
||||
"is": "is",
|
||||
"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-not-like": "is not like"
|
||||
"is": "је",
|
||||
"is-not": "није ",
|
||||
"is-one-of": "је једно од",
|
||||
"is-not-one-of": "није једно од",
|
||||
"contains-all-of": "садржи све из",
|
||||
"is-like": "је као",
|
||||
"is-not-like": "није као"
|
||||
}
|
||||
},
|
||||
"validators": {
|
||||
"required": "This Field is Required",
|
||||
"invalid-email": "Email Must Be Valid",
|
||||
"invalid-url": "Must Be A Valid URL",
|
||||
"no-whitespace": "No Whitespace Allowed",
|
||||
"min-length": "Must Be At Least {min} Characters",
|
||||
"max-length": "Must Be At Most {max} Characters"
|
||||
"required": "Ово поље је обавезно",
|
||||
"invalid-email": "Имејл мора бити валидан",
|
||||
"invalid-url": "Мора бити валидан URL",
|
||||
"no-whitespace": "Размак није дозвољен",
|
||||
"min-length": "Мора бити најмање {min} карактера",
|
||||
"max-length": "Мора бити највише {max} карактера"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Receptregler",
|
||||
"applies-to-all-days": "Gäller för alla dagar",
|
||||
"applies-on-days": "Gäller på {0}s",
|
||||
"meal-plan-settings": "Inställningar för måltidsplanering"
|
||||
"meal-plan-settings": "Inställningar för måltidsplanering",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Importerad data borttagen",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Tarif Kuralları",
|
||||
"applies-to-all-days": "Tüm günler için geçerlidir",
|
||||
"applies-on-days": "{0} günlerine geçerlidir",
|
||||
"meal-plan-settings": "Öğün Planı Ayarları"
|
||||
"meal-plan-settings": "Öğün Planı Ayarları",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Taşıma verileri kaldırıldı",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Правила рецептів",
|
||||
"applies-to-all-days": "Застосовується до всіх днів",
|
||||
"applies-on-days": "Застосовується на {0}сек",
|
||||
"meal-plan-settings": "Налаштування меню"
|
||||
"meal-plan-settings": "Налаштування меню",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Дані міграції видалені",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
"meal-plan-settings": "Meal Plan Settings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migration data removed",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "食谱规则",
|
||||
"applies-to-all-days": "应用到所有日期",
|
||||
"applies-on-days": "应用于{0}",
|
||||
"meal-plan-settings": "饮食计划设置"
|
||||
"meal-plan-settings": "饮食计划设置",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "已删除迁移数据",
|
||||
|
||||
@@ -369,7 +369,9 @@
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
"meal-plan-settings": "Meal Plan Settings",
|
||||
"add-all-to-list": "Add All to List",
|
||||
"add-day-to-list": "Add Day to List"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "遷移數據已刪除",
|
||||
|
||||
@@ -44,6 +44,7 @@ export interface QueryFilterJSONPart {
|
||||
attributeName?: string | null;
|
||||
relationalOperator?: RelationalKeyword | RelationalOperator | null;
|
||||
value?: string | string[] | null;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface SaveCookBook {
|
||||
name: string;
|
||||
|
||||
@@ -53,6 +53,7 @@ export interface QueryFilterJSONPart {
|
||||
attributeName?: string | null;
|
||||
relationalOperator?: RelationalKeyword | RelationalOperator | null;
|
||||
value?: string | string[] | null;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface PlanRulesSave {
|
||||
day?: PlanRulesDay;
|
||||
|
||||
@@ -40,3 +40,20 @@ export enum Organizer {
|
||||
Household = "households",
|
||||
User = "users",
|
||||
}
|
||||
|
||||
export type LogicalOperator = "AND" | "OR";
|
||||
export type RelationalKeyword = "IS" | "IS NOT" | "IN" | "NOT IN" | "CONTAINS ALL" | "LIKE" | "NOT LIKE";
|
||||
export type RelationalOperator = "=" | "<>" | ">" | "<" | ">=" | "<=";
|
||||
|
||||
export interface QueryFilterJSON {
|
||||
parts?: QueryFilterJSONPart[];
|
||||
}
|
||||
|
||||
export interface QueryFilterJSONPart {
|
||||
leftParenthesis?: string | null;
|
||||
rightParenthesis?: string | null;
|
||||
logicalOperator?: LogicalOperator | null;
|
||||
attributeName?: string | null;
|
||||
relationalOperator?: RelationalKeyword | RelationalOperator | null;
|
||||
value?: string | string[] | null;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ export interface OpenAIIngredients {
|
||||
}
|
||||
export interface OpenAIRecipe {
|
||||
name: string;
|
||||
description: string | null;
|
||||
description?: string | null;
|
||||
recipe_yield?: string | null;
|
||||
total_time?: string | null;
|
||||
prep_time?: string | null;
|
||||
@@ -37,4 +37,7 @@ export interface OpenAIRecipeNotes {
|
||||
title?: string | null;
|
||||
text: string;
|
||||
}
|
||||
export interface OpenAIText {
|
||||
text: string;
|
||||
}
|
||||
export interface OpenAIBase {}
|
||||
|
||||
@@ -502,13 +502,16 @@ export interface SaveIngredientUnit {
|
||||
}
|
||||
export interface ScrapeRecipe {
|
||||
includeTags?: boolean;
|
||||
includeCategories?: boolean;
|
||||
url: string;
|
||||
}
|
||||
export interface ScrapeRecipeBase {
|
||||
includeTags?: boolean;
|
||||
includeCategories?: boolean;
|
||||
}
|
||||
export interface ScrapeRecipeData {
|
||||
includeTags?: boolean;
|
||||
includeCategories?: boolean;
|
||||
data: string;
|
||||
url?: string | null;
|
||||
}
|
||||
|
||||
@@ -7,9 +7,6 @@
|
||||
|
||||
export type OrderByNullPosition = "first" | "last";
|
||||
export type OrderDirection = "asc" | "desc";
|
||||
export type LogicalOperator = "AND" | "OR";
|
||||
export type RelationalKeyword = "IS" | "IS NOT" | "IN" | "NOT IN" | "CONTAINS ALL" | "LIKE" | "NOT LIKE";
|
||||
export type RelationalOperator = "=" | "<>" | ">" | "<" | ">=" | "<=";
|
||||
|
||||
export interface ErrorResponse {
|
||||
message: string;
|
||||
@@ -28,17 +25,6 @@ export interface PaginationQuery {
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}
|
||||
export interface QueryFilterJSON {
|
||||
parts?: QueryFilterJSONPart[];
|
||||
}
|
||||
export interface QueryFilterJSONPart {
|
||||
leftParenthesis?: string | null;
|
||||
rightParenthesis?: string | null;
|
||||
logicalOperator?: LogicalOperator | null;
|
||||
attributeName?: string | null;
|
||||
relationalOperator?: RelationalKeyword | RelationalOperator | null;
|
||||
value?: string | string[] | null;
|
||||
}
|
||||
export interface RecipeSearchQuery {
|
||||
cookbook?: string | null;
|
||||
requireAllCategories?: boolean;
|
||||
|
||||
@@ -219,6 +219,7 @@ export default defineNuxtConfig({
|
||||
},
|
||||
workbox: {
|
||||
navigateFallback: "/",
|
||||
navigateFallbackAllowlist: [/^(?!\/api)/],
|
||||
globPatterns: ["**/*.{js,css,html,png,svg,ico}"],
|
||||
globIgnores: ["404.html", "200.html"],
|
||||
cleanupOutdatedCaches: true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mealie",
|
||||
"version": "3.9.2",
|
||||
"version": "3.10.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxt dev",
|
||||
|
||||
@@ -422,7 +422,7 @@ import { Organizer } from "~/lib/api/types/non-generated";
|
||||
import QueryFilterBuilder from "~/components/Domain/QueryFilterBuilder.vue";
|
||||
import RecipeSuggestion from "~/components/Domain/Recipe/RecipeSuggestion.vue";
|
||||
import SearchFilter from "~/components/Domain/SearchFilter.vue";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/response";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
|
||||
import type { FieldDefinition } from "~/composables/use-query-filter-builder";
|
||||
import { useRecipeFinderPreferences } from "~/composables/use-users/preferences";
|
||||
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<RecipeDialogAddToShoppingList
|
||||
v-if="shoppingLists"
|
||||
v-model="state.shoppingListDialog"
|
||||
:recipes="weekRecipesWithScales"
|
||||
:shopping-lists="shoppingLists"
|
||||
/>
|
||||
<v-menu
|
||||
v-model="state.picker"
|
||||
:close-on-content-click="false"
|
||||
@@ -45,13 +51,23 @@
|
||||
|
||||
<div class="d-flex flex-wrap align-center justify-space-between mb-2">
|
||||
<v-tabs style="width: fit-content;">
|
||||
<v-tab :to="{ name: 'household-mealplan-planner-view', query: route.query }">
|
||||
<v-tab :to="{ name: TABS.view, query: route.query }">
|
||||
{{ $t('meal-plan.meal-planner') }}
|
||||
</v-tab>
|
||||
<v-tab :to="{ name: 'household-mealplan-planner-edit', query: route.query }">
|
||||
<v-tab :to="{ name: TABS.edit, query: route.query }">
|
||||
{{ $t('general.edit') }}
|
||||
</v-tab>
|
||||
</v-tabs>
|
||||
<BaseButton
|
||||
v-if="route.name === TABS.view"
|
||||
color="info"
|
||||
:icon="$globals.icons.cartCheck"
|
||||
:text="$t('meal-plan.add-all-to-list')"
|
||||
:disabled="!hasRecipes"
|
||||
:loading="state.addAllLoading"
|
||||
class="ml-auto mr-4"
|
||||
@click="addAllToList"
|
||||
/>
|
||||
<ButtonLink
|
||||
:icon="$globals.icons.calendar"
|
||||
:to="`/household/mealplan/settings`"
|
||||
@@ -72,15 +88,27 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { isSameDay, addDays, parseISO, format, isValid } from "date-fns";
|
||||
import RecipeDialogAddToShoppingList from "~/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue";
|
||||
import { useHouseholdSelf } from "~/composables/use-households";
|
||||
import { useMealplans } from "~/composables/use-group-mealplan";
|
||||
import { useUserMealPlanPreferences } from "~/composables/use-users/preferences";
|
||||
import type { ShoppingListSummary } from "~/lib/api/types/household";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: {
|
||||
RecipeDialogAddToShoppingList,
|
||||
},
|
||||
setup() {
|
||||
const TABS = {
|
||||
view: "household-mealplan-planner-view",
|
||||
edit: "household-mealplan-planner-edit",
|
||||
};
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const i18n = useI18n();
|
||||
const api = useUserApi();
|
||||
const { household } = useHouseholdSelf();
|
||||
|
||||
useSeoMeta({
|
||||
@@ -96,7 +124,7 @@ export default defineNuxtComponent({
|
||||
// Force to /view if current route is /planner
|
||||
if (route.path === "/household/mealplan/planner") {
|
||||
router.push({
|
||||
name: "household-mealplan-planner-view",
|
||||
name: TABS.view,
|
||||
query: route.query,
|
||||
});
|
||||
}
|
||||
@@ -120,8 +148,12 @@ export default defineNuxtComponent({
|
||||
start: initialStartDate,
|
||||
picker: false,
|
||||
end: initialEndDate,
|
||||
shoppingListDialog: false,
|
||||
addAllLoading: false,
|
||||
});
|
||||
|
||||
const shoppingLists = ref<ShoppingListSummary[]>();
|
||||
|
||||
const firstDayOfWeek = computed(() => {
|
||||
return household.value?.preferences?.firstDayOfWeek || 0;
|
||||
});
|
||||
@@ -145,7 +177,7 @@ export default defineNuxtComponent({
|
||||
watch(weekRange, (newRange) => {
|
||||
// Keep current route name and params, just update the query
|
||||
router.replace({
|
||||
name: route.name || "household-mealplan-planner-view",
|
||||
name: route.name || TABS.view,
|
||||
params: route.params,
|
||||
query: {
|
||||
...route.query,
|
||||
@@ -193,7 +225,41 @@ export default defineNuxtComponent({
|
||||
});
|
||||
});
|
||||
|
||||
const hasRecipes = computed(() => {
|
||||
return mealsByDate.value.some(day => day.meals.some(meal => meal.recipe));
|
||||
});
|
||||
|
||||
const weekRecipesWithScales = computed(() => {
|
||||
const allRecipes: any[] = [];
|
||||
for (const day of mealsByDate.value) {
|
||||
for (const meal of day.meals) {
|
||||
if (meal.recipe) {
|
||||
allRecipes.push(meal.recipe);
|
||||
}
|
||||
}
|
||||
}
|
||||
return allRecipes.map(recipe => ({
|
||||
scale: 1,
|
||||
...recipe,
|
||||
}));
|
||||
});
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
|
||||
if (data) {
|
||||
shoppingLists.value = data.items as ShoppingListSummary[] ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
async function addAllToList() {
|
||||
state.value.addAllLoading = true;
|
||||
await getShoppingLists();
|
||||
state.value.shoppingListDialog = true;
|
||||
state.value.addAllLoading = false;
|
||||
}
|
||||
|
||||
return {
|
||||
TABS,
|
||||
route,
|
||||
state,
|
||||
actions,
|
||||
@@ -201,6 +267,10 @@ export default defineNuxtComponent({
|
||||
weekRange,
|
||||
firstDayOfWeek,
|
||||
numberOfDays,
|
||||
hasRecipes,
|
||||
shoppingLists,
|
||||
weekRecipesWithScales,
|
||||
addAllToList,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -110,6 +110,11 @@ class AppSettings(AppLoggingSettings):
|
||||
BASE_URL: str = "http://localhost:8080"
|
||||
"""trailing slashes are trimmed (ex. `http://localhost:8080/` becomes ``http://localhost:8080`)"""
|
||||
|
||||
@property
|
||||
def is_default_base_url(self) -> bool:
|
||||
"""Returns True if BASE_URL has not been changed from the default."""
|
||||
return self.BASE_URL == "http://localhost:8080"
|
||||
|
||||
STATIC_FILES: str = str(PACKAGE_DIR / "frontend")
|
||||
"""path to static files directory (ex. `mealie/dist`)"""
|
||||
|
||||
|
||||
@@ -4,19 +4,19 @@
|
||||
},
|
||||
"recipe": {
|
||||
"unique-name-error": "Назив рецепта мора бити јединствен",
|
||||
"recipe-created": "Recipe Created",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-created": "Рецепт је направљен",
|
||||
"recipe-image-deleted": "Слика рецепта је обрисана",
|
||||
"recipe-defaults": {
|
||||
"ingredient-note": "1 Cup Flour",
|
||||
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
|
||||
"ingredient-note": "1 шоља брашна",
|
||||
"step-text": "Упутство за рецепт као и остала поља подржавају markdown синтаксу\n\n**Додати линк**\n\n[Мој линк](https://demo.mealie.io)\n"
|
||||
},
|
||||
"servings-text": {
|
||||
"makes": "Makes",
|
||||
"serves": "Serves",
|
||||
"serving": "Serving",
|
||||
"servings": "Servings",
|
||||
"yield": "Yield",
|
||||
"yields": "Yields"
|
||||
"makes": "Прави",
|
||||
"serves": "Послужује",
|
||||
"serving": "Порција",
|
||||
"servings": "Број порција",
|
||||
"yield": "Количина",
|
||||
"yields": "Количина"
|
||||
}
|
||||
},
|
||||
"mealplan": {
|
||||
@@ -29,55 +29,55 @@
|
||||
"ldap-update-password-unavailable": "Лозинку није могуће ажурирати, корисник је контролисан од стране LDAP-а"
|
||||
},
|
||||
"group": {
|
||||
"report-deleted": "Рецепт је избрисан."
|
||||
"report-deleted": "Извештај је избрисан."
|
||||
},
|
||||
"exceptions": {
|
||||
"permission_denied": "Немате дозволу за извршење ове радње",
|
||||
"recursive-recipe-link": "A recipe cannot reference itself, either directly or indirectly",
|
||||
"recursive-recipe-link": "Рецепт не може да референцира сам себе, директно или индиректно",
|
||||
"no-entry-found": "Захтевани ресурс није пронађен",
|
||||
"integrity-error": "Грешка у интегритету базе података",
|
||||
"username-conflict-error": "Корисничко име је већ заузето",
|
||||
"email-conflict-error": "Овај е-мејл је већ у употреби"
|
||||
"email-conflict-error": "Овај имејл је већ у употреби"
|
||||
},
|
||||
"notifications": {
|
||||
"generic-created": "{name} је крериран",
|
||||
"generic-created": "{name} је креиран",
|
||||
"generic-updated": "{name} је ажуриран",
|
||||
"generic-created-with-url": "{name} је направљено, {url}",
|
||||
"generic-updated-with-url": "{name} је ажурирано, {url}",
|
||||
"generic-duplicated": "{name} је дуплиран",
|
||||
"generic-deleted": "{name} је обрисан",
|
||||
"logged-out": "Logged out"
|
||||
"logged-out": "Одјављено"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
"day": "day|days",
|
||||
"hour": "hour|hours",
|
||||
"minute": "minute|minutes",
|
||||
"second": "second|seconds",
|
||||
"millisecond": "millisecond|milliseconds",
|
||||
"microsecond": "microsecond|microseconds"
|
||||
"year": "година",
|
||||
"day": "дан",
|
||||
"hour": "сат",
|
||||
"minute": "минут",
|
||||
"second": "секунд",
|
||||
"millisecond": "милисекунд",
|
||||
"microsecond": "микросекунд"
|
||||
},
|
||||
"emails": {
|
||||
"password": {
|
||||
"subject": "Mealie Forgot Password",
|
||||
"header_text": "Forgot Password",
|
||||
"message_top": "You have requested to reset your password.",
|
||||
"message_bottom": "Please click the button above to reset your password.",
|
||||
"button_text": "Reset Password"
|
||||
"subject": "Mealie Заборављена лозинка",
|
||||
"header_text": "Заборављена лозинка",
|
||||
"message_top": "Направили сте захтев за ресетовање лозинке.",
|
||||
"message_bottom": "Молимо вас да притиснете дугме изнад како бисте ресетовали лозинку.",
|
||||
"button_text": "Ресетуј лозинку"
|
||||
},
|
||||
"invitation": {
|
||||
"subject": "Invitation to join Mealie",
|
||||
"header_text": "You're Invited!",
|
||||
"message_top": "You have been invited to join Mealie.",
|
||||
"message_bottom": "Please click the button above to accept the invitation.",
|
||||
"button_text": "Accept Invitation"
|
||||
"subject": "Mealie Позивница за придруживање",
|
||||
"header_text": "Позвани сте!",
|
||||
"message_top": "Позвани сте да се придружите Mealie-у.",
|
||||
"message_bottom": "Молимо вас да притиснете дугме изнад како бисте прихватили позив.",
|
||||
"button_text": "Прихвати позивницу"
|
||||
},
|
||||
"test": {
|
||||
"subject": "Mealie Test Email",
|
||||
"header_text": "Test Email",
|
||||
"message_top": "This is a test email.",
|
||||
"message_bottom": "Please click the button above to test the email.",
|
||||
"button_text": "Open Mealie"
|
||||
"subject": "Mealie тест имејл",
|
||||
"header_text": "Пробни имејл",
|
||||
"message_top": "Ово је пробни имејл.",
|
||||
"message_bottom": "Молимо вас да притиснете дугме изнад како бисте тестирали имејл.",
|
||||
"button_text": "Отвори Maelie"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,8 +24,8 @@ from mealie.schema.response.pagination import (
|
||||
PaginationQuery,
|
||||
RequestQuery,
|
||||
)
|
||||
from mealie.schema.response.query_filter import QueryFilterBuilder
|
||||
from mealie.schema.response.query_search import SearchFilter
|
||||
from mealie.services.query_filter.builder import QueryFilterBuilder
|
||||
|
||||
from ._utils import NOT_SET, NotSet
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ from mealie.schema.recipe.recipe_ingredient import IngredientFood
|
||||
from mealie.schema.recipe.recipe_suggestion import RecipeSuggestionQuery, RecipeSuggestionResponseItem
|
||||
from mealie.schema.recipe.recipe_tool import RecipeToolOut
|
||||
from mealie.schema.response.pagination import PaginationQuery
|
||||
from mealie.schema.response.query_filter import QueryFilterBuilder
|
||||
from mealie.services.query_filter.builder import QueryFilterBuilder
|
||||
|
||||
from ..db.models._model_base import SqlAlchemyBase
|
||||
from .repository_generic import HouseholdRepositoryGeneric
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "σκόρδο",
|
||||
"plural_name": "garlic"
|
||||
"plural_name": "σκόρδα"
|
||||
},
|
||||
"onion": {
|
||||
"aliases": [],
|
||||
@@ -59,13 +59,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "σέλινο",
|
||||
"plural_name": "celery"
|
||||
"plural_name": "σέλινα"
|
||||
},
|
||||
"jalapeño": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "jalapeño",
|
||||
"plural_name": "jalapeños"
|
||||
"name": "jalapeño",
|
||||
"plural_name": "jalapeños"
|
||||
},
|
||||
"avocado": {
|
||||
"aliases": [],
|
||||
@@ -95,13 +95,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "σπανάκι",
|
||||
"plural_name": "spinach"
|
||||
"plural_name": "σπανάκια"
|
||||
},
|
||||
"sweet corn": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "γλυκό καλαμπόκι",
|
||||
"plural_name": "sweet corn"
|
||||
"plural_name": "γλυκά καλαμπόκια"
|
||||
},
|
||||
"chile pepper": {
|
||||
"aliases": [
|
||||
@@ -121,19 +121,19 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "μπρόκολο",
|
||||
"plural_name": "broccoli"
|
||||
"plural_name": "μπρόκολα"
|
||||
},
|
||||
"heart of palm": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "καρδιά φοίνικα",
|
||||
"plural_name": "heart of palm"
|
||||
"plural_name": "καρδιές φοινίκων"
|
||||
},
|
||||
"baby greens": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "baby greens",
|
||||
"plural_name": "baby greens"
|
||||
"name": "νωπά πράσινα",
|
||||
"plural_name": "νωπά πράσινα"
|
||||
},
|
||||
"pumpkin": {
|
||||
"aliases": [],
|
||||
@@ -145,7 +145,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "κουνουπίδι",
|
||||
"plural_name": "cauliflower"
|
||||
"plural_name": "κουνουπίδια"
|
||||
},
|
||||
"cabbage": {
|
||||
"aliases": [],
|
||||
@@ -156,20 +156,20 @@
|
||||
"asparagus": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "asparagus",
|
||||
"plural_name": "asparagus"
|
||||
"name": "σπαράγγι",
|
||||
"plural_name": "σπαράγγια"
|
||||
},
|
||||
"kale": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "λαχανίδα",
|
||||
"plural_name": "kale"
|
||||
"plural_name": "λαχανίδες"
|
||||
},
|
||||
"arugula": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ρόκα",
|
||||
"plural_name": "arugula"
|
||||
"plural_name": "ρόκα"
|
||||
},
|
||||
"leek": {
|
||||
"aliases": [],
|
||||
@@ -187,7 +187,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "μαρούλι",
|
||||
"plural_name": "lettuce"
|
||||
"plural_name": "μαρούλια"
|
||||
},
|
||||
"butternut squash": {
|
||||
"aliases": [],
|
||||
@@ -198,8 +198,8 @@
|
||||
"romaine lettuce": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "romaine lettuce",
|
||||
"plural_name": "romaine lettuce"
|
||||
"name": "μαρούλι romaine",
|
||||
"plural_name": "μαρούλια romaine"
|
||||
},
|
||||
"beetroot": {
|
||||
"aliases": [],
|
||||
@@ -217,7 +217,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "μάραθος",
|
||||
"plural_name": "fennel"
|
||||
"plural_name": "μάραθο"
|
||||
},
|
||||
"sun dried tomato": {
|
||||
"aliases": [],
|
||||
@@ -261,8 +261,8 @@
|
||||
"mixed greens": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mixed greens",
|
||||
"plural_name": "mixed greens"
|
||||
"name": "ανάμικτη πρασινάδα",
|
||||
"plural_name": "ανάμικτη πρασινάδα"
|
||||
},
|
||||
"parsnip": {
|
||||
"aliases": [],
|
||||
@@ -279,8 +279,8 @@
|
||||
"mixed vegetables": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mixed vegetables",
|
||||
"plural_name": "mixed vegetables"
|
||||
"name": "μιξ λαχανικών",
|
||||
"plural_name": "μιξ λαχανικών"
|
||||
},
|
||||
"poblano pepper": {
|
||||
"aliases": [],
|
||||
@@ -304,7 +304,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "πιπεριά καγιέν",
|
||||
"plural_name": "cayenne pepper"
|
||||
"plural_name": "πιπέρι καγιέν"
|
||||
},
|
||||
"green tomato": {
|
||||
"aliases": [],
|
||||
@@ -321,8 +321,8 @@
|
||||
"iceberg lettuce": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "iceberg lettuce",
|
||||
"plural_name": "iceberg lettuce"
|
||||
"name": "μαρούλι iceberg",
|
||||
"plural_name": "μαρούλια iceberg"
|
||||
},
|
||||
"mashed potato": {
|
||||
"aliases": [],
|
||||
@@ -340,13 +340,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "σέσκουλο",
|
||||
"plural_name": "chard"
|
||||
"plural_name": "σέσκουλο"
|
||||
},
|
||||
"pimiento": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "πιμιέντο",
|
||||
"plural_name": "pimientos"
|
||||
"plural_name": "πιμιέντο"
|
||||
},
|
||||
"spaghetti squash": {
|
||||
"aliases": [],
|
||||
@@ -512,7 +512,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "baby corn",
|
||||
"plural_name": "baby corns"
|
||||
"plural_name": ""
|
||||
},
|
||||
"broccoli rabe": {
|
||||
"aliases": [],
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "küüslauk",
|
||||
"plural_name": "garlic"
|
||||
"plural_name": "küüslauku"
|
||||
},
|
||||
"onion": {
|
||||
"aliases": [],
|
||||
@@ -59,7 +59,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "seller",
|
||||
"plural_name": "celery"
|
||||
"plural_name": "sellerit"
|
||||
},
|
||||
"jalapeño": {
|
||||
"aliases": [],
|
||||
@@ -95,7 +95,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "spinat",
|
||||
"plural_name": "spinach"
|
||||
"plural_name": "spinatit"
|
||||
},
|
||||
"sweet corn": {
|
||||
"aliases": [],
|
||||
@@ -145,7 +145,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "lillkapsas",
|
||||
"plural_name": "cauliflower"
|
||||
"plural_name": "lillkapsast"
|
||||
},
|
||||
"cabbage": {
|
||||
"aliases": [],
|
||||
@@ -169,7 +169,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "rukkola",
|
||||
"plural_name": "arugula"
|
||||
"plural_name": "rukolat"
|
||||
},
|
||||
"leek": {
|
||||
"aliases": [],
|
||||
@@ -321,8 +321,8 @@
|
||||
"iceberg lettuce": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "iceberg lettuce",
|
||||
"plural_name": "iceberg lettuce"
|
||||
"name": "jääkapsas",
|
||||
"plural_name": "jääkapsad"
|
||||
},
|
||||
"mashed potato": {
|
||||
"aliases": [],
|
||||
@@ -630,7 +630,7 @@
|
||||
"foods": {
|
||||
"tomato": {
|
||||
"aliases": [],
|
||||
"description": "Yes they are a fruit",
|
||||
"description": "Jah, need on puuviljad",
|
||||
"name": "tomat",
|
||||
"plural_name": "tomatit"
|
||||
},
|
||||
@@ -739,8 +739,8 @@
|
||||
"dried apricot": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dried apricot",
|
||||
"plural_name": "dried apricots"
|
||||
"name": "kuivatatud aprikoos",
|
||||
"plural_name": "kuivatatud aprikoosid"
|
||||
},
|
||||
"kiwi": {
|
||||
"aliases": [],
|
||||
@@ -853,8 +853,8 @@
|
||||
"dried fruit": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dried fruit",
|
||||
"plural_name": "dried fruits"
|
||||
"name": "kuivatatud puuvili",
|
||||
"plural_name": "kuivatatud puuviljad"
|
||||
},
|
||||
"clementine": {
|
||||
"aliases": [],
|
||||
@@ -907,8 +907,8 @@
|
||||
"banana chip": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "banana chip",
|
||||
"plural_name": "banana chips"
|
||||
"name": "banaanikrõps",
|
||||
"plural_name": "banaanikrõpsud"
|
||||
},
|
||||
"kumquat": {
|
||||
"aliases": [],
|
||||
@@ -925,8 +925,8 @@
|
||||
"dragon fruit": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dragon fruit",
|
||||
"plural_name": "dragon fruits"
|
||||
"name": "draakonivili",
|
||||
"plural_name": "draakoniviljad"
|
||||
},
|
||||
"mixed fruit": {
|
||||
"aliases": [],
|
||||
@@ -1009,8 +1009,8 @@
|
||||
"apple chip": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "apple chip",
|
||||
"plural_name": "apple chips"
|
||||
"name": "õunakrõps",
|
||||
"plural_name": "õunakrõpsu"
|
||||
},
|
||||
"mixed peel": {
|
||||
"aliases": [],
|
||||
@@ -1093,8 +1093,8 @@
|
||||
"physali": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "physali",
|
||||
"plural_name": "physalis"
|
||||
"name": "füüsal",
|
||||
"plural_name": "füüsalit"
|
||||
},
|
||||
"tamarillo": {
|
||||
"aliases": [],
|
||||
@@ -1153,8 +1153,8 @@
|
||||
"dried orange slice": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dried orange slice",
|
||||
"plural_name": "dried orange slices"
|
||||
"name": "kuivatatud apelsiniviil",
|
||||
"plural_name": "kuivatatud apelsiniviilu"
|
||||
},
|
||||
"loquat": {
|
||||
"aliases": [],
|
||||
@@ -1503,8 +1503,8 @@
|
||||
"dried cherry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dried cherry",
|
||||
"plural_name": "dried cherries"
|
||||
"name": "kuivatatud kirss",
|
||||
"plural_name": "kuivatatud kirsse"
|
||||
},
|
||||
"juniper berry": {
|
||||
"aliases": [],
|
||||
@@ -1515,8 +1515,8 @@
|
||||
"sour cherry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sour cherry",
|
||||
"plural_name": "sour cherries"
|
||||
"name": "hapu kirss",
|
||||
"plural_name": "hapusid kirsse"
|
||||
},
|
||||
"goji berry": {
|
||||
"aliases": [],
|
||||
@@ -1551,8 +1551,8 @@
|
||||
"lingonberry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "lingonberry",
|
||||
"plural_name": "lingonberries"
|
||||
"name": "pohl",
|
||||
"plural_name": "pohla"
|
||||
},
|
||||
"canned sour cherry": {
|
||||
"aliases": [],
|
||||
@@ -1593,8 +1593,8 @@
|
||||
"freeze-dried blueberry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "freeze-dried blueberry",
|
||||
"plural_name": "freeze-dried blueberries"
|
||||
"name": "külmkuivatatud mustikas",
|
||||
"plural_name": "külmkuivatatud mustikat"
|
||||
},
|
||||
"huckleberry": {
|
||||
"aliases": [],
|
||||
@@ -1617,14 +1617,14 @@
|
||||
"dried berry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "dried berry",
|
||||
"plural_name": "dried berries"
|
||||
"name": "kuivatatud mari",
|
||||
"plural_name": "kuivatatud marju"
|
||||
},
|
||||
"sea buckthorn": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sea buckthorn",
|
||||
"plural_name": "sea buckthorns"
|
||||
"name": "astelpaju",
|
||||
"plural_name": "astelpaju"
|
||||
},
|
||||
"saskatoon berry": {
|
||||
"aliases": [],
|
||||
@@ -1683,7 +1683,7 @@
|
||||
"blackcurrant leaf": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "blackcurrant leaf",
|
||||
"name": "mustsõstraleht",
|
||||
"plural_name": "blackcurrant leaves"
|
||||
},
|
||||
"haskap berry": {
|
||||
@@ -1735,13 +1735,13 @@
|
||||
"sesame seed": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sesame seed",
|
||||
"plural_name": "sesame seeds"
|
||||
"name": "seesamiseeme",
|
||||
"plural_name": "seesamiseemneid"
|
||||
},
|
||||
"cashew": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "cashew",
|
||||
"name": "India pähkel",
|
||||
"plural_name": "cashews"
|
||||
},
|
||||
"pine nut": {
|
||||
@@ -1795,7 +1795,7 @@
|
||||
"poppy seed": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "poppy seed",
|
||||
"name": "mooniseeme",
|
||||
"plural_name": "poppy seeds"
|
||||
},
|
||||
"sunflower seed": {
|
||||
@@ -1861,7 +1861,7 @@
|
||||
"watermelon seed": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "watermelon seed",
|
||||
"name": "arbuusiseeme",
|
||||
"plural_name": "watermelon seeds"
|
||||
},
|
||||
"honey-roasted peanut": {
|
||||
@@ -1873,7 +1873,7 @@
|
||||
"melon seed": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "melon seed",
|
||||
"name": "meloniseeme",
|
||||
"plural_name": "melon seeds"
|
||||
},
|
||||
"lotus seed": {
|
||||
@@ -2031,7 +2031,7 @@
|
||||
"cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "cheese",
|
||||
"name": "juust",
|
||||
"plural_name": "cheese"
|
||||
},
|
||||
"mozzarella cheese": {
|
||||
@@ -2073,8 +2073,8 @@
|
||||
"goat cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "goat cheese",
|
||||
"plural_name": "goat cheese"
|
||||
"name": "kitsejuust",
|
||||
"plural_name": "kitsejuustu"
|
||||
},
|
||||
"fresh mozzarella cheese": {
|
||||
"aliases": [],
|
||||
@@ -2187,8 +2187,8 @@
|
||||
"smoked cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "smoked cheese",
|
||||
"plural_name": "smoked cheese"
|
||||
"name": "suitsujuust",
|
||||
"plural_name": "suitsujuustu"
|
||||
},
|
||||
"halloumi cheese": {
|
||||
"aliases": [],
|
||||
@@ -2457,8 +2457,8 @@
|
||||
"hard goat cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "hard goat cheese",
|
||||
"plural_name": "hard goat cheese"
|
||||
"name": "kõva kitsejuust",
|
||||
"plural_name": "kõva kitsejuustu"
|
||||
},
|
||||
"kashkaval cheese": {
|
||||
"aliases": [],
|
||||
@@ -2469,8 +2469,8 @@
|
||||
"sheep cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sheep cheese",
|
||||
"plural_name": "sheep cheese"
|
||||
"name": "lambajuust",
|
||||
"plural_name": "lambajuustu"
|
||||
},
|
||||
"amul cheese": {
|
||||
"aliases": [],
|
||||
@@ -2630,7 +2630,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "piim",
|
||||
"plural_name": "milk"
|
||||
"plural_name": "piima"
|
||||
},
|
||||
"heavy cream": {
|
||||
"aliases": [],
|
||||
@@ -2641,8 +2641,8 @@
|
||||
"sour cream": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sour cream",
|
||||
"plural_name": "sour cream"
|
||||
"name": "hapukoor",
|
||||
"plural_name": "hapukoort"
|
||||
},
|
||||
"buttermilk": {
|
||||
"aliases": [],
|
||||
@@ -2665,14 +2665,14 @@
|
||||
"cream": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "cream",
|
||||
"plural_name": "cream"
|
||||
"name": "koor",
|
||||
"plural_name": "koort"
|
||||
},
|
||||
"whipped cream": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "vahukoor",
|
||||
"plural_name": "whipped cream"
|
||||
"plural_name": "vahukoort"
|
||||
},
|
||||
"ghee": {
|
||||
"aliases": [
|
||||
@@ -2692,7 +2692,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "kondenspiim",
|
||||
"plural_name": "condensed milk"
|
||||
"plural_name": "kondenspiima"
|
||||
},
|
||||
"half and half": {
|
||||
"aliases": [],
|
||||
@@ -2704,13 +2704,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "magustatud kondenspiim",
|
||||
"plural_name": "sweetened condensed milk"
|
||||
"plural_name": "magustatud kondenspiima"
|
||||
},
|
||||
"ice cream": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "jäätis",
|
||||
"plural_name": "ice cream"
|
||||
"plural_name": "jäätist"
|
||||
},
|
||||
"margarine": {
|
||||
"aliases": [],
|
||||
@@ -2739,7 +2739,7 @@
|
||||
"curd": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "curd",
|
||||
"name": "",
|
||||
"plural_name": "curds"
|
||||
},
|
||||
"thickened cream": {
|
||||
@@ -2787,8 +2787,8 @@
|
||||
"chocolate milk": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "chocolate milk",
|
||||
"plural_name": "chocolate milk"
|
||||
"name": "šokolaadipiim",
|
||||
"plural_name": "šokolaadipiima"
|
||||
},
|
||||
"liquid egg substitute": {
|
||||
"aliases": [],
|
||||
@@ -2811,8 +2811,8 @@
|
||||
"quail egg": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "quail egg",
|
||||
"plural_name": "quail eggs"
|
||||
"name": "vutimuna",
|
||||
"plural_name": "vutimuna"
|
||||
},
|
||||
"buttermilk powder": {
|
||||
"aliases": [],
|
||||
@@ -3045,8 +3045,8 @@
|
||||
"strawberry milk": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "strawberry milk",
|
||||
"plural_name": "strawberry milk"
|
||||
"name": "maasikapiim",
|
||||
"plural_name": "maasikapiima"
|
||||
},
|
||||
"ayran": {
|
||||
"aliases": [],
|
||||
@@ -3081,8 +3081,8 @@
|
||||
"sheep milk": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sheep milk",
|
||||
"plural_name": "sheep milk"
|
||||
"name": "lambapiim",
|
||||
"plural_name": "lambapiima"
|
||||
},
|
||||
"starter culture": {
|
||||
"aliases": [],
|
||||
@@ -3123,8 +3123,8 @@
|
||||
"goat kefir": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "goat kefir",
|
||||
"plural_name": "goat kefirs"
|
||||
"name": "kitsekeefir",
|
||||
"plural_name": "kitsekeefirit"
|
||||
},
|
||||
"lebneh": {
|
||||
"aliases": [],
|
||||
@@ -3146,7 +3146,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mandlipiim",
|
||||
"plural_name": "almond milk"
|
||||
"plural_name": "mandlipiima"
|
||||
},
|
||||
"almond butter": {
|
||||
"aliases": [],
|
||||
@@ -3205,7 +3205,7 @@
|
||||
"coconut butter": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "coconut butter",
|
||||
"name": "kookosvõi",
|
||||
"plural_name": "coconut butter"
|
||||
},
|
||||
"egg replacer": {
|
||||
@@ -3272,7 +3272,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "kaerapiim",
|
||||
"plural_name": "oat milk"
|
||||
"plural_name": "kaerapiim"
|
||||
},
|
||||
"nut butter": {
|
||||
"aliases": [],
|
||||
@@ -3284,7 +3284,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "riisipiim",
|
||||
"plural_name": "rice milk"
|
||||
"plural_name": "riisipiim"
|
||||
},
|
||||
"vegan sour cream": {
|
||||
"aliases": [],
|
||||
@@ -3755,8 +3755,8 @@
|
||||
"ground beef": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ground beef",
|
||||
"plural_name": "ground beefs"
|
||||
"name": "veisehakkliha",
|
||||
"plural_name": "veisehakkliha"
|
||||
},
|
||||
"beef steak": {
|
||||
"aliases": [],
|
||||
@@ -3809,8 +3809,8 @@
|
||||
"ground pork": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ground pork",
|
||||
"plural_name": "ground porks"
|
||||
"name": "seahakkliha",
|
||||
"plural_name": "seahakkliha"
|
||||
},
|
||||
"beef stew meat": {
|
||||
"aliases": [],
|
||||
@@ -3851,7 +3851,7 @@
|
||||
"ground lamb": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ground lamb",
|
||||
"name": "lambahakkliha",
|
||||
"plural_name": "ground lambs"
|
||||
},
|
||||
"pork rib": {
|
||||
@@ -4079,8 +4079,8 @@
|
||||
"mixed ground meat": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mixed ground meat",
|
||||
"plural_name": "mixed ground meats"
|
||||
"name": "hakklihasegu",
|
||||
"plural_name": "hakklihasegu"
|
||||
},
|
||||
"rabbit": {
|
||||
"aliases": [],
|
||||
@@ -4235,8 +4235,8 @@
|
||||
"blood sausage": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "blood sausage",
|
||||
"plural_name": "blood sausages"
|
||||
"name": "verivorst",
|
||||
"plural_name": "verivorsti"
|
||||
},
|
||||
"dried beef": {
|
||||
"aliases": [],
|
||||
@@ -4395,8 +4395,8 @@
|
||||
"chicken wing": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "chicken wing",
|
||||
"plural_name": "chicken wings"
|
||||
"name": "kanatiib",
|
||||
"plural_name": "kanatiiba"
|
||||
},
|
||||
"turkey breast": {
|
||||
"aliases": [],
|
||||
@@ -4407,8 +4407,8 @@
|
||||
"ground chicken": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ground chicken",
|
||||
"plural_name": "ground chickens"
|
||||
"name": "kanahakkliha",
|
||||
"plural_name": "kanahakkliha"
|
||||
},
|
||||
"rotisserie chicken": {
|
||||
"aliases": [],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "czosnek",
|
||||
"plural_name": "garlic"
|
||||
"plural_name": "czosnek"
|
||||
},
|
||||
"onion": {
|
||||
"aliases": [],
|
||||
@@ -59,13 +59,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "seler naciowy",
|
||||
"plural_name": "celery"
|
||||
"plural_name": "seler"
|
||||
},
|
||||
"jalapeño": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "jalapeño",
|
||||
"plural_name": "jalapeños"
|
||||
"name": "papryczka jalapeño",
|
||||
"plural_name": "papryczki jalapeño"
|
||||
},
|
||||
"avocado": {
|
||||
"aliases": [],
|
||||
@@ -95,13 +95,13 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "szpinak",
|
||||
"plural_name": "spinach"
|
||||
"plural_name": "szpinak"
|
||||
},
|
||||
"sweet corn": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "kukurydza cukrowa",
|
||||
"plural_name": "sweet corn"
|
||||
"plural_name": "kukurydza cukrowa"
|
||||
},
|
||||
"chile pepper": {
|
||||
"aliases": [
|
||||
@@ -121,19 +121,19 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "brokuł",
|
||||
"plural_name": "broccoli"
|
||||
"plural_name": "brokuł"
|
||||
},
|
||||
"heart of palm": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "serce palmy",
|
||||
"plural_name": "heart of palm"
|
||||
"plural_name": "serce palmy"
|
||||
},
|
||||
"baby greens": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "baby greens",
|
||||
"plural_name": "baby greens"
|
||||
"name": "młode liście",
|
||||
"plural_name": "młode liście"
|
||||
},
|
||||
"pumpkin": {
|
||||
"aliases": [],
|
||||
@@ -145,7 +145,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "kalafior",
|
||||
"plural_name": "cauliflower"
|
||||
"plural_name": "kalafior"
|
||||
},
|
||||
"cabbage": {
|
||||
"aliases": [],
|
||||
@@ -156,20 +156,20 @@
|
||||
"asparagus": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "asparagus",
|
||||
"plural_name": "asparagus"
|
||||
"name": "szparagi",
|
||||
"plural_name": "szparagi"
|
||||
},
|
||||
"kale": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "jarmuż",
|
||||
"plural_name": "kale"
|
||||
"plural_name": "jarmuż"
|
||||
},
|
||||
"arugula": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "rukola",
|
||||
"plural_name": "arugula"
|
||||
"plural_name": "rukola"
|
||||
},
|
||||
"leek": {
|
||||
"aliases": [],
|
||||
@@ -187,7 +187,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sałata",
|
||||
"plural_name": "lettuce"
|
||||
"plural_name": "sałata"
|
||||
},
|
||||
"butternut squash": {
|
||||
"aliases": [],
|
||||
@@ -198,8 +198,8 @@
|
||||
"romaine lettuce": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "romaine lettuce",
|
||||
"plural_name": "romaine lettuce"
|
||||
"name": "sałata rzymska",
|
||||
"plural_name": "sałata rzymska"
|
||||
},
|
||||
"beetroot": {
|
||||
"aliases": [],
|
||||
@@ -217,7 +217,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "koper włoski",
|
||||
"plural_name": "fennel"
|
||||
"plural_name": "koper włoski"
|
||||
},
|
||||
"sun dried tomato": {
|
||||
"aliases": [],
|
||||
@@ -261,8 +261,8 @@
|
||||
"mixed greens": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mixed greens",
|
||||
"plural_name": "mixed greens"
|
||||
"name": "mieszanka zielenin",
|
||||
"plural_name": "mieszanka zielenin"
|
||||
},
|
||||
"parsnip": {
|
||||
"aliases": [],
|
||||
@@ -279,8 +279,8 @@
|
||||
"mixed vegetables": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "mixed vegetables",
|
||||
"plural_name": "mixed vegetables"
|
||||
"name": "mieszanka warzywna",
|
||||
"plural_name": "mieszanki warzywne"
|
||||
},
|
||||
"poblano pepper": {
|
||||
"aliases": [],
|
||||
@@ -304,7 +304,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "pieprz cayenne",
|
||||
"plural_name": "cayenne pepper"
|
||||
"plural_name": "pieprz cayenne"
|
||||
},
|
||||
"green tomato": {
|
||||
"aliases": [],
|
||||
@@ -321,8 +321,8 @@
|
||||
"iceberg lettuce": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "iceberg lettuce",
|
||||
"plural_name": "iceberg lettuce"
|
||||
"name": "sałata lodowa",
|
||||
"plural_name": "sałaty lodowe"
|
||||
},
|
||||
"mashed potato": {
|
||||
"aliases": [],
|
||||
@@ -340,7 +340,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "botwina",
|
||||
"plural_name": "chard"
|
||||
"plural_name": "botwina"
|
||||
},
|
||||
"pimiento": {
|
||||
"aliases": [],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -60,6 +60,6 @@
|
||||
"name": "Alcohol"
|
||||
},
|
||||
{
|
||||
"name": "Anders"
|
||||
"name": "Overige"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -139,8 +139,8 @@
|
||||
"abbreviation": ""
|
||||
},
|
||||
"sprig": {
|
||||
"name": "sprig",
|
||||
"plural_name": "sprigs",
|
||||
"name": "Zweig",
|
||||
"plural_name": "Zweige",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
}
|
||||
|
||||
@@ -139,8 +139,8 @@
|
||||
"abbreviation": ""
|
||||
},
|
||||
"sprig": {
|
||||
"name": "sprig",
|
||||
"plural_name": "sprigs",
|
||||
"name": "gałązka",
|
||||
"plural_name": "gałązki",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
}
|
||||
|
||||
@@ -1,146 +1,146 @@
|
||||
{
|
||||
"teaspoon": {
|
||||
"name": "кашичица",
|
||||
"plural_name": "teaspoons",
|
||||
"plural_name": "кашичица",
|
||||
"description": "",
|
||||
"abbreviation": "кашичица"
|
||||
},
|
||||
"tablespoon": {
|
||||
"name": "кашика",
|
||||
"plural_name": "tablespoons",
|
||||
"plural_name": "кашика",
|
||||
"description": "",
|
||||
"abbreviation": "кашика"
|
||||
},
|
||||
"cup": {
|
||||
"name": "шоља",
|
||||
"plural_name": "cups",
|
||||
"plural_name": "шоља",
|
||||
"description": "",
|
||||
"abbreviation": "c"
|
||||
"abbreviation": "шоља"
|
||||
},
|
||||
"fluid-ounce": {
|
||||
"name": "течна унца",
|
||||
"plural_name": "fluid ounces",
|
||||
"plural_name": "течна унца",
|
||||
"description": "",
|
||||
"abbreviation": "течна унца"
|
||||
},
|
||||
"pint": {
|
||||
"name": "пинта",
|
||||
"plural_name": "pints",
|
||||
"plural_name": "пинте",
|
||||
"description": "",
|
||||
"abbreviation": "pt"
|
||||
},
|
||||
"quart": {
|
||||
"name": "четврт галона",
|
||||
"plural_name": "quarts",
|
||||
"plural_name": "четврт галона",
|
||||
"description": "",
|
||||
"abbreviation": "qt"
|
||||
},
|
||||
"gallon": {
|
||||
"name": "галон",
|
||||
"plural_name": "gallons",
|
||||
"plural_name": "галона",
|
||||
"description": "",
|
||||
"abbreviation": "гал"
|
||||
"abbreviation": "gal"
|
||||
},
|
||||
"milliliter": {
|
||||
"name": "милиметар",
|
||||
"plural_name": "milliliters",
|
||||
"plural_name": "милиметара",
|
||||
"description": "",
|
||||
"abbreviation": "мл"
|
||||
"abbreviation": "ml"
|
||||
},
|
||||
"liter": {
|
||||
"name": "литар",
|
||||
"plural_name": "liters",
|
||||
"plural_name": "литара",
|
||||
"description": "",
|
||||
"abbreviation": "л"
|
||||
"abbreviation": "l"
|
||||
},
|
||||
"pound": {
|
||||
"name": "фунта",
|
||||
"plural_name": "pounds",
|
||||
"plural_name": "фунти",
|
||||
"description": "",
|
||||
"abbreviation": "lb",
|
||||
"plural_abbreviation": "lbs"
|
||||
},
|
||||
"ounce": {
|
||||
"name": "унца",
|
||||
"plural_name": "ounces",
|
||||
"plural_name": "унци",
|
||||
"description": "",
|
||||
"abbreviation": "унца (oz)"
|
||||
},
|
||||
"gram": {
|
||||
"name": "грам",
|
||||
"plural_name": "grams",
|
||||
"plural_name": "грама",
|
||||
"description": "",
|
||||
"abbreviation": "г"
|
||||
},
|
||||
"kilogram": {
|
||||
"name": "килограм",
|
||||
"plural_name": "kilograms",
|
||||
"plural_name": "килограма",
|
||||
"description": "",
|
||||
"abbreviation": "кг"
|
||||
},
|
||||
"milligram": {
|
||||
"name": "милиграм",
|
||||
"plural_name": "milligrams",
|
||||
"plural_name": "милиграма",
|
||||
"description": "",
|
||||
"abbreviation": "мг"
|
||||
},
|
||||
"splash": {
|
||||
"name": "мала количина (splash)",
|
||||
"plural_name": "splashes",
|
||||
"plural_name": "неколико капи",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"dash": {
|
||||
"name": "осмина кашичице",
|
||||
"plural_name": "dashes",
|
||||
"plural_name": "на врх ножа",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"serving": {
|
||||
"name": "порција",
|
||||
"plural_name": "servings",
|
||||
"plural_name": "порција",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"head": {
|
||||
"name": "head",
|
||||
"plural_name": "heads",
|
||||
"plural_name": "главица",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"clove": {
|
||||
"name": "клинчић",
|
||||
"plural_name": "cloves",
|
||||
"plural_name": "чешњева",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"can": {
|
||||
"name": "конзерва",
|
||||
"plural_name": "cans",
|
||||
"plural_name": "конзерви",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"bunch": {
|
||||
"name": "bunch",
|
||||
"plural_name": "bunches",
|
||||
"name": "доста",
|
||||
"plural_name": "доста",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"pack": {
|
||||
"name": "pack",
|
||||
"plural_name": "packs",
|
||||
"name": "паковање",
|
||||
"plural_name": "паковања",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"pinch": {
|
||||
"name": "pinch",
|
||||
"plural_name": "pinches",
|
||||
"name": "напрстак",
|
||||
"plural_name": "напрстака",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
},
|
||||
"sprig": {
|
||||
"name": "sprig",
|
||||
"plural_name": "sprigs",
|
||||
"name": "гранчица",
|
||||
"plural_name": "гранчица",
|
||||
"description": "",
|
||||
"abbreviation": ""
|
||||
}
|
||||
|
||||
@@ -99,7 +99,12 @@ async def oauth_login(request: Request):
|
||||
# in development, we want to redirect to the frontend
|
||||
redirect_url = "http://localhost:3000/login"
|
||||
else:
|
||||
redirect_url = URLPath("/login").make_absolute_url(request.base_url)
|
||||
# Prioritize User Configuration over Request Headers.
|
||||
if not settings.is_default_base_url:
|
||||
base = settings.BASE_URL or request.base_url
|
||||
else:
|
||||
base = request.base_url
|
||||
redirect_url = URLPath("/login").make_absolute_url(base)
|
||||
|
||||
response: RedirectResponse = await client.authorize_redirect(request, redirect_url)
|
||||
return response
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from enum import Enum
|
||||
from enum import StrEnum
|
||||
|
||||
from fastapi import APIRouter, HTTPException, status
|
||||
from pydantic import UUID4
|
||||
@@ -10,7 +10,7 @@ from mealie.schema.recipe.recipe_timeline_events import RecipeTimelineEventOut
|
||||
router = APIRouter(prefix="/recipes")
|
||||
|
||||
|
||||
class ImageType(str, Enum):
|
||||
class ImageType(StrEnum):
|
||||
original = "original.webp"
|
||||
small = "min-original.webp"
|
||||
tiny = "tiny-original.webp"
|
||||
|
||||
@@ -11,7 +11,7 @@ from mealie.db.models.household.cookbook import CookBook
|
||||
from mealie.db.models.recipe import RecipeModel
|
||||
from mealie.schema._mealie import MealieModel
|
||||
from mealie.schema.response.pagination import PaginationBase
|
||||
from mealie.schema.response.query_filter import QueryFilterBuilder, QueryFilterJSON
|
||||
from mealie.services.query_filter.builder import QueryFilterBuilder, QueryFilterJSON
|
||||
|
||||
logger = get_logger()
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import enum
|
||||
from mealie.schema._mealie import MealieModel
|
||||
|
||||
|
||||
class SupportedMigrations(str, enum.Enum):
|
||||
class SupportedMigrations(enum.StrEnum):
|
||||
nextcloud = "nextcloud"
|
||||
chowdown = "chowdown"
|
||||
copymethat = "copymethat"
|
||||
|
||||
@@ -9,7 +9,7 @@ from mealie.schema._mealie.datetime_parse import parse_datetime
|
||||
from mealie.schema.response.pagination import PaginationBase
|
||||
|
||||
|
||||
class WebhookType(str, enum.Enum):
|
||||
class WebhookType(enum.StrEnum):
|
||||
mealplan = "mealplan"
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from datetime import date
|
||||
from enum import Enum
|
||||
from enum import StrEnum
|
||||
from typing import Annotated
|
||||
from uuid import UUID
|
||||
|
||||
@@ -16,7 +16,7 @@ from mealie.schema.recipe.recipe import RecipeSummary
|
||||
from mealie.schema.response.pagination import PaginationBase
|
||||
|
||||
|
||||
class PlanEntryType(str, Enum):
|
||||
class PlanEntryType(StrEnum):
|
||||
breakfast = "breakfast"
|
||||
lunch = "lunch"
|
||||
dinner = "dinner"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import datetime
|
||||
from enum import Enum
|
||||
from enum import StrEnum
|
||||
from typing import Annotated
|
||||
|
||||
import sqlalchemy as sa
|
||||
@@ -9,12 +9,12 @@ from mealie.core.root_logger import get_logger
|
||||
from mealie.db.models.recipe import RecipeModel
|
||||
from mealie.schema._mealie import MealieModel
|
||||
from mealie.schema.response.pagination import PaginationBase
|
||||
from mealie.schema.response.query_filter import QueryFilterBuilder, QueryFilterJSON
|
||||
from mealie.services.query_filter.builder import QueryFilterBuilder, QueryFilterJSON
|
||||
|
||||
logger = get_logger()
|
||||
|
||||
|
||||
class PlanRulesDay(str, Enum):
|
||||
class PlanRulesDay(StrEnum):
|
||||
monday = "monday"
|
||||
tuesday = "tuesday"
|
||||
wednesday = "wednesday"
|
||||
@@ -33,7 +33,7 @@ class PlanRulesDay(str, Enum):
|
||||
return PlanRulesDay.unset
|
||||
|
||||
|
||||
class PlanRulesType(str, Enum):
|
||||
class PlanRulesType(StrEnum):
|
||||
breakfast = "breakfast"
|
||||
lunch = "lunch"
|
||||
dinner = "dinner"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# This file is auto-generated by gen_schema_exports.py
|
||||
from .general import OpenAIText
|
||||
from .recipe import OpenAIRecipe, OpenAIRecipeIngredient, OpenAIRecipeInstruction, OpenAIRecipeNotes
|
||||
from .recipe_ingredient import OpenAIIngredient, OpenAIIngredients
|
||||
|
||||
@@ -9,4 +10,5 @@ __all__ = [
|
||||
"OpenAIRecipeIngredient",
|
||||
"OpenAIRecipeInstruction",
|
||||
"OpenAIRecipeNotes",
|
||||
"OpenAIText",
|
||||
]
|
||||
|
||||
@@ -5,7 +5,7 @@ from mealie.schema.recipe.recipe_category import CategoryBase, TagBase
|
||||
from mealie.schema.recipe.recipe_settings import RecipeSettings
|
||||
|
||||
|
||||
class ExportTypes(str, enum.Enum):
|
||||
class ExportTypes(enum.StrEnum):
|
||||
JSON = "json"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from enum import Enum
|
||||
from enum import StrEnum
|
||||
|
||||
|
||||
class RecipeImageTypes(str, Enum):
|
||||
class RecipeImageTypes(StrEnum):
|
||||
original = "original.webp"
|
||||
min = "min-original.webp"
|
||||
tiny = "tiny-original.webp"
|
||||
|
||||
@@ -320,7 +320,7 @@ class ParsedIngredient(MealieModel):
|
||||
ingredient: RecipeIngredient
|
||||
|
||||
|
||||
class RegisteredParser(str, enum.Enum):
|
||||
class RegisteredParser(enum.StrEnum):
|
||||
nlp = "nlp"
|
||||
brute = "brute"
|
||||
openai = "openai"
|
||||
|
||||
@@ -11,14 +11,14 @@ from mealie.db.models.group import ReportModel
|
||||
from mealie.schema._mealie import MealieModel
|
||||
|
||||
|
||||
class ReportCategory(str, enum.Enum):
|
||||
class ReportCategory(enum.StrEnum):
|
||||
backup = "backup"
|
||||
restore = "restore"
|
||||
migration = "migration"
|
||||
bulk_import = "bulk_import"
|
||||
|
||||
|
||||
class ReportSummaryStatus(str, enum.Enum):
|
||||
class ReportSummaryStatus(enum.StrEnum):
|
||||
in_progress = "in-progress"
|
||||
success = "success"
|
||||
failure = "failure"
|
||||
|
||||
@@ -7,15 +7,6 @@ from .pagination import (
|
||||
RecipeSearchQuery,
|
||||
RequestQuery,
|
||||
)
|
||||
from .query_filter import (
|
||||
LogicalOperator,
|
||||
QueryFilterBuilder,
|
||||
QueryFilterBuilderComponent,
|
||||
QueryFilterJSON,
|
||||
QueryFilterJSONPart,
|
||||
RelationalKeyword,
|
||||
RelationalOperator,
|
||||
)
|
||||
from .query_search import SearchFilter
|
||||
from .responses import ErrorResponse, FileTokenResponse, SuccessResponse
|
||||
from .validation import ValidationResponse
|
||||
@@ -25,13 +16,6 @@ __all__ = [
|
||||
"FileTokenResponse",
|
||||
"SuccessResponse",
|
||||
"SearchFilter",
|
||||
"LogicalOperator",
|
||||
"QueryFilterBuilder",
|
||||
"QueryFilterBuilderComponent",
|
||||
"QueryFilterJSON",
|
||||
"QueryFilterJSONPart",
|
||||
"RelationalKeyword",
|
||||
"RelationalOperator",
|
||||
"OrderByNullPosition",
|
||||
"OrderDirection",
|
||||
"PaginationBase",
|
||||
|
||||
@@ -9,12 +9,12 @@ from pydantic_core.core_schema import ValidationInfo
|
||||
from mealie.schema._mealie import MealieModel
|
||||
|
||||
|
||||
class OrderDirection(str, enum.Enum):
|
||||
class OrderDirection(enum.StrEnum):
|
||||
asc = "asc"
|
||||
desc = "desc"
|
||||
|
||||
|
||||
class OrderByNullPosition(str, enum.Enum):
|
||||
class OrderByNullPosition(enum.StrEnum):
|
||||
first = "first"
|
||||
last = "last"
|
||||
|
||||
|
||||
0
mealie/services/query_filter/__init__.py
Normal file
0
mealie/services/query_filter/__init__.py
Normal file
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user