Compare commits

..

14 Commits

Author SHA1 Message Date
Hayden
b54cdf6425 fix: sync locales in user registration validation (#3278)
* Add ability to inject into Python files

* Update outdated references to gen_global_components.py

* Add code gen for registration locale validation

* sort validators

* update for pydantic 2

* run generator again

---------

Co-authored-by: Gasper Gril <gasper@gril.si>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2024-03-10 09:58:52 -08:00
Hayden
02da2114f9 New Crowdin updates (#3277)
* New translations en-us.json (Spanish)

* New translations en-us.json (Swedish)

* New translations en-us.json (English, United Kingdom)

* New translations en-us.json (Polish)

* New translations en-us.json (Romanian)

* New translations en-us.json (French)

* New translations en-us.json (Afrikaans)

* New translations en-us.json (Arabic)

* New translations en-us.json (Bulgarian)

* New translations en-us.json (Catalan)

* New translations en-us.json (Czech)

* New translations en-us.json (Danish)

* New translations en-us.json (German)

* New translations en-us.json (Greek)

* New translations en-us.json (Finnish)

* New translations en-us.json (Hebrew)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Italian)

* New translations en-us.json (Japanese)

* New translations en-us.json (Korean)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Dutch)

* New translations en-us.json (Norwegian)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Slovak)

* New translations en-us.json (Slovenian)

* New translations en-us.json (Serbian (Cyrillic))

* New translations en-us.json (Turkish)

* New translations en-us.json (Ukrainian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Chinese Traditional)

* New translations en-us.json (Vietnamese)

* New translations en-us.json (Galician)

* New translations en-us.json (Icelandic)

* New translations en-us.json (Portuguese, Brazilian)

* New translations en-us.json (Croatian)

* New translations en-us.json (Latvian)

