From b3c214d102277e0ad691c9a1f06f7744fcd0579b Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:43:45 -0600 Subject: [PATCH 01/10] chore(l10n): New Crowdin updates (#7119) --- frontend/lang/messages/pl-PL.json | 6 +- .../seed/resources/foods/locales/hu-HU.json | 76 +++++++++---------- .../seed/resources/foods/locales/pl-PL.json | 10 +-- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/frontend/lang/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json index 3c395b34d..3b9bf72ac 100644 --- a/frontend/lang/messages/pl-PL.json +++ b/frontend/lang/messages/pl-PL.json @@ -1423,8 +1423,8 @@ "is-greater-than-or-equal-to": "jest większe lub równe", "is-less-than": "jest mniejsze niż", "is-less-than-or-equal-to": "jest mniejsze lub równe", - "is-older-than": "is older than", - "is-newer-than": "is newer than" + "is-older-than": "jest starsze niż", + "is-newer-than": "jest nowsze niż" }, "relational-keywords": { "is": "jest", @@ -1436,7 +1436,7 @@ "is-not-like": "nie jest jak" }, "dates": { - "days-ago": "days ago|day ago|days ago" + "days-ago": "dni temu|dzień temu|dni temu" } }, "validators": { diff --git a/mealie/repos/seed/resources/foods/locales/hu-HU.json b/mealie/repos/seed/resources/foods/locales/hu-HU.json index 5752079a1..d3322922c 100644 --- a/mealie/repos/seed/resources/foods/locales/hu-HU.json +++ b/mealie/repos/seed/resources/foods/locales/hu-HU.json @@ -5,7 +5,7 @@ "aliases": [], "description": "", "name": "fokhagyma", - "plural_name": "garlic" + "plural_name": "fokhagyma" }, "onion": { "aliases": [], @@ -59,13 +59,13 @@ "aliases": [], "description": "", "name": "zeller", - "plural_name": "celery" + "plural_name": "zeller" }, "jalapeño": { "aliases": [], "description": "", - "name": "jalapeño", - "plural_name": "jalapeños" + "name": "jalapeno", + "plural_name": "jalapeno" }, "avocado": { "aliases": [], @@ -95,13 +95,13 @@ "aliases": [], "description": "", "name": "spenót", - "plural_name": "spinach" + "plural_name": "spenót" }, "sweet corn": { "aliases": [], "description": "", "name": "csemegekukorica", - "plural_name": "sweet corn" + "plural_name": "csemegekukorica" }, "chile pepper": { "aliases": [ @@ -121,7 +121,7 @@ "aliases": [], "description": "", "name": "brokkoli", - "plural_name": "broccoli" + "plural_name": "brokkoli" }, "heart of palm": { "aliases": [], @@ -132,8 +132,8 @@ "baby greens": { "aliases": [], "description": "", - "name": "baby greens", - "plural_name": "baby greens" + "name": "salátakeverék", + "plural_name": "salátakeverék" }, "pumpkin": { "aliases": [], @@ -145,7 +145,7 @@ "aliases": [], "description": "", "name": "karfiol", - "plural_name": "cauliflower" + "plural_name": "karfiol" }, "cabbage": { "aliases": [], @@ -156,20 +156,20 @@ "asparagus": { "aliases": [], "description": "", - "name": "asparagus", - "plural_name": "asparagus" + "name": "spárga", + "plural_name": "spárga" }, "kale": { "aliases": [], "description": "", "name": "kelkáposzta", - "plural_name": "kale" + "plural_name": "kelkáposzta" }, "arugula": { "aliases": [], "description": "", "name": "rukkola", - "plural_name": "arugula" + "plural_name": "rukkola" }, "leek": { "aliases": [], @@ -187,7 +187,7 @@ "aliases": [], "description": "", "name": "saláta", - "plural_name": "lettuce" + "plural_name": "fejes saláta" }, "butternut squash": { "aliases": [], @@ -198,8 +198,8 @@ "romaine lettuce": { "aliases": [], "description": "", - "name": "romaine lettuce", - "plural_name": "romaine lettuce" + "name": "római saláta", + "plural_name": "római saláta" }, "beetroot": { "aliases": [], @@ -217,7 +217,7 @@ "aliases": [], "description": "", "name": "édeskömény", - "plural_name": "fennel" + "plural_name": "édeskömény" }, "sun dried tomato": { "aliases": [], @@ -261,8 +261,8 @@ "mixed greens": { "aliases": [], "description": "", - "name": "mixed greens", - "plural_name": "mixed greens" + "name": "salátakeverék", + "plural_name": "salátakeverék" }, "parsnip": { "aliases": [], @@ -279,8 +279,8 @@ "mixed vegetables": { "aliases": [], "description": "", - "name": "mixed vegetables", - "plural_name": "mixed vegetables" + "name": "zöldségkeverék", + "plural_name": "zöldségkeverék" }, "poblano pepper": { "aliases": [], @@ -304,7 +304,7 @@ "aliases": [], "description": "", "name": "cayenne bors", - "plural_name": "cayenne pepper" + "plural_name": "cayenne bors" }, "green tomato": { "aliases": [], @@ -321,8 +321,8 @@ "iceberg lettuce": { "aliases": [], "description": "", - "name": "iceberg lettuce", - "plural_name": "iceberg lettuce" + "name": "jégsaláta", + "plural_name": "jégsaláta" }, "mashed potato": { "aliases": [], @@ -340,13 +340,13 @@ "aliases": [], "description": "", "name": "mángold", - "plural_name": "chard" + "plural_name": "mángold" }, "pimiento": { "aliases": [], "description": "", "name": "kápia paprika", - "plural_name": "pimientos" + "plural_name": "kápia paprika" }, "spaghetti squash": { "aliases": [], @@ -358,7 +358,7 @@ "aliases": [], "description": "", "name": "fejes saláta", - "plural_name": "butter lettuce" + "plural_name": "kötözősaláta" }, "hash brown": { "aliases": [], @@ -419,8 +419,8 @@ "corn on the cob": { "aliases": [], "description": "", - "name": "corn on the cob", - "plural_name": "corn on the cob" + "name": "csöves kukorica", + "plural_name": "csöves kukorica" }, "radicchio": { "aliases": [], @@ -438,7 +438,7 @@ "aliases": [], "description": "", "name": "brokkolini", - "plural_name": "tenderstem broccoli" + "plural_name": "bébi brokkoli" }, "plantain": { "aliases": [], @@ -450,7 +450,7 @@ "aliases": [], "description": "", "name": "saláta", - "plural_name": "leaf lettuce" + "plural_name": "saláta" }, "pepperoncini": { "aliases": [], @@ -484,11 +484,11 @@ }, "maize": { "aliases": [ - "corn husk" + "kukoricacsuhé" ], "description": "", - "name": "maize", - "plural_name": "maize" + "name": "csemegekukorica", + "plural_name": "csemegekukorica" }, "collard greens": { "aliases": [], @@ -3140,13 +3140,13 @@ "aliases": [], "description": "", "name": "kókusztej", - "plural_name": "coconut milk" + "plural_name": "kókusztej" }, "almond milk": { "aliases": [], "description": "", "name": "mandulatej", - "plural_name": "almond milk" + "plural_name": "mandulatej" }, "almond butter": { "aliases": [], @@ -3182,7 +3182,7 @@ "aliases": [], "description": "", "name": "szójatej", - "plural_name": "soy milk" + "plural_name": "szójatej" }, "extra firm tofu": { "aliases": [], diff --git a/mealie/repos/seed/resources/foods/locales/pl-PL.json b/mealie/repos/seed/resources/foods/locales/pl-PL.json index 7f295a670..fa0aae51c 100644 --- a/mealie/repos/seed/resources/foods/locales/pl-PL.json +++ b/mealie/repos/seed/resources/foods/locales/pl-PL.json @@ -487,8 +487,8 @@ "łuska kukurydzy" ], "description": "", - "name": "maize", - "plural_name": "maize" + "name": "kukurydza", + "plural_name": "kukurydza" }, "collard greens": { "aliases": [], @@ -554,7 +554,7 @@ "aliases": [], "description": "", "name": "sałata masłowa", - "plural_name": "boston lettuce" + "plural_name": "sałata masłowa" }, "kohlrabi": { "aliases": [], @@ -598,7 +598,7 @@ "aliases": [], "description": "", "name": "surówka z brokułów", - "plural_name": "broccoli slaw" + "plural_name": "surówka z brokułów" }, "arbol chile pepper": { "aliases": [], @@ -974,7 +974,7 @@ "aliases": [], "description": "", "name": "pomelo", - "plural_name": "pomelos" + "plural_name": "pomelo" }, "chestnut purée": { "aliases": [], From d79252752b9e35bfc9438be345b735ed3ed77f61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:44:02 -0600 Subject: [PATCH 02/10] fix(deps): update dependency fastapi to v0.131.0 (#7113) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9655c64e0..877674dc5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "apprise==1.9.7", "bcrypt==5.0.0", "extruct==0.18.0", - "fastapi==0.129.1", + "fastapi==0.131.0", "httpx==0.28.1", "lxml==6.0.2", "orjson==3.11.7", diff --git a/uv.lock b/uv.lock index c582d697d..3070b5c41 100644 --- a/uv.lock +++ b/uv.lock @@ -399,7 +399,7 @@ wheels = [ [[package]] name = "fastapi" -version = "0.129.1" +version = "0.131.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -408,9 +408,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/4aa7f6ce92745458b6ce0acd706dde2ac23a3bf341266b5311c904109f67/fastapi-0.129.1.tar.gz", hash = "sha256:6ccf0eca9644e0d6280115b4fc8281bf55ec5878d4d95572f7b2034ab15708ba", size = 369852, upload-time = "2026-02-21T13:10:03.335Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/32/158cbf685b7d5a26f87131069da286bf10fc9fbf7fc968d169d48a45d689/fastapi-0.131.0.tar.gz", hash = "sha256:6531155e52bee2899a932c746c9a8250f210e3c3303a5f7b9f8a808bfe0548ff", size = 369612, upload-time = "2026-02-22T16:38:11.252Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/f9/f15d92bd6035d4f83be8b82dc527a3e7abc87648fda62cf8d1df344410a7/fastapi-0.129.1-py3-none-any.whl", hash = "sha256:022462403bc385b791df418d8f088eb0e8f1fe7cb8f625d682f5e9da6157cc83", size = 103226, upload-time = "2026-02-21T13:10:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/ff/94/b58ec24c321acc2ad1327f69b033cadc005e0f26df9a73828c9e9c7db7ce/fastapi-0.131.0-py3-none-any.whl", hash = "sha256:ed0e53decccf4459de78837ce1b867cd04fa9ce4579497b842579755d20b405a", size = 103854, upload-time = "2026-02-22T16:38:09.814Z" }, ] [[package]] @@ -910,7 +910,7 @@ requires-dist = [ { name = "bcrypt", specifier = "==5.0.0" }, { name = "beautifulsoup4", specifier = "==4.14.3" }, { name = "extruct", specifier = "==0.18.0" }, - { name = "fastapi", specifier = "==0.129.1" }, + { name = "fastapi", specifier = "==0.131.0" }, { name = "html2text", specifier = "==2025.4.15" }, { name = "httpx", specifier = "==0.28.1" }, { name = "ingredient-parser-nlp", specifier = "==2.5.0" }, From b3cea081fe74ab4da20f403df7a2e66d82e58a4e Mon Sep 17 00:00:00 2001 From: "mealie-actions[bot]" <247473823+mealie-actions[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 08:07:02 -0600 Subject: [PATCH 03/10] chore(auto): Update pre-commit hooks (#7122) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2bf158862..8a0268106 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: ^tests/data/ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.15.1 + rev: v0.15.2 hooks: - id: ruff - id: ruff-format From 7e0d083e770da61fefd7afad9a9f08ed25072a86 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:21:38 -0600 Subject: [PATCH 04/10] chore(l10n): New Crowdin updates (#7126) --- frontend/lang/messages/pt-BR.json | 8 +- .../seed/resources/foods/locales/de-DE.json | 14 +- .../seed/resources/foods/locales/pt-BR.json | 4 +- .../seed/resources/foods/locales/pt-PT.json | 144 +++++++++--------- .../seed/resources/units/locales/pt-PT.json | 8 +- 5 files changed, 89 insertions(+), 89 deletions(-) diff --git a/frontend/lang/messages/pt-BR.json b/frontend/lang/messages/pt-BR.json index b3fdba059..c04788034 100644 --- a/frontend/lang/messages/pt-BR.json +++ b/frontend/lang/messages/pt-BR.json @@ -212,8 +212,8 @@ "upload-file": "Enviar arquivo", "created-on-date": "Criado em {0}", "unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações.", - "discard-changes": "Discard Changes", - "discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?", + "discard-changes": "Descartar alterações", + "discard-changes-description": "Você tem alterações não salvas. Tem certeza de que deseja descartá-las?", "clipboard-copy-failure": "Falha ao copiar para a área de transferência.", "confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?", "organizers": "Organizadores", @@ -644,7 +644,7 @@ "scrape-recipe-website-being-blocked": "Site sendo bloqueado?", "scrape-recipe-try-importing-raw-html-instead": "Tente importar o HTML ao invés disso.", "import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores", - "import-original-categories": "Import original categories", + "import-original-categories": "Importar categorias originais", "stay-in-edit-mode": "Permanecer no modo de edição", "parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar", "import-from-zip": "Importar do .zip", @@ -1423,7 +1423,7 @@ "is-greater-than-or-equal-to": "é maior ou igual a", "is-less-than": "é menor que", "is-less-than-or-equal-to": "é menor ou igual a", - "is-older-than": "is older than", + "is-older-than": "Mais antigo que", "is-newer-than": "is newer than" }, "relational-keywords": { diff --git a/mealie/repos/seed/resources/foods/locales/de-DE.json b/mealie/repos/seed/resources/foods/locales/de-DE.json index a714d42d2..1c6b9b41d 100644 --- a/mealie/repos/seed/resources/foods/locales/de-DE.json +++ b/mealie/repos/seed/resources/foods/locales/de-DE.json @@ -2494,25 +2494,25 @@ "aliases": [], "description": "", "name": "Backstein Käse", - "plural_name": "brick cheese" + "plural_name": "Brick-Käse" }, "quick-melt cheese": { "aliases": [], "description": "", - "name": "quick-melt cheese", - "plural_name": "quick-melt cheese" + "name": "schnellschmelzender Käse", + "plural_name": "schnellschmelzender Käse" }, "farmer's cheese": { "aliases": [], "description": "", - "name": "farmer's cheese", - "plural_name": "farmer's cheese" + "name": "Bauernkäse", + "plural_name": "Bauernkäse" }, "manouri cheese": { "aliases": [], "description": "", "name": "manouri cheese", - "plural_name": "manouri cheese" + "plural_name": "Manouri Käse" }, "mimolette cheese": { "aliases": [], @@ -7670,7 +7670,7 @@ "aliases": [], "description": "", "name": "Backpulver", - "plural_name": "baking powder" + "plural_name": "Backpulver" }, "baking soda": { "aliases": [], diff --git a/mealie/repos/seed/resources/foods/locales/pt-BR.json b/mealie/repos/seed/resources/foods/locales/pt-BR.json index ab87083a6..b3a2dbfe6 100644 --- a/mealie/repos/seed/resources/foods/locales/pt-BR.json +++ b/mealie/repos/seed/resources/foods/locales/pt-BR.json @@ -5,7 +5,7 @@ "aliases": [], "description": "", "name": "alho", - "plural_name": "garlic" + "plural_name": "alho" }, "onion": { "aliases": [], @@ -59,7 +59,7 @@ "aliases": [], "description": "", "name": "salsão", - "plural_name": "celery" + "plural_name": "aipo" }, "jalapeño": { "aliases": [], diff --git a/mealie/repos/seed/resources/foods/locales/pt-PT.json b/mealie/repos/seed/resources/foods/locales/pt-PT.json index 58b340523..3c3f9a1b8 100644 --- a/mealie/repos/seed/resources/foods/locales/pt-PT.json +++ b/mealie/repos/seed/resources/foods/locales/pt-PT.json @@ -101,7 +101,7 @@ "aliases": [], "description": "", "name": "milho doce", - "plural_name": "sweet corn" + "plural_name": "milho doce" }, "chile pepper": { "aliases": [ @@ -280,7 +280,7 @@ "aliases": [], "description": "", "name": "mixed vegetables", - "plural_name": "mixed vegetables" + "plural_name": "mistura de vegetais" }, "poblano pepper": { "aliases": [], @@ -1671,8 +1671,8 @@ "chokeberry": { "aliases": [], "description": "", - "name": "chokeberry", - "plural_name": "chokeberries" + "name": "arónia", + "plural_name": "arónias" }, "loganberry": { "aliases": [], @@ -1717,7 +1717,7 @@ "walnut": { "aliases": [], "description": "", - "name": "walnut", + "name": "noz", "plural_name": "walnuts" }, "pecan": { @@ -1783,8 +1783,8 @@ "pumpkin seed": { "aliases": [], "description": "", - "name": "pumpkin seed", - "plural_name": "pumpkin seeds" + "name": "semente de abóbora", + "plural_name": "sementes de abóbora" }, "hazelnut": { "aliases": [], @@ -1801,8 +1801,8 @@ "sunflower seed": { "aliases": [], "description": "", - "name": "sunflower seed", - "plural_name": "sunflower seeds" + "name": "semente de girassol", + "plural_name": "sementes de girassol" }, "macadamia": { "aliases": [], @@ -1813,8 +1813,8 @@ "roasted peanut": { "aliases": [], "description": "", - "name": "roasted peanut", - "plural_name": "roasted peanuts" + "name": "amendoim torrado", + "plural_name": "amendoins torrados" }, "chopped nut": { "aliases": [], @@ -2003,22 +2003,22 @@ "parmesan cheese": { "aliases": [], "description": "", - "name": "parmesan cheese", + "name": "queijo parmesão", "plural_name": "parmesan cheese" }, "cheddar cheese": { "aliases": [ - "cheddar cheese" + "queijo cheddar" ], "description": "", - "name": "cheddar cheese", - "plural_name": "cheddar cheese" + "name": "queijo cheddar", + "plural_name": "queijos cheddar" }, "cream cheese": { "aliases": [], "description": "", - "name": "cream cheese", - "plural_name": "cream cheese" + "name": "queijo creme", + "plural_name": "queijo creme" }, "sharp cheddar cheese": { "aliases": [ @@ -2031,26 +2031,26 @@ "cheese": { "aliases": [], "description": "", - "name": "cheese", - "plural_name": "cheese" + "name": "queijo", + "plural_name": "queijos" }, "mozzarella cheese": { "aliases": [], "description": "", - "name": "mozzarella cheese", - "plural_name": "mozzarella cheese" + "name": "queijo mozzarella", + "plural_name": "queijos mozzarella" }, "feta cheese": { "aliases": [], "description": "", - "name": "feta cheese", - "plural_name": "feta cheese" + "name": "queijo feta", + "plural_name": "queijos feta" }, "ricotta cheese": { "aliases": [], "description": "", - "name": "ricotta cheese", - "plural_name": "ricotta cheese" + "name": "queijo ricotta", + "plural_name": "queijos ricotta" }, "cheddar-jack cheese": { "aliases": [], @@ -2139,8 +2139,8 @@ "brie cheese": { "aliases": [], "description": "", - "name": "brie cheese", - "plural_name": "brie cheese" + "name": "queijo brie", + "plural_name": "queijos brie" }, "paneer cheese": { "aliases": [], @@ -2617,26 +2617,26 @@ "butter": { "aliases": [], "description": "", - "name": "butter", - "plural_name": "butter" + "name": "manteiga", + "plural_name": "manteigas" }, "egg": { "aliases": [], "description": "", - "name": "egg", - "plural_name": "eggs" + "name": "ovo", + "plural_name": "ovos" }, "milk": { "aliases": [], "description": "", - "name": "milk", - "plural_name": "milk" + "name": "leite", + "plural_name": "leites" }, "heavy cream": { "aliases": [], "description": "", - "name": "heavy cream", - "plural_name": "heavy cream" + "name": "nata", + "plural_name": "natas" }, "sour cream": { "aliases": [], @@ -2691,8 +2691,8 @@ "condensed milk": { "aliases": [], "description": "", - "name": "condensed milk", - "plural_name": "condensed milk" + "name": "leite condensado", + "plural_name": "leites condensados" }, "half and half": { "aliases": [], @@ -2703,20 +2703,20 @@ "sweetened condensed milk": { "aliases": [], "description": "", - "name": "sweetened condensed milk", - "plural_name": "sweetened condensed milk" + "name": "leite condensado açucarado", + "plural_name": "leites condensados açucarados" }, "ice cream": { "aliases": [], "description": "", - "name": "ice cream", - "plural_name": "ice cream" + "name": "gelado", + "plural_name": "gelados" }, "margarine": { "aliases": [], "description": "", - "name": "margarine", - "plural_name": "margarines" + "name": "margarina", + "plural_name": "margarinas" }, "creme fraiche": { "aliases": [], @@ -2757,8 +2757,8 @@ "dulce de leche": { "aliases": [], "description": "", - "name": "dulce de leche", - "plural_name": "dulce de leche" + "name": "doce de leite", + "plural_name": "doces de leite" }, "custard": { "aliases": [], @@ -2787,8 +2787,8 @@ "chocolate milk": { "aliases": [], "description": "", - "name": "chocolate milk", - "plural_name": "chocolate milk" + "name": "leite achocolatado", + "plural_name": "leites achocolatados" }, "liquid egg substitute": { "aliases": [], @@ -3325,8 +3325,8 @@ "vegan sausage": { "aliases": [], "description": "", - "name": "vegan sausage", - "plural_name": "vegan sausages" + "name": "salsicha vegan", + "plural_name": "salsichas vegan" }, "coconut whipped cream": { "aliases": [], @@ -3373,8 +3373,8 @@ "nut milk": { "aliases": [], "description": "", - "name": "nut milk", - "plural_name": "nut milk" + "name": "leite de noz", + "plural_name": "leite de nozes" }, "non-dairy cream": { "aliases": [], @@ -3744,37 +3744,37 @@ "aliases": [], "description": "", "name": "bacon", - "plural_name": "bacons" + "plural_name": "bacon" }, "chopped bacon": { "aliases": [], "description": "", - "name": "chopped bacon", - "plural_name": "chopped bacons" + "name": "bacon", + "plural_name": "bacon" }, "ground beef": { "aliases": [], "description": "", - "name": "ground beef", - "plural_name": "ground beefs" + "name": "carne picada", + "plural_name": "carne picada" }, "beef steak": { "aliases": [], "description": "", - "name": "beef steak", - "plural_name": "beef steaks" + "name": "bife de vaca", + "plural_name": "bifes de vaca" }, "ham": { "aliases": [], "description": "", - "name": "ham", - "plural_name": "hams" + "name": "fiambre", + "plural_name": "fiambres" }, "pork chop": { "aliases": [], "description": "", - "name": "pork chop", - "plural_name": "pork chops" + "name": "costoleta", + "plural_name": "costoletas" }, "sweet italian sausage": { "aliases": [], @@ -3827,8 +3827,8 @@ "chorizo": { "aliases": [], "description": "", - "name": "chorizo", - "plural_name": "chorizoes" + "name": "chouriço", + "plural_name": "chouriços" }, "pancetta": { "aliases": [], @@ -3899,8 +3899,8 @@ "deli ham": { "aliases": [], "description": "", - "name": "deli ham", - "plural_name": "deli hams" + "name": "fiambre", + "plural_name": "fiambres" }, "leg of lamb": { "aliases": [], @@ -10638,8 +10638,8 @@ "olive oil": { "aliases": [], "description": "", - "name": "olive oil", - "plural_name": "olive oil" + "name": "azeite", + "plural_name": "azeite" }, "vegetable oil": { "aliases": [], @@ -10650,8 +10650,8 @@ "extra virgin olive oil": { "aliases": [], "description": "", - "name": "extra virgin olive oil", - "plural_name": "extra virgin olive oil" + "name": "azeite extra virgem", + "plural_name": "azeite extra virgem" }, "canola oil": { "aliases": [], @@ -10916,8 +10916,8 @@ "herb-infused olive oil": { "aliases": [], "description": "", - "name": "herb-infused olive oil", - "plural_name": "herb-infused olive oil" + "name": "azeite de ervas", + "plural_name": "azeite de ervas" }, "roasted peanut oil": { "aliases": [], diff --git a/mealie/repos/seed/resources/units/locales/pt-PT.json b/mealie/repos/seed/resources/units/locales/pt-PT.json index c1ab6f690..a26209415 100644 --- a/mealie/repos/seed/resources/units/locales/pt-PT.json +++ b/mealie/repos/seed/resources/units/locales/pt-PT.json @@ -9,7 +9,7 @@ "name": "colher de sopa", "plural_name": "colheres de sopa", "description": "", - "abbreviation": "csp" + "abbreviation": "c. sopa" }, "cup": { "name": "chávena", @@ -25,7 +25,7 @@ }, "pint": { "name": "pint", - "plural_name": "pintas", + "plural_name": "pints", "description": "", "abbreviation": "pt" }, @@ -139,8 +139,8 @@ "abbreviation": "" }, "sprig": { - "name": "sprig", - "plural_name": "sprigs", + "name": "ramo", + "plural_name": "ramos", "description": "", "abbreviation": "" } From 02d32c8905837ee80ab2f50b059361d7e1a2eff0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:15:25 +0100 Subject: [PATCH 05/10] fix(deps): update dependency openai to v2.22.0 (#7128) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 877674dc5..9a20eedcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dependencies = [ "pydantic-settings==2.13.1", "pillow-heif==1.2.1", "pyjwt==2.11.0", - "openai==2.21.0", + "openai==2.22.0", "typing-extensions==4.15.0", "itsdangerous==2.2.0", "ingredient-parser-nlp==2.5.0", diff --git a/uv.lock b/uv.lock index 3070b5c41..40a2d444f 100644 --- a/uv.lock +++ b/uv.lock @@ -918,7 +918,7 @@ requires-dist = [ { name = "itsdangerous", specifier = "==2.2.0" }, { name = "jinja2", specifier = "==3.1.6" }, { name = "lxml", specifier = "==6.0.2" }, - { name = "openai", specifier = "==2.21.0" }, + { name = "openai", specifier = "==2.22.0" }, { name = "orjson", specifier = "==3.11.7" }, { name = "paho-mqtt", specifier = "==1.6.1" }, { name = "pillow", specifier = "==12.1.1" }, @@ -1143,7 +1143,7 @@ wheels = [ [[package]] name = "openai" -version = "2.21.0" +version = "2.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1155,9 +1155,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/e5/3d197a0947a166649f566706d7a4c8f7fe38f1fa7b24c9bcffe4c7591d44/openai-2.21.0.tar.gz", hash = "sha256:81b48ce4b8bbb2cc3af02047ceb19561f7b1dc0d4e52d1de7f02abfd15aa59b7", size = 644374, upload-time = "2026-02-14T00:12:01.577Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/ed/0a004a42fea6b6f3dd4ab33235183e994a4c7ade214fba10d9494577ec04/openai-2.22.0.tar.gz", hash = "sha256:fc2ea71c79951ac3faf178ff72c766bb4b09c3e9aab277184c5260ab3e94294f", size = 657093, upload-time = "2026-02-23T20:14:31.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/56/0a89092a453bb2c676d66abee44f863e742b2110d4dbb1dbcca3f7e5fc33/openai-2.21.0-py3-none-any.whl", hash = "sha256:0bc1c775e5b1536c294eded39ee08f8407656537ccc71b1004104fe1602e267c", size = 1103065, upload-time = "2026-02-14T00:11:59.603Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9a/ac24d606ea7e729475100689a1fe8866fe6cbcd0fd9b93dc4b8324be353d/openai-2.22.0-py3-none-any.whl", hash = "sha256:df02cfb731fe312215d046bf1330030e0f4b70a7b880b96992b1517b0b6aced8", size = 1118913, upload-time = "2026-02-23T20:14:29.546Z" }, ] [[package]] From 216ae8571ce5a51602078235262f0c967c5f30fe Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:34:16 -0600 Subject: [PATCH 06/10] fix: Include unmade recipes when filtering by last made (#7130) --- .../getting-started/api-usage.md | 4 +- mealie/repos/repository_recipes.py | 9 +++- .../test_recipe_repository.py | 41 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/docs/docs/documentation/getting-started/api-usage.md b/docs/docs/documentation/getting-started/api-usage.md index 4eaa97ee7..a85eb2df6 100644 --- a/docs/docs/documentation/getting-started/api-usage.md +++ b/docs/docs/documentation/getting-started/api-usage.md @@ -79,8 +79,8 @@ This filter will find all foods that are not named "carrot":
##### Keyword Filters The API supports many SQL keywords, such as `IS NULL` and `IN`, as well as their negations (e.g. `IS NOT NULL` and `NOT IN`). -Here is an example of a filter that returns all recipes where the "last made" value is not null:
-`lastMade IS NOT NULL` +Here is an example of a filter that returns all shopping list items without a food:
+`foodId IS NULL` This filter will find all recipes that don't start with the word "Test":
`name NOT LIKE "Test%"` diff --git a/mealie/repos/repository_recipes.py b/mealie/repos/repository_recipes.py index fe2c6d588..23972d024 100644 --- a/mealie/repos/repository_recipes.py +++ b/mealie/repos/repository_recipes.py @@ -1,5 +1,6 @@ import re as re from collections.abc import Iterable, Sequence +from datetime import UTC, datetime from random import randint from typing import Self, cast from uuid import UUID @@ -51,10 +52,13 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]): return self def _get_last_made_col_alias(self) -> sa.ColumnElement | None: - """Computed last_made which uses `HouseholdToRecipe.last_made` for the user's household, otherwise None""" + """ + Computed last_made which uses `HouseholdToRecipe.last_made` for the user's household, + otherwise an arbitrarily low date + """ user_household_subquery = sa.select(User.household_id).where(User.id == self.user_id).scalar_subquery() - return ( + last_made_subquery = ( sa.select(HouseholdToRecipe.last_made) .where( HouseholdToRecipe.recipe_id == self.model.id, @@ -63,6 +67,7 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]): .correlate(self.model) .scalar_subquery() ) + return sa.func.coalesce(last_made_subquery, datetime(year=1900, month=1, day=1, tzinfo=UTC)) def _get_rating_col_alias(self) -> sa.ColumnElement | None: """Computed rating which uses the user's rating if it exists, otherwise falling back to the recipe's rating""" diff --git a/tests/unit_tests/repository_tests/test_recipe_repository.py b/tests/unit_tests/repository_tests/test_recipe_repository.py index 2c43f8235..a7cc28910 100644 --- a/tests/unit_tests/repository_tests/test_recipe_repository.py +++ b/tests/unit_tests/repository_tests/test_recipe_repository.py @@ -647,6 +647,47 @@ def test_order_by_last_made(unique_user: TestUser, h2_user: TestUser): assert [item.id for item in h2_query.items] == [recipe_2.id, recipe_1.id] +def test_coalesce_last_made(unique_user: TestUser): + dt = datetime.now(UTC) + + made_recipe, unmade_recipe = ( + unique_user.repos.recipes.create( + Recipe(user_id=unique_user.user_id, group_id=unique_user.group_id, name=random_string()) + ) + for _ in range(2) + ) + unique_user.repos.household_recipes.create( + HouseholdRecipeCreate(recipe_id=made_recipe.id, household_id=unique_user.household_id, last_made=dt) + ) + + repos = get_repositories( + unique_user.repos.session, group_id=unique_user.group_id, household_id=None + ).recipes.by_user(unique_user.user_id) + r = repos.page_all( + PaginationQuery( + page=1, + per_page=-1, + order_by="last_made", + order_direction=OrderDirection.asc, + query_filter=f"id IN [{made_recipe.id}, {unmade_recipe.id}] AND lastMade <= {dt.isoformat()}", + ) + ) + assert len(r.items) == 2 + assert [item.id for item in r.items] == [unmade_recipe.id, made_recipe.id] + + r = repos.page_all( + PaginationQuery( + page=1, + per_page=-1, + order_by="last_made", + order_direction=OrderDirection.desc, + query_filter=f"id IN [{made_recipe.id}, {unmade_recipe.id}]", + ) + ) + assert len(r.items) == 2 + assert [item.id for item in r.items] == [made_recipe.id, unmade_recipe.id] + + def test_order_by_rating(user_tuple: tuple[TestUser, TestUser]): user_1, user_2 = user_tuple database = user_1.repos From 353c24ca4be017a4bf2bb31cb3f9f1cdf125ef40 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Tue, 24 Feb 2026 01:02:24 -0600 Subject: [PATCH 07/10] chore(l10n): New Crowdin updates (#7131) --- .../seed/resources/foods/locales/nl-NL.json | 382 +++++++++--------- 1 file changed, 191 insertions(+), 191 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/nl-NL.json b/mealie/repos/seed/resources/foods/locales/nl-NL.json index a077f8a79..66fc5c761 100644 --- a/mealie/repos/seed/resources/foods/locales/nl-NL.json +++ b/mealie/repos/seed/resources/foods/locales/nl-NL.json @@ -2289,32 +2289,32 @@ "colby-jack cheese": { "aliases": [], "description": "", - "name": "colby-jack cheese", - "plural_name": "colby-jack cheese" + "name": "colby-jack kaas", + "plural_name": "colby-jack kaas" }, "jarlsberg cheese": { "aliases": [], "description": "", - "name": "jarlsberg cheese", - "plural_name": "jarlsberg cheese" + "name": "jarlsberg kaas", + "plural_name": "jarlsberg kaas" }, "taleggio cheese": { "aliases": [], "description": "", - "name": "taleggio cheese", - "plural_name": "taleggio cheese" + "name": "taleggio kaas", + "plural_name": "taleggio kaas" }, "oaxaca cheese": { "aliases": [], "description": "", - "name": "oaxaca cheese", - "plural_name": "oaxaca cheese" + "name": "oaxaca kaas", + "plural_name": "oaxaca kaas" }, "labneh cheese": { "aliases": [], "description": "", - "name": "labneh cheese", - "plural_name": "labneh cheese" + "name": "labneh kaas", + "plural_name": "labneh kaas" }, "edam cheese": { "aliases": [], @@ -2325,80 +2325,80 @@ "creamy cheese wedge": { "aliases": [], "description": "", - "name": "creamy cheese wedge", - "plural_name": "creamy cheese wedges" + "name": "romig stukje kaas", + "plural_name": "romig stukjes kaas" }, "cheese powder cheese": { "aliases": [], "description": "", - "name": "cheese powder cheese", - "plural_name": "cheese powder cheese" + "name": "kaaspoeder", + "plural_name": "kaaspoeder" }, "fromage blanc cheese": { "aliases": [], "description": "", - "name": "fromage blanc cheese", - "plural_name": "fromage blanc cheese" + "name": "kwark", + "plural_name": "kwark" }, "asadero cheese": { "aliases": [], "description": "", - "name": "asadero cheese", - "plural_name": "asadero cheese" + "name": "asadero kaas", + "plural_name": "asadero kaas" }, "marble cheese": { "aliases": [], "description": "", - "name": "marble cheese", - "plural_name": "marble cheese" + "name": "marmeren kaas", + "plural_name": "marmeren kaas" }, "leicester cheese": { "aliases": [], "description": "", - "name": "leicester cheese", - "plural_name": "leicester cheese" + "name": "leicester kaas", + "plural_name": "leicester kaas" }, "kefalotyri cheese": { "aliases": [], "description": "", - "name": "kefalotyri cheese", - "plural_name": "kefalotyri cheese" + "name": "kefalotyri kaas", + "plural_name": "kefalotyri kaas" }, "mizithra cheese": { "aliases": [], "description": "", - "name": "mizithra cheese", - "plural_name": "mizithra cheese" + "name": "mizithra kaas", + "plural_name": "mizithra kaas" }, "lancashire cheese": { "aliases": [], "description": "", - "name": "lancashire cheese", - "plural_name": "lancashire cheese" + "name": "lancashire kaas", + "plural_name": "lancashire kaas" }, "kasseri cheese": { "aliases": [], "description": "", - "name": "kasseri cheese", - "plural_name": "kasseri cheese" + "name": "kasseri kaas", + "plural_name": "kasseri kaas" }, "babybel cheese": { "aliases": [], "description": "", - "name": "babybel cheese", - "plural_name": "babybel cheese" + "name": "babybel kaas", + "plural_name": "babybel kaas" }, "panela cheese": { "aliases": [], "description": "", - "name": "panela cheese", - "plural_name": "panela cheese" + "name": "panela kaas", + "plural_name": "panela kaas" }, "longhorn cheese": { "aliases": [], "description": "", - "name": "longhorn cheese", - "plural_name": "longhorn cheese" + "name": "longhorn kaas", + "plural_name": "longhorn kaas" }, "seasoned feta cheese": { "aliases": [], @@ -2409,49 +2409,49 @@ "comté cheese": { "aliases": [], "description": "", - "name": "comté cheese", - "plural_name": "comté cheese" + "name": "comte kaas", + "plural_name": "comte kaas" }, "graviera cheese": { "aliases": [], "description": "", - "name": "graviera cheese", - "plural_name": "graviera cheese" + "name": "graviera kaas", + "plural_name": "graviera kaas" }, "wensleydale cheese": { "aliases": [], "description": "", - "name": "wensleydale cheese", - "plural_name": "wensleydale cheese" + "name": "wensleydale kaas", + "plural_name": "wensleydale kaas" }, "scamorza cheese": { "aliases": [], "description": "", - "name": "scamorza cheese", - "plural_name": "scamorza cheese" + "name": "scamorza kaas", + "plural_name": "scamorza kaas" }, "cambozola cheese": { "aliases": [], "description": "", - "name": "cambozola cheese", - "plural_name": "cambozola cheese" + "name": "cambozola kaas", + "plural_name": "cambozola kaas" }, "cheshire cheese": { "aliases": [], "description": "", - "name": "cheshire cheese", - "plural_name": "cheshire cheese" + "name": "cheshire kaas", + "plural_name": "cheshire kaas" }, "anthotyro cheese": { "aliases": [], "description": "", - "name": "anthotyro cheese", - "plural_name": "anthotyro cheese" + "name": "anthotyro kaas", + "plural_name": "anthotyro kaas" }, "chenna cheese": { "aliases": [], "description": "", - "name": "chenna cheese", + "name": "chenna kaas", "plural_name": "chenna cheese" }, "hard goat cheese": { @@ -3106,19 +3106,19 @@ "aliases": [], "description": "", "name": "vanille melk", - "plural_name": "vanilla milk" + "plural_name": "vanille melk" }, "yoplait whip": { "aliases": [], "description": "", - "name": "yoplait whip", - "plural_name": "yoplait whips" + "name": "yoplait(yoghurt) crememouse", + "plural_name": "yoplait(yoghurt) crememouse" }, "buffalo milk": { "aliases": [], "description": "", "name": "buffelmelk", - "plural_name": "buffalo milk" + "plural_name": "buffelmelk" }, "goat kefir": { "aliases": [], @@ -3129,8 +3129,8 @@ "lebneh": { "aliases": [], "description": "", - "name": "lebneh", - "plural_name": "lebnehs" + "name": "labneh(Lebanese yoghurt dip)", + "plural_name": "labneh(Lebanese yoghurt dip)" } } }, @@ -3199,8 +3199,8 @@ "kala namak salt": { "aliases": [], "description": "", - "name": "kala namak salt", - "plural_name": "kala namak salt" + "name": "kala namak zout(Indiaas zwart zout)", + "plural_name": "kala namak zout(Indiaas zwart zout)" }, "coconut butter": { "aliases": [], @@ -3464,7 +3464,7 @@ "aliases": [], "description": "", "name": "veganistische ranch", - "plural_name": "vegan ranches" + "plural_name": "veganistische ranch" }, "vegan chicken": { "aliases": [], @@ -3541,8 +3541,8 @@ "almond creamer": { "aliases": [], "description": "", - "name": "almond creamer", - "plural_name": "almond creamers" + "name": "amandelroomkoffie", + "plural_name": "amandelroomkoffie" }, "soy milk powder": { "aliases": [], @@ -3553,8 +3553,8 @@ "vegan cream cheese frosting": { "aliases": [], "description": "", - "name": "vegan cream cheese frosting", - "plural_name": "vegan cream cheese frostings" + "name": "veganistische roomkaas glazuur", + "plural_name": "veganistische roomkazen glazuur" }, "coconut manna": { "aliases": [], @@ -3583,8 +3583,8 @@ "cashew cheese sauce": { "aliases": [], "description": "", - "name": "cashew cheese sauce", - "plural_name": "cashew cheese sauce" + "name": "cashewnoot kaassaus", + "plural_name": "cashewnoten kaassaus" }, "coconut fat": { "aliases": [], @@ -3596,13 +3596,13 @@ "aliases": [], "description": "", "name": "lijnzaad melk", - "plural_name": "flax milk" + "plural_name": "lijnzaadmelk" }, "hazelnut creamer": { "aliases": [], "description": "", - "name": "hazelnut creamer", - "plural_name": "hazelnut creamers" + "name": "hazelnoot roomkoffie", + "plural_name": "hazelnoot roomkoffie" }, "quorn": { "aliases": [], @@ -3619,8 +3619,8 @@ "tofurky": { "aliases": [], "description": "", - "name": "tofurky", - "plural_name": "tofurkies" + "name": "kalkoenvervanger", + "plural_name": "kalkoenvervangers" }, "vegan nutella": { "aliases": [], @@ -3637,14 +3637,14 @@ "cashew cream cheese": { "aliases": [], "description": "", - "name": "cashew cream cheese", - "plural_name": "cashew cream cheese" + "name": "cashewnoot roomkaas", + "plural_name": "cashewnoten roomkaas" }, "cricket flour": { "aliases": [], "description": "", - "name": "cricket flour", - "plural_name": "cricket flour" + "name": "krekelmeel (Acheta-poeder)", + "plural_name": "krekelsmeel (Acheta-poeder)" }, "macadamia butter": { "aliases": [], @@ -3655,8 +3655,8 @@ "okara": { "aliases": [], "description": "", - "name": "okara", - "plural_name": "okaras" + "name": "okara (sojapulp)", + "plural_name": "okaras (sojapulpen)" }, "egg tofu": { "aliases": [], @@ -3674,7 +3674,7 @@ "aliases": [], "description": "", "name": "macadamia melk", - "plural_name": "macadamia milk" + "plural_name": "macadamia-notenmelk" }, "vegan taco meat": { "aliases": [], @@ -3698,7 +3698,7 @@ "aliases": [], "description": "", "name": "bananenmelk", - "plural_name": "banana milk" + "plural_name": "bananen melk" }, "soy quark": { "aliases": [], @@ -3722,7 +3722,7 @@ "aliases": [], "description": "", "name": "walnoten melk", - "plural_name": "walnut milk" + "plural_name": "walnoten melk" }, "latik": { "aliases": [], @@ -3941,7 +3941,7 @@ "ground sausage": { "aliases": [], "description": "", - "name": "ground sausage", + "name": "gehaktworst", "plural_name": "gehaktworsten" }, "ground pork sausage": { @@ -3959,8 +3959,8 @@ "bacon bit": { "aliases": [], "description": "", - "name": "bacon bit", - "plural_name": "bacon bits" + "name": "spekje (varkensvlees)", + "plural_name": "spekjes (varkensvlees)" }, "pork roast": { "aliases": [], @@ -4043,8 +4043,8 @@ "ham steak": { "aliases": [], "description": "", - "name": "ham steak", - "plural_name": "ham steaks" + "name": "beenham plakje", + "plural_name": "beenham plakjes" }, "venison": { "aliases": [], @@ -4193,14 +4193,14 @@ "hard salami": { "aliases": [], "description": "", - "name": "hard salami", - "plural_name": "hard salamis" + "name": "salami", + "plural_name": "salami" }, "back bacon": { "aliases": [], "description": "", - "name": "back bacon", - "plural_name": "back bacons" + "name": "bakbacon", + "plural_name": "bakbacons" }, "salt pork": { "aliases": [], @@ -4247,26 +4247,26 @@ "gammon joint": { "aliases": [], "description": "", - "name": "gammon joint", - "plural_name": "gammon joints" + "name": "achterham", + "plural_name": "achterhammen" }, "boneless beef short rib": { "aliases": [], "description": "", - "name": "boneless beef short rib", - "plural_name": "boneless beef short ribs" + "name": "runderrib zonder bot", + "plural_name": "runderribben zonder bot" }, "country ham": { "aliases": [], "description": "", - "name": "country ham", - "plural_name": "country hams" + "name": "beenham", + "plural_name": "beenhammen" }, "boneless ham": { "aliases": [], "description": "", - "name": "boneless ham", - "plural_name": "boneless hams" + "name": "schouderham", + "plural_name": "schouderhammen" }, "mortadella": { "aliases": [], @@ -4277,8 +4277,8 @@ "ground bison": { "aliases": [], "description": "", - "name": "ground bison", - "plural_name": "ground bisons" + "name": "bizon gehakt", + "plural_name": "bizon gehakt" }, "fresh sausage": { "aliases": [], @@ -4337,8 +4337,8 @@ "steak tip": { "aliases": [], "description": "", - "name": "steak tip", - "plural_name": "steak tips" + "name": "biefstuk puntje", + "plural_name": "biefstuk puntjes" }, "veal chop": { "aliases": [], @@ -4473,8 +4473,8 @@ "deli turkey": { "aliases": [], "description": "", - "name": "deli turkey", - "plural_name": "deli turkeys" + "name": "plakje kalkoen", + "plural_name": "plakjes kalkoen" }, "smoked turkey": { "aliases": [], @@ -4491,8 +4491,8 @@ "chicken quarter": { "aliases": [], "description": "", - "name": "chicken quarter", - "plural_name": "chicken quarters" + "name": "kwart van een kip", + "plural_name": "kwarten van een kip" }, "ground turkey sausage": { "aliases": [], @@ -4539,7 +4539,7 @@ "turkey pepperoni": { "aliases": [], "description": "", - "name": "turkey pepperoni", + "name": "pepperoni van kalkoen", "plural_name": "turkey pepperonis" }, "turkey ham": { @@ -4702,19 +4702,19 @@ "aliases": [], "description": "", "name": "turkey liver", - "plural_name": "turkey livers" + "plural_name": "kalkoen levertjes" }, "chicken neck": { "aliases": [], "description": "", - "name": "chicken neck", - "plural_name": "chicken necks" + "name": "kippennek", + "plural_name": "kippennekken" }, "duck confit": { "aliases": [], "description": "", "name": "", - "plural_name": "duck confits" + "plural_name": "geconfiteerde eend" }, "roast duck": { "aliases": [], @@ -4737,20 +4737,20 @@ "guinea fowl": { "aliases": [], "description": "", - "name": "guinea fowl", - "plural_name": "guinea fowls" + "name": "parelhoen", + "plural_name": "parelhoenen" }, "smoked turkey wing": { "aliases": [], "description": "", - "name": "smoked turkey wing", - "plural_name": "smoked turkey wings" + "name": "gerookte kalkoen wing", + "plural_name": "gerookte kalkoen wings" }, "chicken curry-cut": { "aliases": [], "description": "", - "name": "chicken curry-cut", - "plural_name": "chicken curry-cuts" + "name": "gesneden kippendij (met of zonder bot)", + "plural_name": "gesneden kippendijen (met of zonder bot)" }, "chicken schnitzel": { "aliases": [], @@ -4761,14 +4761,14 @@ "grouse": { "aliases": [], "description": "", - "name": "grouse", - "plural_name": "grouses" + "name": "korhoen", + "plural_name": "korhoenen" }, "chicken roast": { "aliases": [], "description": "", - "name": "chicken roast", - "plural_name": "chicken roasts" + "name": "geroosterde kip", + "plural_name": "geroosterde kippen" }, "goose liver": { "aliases": [], @@ -4780,37 +4780,37 @@ "aliases": [], "description": "", "name": "", - "plural_name": "turkey bones" + "plural_name": "kalkoen botten" }, "turkey lunch meat": { "aliases": [], "description": "", - "name": "turkey lunch meat", - "plural_name": "turkey lunch meats" + "name": "kalkoen platkjes", + "plural_name": "kalkoen plakjes" }, "turkey roast": { "aliases": [], "description": "", - "name": "turkey roast", - "plural_name": "turkey roasts" + "name": "geroosterde kalkoen", + "plural_name": "geroosterde kalkoenen" }, "capon": { "aliases": [], "description": "", - "name": "capon", - "plural_name": "capons" + "name": "kapoen/haan", + "plural_name": "kapoenen/haanen" }, "smoked turkey bacon": { "aliases": [], "description": "", - "name": "smoked turkey bacon", - "plural_name": "smoked turkey bacons" + "name": "gerookte bacon van kalkoen", + "plural_name": "gerookte bacon van kalkoen" }, "chicken bacon": { "aliases": [], "description": "", - "name": "chicken bacon", - "plural_name": "chicken bacons" + "name": "bacon van kip", + "plural_name": "bacon van kippen" }, "turkey rissole": { "aliases": [], @@ -5657,8 +5657,8 @@ "roasted seaweed": { "aliases": [], "description": "", - "name": "roasted seaweed", - "plural_name": "roasted seaweeds" + "name": "geroosterd zeewier", + "plural_name": "geroosterd zeewier" }, "smoked oyster": { "aliases": [], @@ -5688,7 +5688,7 @@ "aliases": [], "description": "", "name": "salted shrimp", - "plural_name": "salted shrimps" + "plural_name": "gezouten garnalen" }, "yaki-nori": { "aliases": [], @@ -5735,7 +5735,7 @@ "seaweed salad": { "aliases": [], "description": "", - "name": "seaweed salad", + "name": "zeewier salade", "plural_name": "seaweed salads" }, "dulse": { @@ -5747,8 +5747,8 @@ "smoked mussel": { "aliases": [], "description": "", - "name": "smoked mussel", - "plural_name": "smoked mussels" + "name": "gerookte mossel", + "plural_name": "gerookte mosselen" }, "sea snail": { "aliases": [], @@ -5777,8 +5777,8 @@ "korean seaweed": { "aliases": [], "description": "", - "name": "korean seaweed", - "plural_name": "korean seaweeds" + "name": "koreaans zeewier", + "plural_name": "koreaans zeewier" }, "ogo seaweed": { "aliases": [], @@ -6003,8 +6003,8 @@ "cracked pepper": { "aliases": [], "description": "", - "name": "cracked pepper", - "plural_name": "cracked pepper" + "name": "grove zwarte peper", + "plural_name": "grove zwarte peper" }, "peppercorn": { "aliases": [], @@ -6208,7 +6208,7 @@ "aliases": [], "description": "", "name": "mangopoeder", - "plural_name": "mango powder" + "plural_name": "mangopoeder" }, "black mustard seed": { "aliases": [], @@ -6243,8 +6243,8 @@ "pink peppercorn": { "aliases": [], "description": "", - "name": "pink peppercorn", - "plural_name": "pink peppercorns" + "name": "roze peperkorrel", + "plural_name": "roze peperkorrels" }, "hot paprika": { "aliases": [], @@ -6256,7 +6256,7 @@ "aliases": [], "description": "", "name": "citroentijm", - "plural_name": "lemon thyme" + "plural_name": "citroentijm" }, "galangal": { "aliases": [], @@ -6274,7 +6274,7 @@ "aliases": [], "description": "", "name": "gedroogde koriander", - "plural_name": "dried cilantro" + "plural_name": "gedroogde koreander" }, "lemon balm": { "aliases": [], @@ -6315,8 +6315,8 @@ "savory herb": { "aliases": [], "description": "", - "name": "savory herb", - "plural_name": "savory herbs" + "name": "bonekruid", + "plural_name": "bonekruid" }, "pandan leaf": { "aliases": [], @@ -6339,8 +6339,8 @@ "saigon cinnamon": { "aliases": [], "description": "", - "name": "saigon cinnamon", - "plural_name": "saigon cinnamon" + "name": "Saigon kaneel", + "plural_name": "Saigon kaneel" }, "lemongrass paste": { "aliases": [], @@ -6363,8 +6363,8 @@ "black cumin": { "aliases": [], "description": "", - "name": "black cumin", - "plural_name": "black cumins" + "name": "zwarte komijn", + "plural_name": "zwarte komijn" }, "anardana": { "aliases": [], @@ -6375,8 +6375,8 @@ "vietnamese mint": { "aliases": [], "description": "", - "name": "vietnamese mint", - "plural_name": "vietnamese mints" + "name": "Vietnamese munt", + "plural_name": "Vietnamese munt" }, "dried orange peel": { "aliases": [], @@ -6399,8 +6399,8 @@ "raw stevia": { "aliases": [], "description": "", - "name": "raw stevia", - "plural_name": "raw stevia" + "name": "rauwe stevia", + "plural_name": "rauwe stevia" }, "achiote paste": { "aliases": [], @@ -6411,8 +6411,8 @@ "summer savory": { "aliases": [], "description": "", - "name": "summer savory", - "plural_name": "summer savories" + "name": "zomerbonekruid", + "plural_name": "zomerbonekruid" }, "fennel pollen": { "aliases": [], @@ -6428,7 +6428,7 @@ "aliases": [], "description": "", "name": "suiker", - "plural_name": "sugar" + "plural_name": "suiker" }, "brown sugar": { "aliases": [ @@ -6441,11 +6441,11 @@ "confectioners sugar": { "aliases": [ "poedersuiker", - "icing sugar" + "poedersuiker" ], "description": "", "name": "poedersuiker", - "plural_name": "confectioners sugar" + "plural_name": "fondant suiker" }, "bar sugar": { "aliases": [ @@ -6561,7 +6561,7 @@ "aliases": [], "description": "", "name": "vloeibare stevia", - "plural_name": "liquid stevia" + "plural_name": "vloeibare stevia" }, "grenadine": { "aliases": [], @@ -6573,7 +6573,7 @@ "aliases": [], "description": "", "name": "grove suiker", - "plural_name": "coarse sugar" + "plural_name": "grove suiker" }, "salted caramel syrup": { "aliases": [], @@ -6584,14 +6584,14 @@ "sanding sugar": { "aliases": [], "description": "", - "name": "sanding sugar", - "plural_name": "sanding sugar" + "name": "sanding suiker", + "plural_name": "sanding suiker" }, "dark corn syrup": { "aliases": [], "description": "", - "name": "dark corn syrup", - "plural_name": "dark corn syrup" + "name": "donkere mäissiroop", + "plural_name": "donkere mäissiroop" }, "sucralose": { "aliases": [], @@ -6608,8 +6608,8 @@ "maple sugar": { "aliases": [], "description": "", - "name": "maple sugar", - "plural_name": "maple sugar" + "name": "esdoorn suiker", + "plural_name": "esdoorn suiker" }, "blackstrap molass": { "aliases": [], @@ -6626,14 +6626,14 @@ "rock sugar": { "aliases": [], "description": "", - "name": "rock sugar", - "plural_name": "rock sugar" + "name": "steen suiker", + "plural_name": "steen suiker" }, "confectioners' sweetener": { "aliases": [], "description": "", - "name": "confectioners' sweetener", - "plural_name": "confectioners' sweeteners" + "name": "confectie zoetstof", + "plural_name": "confectie zoetstof" }, "xylitol": { "aliases": [], @@ -6716,8 +6716,8 @@ "date paste": { "aliases": [], "description": "", - "name": "date paste", - "plural_name": "date paste" + "name": "dadelpasta", + "plural_name": "dadelpasta" }, "coconut syrup": { "aliases": [], @@ -6740,8 +6740,8 @@ "rice syrup": { "aliases": [], "description": "", - "name": "rice syrup", - "plural_name": "rice syrup" + "name": "rijstsiroop", + "plural_name": "rijstsiroop" }, "manuka honey": { "aliases": [], @@ -6914,8 +6914,8 @@ "inulin": { "aliases": [], "description": "", - "name": "inulin", - "plural_name": "inulins" + "name": "inuline", + "plural_name": "inuline" }, "sweet'n low": { "aliases": [], @@ -6956,8 +6956,8 @@ "date sugar": { "aliases": [], "description": "", - "name": "date sugar", - "plural_name": "date sugar" + "name": "dadelsuiker", + "plural_name": "dadelsuiker" }, "mastic gum": { "aliases": [], @@ -8630,14 +8630,14 @@ "granola cereal": { "aliases": [], "description": "", - "name": "granola cereal", - "plural_name": "granola cereals" + "name": "granola", + "plural_name": "granola" }, "bulgur": { "aliases": [], "description": "", "name": "bulgur", - "plural_name": "bulgurs" + "plural_name": "bulgur" }, "pearl barley": { "aliases": [], @@ -8691,7 +8691,7 @@ "aliases": [], "description": "", "name": "sushirijst", - "plural_name": "sushi rices" + "plural_name": "sushirijst" }, "glutinous rice": { "aliases": [], @@ -8702,8 +8702,8 @@ "instant rice": { "aliases": [], "description": "", - "name": "instant rice", - "plural_name": "instant rices" + "name": "instantrijst", + "plural_name": "instantrijst" }, "hominy": { "aliases": [], @@ -8816,8 +8816,8 @@ "paella rice": { "aliases": [], "description": "", - "name": "paella rice", - "plural_name": "paella rices" + "name": "paellarijst", + "plural_name": "paellarijst" }, "sorghum": { "aliases": [], @@ -8834,8 +8834,8 @@ "mexican rice": { "aliases": [], "description": "", - "name": "mexican rice", - "plural_name": "mexican rices" + "name": "mexicaanse rijst", + "plural_name": "mexicaanse rijst" }, "idli rice": { "aliases": [], From 5db3b6ab72b9aa593f58998af99e346fc03c4570 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 09:56:43 +0100 Subject: [PATCH 08/10] fix(deps): update dependency openai to v2.23.0 (#7132) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9a20eedcb..488ce7db7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dependencies = [ "pydantic-settings==2.13.1", "pillow-heif==1.2.1", "pyjwt==2.11.0", - "openai==2.22.0", + "openai==2.23.0", "typing-extensions==4.15.0", "itsdangerous==2.2.0", "ingredient-parser-nlp==2.5.0", diff --git a/uv.lock b/uv.lock index 40a2d444f..3e2980280 100644 --- a/uv.lock +++ b/uv.lock @@ -918,7 +918,7 @@ requires-dist = [ { name = "itsdangerous", specifier = "==2.2.0" }, { name = "jinja2", specifier = "==3.1.6" }, { name = "lxml", specifier = "==6.0.2" }, - { name = "openai", specifier = "==2.22.0" }, + { name = "openai", specifier = "==2.23.0" }, { name = "orjson", specifier = "==3.11.7" }, { name = "paho-mqtt", specifier = "==1.6.1" }, { name = "pillow", specifier = "==12.1.1" }, @@ -1143,7 +1143,7 @@ wheels = [ [[package]] name = "openai" -version = "2.22.0" +version = "2.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1155,9 +1155,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/ed/0a004a42fea6b6f3dd4ab33235183e994a4c7ade214fba10d9494577ec04/openai-2.22.0.tar.gz", hash = "sha256:fc2ea71c79951ac3faf178ff72c766bb4b09c3e9aab277184c5260ab3e94294f", size = 657093, upload-time = "2026-02-23T20:14:31.017Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/4b/dc1d84b8237205ebe48a1b1c9c3a8e1ab9fd08b30811b6d787196df58fd6/openai-2.23.0.tar.gz", hash = "sha256:7d24cc8087d5e8eed58e98aaa823391d39d12f9a9a2755770f67c7bb2004d94c", size = 657323, upload-time = "2026-02-24T03:20:20.323Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9a/ac24d606ea7e729475100689a1fe8866fe6cbcd0fd9b93dc4b8324be353d/openai-2.22.0-py3-none-any.whl", hash = "sha256:df02cfb731fe312215d046bf1330030e0f4b70a7b880b96992b1517b0b6aced8", size = 1118913, upload-time = "2026-02-23T20:14:29.546Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5f/bcdf0fb510c24f021e485f920677da363cd59d6e0310171bf2cad6e052b5/openai-2.23.0-py3-none-any.whl", hash = "sha256:1041d40bebf845053fda1946104f8bf9c3e2df957a41c3878c55c72c352630e9", size = 1118971, upload-time = "2026-02-24T03:20:18.708Z" }, ] [[package]] From 03f849f20fd004a372c161b57096179e81171521 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:09:43 -0600 Subject: [PATCH 09/10] chore(deps): update dependency mkdocs-material to v9.7.3 (#7134) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 4 ++-- uv.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 488ce7db7..467dec628 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,12 +58,12 @@ pgsql = [ [dependency-groups] docs = [ - "mkdocs-material==9.7.2", + "mkdocs-material==9.7.3", ] dev = [ "coverage==7.13.4", "coveragepy-lcov==0.1.2", - "mkdocs-material==9.7.2", + "mkdocs-material==9.7.3", "mypy==1.19.1", "pre-commit==4.5.1", "pylint==4.0.5", diff --git a/uv.lock b/uv.lock index 3e2980280..86a25866f 100644 --- a/uv.lock +++ b/uv.lock @@ -950,7 +950,7 @@ dev = [ { name = "coverage", specifier = "==7.13.4" }, { name = "coveragepy-lcov", specifier = "==0.1.2" }, { name = "freezegun", specifier = "==1.5.5" }, - { name = "mkdocs-material", specifier = "==9.7.2" }, + { name = "mkdocs-material", specifier = "==9.7.3" }, { name = "mypy", specifier = "==1.19.1" }, { name = "pre-commit", specifier = "==4.5.1" }, { name = "pydantic-to-typescript2", specifier = "==1.0.6" }, @@ -965,7 +965,7 @@ dev = [ { name = "types-requests", specifier = "==2.32.4.20260107" }, { name = "types-urllib3", specifier = "==1.26.25.14" }, ] -docs = [{ name = "mkdocs-material", specifier = "==9.7.2" }] +docs = [{ name = "mkdocs-material", specifier = "==9.7.3" }] [[package]] name = "mergedeep" @@ -1030,7 +1030,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.7.2" +version = "9.7.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -1045,9 +1045,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/57/5d3c8c9e2ff9d66dc8f63aa052eb0bac5041fecff7761d8689fe65c39c13/mkdocs_material-9.7.2.tar.gz", hash = "sha256:6776256552290b9b7a7aa002780e25b1e04bc9c3a8516b6b153e82e16b8384bd", size = 4097818, upload-time = "2026-02-18T15:53:07.763Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/b4/f900fcb8e6f510241e334ca401eddcb61ed880fb6572f7f32e4228472ca1/mkdocs_material-9.7.3.tar.gz", hash = "sha256:e5f0a18319699da7e78c35e4a8df7e93537a888660f61a86bd773a7134798f22", size = 4097748, upload-time = "2026-02-24T12:06:22.646Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/19/d194e75e82282b1d688f0720e21b5ac250ed64ddea333a228aaf83105f2e/mkdocs_material-9.7.2-py3-none-any.whl", hash = "sha256:9bf6f53452d4a4d527eac3cef3f92b7b6fc4931c55d57766a7d87890d47e1b92", size = 9305052, upload-time = "2026-02-18T15:53:05.221Z" }, + { url = "https://files.pythonhosted.org/packages/b9/1b/16ad0193079bb8a15aa1d2620813a9cd15b18de150a4ea1b2c607fb4c74d/mkdocs_material-9.7.3-py3-none-any.whl", hash = "sha256:37ebf7b4788c992203faf2e71900be3c197c70a4be9b0d72aed537b08a91dd9d", size = 9305078, upload-time = "2026-02-24T12:06:19.155Z" }, ] [[package]] From 282eedfe2bbf5b710e6d5815e8c845f2f288cfad Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:23:33 +0100 Subject: [PATCH 10/10] chore: refactor data management pages (#7107) --- .../components/Domain/Group/GroupDataPage.vue | 217 +++++ frontend/components/global/AutoForm.vue | 357 +++----- frontend/components/global/CrudTable.vue | 191 ++--- frontend/composables/forms/use-field-types.ts | 4 +- .../use-setup/common-settings-form.ts | 5 +- frontend/composables/use-users/user-form.ts | 21 +- frontend/composables/use-validators.ts | 8 +- frontend/lang/messages/en-US.json | 4 +- frontend/lib/validators/inputs.ts | 2 +- frontend/pages/admin/manage/groups/index.vue | 3 +- .../pages/admin/manage/households/index.vue | 2 +- frontend/pages/group/data/categories.vue | 306 ++----- frontend/pages/group/data/foods.vue | 768 +++++++----------- frontend/pages/group/data/labels.vue | 383 +++------ frontend/pages/group/data/recipe-actions.vue | 377 +++------ frontend/pages/group/data/tags.vue | 310 ++----- frontend/pages/group/data/tools.vue | 384 +++------ frontend/pages/group/data/units.vue | 696 ++++++---------- frontend/types/auto-forms.ts | 5 +- 19 files changed, 1457 insertions(+), 2586 deletions(-) create mode 100644 frontend/components/Domain/Group/GroupDataPage.vue diff --git a/frontend/components/Domain/Group/GroupDataPage.vue b/frontend/components/Domain/Group/GroupDataPage.vue new file mode 100644 index 000000000..1865373fc --- /dev/null +++ b/frontend/components/Domain/Group/GroupDataPage.vue @@ -0,0 +1,217 @@ + + + diff --git a/frontend/components/global/AutoForm.vue b/frontend/components/global/AutoForm.vue index ffd8e0a6a..8407e7603 100644 --- a/frontend/components/global/AutoForm.vue +++ b/frontend/components/global/AutoForm.vue @@ -1,211 +1,136 @@ diff --git a/frontend/components/global/CrudTable.vue b/frontend/components/global/CrudTable.vue index 1bdcb4950..5ab57a598 100644 --- a/frontend/components/global/CrudTable.vue +++ b/frontend/components/global/CrudTable.vue @@ -8,11 +8,11 @@ nudge-bottom="6" :close-on-content-click="false" > -