* New translations en-us.json (French, Canada)
2024-03-10 15:01:47 +01:00
boc-the-git
a67533a778 Merge pull request #3276 from mealie-recipes/renovate/apprise-1.x-lockfile
fix(deps): update dependency apprise to v1.7.4
2024-03-10 21:37:15 +11:00
renovate[bot]
59ad834c12 fix(deps): update dependency apprise to v1.7.4 2024-03-09 23:19:43 +00:00
Michael Genson
315d5b370e fix: bump ruff (#3275)
* bump ruff

* updated deprecated cli usage

* fixed deprecated pyproject layout

* fixed .format string

* fixed another deprecated setting
2024-03-09 18:40:08 +00:00
Michael Genson
130813ffe4 fix: Make Meal Planner Notes Not Clickable (#3274)
* selectively remove recipe card components when there is no recipe

* copied changes to regular card
2024-03-09 09:29:41 -09:00
renovate[bot]
65ddb7c9e2 chore(deps): update dependency pytest to v8.1.1 (#3244)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-09 11:55:16 -06:00
renovate[bot]
dbe29e15ae fix(deps): update dependency uvicorn to ^0.28.0 (#3273)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-09 16:36:18 +00:00
boc-the-git
980b3c634b Change "New" to "Add" (#3271) 2024-03-09 10:26:55 -06:00
renovate[bot]
457d8c93ce chore(deps): update dependency mypy to v1.9.0 (#3270)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-08 13:22:54 -06:00
Hayden
23aad6358c New Crowdin updates (#3269)
* New translations en-us.json (French)

* New translations en-us.json (Italian)

* New translations en-us.json (Slovenian)

* New translations en-us.json (Turkish)

* New translations en-us.json (Ukrainian)
2024-03-08 14:05:19 +01:00
boc-the-git
7c896361f2 Merge pull request #3268 from mealie-recipes/docs/newrelease-update-version-v1.3.1
docs(auto): Update image tag, for release v1.3.1
2024-03-08 19:26:51 +11:00
boc-the-git
5b7f5738e3 Add a comment to kick PR3268 along, and for future reference 2024-03-08 19:20:31 +11:00
boc-the-git
5bfcb80c98 Update image tag, for release v1.3.1 2024-03-08 02:50:52 +00:00
63 changed files with 280 additions and 217 deletions

View File

@@ -68,6 +68,9 @@ jobs:
- name: Create Pull Request - name: Create Pull Request
uses: peter-evans/create-pull-request@v6 uses: peter-evans/create-pull-request@v6
# This doesn't currently work for us because it creates the PR but the workflows don't run.
# TODO: Provide a personal access token as a parameter here, that solves that problem.
# https://github.com/peter-evans/create-pull-request
with: with:
commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}" commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}"
branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}" branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}"

View File

@@ -110,7 +110,7 @@ tasks:
py:lint: py:lint:
desc: runs python linter desc: runs python linter
cmds: cmds:
- poetry run ruff mealie - poetry run ruff check mealie
py:check: py:check:
desc: runs all linters, type checkers, and formatters desc: runs all linters, type checkers, and formatters

View File

@@ -3,8 +3,8 @@ from pathlib import Path
from fastapi import FastAPI from fastapi import FastAPI
from jinja2 import Template from jinja2 import Template
from pydantic import BaseModel from pydantic import BaseModel, ConfigDict
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject, RequestType
CWD = Path(__file__).parent CWD = Path(__file__).parent
@@ -12,23 +12,25 @@ OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
class PathObject(BaseModel): class PathObject(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
route_object: RouteObject route_object: RouteObject
http_verbs: list[HTTPRequest] http_verbs: list[HTTPRequest]
class Config:
arbitrary_types_allowed = True
def get_path_objects(app: FastAPI): def get_path_objects(app: FastAPI):
paths = [] paths = []
for key, value in app.openapi().items(): for key, value in app.openapi().items():
if key == "paths": if key == "paths":
for key, value in value.items(): for key, value2 in value.items():
verbs = []
for k, v in value2.items():
verbs.append(HTTPRequest(request_type=k, **v))
paths.append( paths.append(
PathObject( PathObject(
route_object=RouteObject(key), route_object=RouteObject(key),
http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()], http_verbs=verbs,
) )
) )

View File

@@ -5,7 +5,7 @@ from pathlib import Path
import dotenv import dotenv
import requests import requests
from jinja2 import Template from jinja2 import Template
from pydantic import Extra from pydantic import ConfigDict
from requests import Response from requests import Response
from utils import CodeDest, CodeKeys, inject_inline, log from utils import CodeDest, CodeKeys, inject_inline, log
@@ -56,7 +56,7 @@ LOCALE_DATA: dict[str, LocaleData] = {
"zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"), "zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"),
} }
LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py LOCALE_TEMPLATE = """// This Code is auto generated by gen_ts_locales.py
export const LOCALES = [{% for locale in locales %} export const LOCALES = [{% for locale in locales %}
{ {
name: "{{ locale.name }}", name: "{{ locale.name }}",
@@ -70,6 +70,8 @@ export const LOCALES = [{% for locale in locales %}
class TargetLanguage(MealieModel): class TargetLanguage(MealieModel):
model_config = ConfigDict(populate_by_name=True, extra="allow")
id: str id: str
name: str name: str
locale: str locale: str
@@ -78,10 +80,6 @@ class TargetLanguage(MealieModel):
twoLettersCode: str twoLettersCode: str
progress: float = 0.0 progress: float = 0.0
class Config:
extra = Extra.allow
allow_population_by_field_name = True
class CrowdinApi: class CrowdinApi:
project_name = "Mealie" project_name = "Mealie"
@@ -152,6 +150,7 @@ PROJECT_DIR = Path(__file__).parent.parent.parent
datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats" datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats"
locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages" locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages"
nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js" nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js"
reg_valid = PROJECT_DIR / "mealie" / "schema" / "_mealie" / "validators.py"
""" """
This snippet walks the message and dat locales directories and generates the import information This snippet walks the message and dat locales directories and generates the import information
@@ -175,6 +174,19 @@ def inject_nuxt_values():
inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales) inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales)
def inject_registration_validation_values():
all_langs = []
for match in locales_dir.glob("*.json"):
lang_string = f'"{match.stem}",'
all_langs.append(lang_string)
# sort
all_langs.sort()
log.debug(f"injecting locales into user registration validation -> {reg_valid}")
inject_inline(reg_valid, CodeKeys.nuxt_local_messages, all_langs)
def generate_locales_ts_file(): def generate_locales_ts_file():
api = CrowdinApi("") api = CrowdinApi("")
models = api.get_languages() models = api.get_languages()
@@ -193,6 +205,7 @@ def main():
generate_locales_ts_file() generate_locales_ts_file()
inject_nuxt_values() inject_nuxt_values()
inject_registration_validation_values()
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -6,7 +6,7 @@ from utils import log
# ============================================================ # ============================================================
template = """// This Code is auto generated by gen_global_components.py template = """// This Code is auto generated by gen_ts_types.py
{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue"; {% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue"; {% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
{% endfor %} {% endfor %}

View File

@@ -1,9 +1,8 @@
import re import re
from enum import Enum from enum import Enum
from typing import Optional
from humps import camelize from humps import camelize
from pydantic import BaseModel, Extra, Field from pydantic import BaseModel, ConfigDict, Field
from slugify import slugify from slugify import slugify
@@ -34,33 +33,30 @@ class ParameterIn(str, Enum):
class RouterParameter(BaseModel): class RouterParameter(BaseModel):
model_config = ConfigDict(extra="allow")
required: bool = False required: bool = False
name: str name: str
location: ParameterIn = Field(..., alias="in") location: ParameterIn = Field(..., alias="in")
class Config:
extra = Extra.allow
class RequestBody(BaseModel): class RequestBody(BaseModel):
required: bool = False model_config = ConfigDict(extra="allow")
class Config: required: bool = False
extra = Extra.allow
class HTTPRequest(BaseModel): class HTTPRequest(BaseModel):
model_config = ConfigDict(extra="allow", populate_by_name=True)
request_type: RequestType request_type: RequestType
description: str = "" description: str = ""
summary: str summary: str
requestBody: Optional[RequestBody] request_body: RequestBody | None = None
parameters: list[RouterParameter] = [] parameters: list[RouterParameter] = []
tags: list[str] | None = [] tags: list[str] | None = []
class Config:
extra = Extra.allow
def list_as_js_object_string(self, parameters, braces=True): def list_as_js_object_string(self, parameters, braces=True):
if len(parameters) == 0: if len(parameters) == 0:
return "" return ""
@@ -71,11 +67,11 @@ class HTTPRequest(BaseModel):
return ", ".join(parameters) return ", ".join(parameters)
def payload(self): def payload(self):
return "payload" if self.requestBody else "" return "payload" if self.request_body else ""
def function_args(self): def function_args(self):
all_params = [p.name for p in self.parameters] all_params = [p.name for p in self.parameters]
if self.requestBody: if self.request_body:
all_params.append("payload") all_params.append("payload")
return self.list_as_js_object_string(all_params) return self.list_as_js_object_string(all_params)

View File

@@ -50,7 +50,7 @@ class CodeSlicer:
self._next_line += 1 self._next_line += 1
def get_indentation_of_string(line: str, comment_char: str = "//") -> str: def get_indentation_of_string(line: str, comment_char: str = "//|#") -> str:
return re.sub(rf"{comment_char}.*", "", line).removesuffix("\n") return re.sub(rf"{comment_char}.*", "", line).removesuffix("\n")

View File

@@ -9,7 +9,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
version: "3.7" version: "3.7"
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3) image: ghcr.io/mealie-recipes/mealie:v1.3.1 # (3)
container_name: mealie container_name: mealie
ports: ports:
- "9925:9000" # (1) - "9925:9000" # (1)

View File

@@ -13,7 +13,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
version: "3.7" version: "3.7"
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3) image: ghcr.io/mealie-recipes/mealie:v1.3.1 # (3)
container_name: mealie container_name: mealie
ports: ports:
- "9925:9000" # (1) - "9925:9000" # (1)

View File

@@ -3,8 +3,9 @@
<v-hover v-slot="{ hover }" :open-delay="50"> <v-hover v-slot="{ hover }" :open-delay="50">
<v-card <v-card
:class="{ 'on-hover': hover }" :class="{ 'on-hover': hover }"
:style="{ cursor }"
:elevation="hover ? 12 : 2" :elevation="hover ? 12 : 2"
:to="route ? recipeRoute : ''" :to="recipeRoute"
:min-height="imageHeight + 75" :min-height="imageHeight + 75"
@click="$emit('click')" @click="$emit('click')"
> >
@@ -33,7 +34,7 @@
</v-card-title> </v-card-title>
<slot name="actions"> <slot name="actions">
<v-card-actions class="px-1"> <v-card-actions v-if="showRecipeContent" class="px-1">
<RecipeFavoriteBadge v-if="isOwnGroup" class="absolute" :slug="slug" show-always /> <RecipeFavoriteBadge v-if="isOwnGroup" class="absolute" :slug="slug" show-always />
<RecipeRating class="pb-1" :value="rating" :name="name" :slug="slug" :small="true" /> <RecipeRating class="pb-1" :value="rating" :name="name" :slug="slug" :small="true" />
@@ -101,10 +102,6 @@ export default defineComponent({
required: false, required: false,
default: "abc123", default: "abc123",
}, },
route: {
type: Boolean,
default: true,
},
tags: { tags: {
type: Array, type: Array,
default: () => [], default: () => [],
@@ -123,14 +120,18 @@ export default defineComponent({
const { isOwnGroup } = useLoggedInState(); const { isOwnGroup } = useLoggedInState();
const route = useRoute(); const route = useRoute();
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "") const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
const showRecipeContent = computed(() => props.recipeId && props.slug);
const recipeRoute = computed<string>(() => { const recipeRoute = computed<string>(() => {
return `/g/${groupSlug.value}/r/${props.slug}`; return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
}); });
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
return { return {
isOwnGroup, isOwnGroup,
recipeRoute, recipeRoute,
showRecipeContent,
cursor,
}; };
}, },
}); });

View File

@@ -3,6 +3,7 @@
<v-card <v-card
:ripple="false" :ripple="false"
:class="isFlat ? 'mx-auto flat' : 'mx-auto'" :class="isFlat ? 'mx-auto flat' : 'mx-auto'"
:style="{ cursor }"
hover hover
:to="$listeners.selected ? undefined : recipeRoute" :to="$listeners.selected ? undefined : recipeRoute"
@click="$emit('selected')" @click="$emit('selected')"
@@ -37,8 +38,9 @@
</v-list-item-subtitle> </v-list-item-subtitle>
<div class="d-flex flex-wrap justify-end align-center"> <div class="d-flex flex-wrap justify-end align-center">
<slot name="actions"> <slot name="actions">
<RecipeFavoriteBadge v-if="isOwnGroup" :slug="slug" show-always /> <RecipeFavoriteBadge v-if="isOwnGroup && showRecipeContent" :slug="slug" show-always />
<v-rating <v-rating
v-if="showRecipeContent"
color="secondary" color="secondary"
:class="isOwnGroup ? 'ml-auto' : 'ml-auto pb-2'" :class="isOwnGroup ? 'ml-auto' : 'ml-auto pb-2'"
background-color="secondary lighten-3" background-color="secondary lighten-3"
@@ -52,7 +54,7 @@
<!-- If we're not logged-in, no items display, so we hide this menu --> <!-- If we're not logged-in, no items display, so we hide this menu -->
<!-- We also add padding to the v-rating above to compensate --> <!-- We also add padding to the v-rating above to compensate -->
<RecipeContextMenu <RecipeContextMenu
v-if="isOwnGroup" v-if="isOwnGroup && showRecipeContent"
:slug="slug" :slug="slug"
:menu-icon="$globals.icons.dotsHorizontal" :menu-icon="$globals.icons.dotsHorizontal"
:name="name" :name="name"
@@ -113,10 +115,6 @@ export default defineComponent({
required: false, required: false,
default: "abc123", default: "abc123",
}, },
route: {
type: Boolean,
default: true,
},
recipeId: { recipeId: {
type: String, type: String,
required: true, required: true,
@@ -135,14 +133,19 @@ export default defineComponent({
const { isOwnGroup } = useLoggedInState(); const { isOwnGroup } = useLoggedInState();
const route = useRoute(); const route = useRoute();
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "") const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
const showRecipeContent = computed(() => props.recipeId && props.slug);
const recipeRoute = computed<string>(() => { const recipeRoute = computed<string>(() => {
return `/g/${groupSlug.value}/r/${props.slug}`; return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
}); });
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
return { return {
isOwnGroup, isOwnGroup,
recipeRoute, recipeRoute,
showRecipeContent,
cursor,
}; };
}, },
}); });

View File

@@ -45,7 +45,6 @@
:rating="recipe.rating" :rating="recipe.rating"
:image="recipe.image" :image="recipe.image"
:recipe-id="recipe.id" :recipe-id="recipe.id"
:route="true"
v-on="$listeners.selected ? { selected: () => handleSelect(recipe) } : {}" v-on="$listeners.selected ? { selected: () => handleSelect(recipe) } : {}"
/> />
</v-card> </v-card>

View File

@@ -24,7 +24,7 @@
</div> </div>
<div v-if="edit" class="d-flex justify-end"> <div v-if="edit" class="d-flex justify-end">
<BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.new") }}</BaseButton> <BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.add") }}</BaseButton>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -51,7 +51,7 @@
/> />
<div v-if="isEditForm" class="d-flex"> <div v-if="isEditForm" class="d-flex">
<RecipeDialogBulkAdd class="ml-auto my-2 mr-1" @bulk-data="addStep" /> <RecipeDialogBulkAdd class="ml-auto my-2 mr-1" @bulk-data="addStep" />
<BaseButton class="my-2" @click="addStep()"> {{ $t("general.new") }}</BaseButton> <BaseButton class="my-2" @click="addStep()"> {{ $t("general.add") }}</BaseButton>
</div> </div>
<div v-if="!$vuetify.breakpoint.mdAndUp"> <div v-if="!$vuetify.breakpoint.mdAndUp">
<RecipePageOrganizers :recipe="recipe" /> <RecipePageOrganizers :recipe="recipe" />

View File

@@ -47,7 +47,7 @@
<span>{{ parserToolTip }}</span> <span>{{ parserToolTip }}</span>
</v-tooltip> </v-tooltip>
<RecipeDialogBulkAdd class="mx-1 mb-1" @bulk-data="addIngredient" /> <RecipeDialogBulkAdd class="mx-1 mb-1" @bulk-data="addIngredient" />
<BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.new") }} </BaseButton> <BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.add") }} </BaseButton>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -1,9 +1,9 @@
// This Code is auto generated by gen_global_components.py // This Code is auto generated by gen_ts_locales.py
export const LOCALES = [ export const LOCALES = [
{ {
name: "繁體中文 (Chinese traditional)", name: "繁體中文 (Chinese traditional)",
value: "zh-TW", value: "zh-TW",
progress: 30, progress: 29,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -15,7 +15,7 @@ export const LOCALES = [
{ {
name: "Tiếng Việt (Vietnamese)", name: "Tiếng Việt (Vietnamese)",
value: "vi-VN", value: "vi-VN",
progress: 1, progress: 0,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -27,43 +27,43 @@ export const LOCALES = [
{ {
name: "Türkçe (Turkish)", name: "Türkçe (Turkish)",
value: "tr-TR", value: "tr-TR",
progress: 53, progress: 62,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Svenska (Swedish)", name: "Svenska (Swedish)",
value: "sv-SE", value: "sv-SE",
progress: 94, progress: 99,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "српски (Serbian)", name: "српски (Serbian)",
value: "sr-SP", value: "sr-SP",
progress: 32, progress: 31,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Slovenian", name: "Slovenian",
value: "sl-SI", value: "sl-SI",
progress: 47, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Slovak", name: "Slovak",
value: "sk-SK", value: "sk-SK",
progress: 93, progress: 91,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Pусский (Russian)", name: "Pусский (Russian)",
value: "ru-RU", value: "ru-RU",
progress: 98, progress: 99,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Română (Romanian)", name: "Română (Romanian)",
value: "ro-RO", value: "ro-RO",
progress: 42, progress: 44,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -75,19 +75,19 @@ export const LOCALES = [
{ {
name: "Português do Brasil (Brazilian Portuguese)", name: "Português do Brasil (Brazilian Portuguese)",
value: "pt-BR", value: "pt-BR",
progress: 97, progress: 95,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Polski (Polish)", name: "Polski (Polish)",
value: "pl-PL", value: "pl-PL",
progress: 98, progress: 100,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Norsk (Norwegian)", name: "Norsk (Norwegian)",
value: "no-NO", value: "no-NO",
progress: 99, progress: 97,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -99,25 +99,25 @@ export const LOCALES = [
{ {
name: "Latvian", name: "Latvian",
value: "lv-LV", value: "lv-LV",
progress: 1, progress: 0,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Lithuanian", name: "Lithuanian",
value: "lt-LT", value: "lt-LT",
progress: 93, progress: 91,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "한국어 (Korean)", name: "한국어 (Korean)",
value: "ko-KR", value: "ko-KR",
progress: 5, progress: 3,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "日本語 (Japanese)", name: "日本語 (Japanese)",
value: "ja-JP", value: "ja-JP",
progress: 12, progress: 11,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -135,25 +135,25 @@ export const LOCALES = [
{ {
name: "Magyar (Hungarian)", name: "Magyar (Hungarian)",
value: "hu-HU", value: "hu-HU",
progress: 100, progress: 98,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Croatian", name: "Croatian",
value: "hr-HR", value: "hr-HR",
progress: 93, progress: 91,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "עברית (Hebrew)", name: "עברית (Hebrew)",
value: "he-IL", value: "he-IL",
progress: 97, progress: 98,
dir: "rtl", dir: "rtl",
}, },
{ {
name: "Galician", name: "Galician",
value: "gl-ES", value: "gl-ES",
progress: 1, progress: 3,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -165,19 +165,19 @@ export const LOCALES = [
{ {
name: "French, Canada", name: "French, Canada",
value: "fr-CA", value: "fr-CA",
progress: 97, progress: 95,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Suomi (Finnish)", name: "Suomi (Finnish)",
value: "fi-FI", value: "fi-FI",
progress: 91, progress: 89,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Español (Spanish)", name: "Español (Spanish)",
value: "es-ES", value: "es-ES",
progress: 79, progress: 93,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -189,13 +189,13 @@ export const LOCALES = [
{ {
name: "British English", name: "British English",
value: "en-GB", value: "en-GB",
progress: 3, progress: 2,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Ελληνικά (Greek)", name: "Ελληνικά (Greek)",
value: "el-GR", value: "el-GR",
progress: 34, progress: 33,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -219,7 +219,7 @@ export const LOCALES = [
{ {
name: "Català (Catalan)", name: "Català (Catalan)",
value: "ca-ES", value: "ca-ES",
progress: 75, progress: 74,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -231,13 +231,13 @@ export const LOCALES = [
{ {
name: "العربية (Arabic)", name: "العربية (Arabic)",
value: "ar-SA", value: "ar-SA",
progress: 20, progress: 18,
dir: "rtl", dir: "rtl",
}, },
{ {
name: "Afrikaans (Afrikaans)", name: "Afrikaans (Afrikaans)",
value: "af-ZA", value: "af-ZA",
progress: 92, progress: 90,
dir: "ltr", dir: "ltr",
}, },
] ]

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Kanselleer", "cancel": "Kanselleer",
"clear": "Maak skoon", "clear": "Maak skoon",
"close": "Maak toe", "close": "Maak toe",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "إلغاء", "cancel": "إلغاء",
"clear": "مسح", "clear": "مسح",
"close": "إغلاق", "close": "إغلاق",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Събития на рецептата" "recipe-events": "Събития на рецептата"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Откажи", "cancel": "Откажи",
"clear": "Изчисти", "clear": "Изчисти",
"close": "Затвори", "close": "Затвори",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Esdeveniments de receptes" "recipe-events": "Esdeveniments de receptes"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Anuŀla", "cancel": "Anuŀla",
"clear": "Neteja", "clear": "Neteja",
"close": "Tanca", "close": "Tanca",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Zrušit", "cancel": "Zrušit",
"clear": "Vymazat", "clear": "Vymazat",
"close": "Zavřít", "close": "Zavřít",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Hændelser for opskrifter" "recipe-events": "Hændelser for opskrifter"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Annuller", "cancel": "Annuller",
"clear": "Ryd", "clear": "Ryd",
"close": "Luk", "close": "Luk",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Rezept-Ereignisse" "recipe-events": "Rezept-Ereignisse"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"clear": "Zurücksetzen", "clear": "Zurücksetzen",
"close": "Schließen", "close": "Schließen",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Άκυρο", "cancel": "Άκυρο",
"clear": "Εκκαθάριση", "clear": "Εκκαθάριση",
"close": "Κλείσιμο", "close": "Κλείσιμο",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos de receta" "recipe-events": "Eventos de receta"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancelar", "cancel": "Cancelar",
"clear": "Eliminar", "clear": "Eliminar",
"close": "Cerrar", "close": "Cerrar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Peruuta", "cancel": "Peruuta",
"clear": "Tyhjennä", "clear": "Tyhjennä",
"close": "Sulje", "close": "Sulje",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Événements de recette" "recipe-events": "Événements de recette"
}, },
"general": { "general": {
"add": "Ajouter",
"cancel": "Annuler", "cancel": "Annuler",
"clear": "Effacer", "clear": "Effacer",
"close": "Fermer", "close": "Fermer",
@@ -142,7 +143,7 @@
"save": "Sauvegarder", "save": "Sauvegarder",
"settings": "Paramètres", "settings": "Paramètres",
"share": "Partager", "share": "Partager",
"show-all": "Show All", "show-all": "Tout afficher",
"shuffle": "Mélanger", "shuffle": "Mélanger",
"sort": "Trier", "sort": "Trier",
"sort-alphabetically": "Alphabétique", "sort-alphabetically": "Alphabétique",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Événements de recette" "recipe-events": "Événements de recette"
}, },
"general": { "general": {
"add": "Ajouter",
"cancel": "Annuler", "cancel": "Annuler",
"clear": "Effacer", "clear": "Effacer",
"close": "Fermer", "close": "Fermer",
@@ -142,7 +143,7 @@
"save": "Sauvegarder", "save": "Sauvegarder",
"settings": "Paramètres", "settings": "Paramètres",
"share": "Partager", "share": "Partager",
"show-all": "Show All", "show-all": "Tout afficher",
"shuffle": "Aléatoire", "shuffle": "Aléatoire",
"sort": "Trier", "sort": "Trier",
"sort-alphabetically": "Alphabétique", "sort-alphabetically": "Alphabétique",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "אירועי מתכון" "recipe-events": "אירועי מתכון"
}, },
"general": { "general": {
"add": "Add",
"cancel": "ביטול", "cancel": "ביטול",
"clear": "נקה", "clear": "נקה",
"close": "סגירה", "close": "סגירה",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Odustani", "cancel": "Odustani",
"clear": "Očisti", "clear": "Očisti",
"close": "Zatvori", "close": "Zatvori",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recept esemény" "recipe-events": "Recept esemény"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Mégsem", "cancel": "Mégsem",
"clear": "Törlés", "clear": "Törlés",
"close": "Bezár", "close": "Bezár",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventi di ricette" "recipe-events": "Eventi di ricette"
}, },
"general": { "general": {
"add": "Aggiungi",
"cancel": "Cancella", "cancel": "Cancella",
"clear": "Resetta", "clear": "Resetta",
"close": "Chiudi", "close": "Chiudi",
@@ -142,7 +143,7 @@
"save": "Salva", "save": "Salva",
"settings": "Impostazioni", "settings": "Impostazioni",
"share": "Condividi", "share": "Condividi",
"show-all": "Show All", "show-all": "Mostra tutto",
"shuffle": "Casuale", "shuffle": "Casuale",
"sort": "Ordina", "sort": "Ordina",
"sort-alphabetically": "Alfabetico", "sort-alphabetically": "Alfabetico",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "キャンセル", "cancel": "キャンセル",
"clear": "クリア", "clear": "クリア",
"close": "閉じる", "close": "閉じる",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Atšaukti", "cancel": "Atšaukti",
"clear": "Išvalyti", "clear": "Išvalyti",
"close": "Uždaryti", "close": "Uždaryti",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recept gebeurtenissen" "recipe-events": "Recept gebeurtenissen"
}, },
"general": { "general": {
"add": "Voeg toe",
"cancel": "Annuleren", "cancel": "Annuleren",
"clear": "Wissen", "clear": "Wissen",
"close": "Sluiten", "close": "Sluiten",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Oppskriftshendelser" "recipe-events": "Oppskriftshendelser"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Avbryt", "cancel": "Avbryt",
"clear": "Tøm", "clear": "Tøm",
"close": "Lukk", "close": "Lukk",

View File

@@ -77,9 +77,10 @@
"tag-events": "Zdarzenia tagów", "tag-events": "Zdarzenia tagów",
"category-events": "Wydarzenia kategorii", "category-events": "Wydarzenia kategorii",
"when-a-new-user-joins-your-group": "Kiedy nowy użytkownik dołączy do Twojej grupy", "when-a-new-user-joins-your-group": "Kiedy nowy użytkownik dołączy do Twojej grupy",
"recipe-events": "Recipe Events" "recipe-events": "Zdarzenia Przepisów"
}, },
"general": { "general": {
"add": "Dodaj",
"cancel": "Anuluj", "cancel": "Anuluj",
"clear": "Wyczyść", "clear": "Wyczyść",
"close": "Zamknij", "close": "Zamknij",
@@ -142,7 +143,7 @@
"save": "Zapisz", "save": "Zapisz",
"settings": "Ustawienia", "settings": "Ustawienia",
"share": "Udostępnij", "share": "Udostępnij",
"show-all": "Show All", "show-all": "Pokaż wszystko",
"shuffle": "Pomieszaj", "shuffle": "Pomieszaj",
"sort": "Sortuj", "sort": "Sortuj",
"sort-alphabetically": "Alfabetyczne", "sort-alphabetically": "Alfabetyczne",
@@ -495,8 +496,8 @@
"cook-mode": "Tryb Gotowania", "cook-mode": "Tryb Gotowania",
"link-ingredients": "Podłącz składniki", "link-ingredients": "Podłącz składniki",
"merge-above": "Scal z powyższym", "merge-above": "Scal z powyższym",
"move-to-bottom": "Move To Bottom", "move-to-bottom": "Przesuń na sam dół",
"move-to-top": "Move To Top", "move-to-top": "Przesuń na samą górę",
"reset-scale": "Zresetuj Skalę", "reset-scale": "Zresetuj Skalę",
"decrease-scale-label": "Zmniejsz Skalę o 1", "decrease-scale-label": "Zmniejsz Skalę o 1",
"increase-scale-label": "Zwiększ Skalę o 1", "increase-scale-label": "Zwiększ Skalę o 1",
@@ -602,7 +603,7 @@
"import-summary": "Podsumowanie importu", "import-summary": "Podsumowanie importu",
"partial-backup": "Częściowa kopia zapasowa", "partial-backup": "Częściowa kopia zapasowa",
"unable-to-delete-backup": "Nie można usunąć kopii zapasowej.", "unable-to-delete-backup": "Nie można usunąć kopii zapasowej.",
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.", "experimental-description": "Kopie zapasowe to całkowite zrzuty bazy danych i katalogu danych witryny. Obejmują one wszystkie dane i nie można nic ustawić, aby wykluczyć podzbiory danych. Traktuj je jako stan całego Mealie w określonym momencie czasu. Backupy to agnostyczny sposób eksportowania i importowania danych oraz sposób na zrobienie kopii witryny do zewnętrznej lokalizacji.",
"backup-restore": "Przywróć kopie", "backup-restore": "Przywróć kopie",
"back-restore-description": "Przywracanie tej kopii zapasowej nadpisze wszystkie aktualne dane w bazie danych i w katalogu danych i zastąpi je zawartością tej kopii zapasowej. {cannot-be-undone} Jeśli przywrócenie zakończy się pomyślnie, zostaniesz wylogowany.", "back-restore-description": "Przywracanie tej kopii zapasowej nadpisze wszystkie aktualne dane w bazie danych i w katalogu danych i zastąpi je zawartością tej kopii zapasowej. {cannot-be-undone} Jeśli przywrócenie zakończy się pomyślnie, zostaniesz wylogowany.",
"cannot-be-undone": "Tej czynności nie można cofnąć - należy zachować ostrożność.", "cannot-be-undone": "Tej czynności nie można cofnąć - należy zachować ostrożność.",
@@ -872,7 +873,7 @@
"you-are-not-allowed-to-create-a-user": "Nie masz uprawnień do tworzenia użytkowników", "you-are-not-allowed-to-create-a-user": "Nie masz uprawnień do tworzenia użytkowników",
"you-are-not-allowed-to-delete-this-user": "Nie masz uprawnień do usuwania użytkowników", "you-are-not-allowed-to-delete-this-user": "Nie masz uprawnień do usuwania użytkowników",
"enable-advanced-content": "Włącz zaawansowane ustawienia", "enable-advanced-content": "Włącz zaawansowane ustawienia",
"enable-advanced-content-description": "Włącza funkcje zaawansowane takie jak skalowanie przepisów, klucze API, webhooki i zarządzanie danymi. Nie mart się, opcję tą można później zmienić", "enable-advanced-content-description": "Włącza zaawansowane funkcje, takie jak skalowanie receptur, klucze API, Webhooki i zarządzanie danymi. Nie martw się, zawsze możesz to zmienić później",
"favorite-recipes": "Ulubione przepisy", "favorite-recipes": "Ulubione przepisy",
"email-or-username": "E-mail lub nazwa użytkownika", "email-or-username": "E-mail lub nazwa użytkownika",
"remember-me": "Zapamiętaj", "remember-me": "Zapamiętaj",
@@ -949,7 +950,7 @@
"example-unit-singular": "np. Łyżka stołowa", "example-unit-singular": "np. Łyżka stołowa",
"example-unit-plural": "np. Łyżki stołowe", "example-unit-plural": "np. Łyżki stołowe",
"example-unit-abbreviation-singular": "na przykład: Łyżka stołowa", "example-unit-abbreviation-singular": "na przykład: Łyżka stołowa",
"example-unit-abbreviation-plural": "ex: Tbsps" "example-unit-abbreviation-plural": "na przykład: Łyżka stołowa"
}, },
"labels": { "labels": {
"seed-dialog-text": "Wypełnij bazę zwyczajowymi etykietami dla wybranego języka.", "seed-dialog-text": "Wypełnij bazę zwyczajowymi etykietami dla wybranego języka.",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos da Receita" "recipe-events": "Eventos da Receita"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancelar", "cancel": "Cancelar",
"clear": "Limpar", "clear": "Limpar",
"close": "Fechar", "close": "Fechar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos de receita" "recipe-events": "Eventos de receita"
}, },
"general": { "general": {
"add": "Adicionar",
"cancel": "Cancelar", "cancel": "Cancelar",
"clear": "Limpar", "clear": "Limpar",
"close": "Fechar", "close": "Fechar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Evenimente rețetă" "recipe-events": "Evenimente rețetă"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Anulează", "cancel": "Anulează",
"clear": "Șterge", "clear": "Șterge",
"close": "Închide", "close": "Închide",

View File

@@ -80,6 +80,7 @@
"recipe-events": "События Рецепта" "recipe-events": "События Рецепта"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Отмена", "cancel": "Отмена",
"clear": "Очистить", "clear": "Очистить",
"close": "Закрыть", "close": "Закрыть",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Zrušiť", "cancel": "Zrušiť",
"clear": "Vymazať", "clear": "Vymazať",
"close": "Zavrieť", "close": "Zavrieť",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Prekliči", "cancel": "Prekliči",
"clear": "Počisti", "clear": "Počisti",
"close": "Zapri", "close": "Zapri",
@@ -142,7 +143,7 @@
"save": "Shrani", "save": "Shrani",
"settings": "Nastavitve", "settings": "Nastavitve",
"share": "Deli", "share": "Deli",
"show-all": "Show All", "show-all": "Prikaži vse",
"shuffle": "Naključno", "shuffle": "Naključno",
"sort": "Razvrsti", "sort": "Razvrsti",
"sort-alphabetically": "Po abecedi", "sort-alphabetically": "Po abecedi",
@@ -198,8 +199,8 @@
"export-all": "Izvozi vse", "export-all": "Izvozi vse",
"refresh": "Osveži", "refresh": "Osveži",
"upload-file": "Naloži datoteko", "upload-file": "Naloži datoteko",
"created-on-date": "Created on: {0}", "created-on-date": "Ustvarjeno dne: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.", "unsaved-changes": "Imate neohranjene spremembe. Ali želite shraniti pred odhodom? V redu, če želite shraniti, Prekliči, če želite zavreči spremembe.",
"clipboard-copy-failure": "Failed to copy to the clipboard.", "clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?" "confirm-delete-generic-items": "Are you sure you want to delete the following items?"
}, },
@@ -294,8 +295,8 @@
"type-any": "Katerikoli", "type-any": "Katerikoli",
"day-any": "Katerikoli", "day-any": "Katerikoli",
"editor": "Editor", "editor": "Editor",
"meal-recipe": "Meal Recipe", "meal-recipe": "Recept za obrok",
"meal-title": "Meal Title", "meal-title": "Naslov obroka",
"meal-note": "Meal Note", "meal-note": "Meal Note",
"note-only": "Note Only", "note-only": "Note Only",
"random-meal": "Random Meal", "random-meal": "Random Meal",
@@ -354,8 +355,8 @@
"tag-all-recipes": "Tag all recipes with {tag-name} tag", "tag-all-recipes": "Tag all recipes with {tag-name} tag",
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.", "nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below", "chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
"recipe-1": "Recipe 1", "recipe-1": "Recept 1",
"recipe-2": "Recipe 2", "recipe-2": "Recept 2",
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.", "paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
"mealie-text": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.", "mealie-text": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.",
"plantoeat": { "plantoeat": {
@@ -531,7 +532,7 @@
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe", "select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
"looking-for-migrations": "Looking For Migrations?", "looking-for-migrations": "Looking For Migrations?",
"import-with-url": "Import with URL", "import-with-url": "Import with URL",
"create-recipe": "Create Recipe", "create-recipe": "Ustvari recept",
"import-with-zip": "Import with .zip", "import-with-zip": "Import with .zip",
"create-recipe-from-an-image": "Create recipe from an image", "create-recipe-from-an-image": "Create recipe from an image",
"bulk-url-import": "Bulk URL Import", "bulk-url-import": "Bulk URL Import",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Откажи", "cancel": "Откажи",
"clear": "Обриши", "clear": "Обриши",
"close": "Затвори", "close": "Затвори",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recepthändelser" "recipe-events": "Recepthändelser"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Avbryt", "cancel": "Avbryt",
"clear": "Rensa", "clear": "Rensa",
"close": "Stäng", "close": "Stäng",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Ekle",
"cancel": "İptal", "cancel": "İptal",
"clear": "Temizle", "clear": "Temizle",
"close": "Kapat", "close": "Kapat",
@@ -142,7 +143,7 @@
"save": "Kaydet", "save": "Kaydet",
"settings": "Ayarlar", "settings": "Ayarlar",
"share": "Paylaş", "share": "Paylaş",
"show-all": "Show All", "show-all": "Tümünü Göster",
"shuffle": "Karıştır", "shuffle": "Karıştır",
"sort": "Sırala", "sort": "Sırala",
"sort-alphabetically": "Alfabetik", "sort-alphabetically": "Alfabetik",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Події рецепту" "recipe-events": "Події рецепту"
}, },
"general": { "general": {
"add": "Додати",
"cancel": "Скасувати", "cancel": "Скасувати",
"clear": "Очистити", "clear": "Очистити",
"close": "Закрити", "close": "Закрити",
@@ -142,7 +143,7 @@
"save": "Зберегти", "save": "Зберегти",
"settings": "Налаштування", "settings": "Налаштування",
"share": "Поділитись", "share": "Поділитись",
"show-all": "Show All", "show-all": "Показати все",
"shuffle": "Перемішати", "shuffle": "Перемішати",
"sort": "Сортувати", "sort": "Сортувати",
"sort-alphabetically": "За алфавітом", "sort-alphabetically": "За алфавітом",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
"close": "Close", "close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "食谱事件" "recipe-events": "食谱事件"
}, },
"general": { "general": {
"add": "添加",
"cancel": "取消", "cancel": "取消",
"clear": "清空", "clear": "清空",
"close": "关闭", "close": "关闭",
@@ -142,7 +143,7 @@
"save": "保存", "save": "保存",
"settings": "设定", "settings": "设定",
"share": "分享", "share": "分享",
"show-all": "Show All", "show-all": "全部显示",
"shuffle": "随机", "shuffle": "随机",
"sort": "排序", "sort": "排序",
"sort-alphabetically": "按字母顺序排序", "sort-alphabetically": "按字母顺序排序",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events" "recipe-events": "Recipe Events"
}, },
"general": { "general": {
"add": "Add",
"cancel": "取消", "cancel": "取消",
"clear": "清除", "clear": "清除",
"close": "關閉", "close": "關閉",

View File

@@ -38,7 +38,6 @@
:key="mealplan.id" :key="mealplan.id"
:recipe-id="mealplan.recipe ? mealplan.recipe.id : ''" :recipe-id="mealplan.recipe ? mealplan.recipe.id : ''"
class="mb-2" class="mb-2"
:route="mealplan.recipe ? true : false"
:rating="mealplan.recipe ? mealplan.recipe.rating : 0" :rating="mealplan.recipe ? mealplan.recipe.rating : 0"
:slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title" :slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title"
:description="mealplan.recipe ? mealplan.recipe.description : mealplan.text" :description="mealplan.recipe ? mealplan.recipe.description : mealplan.text"

View File

@@ -107,7 +107,7 @@
<template #icon> {{ $globals.icons.tags }} </template> <template #icon> {{ $globals.icons.tags }} </template>
{{ $t('shopping-list.reorder-labels') }} {{ $t('shopping-list.reorder-labels') }}
</BaseButton> </BaseButton>
<BaseButton create @click="createEditorOpen = true" /> <BaseButton create @click="createEditorOpen = true" > {{ $t('general.add') }} </BaseButton>
</div> </div>
<!-- Action Bar --> <!-- Action Bar -->

View File

@@ -1,4 +1,4 @@
// This Code is auto generated by gen_global_components.py // This Code is auto generated by gen_ts_types.py
import AdvancedOnly from "@/components/global/AdvancedOnly.vue"; import AdvancedOnly from "@/components/global/AdvancedOnly.vue";
import AppButtonCopy from "@/components/global/AppButtonCopy.vue"; import AppButtonCopy from "@/components/global/AppButtonCopy.vue";
import AppButtonUpload from "@/components/global/AppButtonUpload.vue"; import AppButtonUpload from "@/components/global/AppButtonUpload.vue";

View File

@@ -24,11 +24,8 @@ def search_user(conn: LDAPObject, username: str) -> list[tuple[str, dict[str, li
id_attribute=settings.LDAP_ID_ATTRIBUTE, mail_attribute=settings.LDAP_MAIL_ATTRIBUTE, input=username id_attribute=settings.LDAP_ID_ATTRIBUTE, mail_attribute=settings.LDAP_MAIL_ATTRIBUTE, input=username
) )
# Don't assume the provided search filter has (|({id_attribute}={input})({mail_attribute}={input})) # Don't assume the provided search filter has (|({id_attribute}={input})({mail_attribute}={input}))
search_filter = "(&(|({id_attribute}={input})({mail_attribute}={input})){filter})".format( search_filter = (
id_attribute=settings.LDAP_ID_ATTRIBUTE, f"(&(|({settings.LDAP_ID_ATTRIBUTE}={username})({settings.LDAP_MAIL_ATTRIBUTE}={username})){user_filter})"
mail_attribute=settings.LDAP_MAIL_ATTRIBUTE,
input=username,
filter=user_filter,
) )
user_entry: list[tuple[str, dict[str, list[bytes]]]] | None = None user_entry: list[tuple[str, dict[str, list[bytes]]]] | None = None

View File

@@ -1,38 +1,47 @@
def validate_locale(locale: str) -> bool: def validate_locale(locale: str) -> bool:
valid = { valid = {
"el-GR", # CODE_GEN_ID: MESSAGE_LOCALES
"it-IT",
"ko-KR",
"es-ES",
"ja-JP",
"zh-CN",
"tr-TR",
"ar-SA",
"hu-HU",
"pt-PT",
"no-NO",
"sv-SE",
"ro-RO",
"sk-SK",
"uk-UA",
"fr-CA",
"pl-PL",
"da-DK",
"pt-BR",
"de-DE",
"ca-ES",
"sr-SP",
"cs-CZ",
"fr-FR",
"zh-TW",
"af-ZA", "af-ZA",
"ru-RU", "ar-SA",
"he-IL", "bg-BG",
"nl-NL", "ca-ES",
"en-US", "cs-CZ",
"da-DK",
"de-DE",
"el-GR",
"en-GB", "en-GB",
"en-US",
"es-ES",
"fi-FI", "fi-FI",
"fr-CA",
"fr-FR",
"gl-ES",
"he-IL",
"hr-HR",
"hu-HU",
"is-IS",
"it-IT",
"ja-JP",
"ko-KR",
"lt-LT",
"lv-LV",
"nl-NL",
"no-NO",
"pl-PL",
"pt-BR",
"pt-PT",
"ro-RO",
"ru-RU",
"sk-SK",
"sl-SI",
"sr-SP",
"sv-SE",
"tr-TR",
"uk-UA",
"vi-VN", "vi-VN",
"zh-CN",
"zh-TW",
# END: MESSAGE_LOCALES
} }
return locale in valid return locale in valid

118
poetry.lock generated
View File

@@ -89,13 +89,13 @@ files = [
[[package]] [[package]]
name = "apprise" name = "apprise"
version = "1.7.3" version = "1.7.4"
description = "Push Notifications that work with just about every platform!" description = "Push Notifications that work with just about every platform!"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "apprise-1.7.3-py3-none-any.whl", hash = "sha256:d071ff2a12dd57c783edc0aab375e8606f2fb527b1e3afbc8750f0190c8928f4"}, {file = "apprise-1.7.4-py3-none-any.whl", hash = "sha256:71edb0f29532c0c35b6c52d882880f1649f8bd1bdc97c7480fda3e1358603325"},
{file = "apprise-1.7.3.tar.gz", hash = "sha256:31e2a639407bb8d266249fc075ff317e9d34ff5951c6e16bfeefddc2af5fe84c"}, {file = "apprise-1.7.4.tar.gz", hash = "sha256:ef5e830051140d4228a759c5bc2d6857bcc7f8664df3e44f30f64617ce0c7a73"},
] ]
[package.dependencies] [package.dependencies]
@@ -1270,38 +1270,38 @@ files = [
[[package]] [[package]]
name = "mypy" name = "mypy"
version = "1.8.0" version = "1.9.0"
description = "Optional static typing for Python" description = "Optional static typing for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"},
{file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"},
{file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"},
{file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"},
{file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"},
{file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"},
{file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"},
{file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"},
{file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"},
{file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"},
{file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"},
{file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"},
{file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"},
{file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"},
{file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"},
{file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"},
{file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"},
{file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"},
{file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"},
{file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"},
{file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"},
{file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"},
{file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"},
{file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"},
{file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"},
{file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"},
{file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"},
] ]
[package.dependencies] [package.dependencies]
@@ -1949,13 +1949,13 @@ rdflib = "*"
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "8.0.2" version = "8.1.1"
description = "pytest: simple powerful testing with Python" description = "pytest: simple powerful testing with Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"},
{file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"},
] ]
[package.dependencies] [package.dependencies]
@@ -1963,11 +1963,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*" iniconfig = "*"
packaging = "*" packaging = "*"
pluggy = ">=1.3.0,<2.0" pluggy = ">=1.4,<2.0"
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras] [package.extras]
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
@@ -2468,28 +2468,28 @@ pyasn1 = ">=0.1.3"
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.3.0" version = "0.3.2"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"}, {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"},
{file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"}, {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"}, {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"}, {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"}, {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"}, {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"}, {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"},
{file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"}, {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"},
{file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"}, {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"},
{file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"}, {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"},
{file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"}, {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"},
] ]
[[package]] [[package]]
@@ -2776,13 +2776,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]] [[package]]
name = "uvicorn" name = "uvicorn"
version = "0.27.1" version = "0.28.0"
description = "The lightning-fast ASGI server." description = "The lightning-fast ASGI server."
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"}, {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"},
{file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"}, {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"},
] ]
[package.dependencies] [package.dependencies]
@@ -3040,4 +3040,4 @@ pgsql = ["psycopg2-binary"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.10" python-versions = "^3.10"
content-hash = "9576c2fb9e9274b65b13e01fd962d59dafd9a1d2f054e8b0407b3e6c0695d0bb" content-hash = "fe771c620ec99c7392b8269f206e2d99ae492988002b8814fa44f1dba1bafe28"

View File

@@ -38,7 +38,7 @@ python-slugify = "^8.0.0"
recipe-scrapers = "^14.53.0" recipe-scrapers = "^14.53.0"
requests = "^2.31.0" requests = "^2.31.0"
tzdata = "^2023.4" tzdata = "^2023.4"
uvicorn = { extras = ["standard"], version = "^0.27.0" } uvicorn = { extras = ["standard"], version = "^0.28.0" }
beautifulsoup4 = "^4.11.2" beautifulsoup4 = "^4.11.2"
isodate = "^0.6.1" isodate = "^0.6.1"
text-unidecode = "^1.3" text-unidecode = "^1.3"
@@ -112,22 +112,7 @@ strict_optional = true
[tool.ruff] [tool.ruff]
line-length = 120 line-length = 120
output-format = "text" output-format = "concise"
# Enable Pyflakes `E` and `F` codes by default.
ignore = ["F403", "TID252", "B008"]
select = [
"E", # pycodestyles
"F", # pyflakes
"I", # isort
"T", # flake8-print
"UP", # pyupgrade
"B", # flake8-bugbear
# "ANN", # flake8-annotations
# "C", # McCabe complexity
# "RUF", # Ruff specific
# "BLE", # blind-except
]
# Exclude a variety of commonly ignored directories. # Exclude a variety of commonly ignored directories.
exclude = [ exclude = [
@@ -155,9 +140,25 @@ exclude = [
# Assume Python 3.10. # Assume Python 3.10.
target-version = "py310" target-version = "py310"
[tool.ruff.per-file-ignores] [tool.ruff.lint]
# Enable Pyflakes `E` and `F` codes by default.
ignore = ["F403", "TID252", "B008"]
select = [
"E", # pycodestyles
"F", # pyflakes
"I", # isort
"T", # flake8-print
"UP", # pyupgrade
"B", # flake8-bugbear
# "ANN", # flake8-annotations
# "C", # McCabe complexity
# "RUF", # Ruff specific
# "BLE", # blind-except
]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["E402", "E501"] "__init__.py" = ["E402", "E501"]
[tool.ruff.mccabe] [tool.ruff.lint.mccabe]
# Unlike Flake8, default to a complexity level of 10. # Unlike Flake8, default to a complexity level of 10.
max-complexity = 10 max-complexity = 10