From dec67f6ef954f68eeb43177e76d16a3ed087f9fc Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:13:32 -0600 Subject: [PATCH 01/46] chore(l10n): New Crowdin updates (#4840) --- frontend/lang/messages/ro-RO.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index 22f829d6a..a296a4a08 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -182,7 +182,7 @@ "date": "Dată", "id": "Id", "owner": "Proprietar", - "change-owner": "Change Owner", + "change-owner": "Modifica proprietar", "date-added": "Data adăugării", "none": "Niciuna", "run": "Execută", @@ -214,10 +214,10 @@ "confirm-delete-generic-items": "Sunteți sigur că doriți să ștergeți următoarele?", "organizers": "Organizatori", "caution": "Atenție", - "show-advanced": "Show Advanced", - "add-field": "Add Field", - "date-created": "Date Created", - "date-updated": "Date Updated" + "show-advanced": "Arată avansate", + "add-field": "Adaugă câmp", + "date-created": "Data creării", + "date-updated": "Data actualizată" }, "group": { "are-you-sure-you-want-to-delete-the-group": "Sunteți sigur că doriți să ștergeți {groupName}?", @@ -277,7 +277,7 @@ "admin-group-management-text": "Modificările la acest grup se vor reflecta imediat.", "group-id-value": "ID grup: {0}", "total-households": "Total locuințe", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "you-must-select-a-group-before-selecting-a-household": "Trebuie să selectaţi un grup înainte de a selecta o gospodărie" }, "household": { "household": "Locuință", @@ -357,7 +357,7 @@ "for-type-meal-types": "pentru {0} tipuri de mese", "meal-plan-rules": "Regulile Planului de Masă", "new-rule": "Regulă nouă", - "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", + "meal-plan-rules-description": "Puteți crea reguli pentru selectarea automată a rețetelor pentru planurile dumneavoastră de masă. Aceste reguli sunt folosite de către server pentru a determina rețetele valabile pentru selecție, atunci când creezi planurile de masă. În cazul in care regulile au aceleași constrângeri de zi sau de tip, atunci categoriile regulilor vor fi fuzionate. În practică, este inutilă creerea regulilor dublate, dar este posibil să se întample acest lucru.", "new-rule-description": "Atunci când creați o nouă regulă pentru un plan de masă puteți restricționa regula aplicabilă pentru o anumită zi a săptămânii și/sau pentru un anumit tip de masă. Pentru a aplica o regulă pentru toate zilele sau toate tipurile de mese puteţi seta regula la \"Oricare\" ce va fi aplicată la toate valorile posibile pentru ziua şi/sau tipul mesei.", "recipe-rules": "Reguli rețetă", "applies-to-all-days": "Se aplică pentru toate zilele", @@ -467,7 +467,7 @@ "calories-suffix": "calorii", "carbohydrate-content": "Carbohidrat", "categories": "Categorii", - "cholesterol-content": "Cholesterol", + "cholesterol-content": "Colesterol", "comment-action": "Comentariu", "comment": "Comentariu", "comments": "Comentarii", @@ -514,11 +514,11 @@ "recipe-updated": "Rețetă actualizată", "remove-from-favorites": "Șterge din Favorite", "remove-section": "Elimină secţiunea", - "saturated-fat-content": "Saturated fat", + "saturated-fat-content": "Acizi grași saturați", "save-recipe-before-use": "Salvați rețeta înainte de utilizare", "section-title": "Titlu secțiune", "servings": "Porții", - "serves-amount": "Serves {amount}", + "serves-amount": "Servire {amount}", "share-recipe-message": "Voiam să vă împărtășesc rețeta mea: {0}.", "show-nutrition-values": "Afișare valori nutriționale", "sodium-content": "Sodiu", @@ -526,9 +526,9 @@ "sugar-content": "Zaharuri", "title": "Titlu", "total-time": "Timp total", - "trans-fat-content": "Trans-fat", + "trans-fat-content": "Acizii grași nesaturați", "unable-to-delete-recipe": "Rețeta nu a putut fi ștearsă", - "unsaturated-fat-content": "Unsaturated fat", + "unsaturated-fat-content": "Acizi grași nesaturați", "no-recipe": "Nicio rețetă", "locked-by-owner": "Blocat de proprietar", "join-the-conversation": "Alătură-te conversației", @@ -547,7 +547,7 @@ "failed-to-add-recipe-to-mealplan": "Adăugarea rețetei la planul de mese a eșuat", "failed-to-add-to-list": "Adăugarea la listă a eșuat", "yield": "Producție", - "yields-amount-with-text": "Yields {amount} {text}", + "yields-amount-with-text": "Produce {amount} {text}", "yield-text": "Yield Text", "quantity": "Cantitate", "choose-unit": "Alegeţi unitatea", From 92ab103b3ad46f6b09484d36bd743c1f7c520871 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 16:01:38 +0000 Subject: [PATCH 02/46] chore(auto): Update pre-commit hooks (#4838) 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 10ef47fec..8696d87f2 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.8.4 + rev: v0.8.6 hooks: - id: ruff - id: ruff-format From f2e1289ab0ec5fb152d820f358b53b8fa4336160 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:51:07 +1100 Subject: [PATCH 03/46] fix(deps): update dependency pillow to v11.1.0 (#4814) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 150 +++++++++++++++++++++++++--------------------------- 1 file changed, 73 insertions(+), 77 deletions(-) diff --git a/poetry.lock b/poetry.lock index d5d778ce2..da5e44df7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1744,93 +1744,89 @@ files = [ [[package]] name = "pillow" -version = "11.0.0" +version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" files = [ - {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, - {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, - {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, - {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, - {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, - {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, - {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, - {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, - {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, - {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, - {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, - {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, - {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, - {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, - {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, - {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, - {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, - {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, - {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, - {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, - {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, - {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] typing = ["typing-extensions"] xmp = ["defusedxml"] From d0508f7ca494c4258332003be487da663f4c5a06 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:02:06 +0000 Subject: [PATCH 04/46] docs(auto): Update image tag, for release v2.4.2 (#4845) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> --- .../getting-started/installation/installation-checklist.md | 2 +- .../docs/documentation/getting-started/installation/postgres.md | 2 +- docs/docs/documentation/getting-started/installation/sqlite.md | 2 +- frontend/package.json | 2 +- pyproject.toml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/documentation/getting-started/installation/installation-checklist.md b/docs/docs/documentation/getting-started/installation/installation-checklist.md index 70de16648..1cf2500f7 100644 --- a/docs/docs/documentation/getting-started/installation/installation-checklist.md +++ b/docs/docs/documentation/getting-started/installation/installation-checklist.md @@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do: 1. Take a backup just in case! -2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.4.1` +2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.4.2` 3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access. 4. Restart the container diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md index ebec14c6c..dac2231c4 100644 --- a/docs/docs/documentation/getting-started/installation/postgres.md +++ b/docs/docs/documentation/getting-started/installation/postgres.md @@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In ```yaml services: mealie: - image: ghcr.io/mealie-recipes/mealie:v2.4.1 # (3) + image: ghcr.io/mealie-recipes/mealie:v2.4.2 # (3) container_name: mealie restart: always ports: diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md index b359d494c..49d2dd6f9 100644 --- a/docs/docs/documentation/getting-started/installation/sqlite.md +++ b/docs/docs/documentation/getting-started/installation/sqlite.md @@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th ```yaml services: mealie: - image: ghcr.io/mealie-recipes/mealie:v2.4.1 # (3) + image: ghcr.io/mealie-recipes/mealie:v2.4.2 # (3) container_name: mealie restart: always ports: diff --git a/frontend/package.json b/frontend/package.json index 1c219a19e..ce8f058f7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mealie", -"version": "2.4.1", +"version": "2.4.2", "private": true, "scripts": { "dev": "nuxt", diff --git a/pyproject.toml b/pyproject.toml index 306d4c2fd..0421a0802 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ authors = ["Hayden "] description = "A Recipe Manager" license = "AGPL" name = "mealie" -version = "2.4.1" +version = "2.4.2" [tool.poetry.scripts] start = "mealie.app:main" From eafb7b9ffcca9db721a32a7190ecc136585b6f29 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Tue, 7 Jan 2025 07:48:27 -0600 Subject: [PATCH 05/46] chore(l10n): New Crowdin updates (#4852) --- frontend/lang/messages/pt-PT.json | 52 +++++++++++++++---------------- mealie/lang/messages/pt-PT.json | 14 ++++----- mealie/lang/messages/sv-SE.json | 4 +-- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/frontend/lang/messages/pt-PT.json b/frontend/lang/messages/pt-PT.json index 433e8fe17..f35f9dd3b 100644 --- a/frontend/lang/messages/pt-PT.json +++ b/frontend/lang/messages/pt-PT.json @@ -277,7 +277,7 @@ "admin-group-management-text": "As alterações a este grupo serão aplicadas imediatamente.", "group-id-value": "ID do Grupo: {0}", "total-households": "Total de Lares", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "you-must-select-a-group-before-selecting-a-household": "Tens de selecionar um grupo antes de selecionar uma casa" }, "household": { "household": "Casa", @@ -518,7 +518,7 @@ "save-recipe-before-use": "Guardar receita antes de usar", "section-title": "Título da secção", "servings": "Porções", - "serves-amount": "Serves {amount}", + "serves-amount": "Serve {amount}", "share-recipe-message": "Eu queria partilhar a minha {0} receita consigo.", "show-nutrition-values": "Mostrar valores nutricionais", "sodium-content": "Sódio", @@ -547,8 +547,8 @@ "failed-to-add-recipe-to-mealplan": "Erro ao adicionar receita ao plano de refeições", "failed-to-add-to-list": "Erro ao adicionar à lista", "yield": "Rendimento", - "yields-amount-with-text": "Yields {amount} {text}", - "yield-text": "Yield Text", + "yields-amount-with-text": "Rendimentos {amount} {text}", + "yield-text": "Rendimento Texto", "quantity": "Quantidade", "choose-unit": "Escolha uma unidade", "press-enter-to-create": "Prima 'Enter' para criar", @@ -644,9 +644,9 @@ "recipe-debugger-use-openai-description": "Utilize o OpenAI para analisar os resultados em vez de depender da biblioteca de scrapers. Ao criar uma receita através de um URL, isto é feito automaticamente se a biblioteca de scrapers falhar, mas pode testá-la manualmente aqui.", "debug": "Depurar", "tree-view": "Vista em árvore", - "recipe-servings": "Recipe Servings", + "recipe-servings": "Porções por receita", "recipe-yield": "Rendimento da receita", - "recipe-yield-text": "Recipe Yield Text", + "recipe-yield-text": "Rendimento da Receita Texto", "unit": "Unidade", "upload-image": "Carregar imagem", "screen-awake": "Manter ecrã ligado", @@ -669,24 +669,24 @@ "no-food": "Nenhum Ingrediente" }, "reset-servings-count": "Reiniciar Contador de Doses", - "not-linked-ingredients": "Additional Ingredients" + "not-linked-ingredients": "Ingredientes Adicionais" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", - "max-missing-tools": "Max Missing Tools", - "selected-tools": "Selected Tools", - "other-filters": "Other Filters", - "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "recipe-finder": "Localizador de Receitas", + "recipe-finder-description": "Procure receitas com base nos ingredientes que tem em mãos. Pode também filtrar pelas ferramentas disponíveis e definir um número máximo de ingredientes ou ferramentas ausentes.", + "selected-ingredients": "Ingredientes Selecionados", + "no-ingredients-selected": "Nenhum ingrediente selecionado", + "missing": "Em falta", + "no-recipes-found": "Nenhuma receita encontrada", + "no-recipes-found-description": "Experimente adicionar mais ingredientes à sua pesquisa ou ajustar os seus filtros", + "include-ingredients-on-hand": "Incluir ingredientes disponíveis", + "include-tools-on-hand": "Incluir ferramentas disponíveis", + "max-missing-ingredients": "Máximo de ingredientes em falta", + "max-missing-tools": "Máximo de ferramentas em falta", + "selected-tools": "Ferramentas selecionadas", + "other-filters": "Outros filtros", + "ready-to-make": "Pronto para fazer", + "almost-ready-to-make": "Quase Pronto para fazer" }, "search": { "advanced-search": "Pesquisa Avançada", @@ -891,7 +891,7 @@ "are-you-sure-you-want-to-check-all-items": "Tem a certeza de que pretende selecionar todos os itens?", "are-you-sure-you-want-to-uncheck-all-items": "Tem a certeza de que pretende desmarcar todos os itens?", "are-you-sure-you-want-to-delete-checked-items": "Tem a certeza de que pretende eliminar todos os itens selecionados?", - "no-shopping-lists-found": "No Shopping Lists Found" + "no-shopping-lists-found": "Nenhuma lista de compras encontrada" }, "sidebar": { "all-recipes": "Todas as Receitas", @@ -1303,7 +1303,7 @@ "profile": { "welcome-user": "👋 Bem-vindo, {0}!", "description": "Gira o seu perfil, receitas e definições de grupo.", - "invite-link": "Invite Link", + "invite-link": "Link de convite", "get-invite-link": "Obter ligação de convite", "get-public-link": "Obter ligação pública", "account-summary": "Resumo da conta", @@ -1353,8 +1353,8 @@ "cookbook": { "cookbooks": "Livros de Receitas", "description": "Os livros de receitas são outra forma de organizar as receitas, criando secções cruzadas de receitas, organizadores e outros filtros. A criação de um livro de receitas adicionará uma entrada à barra lateral e todas as receitas com os filtros selecionados serão apresentadas no livro de receitas.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "hide-cookbooks-from-other-households": "Ocultar livros de receitas de outras famílias", + "hide-cookbooks-from-other-households-description": "Quando ativado, apenas os livros de receitas da sua família aparecerão na barra lateral", "public-cookbook": "Livro de Receitas público", "public-cookbook-description": "Os Livros de Receitas públicos podem ser partilhados com utilizadores não registados e serão exibidos na sua página de grupos.", "filter-options": "Opções de Filtro", diff --git a/mealie/lang/messages/pt-PT.json b/mealie/lang/messages/pt-PT.json index 681a477d3..c8049198d 100644 --- a/mealie/lang/messages/pt-PT.json +++ b/mealie/lang/messages/pt-PT.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "Os nomes de receitas devem ser únicos", - "recipe-created": "Recipe Created", + "recipe-created": "Receita criada", "recipe-defaults": { "ingredient-note": "1 Chávena de Farinha", "step-text": "Os passos da receita, bem como outros campos na página da receita, suportam a sintaxe markdown.\n\n**Adicionar um link**\n\n[Meu link](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "Faz", + "serves": "Serve", + "serving": "Porção", + "servings": "Porções", + "yield": "Rendimento", + "yields": "Rendimentos" } }, "mealplan": { diff --git a/mealie/lang/messages/sv-SE.json b/mealie/lang/messages/sv-SE.json index a6259ad40..12fdc2e2a 100644 --- a/mealie/lang/messages/sv-SE.json +++ b/mealie/lang/messages/sv-SE.json @@ -10,8 +10,8 @@ "step-text": "Receptsteg samt andra fält i receptsidan stöder markdown syntax.\n\n**Lägg till en länk**\n\n[Min länk](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", + "makes": "Portioner", + "serves": "Portioner", "serving": "Portion", "servings": "Portioner", "yield": "Ger", From 795c2cf5752b3958abf3ba914819559213f63aa6 Mon Sep 17 00:00:00 2001 From: "gpotter@gmail.com" <119442226+parumpum@users.noreply.github.com> Date: Tue, 7 Jan 2025 07:55:59 -0800 Subject: [PATCH 06/46] fix: Allow scraping calories as number (#4854) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- mealie/services/scraper/cleaner.py | 29 +++++++++++++++---- .../scraper_tests/test_cleaner_parts.py | 18 ++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/mealie/services/scraper/cleaner.py b/mealie/services/scraper/cleaner.py index 661792022..1089008c4 100644 --- a/mealie/services/scraper/cleaner.py +++ b/mealie/services/scraper/cleaner.py @@ -120,7 +120,8 @@ def clean_image(image: str | list | dict | None = None, default: str = "no image case str(image): return [image] case [str(_), *_]: - return [x for x in image if x] # Only return non-null strings in list + # Only return non-null strings in list + return [x for x in image if x] case [{"url": str(_)}, *_]: return [x["url"] for x in image if "url" in x] case {"url": str(image)}: @@ -128,7 +129,10 @@ def clean_image(image: str | list | dict | None = None, default: str = "no image case [{"@id": str(_)}, *_]: return [x["@id"] for x in image if "@id" in x] case _: - logger.exception(f"Unexpected type for image: {type(image)}, {image}") + logger.exception( + f"Unexpected type for image: { + type(image)}, {image}" + ) return [default] @@ -223,7 +227,10 @@ def clean_instructions(steps_object: list | dict | str, default: list | None = N ) ) case _: - raise TypeError(f"Unexpected type for instructions: {type(steps_object)}, {steps_object}") + raise TypeError( + f"Unexpected type for instructions: { + type(steps_object)}, {steps_object}" + ) def _sanitize_instruction_text(line: str | dict) -> str: @@ -283,7 +290,10 @@ def clean_ingredients(ingredients: list | str | None, default: list | None = Non case str(ingredients): return [clean_string(ingredient) for ingredient in ingredients.splitlines() if ingredient.strip()] case _: - raise TypeError(f"Unexpected type for ingredients: {type(ingredients)}, {ingredients}") + raise TypeError( + f"Unexpected type for ingredients: { + type(ingredients)}, {ingredients}" + ) def clean_int(val: str | int | None, min: int | None = None, max: int | None = None): @@ -521,7 +531,10 @@ def clean_categories(category: str | list) -> list[str]: # return [cat["name"] for cat in category if "name" in cat] case _: - raise TypeError(f"Unexpected type for category: {type(category)}, {category}") + raise TypeError( + f"Unexpected type for category: { + type(category)}, {category}" + ) def clean_tags(data: str | list[str]) -> list[str]: @@ -570,4 +583,10 @@ def clean_nutrition(nutrition: dict | None) -> dict[str, str]: with contextlib.suppress(AttributeError, TypeError): output_nutrition[key] = str(float(output_nutrition[key]) * 1000) + for key in ["calories"]: + if val := nutrition.get(key, None): + if isinstance(val, int | float): + with contextlib.suppress(AttributeError, TypeError): + output_nutrition[key] = str(val) + return output_nutrition diff --git a/tests/unit_tests/services_tests/scraper_tests/test_cleaner_parts.py b/tests/unit_tests/services_tests/scraper_tests/test_cleaner_parts.py index 98bf636dc..61e2e86b8 100644 --- a/tests/unit_tests/services_tests/scraper_tests/test_cleaner_parts.py +++ b/tests/unit_tests/services_tests/scraper_tests/test_cleaner_parts.py @@ -537,6 +537,24 @@ nutrition_test_cases = ( "fatContent": "10", }, ), + CleanerCase( + test_id="calories as int", + input={ + "calories": 100, + }, + expected={ + "calories": "100", + }, + ), + CleanerCase( + test_id="calories as float", + input={ + "calories": 100.0, + }, + expected={ + "calories": "100.0", + }, + ), CleanerCase( test_id="invalid keys get removed", input={ From 4d21900dff9dd891c391d917cb51a3a06a397cad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:08:56 +0100 Subject: [PATCH 07/46] fix(deps): update dependency openai to v1.59.4 (#4855) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index da5e44df7..73a665c1d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1590,13 +1590,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.59.3" +version = "1.59.4" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.59.3-py3-none-any.whl", hash = "sha256:b041887a0d8f3e70d1fc6ffbb2bf7661c3b9a2f3e806c04bf42f572b9ac7bc37"}, - {file = "openai-1.59.3.tar.gz", hash = "sha256:7f7fff9d8729968588edf1524e73266e8593bb6cab09298340efb755755bb66f"}, + {file = "openai-1.59.4-py3-none-any.whl", hash = "sha256:82113498699998e98104f87c19a890e82df9b01251a0395484360575d3a1d98a"}, + {file = "openai-1.59.4.tar.gz", hash = "sha256:b946dc5a2308dc1e03efbda80bf1cd64b6053b536851ad519f57ee44401663d2"}, ] [package.dependencies] From d3c6106566308843adfa0f1020e610ec43629be8 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:16:12 +0100 Subject: [PATCH 08/46] dev: remove PR type from PR description (#4847) --- .github/pull_request_template.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 09f8f5695..b890608ff 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -20,20 +20,6 @@ --> -## What type of PR is this? - -_(REQUIRED)_ - - - -- feature -- bug -- documentation -- cleanup -- dev (Internal development) - ## What this PR does / why we need it: _(REQUIRED)_ From 688d07a5c8f217259a9ea2dd1cc6f94bbbb381f2 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:26:36 +0100 Subject: [PATCH 09/46] fix: remove edit scale icon when not scalable (#4849) --- .../Domain/Recipe/RecipeScaleEditButton.vue | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/components/Domain/Recipe/RecipeScaleEditButton.vue b/frontend/components/Domain/Recipe/RecipeScaleEditButton.vue index 50a500a98..16a416d86 100644 --- a/frontend/components/Domain/Recipe/RecipeScaleEditButton.vue +++ b/frontend/components/Domain/Recipe/RecipeScaleEditButton.vue @@ -4,11 +4,18 @@
From 22f306a3842e0b6a1cd9e1fbf45b656d2baf7419 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:38:01 +0100 Subject: [PATCH 10/46] feat: add make_admin script (#4853) --- .../docs/documentation/getting-started/faq.md | 10 +++++++ docs/docs/overrides/api.html | 2 +- mealie/scripts/make_admin.py | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 mealie/scripts/make_admin.py diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index 5484c718a..b07dc44ab 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -84,6 +84,16 @@ docker exec -it mealie bash python /app/mealie/scripts/reset_locked_users.py ``` +## How can I reset admin privileges for my account? + +If you've lost admin privileges and no other admin can restore them, you can use the Command Line Interface (CLI) to grant admin access. + +```shell +docker exec -it mealie bash + +python /app/mealie/scripts/make_admin.py +``` + ## How can I change my password? You can change your password by going to the user profile page and clicking the "Change Password" button. Alternatively you can use the following script to change your password via the CLI if you are locked out of your account. diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 00328079e..8c7f4880d 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/mealie/scripts/make_admin.py b/mealie/scripts/make_admin.py new file mode 100644 index 000000000..71fd20ec0 --- /dev/null +++ b/mealie/scripts/make_admin.py @@ -0,0 +1,30 @@ +import sys + +from mealie.core import root_logger +from mealie.db.db_setup import session_context +from mealie.repos.repository_factory import AllRepositories + + +def main(): + confirmed = input("Enter user email to assign this user admin privileges: ") + + logger = root_logger.get_logger() + + with session_context() as session: + repos = AllRepositories(session, group_id=None, household_id=None) + + user = repos.users.get_one(confirmed, "email") + if not user: + logger.error("no user found") + sys.exit(1) + + user.admin = True + repos.users.update(user.id, user) + + logger.info("updated user %s to admin", user.username) + input("press enter to exit ") + sys.exit(0) + + +if __name__ == "__main__": + main() From 0f7c1d6a1462f7d8a7c7927c7e110058dbfb8342 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 7 Jan 2025 20:19:30 +0100 Subject: [PATCH 11/46] fix: remove kitchen timer (#4857) --- frontend/assets/audio/kitchen_alarm.mp3 | Bin 25331 -> 0 bytes .../Domain/Recipe/RecipeActionMenu.vue | 9 +- .../Domain/Recipe/RecipeTimerMenu.vue | 317 ------------------ frontend/lang/messages/en-US.json | 7 - frontend/lib/icons/icons.ts | 12 - frontend/nuxt.config.js | 11 - 6 files changed, 1 insertion(+), 355 deletions(-) delete mode 100644 frontend/assets/audio/kitchen_alarm.mp3 delete mode 100644 frontend/components/Domain/Recipe/RecipeTimerMenu.vue diff --git a/frontend/assets/audio/kitchen_alarm.mp3 b/frontend/assets/audio/kitchen_alarm.mp3 deleted file mode 100644 index e8eadc01a7081bb3166bf3cf378516aa3bfcf9e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25331 zcmdRVXH-*7)b2^6m(V+g-Z50E8hYrVNfkoxNEJnq00HS81O%lEN=HN#H1ysCtnku1 ziqfUt@U8Xzz4!N>wNBT#A>w0p*DW~IG0+uI zbGhr}ickx2@eKC7>xYn*k(5CQTYCDr+zky9F}Kz-B@SjMKGH~O84097TI8s(Y zS^1WRj=ny|%+k`v-qpjyHz4%UBOE?1H8nH0prGXC>-zepmJc64cJ>Sm508DGp8h^F zx3I9ZvbM3Yx%KP!@0~w?|L*SX9~>MW9sm1xa(Z@tesOt8oJ++(%}`55QVNNL*8Q)1 zatMBsXUPC)_(~4K8-@M<{p0`F{_^yVCO{4cfCwA_kP(&q2LM2z84wrogAjUDOSy2G zo^;niC00u17xdaGmqp7ccV1dtA3}^@ejuV(>fK(vMq7efMuG3UpPC@*1Nk^@UrXj; zs(9WX0jbz?{$I3i>(1{v_%4-5srcibIexgFHz4&Gq9b11p3;oq91pI+sfBLn^+?x` zg|zit1hBY2rnCIBGJcC-JwsSaLnnvW{!Q8&zGq&R6PelvTb zX%$X`j^E}#EM5(@&-B&d&yY_8^NNCflE@bH;NW}u+XS}xD)o2|ZvFg8^LT5j8^R%s zTmti4p@$S9d0yXQi}XT&n2={_Nd0hUHmV4GS}Q=Uk0pOtdOgH#b=A7&k)-;6{j-%r zfBDl;L3L-1J)3sF&3}zu&W=oeAFZA}J$g_u)A({r#kDb>Il`ve?}duQkxlQ&)Qa>g9}}R?^!Ia#TFc(HDDl1iYbLIYPGo7tl9u-NTiZ6jkJB>yNr?p z-g4ZzgJmllm|#n$k6gLdL%G!=NYh(cA@j4f+@X}Qe}!|64yo8JB|~i$sOb~gDq@^# z+VsBoI4*O|)Ry(Qt=2le-3Hy-zS?_Jur}UODw|XwSixmhw^`s1#7=1QGHyZyryKCHuvnw zIcS%teHlu~L#AiLCfj?ZS4KjPnj5FoDl2B6Yae<)YaOubF1^-bwisAhM(*YKEoo`! zOVw+;K~=RI1uF?*_2HZ=w|q=p>n@4ytKy5x%hTY8wgaKo^o*<>{hXj-St$i?Dlm{U zga)9IlYGU)Ja|Goi55$460eVQM?-RPhg_LG9#$~>5#W$uo_2a;`T$=TVPAnOd~j=x zo!=xEe{;`}=VkfHohKl6(s0gXkF_A)sF*aVOp6;2kb zMCT^p#OyMzR6)MO?)mwKo6wM3z$(isZApP+AiW!VQ4%(nLYt|m9?K8wqtEgn6_T|f z(NzWHzY+QqN(gWU2m_gp+hCnF$)Hc!v&PH557?OgWbdA&8;TC?u2++Uf^n0+a? z4<|K{55oo>(0+F9jS<%QtMd0Ni+GCH*Y;F+LTv?JTM=PLo|g z#0N9|ya5Y)c4EzNKtF1kB>&&|@br-6Vg47z3*~9U(YdqB{D#x9cR{;r3-pZ?XL|SR zW$SIv_Uef*f7wC+2x0-1nIkH!5HP4a63C8x`@Yv$kTnTzzx(%1$bbI^2`8W^OTk_r zx4~7Hf2`t}jN>vw1A9RxdKm`KYUuNpbvY#DWW>LF-!SChVp+~>l91hK-T$4cO zl6pf=viP~TxShZj^u$KnoOEbfC^c4CEzf^1UAKI$-FP`-~@sPkeJQP$QQXtJOkJ4+gNf25E*82m{fDT92 zJ_zqCC>b3b$hhDikCXLt_j4BTe>v2VwLY%HBla#~WvGA0QQ3`O*y-mt+c0$cuinI* z`3BJ~Sfu8U>9K?WSrGIP$cq>M#8 z)PaoavBHn*wV}dXkyHu2S%zFtO(!gUpQE2X!ey&4NWmm4!B5uwyS59pm*;+v&p;ep zFTQU;AEmv@i;rZAr>=3@H9ShScV;y(vdI#e$WP%3vwUat{jyEbpzH25l@m9A z^BgV^*o6*K5NEdOugcvf%=sI#O1kkQAe}3jm_87#BewPuNP~B3sk4l;4a&tuv0?<5 z$m|Rpy&F>02Lh|u^zXGQk{algiP1iKWzNiC9^X`%DfKgP($Mms4#w!k>~QDI?3}*U z`^AXXrKRB0ZMW!r8#i|zziP+RLE~`{ahsh0Sl0`6D3s-$$52KQ1#2j*lAfE?7l#zo zuqVA=_|xn!fG(qA+7DZ79PcDCG-pG_Ie#!w)ScK9xQQK_x8r%lT{^crIE4e$NbjBk z))Qpdda4S?5}t`zI)FV73m0GXOtC5=;K*Wlj?TTJtit70a*;{{YsOj3Hw*?1@(s4U z#zRJUbsY56%y}GWN{4?8KEJg2=D^baY{@ApwbrUExva~FQ+&^bH}e<(q=XiWn)owa zs-_Y>`yFDaXp<8te#^;FM%lBh+GzA)*I0&75}CZc0q%^6*Mn9oE4-Yd(0Tj;LcX3N z4E&!_Jv*PXeq>V-*Bj``*ieQOdoVVH2ZBdafI5OYaGU@qguL?zNk`g6(_w;KAL6q)1V!NdRH0z(X#DjMO9zyu$yJI0le{>6V>3+F*I`jyFV~s(M7f zxf#d9pCR(L34og5<|T&TA}f@hZf@(TrI39|++-yWeJ|SOPlkR4M^T_yJv=B!Uu`6_ ze?V;vG0@+mID9525vRG#s5m+Kb*tIF=fSjeg-CibIa%K2o@B=U#qaQ)OB}kPv$IyIFQS$x1^`fT2s9xG06wh1SC=lWv;J64z1cI9H*I&i=NgQ-S0OR*i z6P{7_igwHc%wb5X(fTV&y*gL8MYRZB)L|hWo7V-uvzmlZXU3vL2G!X;fgZp%!1il| zlI|!f^$oI~1fX&Ry>c2@fg1caenmM zSws2sJoE(-1Y91lUQnTk9}fVL=r6%IVqXu$0h$DWGl@LXg^){Y4JZJeiwW2^>R1x! z4<^bkGSFY73oIInqLPk5?}_n@NoDZJz~K*Ny+`h6zCJ$tArl{21YwGblSauS(7QX# z{$RBM&x|mXKR=tNzs#TK;u%^rw`hOl+^ns!87bd>oHtg{_0R2&peuzoDEqUS3Qe}k z`x}9=&wu`dXZ3m+n_2#L$k|+SpSk_F^5L{jBvC}>_78ucQS|MWRT<%>=ZB14(efc6Iac1&| zzX5w~Nu&)APV*E(EB*P9|6eM3B9L4EJ^KkO1ye4abA3~BbR-Wf{$OS?#N`46Xx z0s!Z!43M2*qen?ptww@leTx-6PXdmFB2odzfER=AlfLO_4I4$C*P___b?G>+Sb7x#=YE)L_KuCC^A)wvFY#xy?gU z9z`Tn@B+u3)h5A&_&lAEyH$pH(C4Ng#evh>#bD6Zme;3G#w*ICZe*8qnc4dNqWS8h z?IM#cy;U5$ZrF#o& zTvJoz#{P@5ts9%+8b7S}^*%JSYy$wa_6&fBkdb1HDzHlID4yvYc2+HbnoSskD=?-} zG5`7s-cHQaQs?q?SaX{>GCFo*21(yyG{! z81-%2aq6*K#}40aYoD9h%=3qn{K>@--%O(iT;aFhPz?^L@vS6Z1@rEF33m@`%IYDV z?O&84>1-aV&n3j6UwLU*%9-L(HC`w^0D0fP!;Oy$+J{-?VPvA$;irgyGu|Nq#uZY1 zftd(w-OM%JwIcF9O#NtKNuz0;Ha~7?J71 zIzRbH(CNp%T4!{F@*Kw?(#PNI`8zg-_|@Hd;?Vctoqg8gm=!FIeF&{Pe#fz*`o}GC zy)4o9t>G|p3fK8p6Kj|JAlwW~^@lbb>|h>X!e$t_T2p3u@D-US7ZBifnFxrmC|r^h z|F%B>j}qOO$WWfLWk5b66V_-L@Xqbyc@qokddaqHm`c`{TDLm*@$Ku&qbQvOi;oom z!1oCN?o>74Hdo@yXSmC~I&D_`kbF<#;tIHVrKZORruO<^8M?PaC*tRs<42p6WZ#tB z1a~}-cmEZ@|EXp-YQ4BOpa=jMxaNTwH5{oYJeR%u@x(loL3(2PfDN5@rGJ+>nEJHL z=Z9!6VOy8@ksz2ah30FWUr6&RbtaGYBoW>Hmb*JT;?8su6r;dzxOx`srnjauQyR*<3kubd%m7#!*pCz zd05>TdWM1g&W!HW4d6kmxs2JuD0-L!-!%y-YX$cGo<%z_GOBS^xr^i%Md_gHkeXws z5vTk;UjIoD02GPw$(pUexxL>6#uEp9vXw<0Uz#AK;}6lOCakwLU^hNRP3RS^Oad2 zhi~og_bWJeB<&LbF!0|#4xAkc)SC^fzvv>Q(4Tmqeq)ECSz}z|@q!`M~cH%CwEzO(z1|pY@l)hl!e_dRpFKApPS|}Fx zNL`UV*^=Yq)HIZ^^vPifqANx$@^l9Wdy60%y1Q=a~B#BminUM}aQ& zKp121d_D*bk5@!Ss?LguDemzfO*^$IF}MvPF9Uj(2PA0u!=+Jt|EdJ`9D@Y&6uMbZ$^z<#FYhT;TH z+C7Wl>!f9r9r~_D?;BiK%EN+A3g*e#k~Oc7TCX*js@*Z0YWru-QCAc}q;kOy>i}6Q z2N&7X>JE-#yu7BFQlwxqBZ;2l3|sx+-GB+u4PcF=t0e9#c?U~pk9bOAfYB|NM_Fx$ zHYuKK9?xu z$BPx2gwHEPWlvd^!eLz}KG2T_f^h7SaNx z<9~Ps6<}mR{xjOK31~M9=4D9=xd(~a#RogjJXo5~U;bo`Pegh)Jgj?sv+x!z3VwoY z)k*8J%n7r^10aC;@)&@nkSi?0lQ(S0eR@pyN6WRTUlmbgiR8}7m2J7)HI!oF&*Ysy z&H(43=XVE%*4vWbI$aOE8`3zrApWS`MKUyfD)13S({iJP0fFe2zfJ)Fb+?-o%vCCC zs_3(Rm2L|h1jUNTOt2Sima3(zDLflspbse@?^e}++{O6q=2F4!gvFL->Ippb%APl3 z)bV1*Te_Tjru^T3c}71ZKTEw;!ymvSo8h7QByYIV#v;ojUn@nAcJRM(3i%)W#7RLl z?Eq*4X=c^M32&PCnt4;>6+{;pRw(lnCXnLCK&Y5rW4AXSe-H?=G@_k!4YtBU-jdFq zzUcQ8{u75gtFwJd)7LKs@QeGsbYfZSaZ!90w@r%2L7$Fc(A!{Y#1ux<1rftX5J_ry z2q}sik)Y0f#!N~t6B4U46iWKl(ECo@bm6k2qXz@}cAn`!ZUxwh4C&od8F0rpD3f5GQBvRdjbt|l?0rh3atyBIMBY< z1LV%P0cxshG#*E^XO|lY3VJ=2@H`Hoi6V zA?+JFO?=s)rlwKI*%lhIf&nEDtkUL*jnll*EGO64`5*g#zmNa8 z9!GyS$B6&fRCRV9;@m117Qu=7aWK7#s$SLd+}t z@}P{jCQJcZO*y>dz+27?rhk{ZFH z{sx1WKW0Sg4jacKS91KElX6~gdWhLv{&uK2I=vj-liZ=a__(}IoQy=yHJ+$GV#6u- zj7WTs7J#Vf(54s#b3kD&lzm+L!pz6R>L~`ePLyG7b+0;(7brl*kls#97Ke;H`qao~ zW3J&7f8g(0!*+tR8KG3Fdu%H*Rgyke{-UC=K~;#Lr%6R7;HTP<#@rNQ!2|##Pp*CP z<-3{?0*V{5!V-$(C~yc}S1J&sd|H8ZYP;y>x`6{Kc0#Kkp3nINJIE0L2zh2mV;1U4DuA9u3n|UR z2SyQuH*j&B2n7M?2n-bGB1$p`RR9OCL-m9hOjSxiiv8LM>4hj^w!ql9Q6@@;Y#zwH z_cNs_%QR<0^Z));^}UU~Vdyt&?>kpk6C~|}XIu~X`Ch6810a+`j{#_OW;!-=@Mca; z2!{bYcx#}O6omstYMErb2_fhWYZX+EY2kFM9{^++eDJ(&+QWh&vj-fY>*7VVYPbv~LmOJ* zA!8g32!;5^G5-GhS9*izzQRu=_yebHKbT41#U`}6lBiTtecE}G_vqH3s6P$>ZfxU# zYG+g&Ny=M+1<(^v?qb8A+pIfX^9X`7Z z-v_SFUkf-$0`JK0AOzT#FE4py9-tI%zt#R0$0JSsvZXN%=F5FedM|OZ(sa1e*Rvc` zZEL&oC%^&!DM7x7n6lLWL;y-Eh0K!yaSLo)TlTx{9CzRBr0ryXa9MV{lwuV9_4>6f z8wdnADApLWiCAe} zI^_*k1i!PYNK&AmzPnX-o)Z#3Eo?!IzT~&60Vc!u2@t+hl=kk4N+O<{-=T>$S&}`G zk@=S4nGI`l&l6ICjYMPkqVa00M^0>MC6frpPq(QM?JsSP`&KU*etnn+cx*3BtwV`zTeh+M}nKhe22spF9Kgw-8{ZR|-$9 z^|yYi##W6WhU?HnEYNSErj$RF6{AN}G%{fAQqtyew{kyO-Ts9{y7PdJsix^O{vXRL zG=*ntW=3g_RpiVFsYiA8K#%FA!i#*AxIDI6?^k1JxT?m-fALX>Pe#s{n8? zC*>jy{Au)O>qjPXKPfXs6bPSdMxhFJ1|_nhiBRqi$;dFo@EJcuPUuj|{d?TaS9KVo ze}C>!1PCFE)Ftz4x>04>5Ux#0vv)G!eqlcU5FI5)QTwX-278Yf8@71Cs39#axSVi` zQFN=Mp$Mz@krRh0v!2|`Gl2c#4Z!vwlY<%Rp={+{+NkavE;L#I zcm$(L24&$%>>dl4ErHE*C3@3^5%MCr54vuzzctB}fCvT77zQ?`Jl0e~)$?3^+*g^LmanmGNTUNuOdY<5mb*u&i zmXB^)G*myyxbu>syCL`Vd|6z8BpO*YEYxqpp9TDNIKo+2tFR zP`|?fEf&wxeaI%C-fMw^|pro`PC(%M-otIvbM?o9;r(N6c&?=KUklsk5q0SCOX6oR6Q*tJhk` z=8i%m!p|N)4|&jjad~sD^?9{j1V5w6u02V5h0)KG-BYHeu!xm^lXJ5LGA)IwgUzQS z77fKOmtQ~ZHzhGQj+hjFpN7_eaxKar*g)=U-rOV-hyqs=qel8!Z+mRBwHbF_kD66i3BCh4)rD$nUnRpAgYxp!10rP=ixzb8MHCZK&>$FTuU@h?6OG3j!1=D~ z2@@M~BL&i^ITdKIjwIt3w<;O9m?=JdAr7O9g~HUnG(F`V_}c3D({z5xAA!NDc`!4_ zv}4U^ryA*)^Aq1z|Ej1xR;_vEVF%xP?fbA%dhh&^I64;(-Bw72^0Fl~A2W5n8m-!0 zty{ZG_WsP(@53eEW1c&>Vxtk2dtA@DUW{E{{?lwM-y!C?z4?j&1d^VPi@)_7n#lIc zQVn0H7?x$Ex+!A7#AIN_e5Vwu!62d`)0PBO{0hWn!vWW6O+R(^~CC)Ceby&(g?Dh_*BUE(s{ zvBX4;PmAT^ye$xuJ@%zNQ6CMI9k9>+2g2tnj<>N-X#1vp`zMEq2=pCXI~ux87Q)!xW9W+AC; zDtJQG0B7#>h!wU?yd$cks}bz=*+#(3qIRgk{dL$2QzIAg(xCWTr#5FJzl7GAz5xIL zuLEGO+A$&Iew&Oa7XU(?PMd22q1VLXEqF-8I0946lA_F$nCMp4JNU@U;zhi9XoTs9 zW9)(+sqXOn2vIMiyBC-tW;jQ1xvPW9pWUsAEu<>t4H;Yu<|I7b)*I7+M_)mP>xytefu;3Xa`u~RM;YV8Yw6NjW_ldRCF(dNjlMe&o^AXtCY{h?M2s` zQyE&wTJ(|}84RKD8H?tEy2OK%WMsRXk|aXjhCqqTBQQz*J#fCFf#=@JPU%1E?egTF zEiG9G?7zbd;^FMm4n}>^KPY*`!z=_(lxd4zzkP=%XoOHibqK(%IVIKd;KCa6GUc+$?AlB? zWT(2I-mOoA*bc}%6|0hvK}imIX6eni$S*TV9tu%w_1$9z$*ry}O}Sy*K`|C~NA99l$|BpfWvNJm8oyQED9zXh-O>nq%CrH*}bg@KMr}87FEqe4$(h zcTS3VX_kh~cz z^7Rxy%6`*G4RqGmq+82D-zK9R*VbKHNPEkiMNct(zafEJ&mxrlk;ApxT>pE!YwPOc zr_B!XGlO~`|BFksX(@yc-6;Yhqg&v(nx4AHb%_+0iEJP?*>Z*uW>xGA3HQ3@PbyOS zvSD#(VM%W_YOm)yTZ3$QPRSuIo#d_7dpV<4pYw&IIUT+mF+_n8g&%NW0t{G)(l5{i z^WS8GXa(oUmctn34fnJJkoD%OPxyQh7gqVVkt{#x2V9l7u1TvWKQvhSumf+d%+!8% z>->wms;&Lpty{`p{(ib_=6|ts>il4I%h>urJG?9Z&t*?TmGe{UH$F5LbhZOX9XaSWnlmY~xIw5J5}T3=RwNVF^?(uJiC9@u!j95t!~LVWxgIIB zN&C?=Gq(1SOJCu8J(kzW8Io_T|XNpR5ttn${o1YvAH zy&F8o$ypHlQy7cgb!{zkuVlqgk$zsaq1LXo=+!J(Lg7#<^VKp^9LY5AK!SrH18`C= zp^KL?CZ>X&DGfwWW1`0BG3w|r!isS1wVI5hqL>?1Umq+5%uf_4H-SHn+0N-&DsHnp zI-6$neOg;N10wgK{2BJ;@}^~ram2+-Ub8et!;7a^x#YbUXP2WjD+<*A_5dtVW=)j{ zcYk7!{tPJMacY=jEGLSDlF~rwoSRq(qXbt#+WK?v(u29nn4JI&>5NA;?{ky)ki4%ny3?COFipfS9dTG+O@ygLQI+Zz$FS>ycF0J0uep zsPE4EALimt{jqXC^N*6h1v+AaXD+_&W%5K-f0_`rZ5+-&f2R2J?UHdHhkoYIub0ZZ z@53V6e`eNCTZM7NmV1d3HBGmifwLY*%3ZS_^eBmboU)871w--C+8|L@Mk|+xp!9er zO$!>6`FT<{mCEbUal>2mk=w%$SZJARW+sx7<2%ndL7n`i;{Om)x^6NLLySurE$C3Y z79rP=Ck9Q;hK(Wt4s zdr9Blq7_Q|LOP+(Yo=Yu18+jmx&M)Q@x|obEv~*L1wUYTs5vEm&QR7ff_>e=d z@BJ|Nts`<-9h~~jj|cD?dLpkN%5ikPbs^naUHFdieXl3+&D>JdY#b5RC+`KrUK^`x z>v-1=aLr9l<*K=64C(7=)e?q_8H>LiS^y2*5fzkvjsLFiguIZzt6MCzUIAUt) z6o3$N4GL{Q1g(1X?Z763X<;y2sggn!Sfv|Fyib9TtK$O^oOqo2-YOSHk@7*Zv}~@i z*TyxpsH?9&^J$c082wW)f>F8tBCp0s_FbRSWE`dl`1=hY0UQCaAAitA9=af^qzIIZ zV#WG7S`|296`Uw$f~?F*>ceT2xs>`K)B+aqac?tnX%IFiV`op<+Z)`ddhe3!GyS`3 zQ!1JMJwIM|tcFa!aA!Shpj@+UEMm`0z$pCjU~;yP6W6VSYs}`&0Lj;JaJ4XVRPA#7 zBgOvQFQdiCC=#ahd?;&m`Yyg+AWWPM`1Dtqu9t%?@uwU0!v(5-HrIgz56?Im| zla3kp3OGt21u2Q&l%S7VI(j{N=i}eogpvyrbbuX zVV&2%p&(Z%cJNS3puv=`=TqhB23xeK-}dz1t~9|HXv238KJyYS0Q@=vfQcC}$~~U+ zy+v0RmnTILNnNy%OO9bA33Sv!EwC)*fP*i+(Dj6dZA7R<-usQcPMTE2&v~`@5$V5d zEPLfTCBv!*A1you?gL_D0H~@$ny!pKybLZ24SJv+E}7n5&noN^yb8|3{ZTLcB%XeG zZ*FZcCu7&N$=bkcIKetbax;}xQxpq|%1S*BRuoIUJOmt`WRbhyxgCQdR;=72Ry`P< zD3QC(3BEpl8lO^VP(}~Sr=W&a@(AwM=kkorN%P2j=KUA=4nfHuMIEWrq-2)D;SpZr z;8d;GL9FQ9{pmsEfq%zstN1t%sQ*XIFLS8fx5vlV z+=cm)AE)a6YV+mM&ZrD8%=5A6(3pH8Zrpq_`9o8I;2O|MEn70|DOU4R;f#0XhO39?Fi(vG6(=6g0^dLS-UC?5B2b7s#z zY)9`kYOkfz>gCVJ0+|^D3O^dWMR!L?WB!}T8wNTO!v zbfua}zNKy}SrN}$pIuCqR`4sr`iMiRxqaRqnw2bz4*YL=l;^yw_v7P+!lnP7w(p=8 z+&^9J9wWhjkBmCtckY6$!*p&x@7r55RSU zLNSuukb-{B-Q~01NFjMDmkW3}!8_8)L8wt-h0Z<$MlytgC|o73(E!iIjzWkVd>AjU zV~(Hz{n&8tBzQmQ2q_GA`TFAzYoU3h8kEpe6+AwDMr2bbH%b~?u)<_EJq9+KY5q_3 zr>{L^W0Zk+g*_{aQ>5)KK6}hJy4)~W-pOA6>HWzZvcV5I!{+)lkh6|Pvjs1QpYmEe z%8j_ZT=-!`{9UmkZY=q_-degwmFRxG;ccsaLR4p`d2M9wlbR+NrLzl9;)D1%r2e@Q=Rjl(VEa12ZIqGz z(_~FFn}V1&3jAAgD`Ru>R&0%HZKVLkyL)ym&Fgo@os+%36q$@uHU9SXqZI&cH<={* zZw0?)MaY_T#~@Bm%r;-(0P1f?bGT~WBG{tqU&f)r+d)tnb)+)?46y9$Bq8j9o`~KgT zhP%IfJ7z2M*wNMutg{RJpXJkon5bHw1GOY*74062nu2P z3g;Qk8d|*GmbD}fZJiq>R3bSKkar|`FW&gMH>_4x@^-Gde3%M)f;+_Xm$rOm- z^P8k|2m&lMF4LbU!mFCv`WjUj$Qw8`2RVI78f4 zkxT=olR;78%0H~*G@RwlcZm4eLpxuUSU;~j{zRwNRd^wZ<*I(3-+GgCdgrsTX9D+} zb8Y?K@ZG$Koy+{7yK|&LrYK?v|B3@8gL&0Sb1r^#`}Dk%4rb6ELaImG+sUtJr~oj= zd@uT=qM@h0T#WS6t<&Ffg<+{=;7Dla;tKVKCX4(=vO=`v;~4to?E9s)aLKm$-jp$% z(ivAL0GtBaY8XWi3^+l|geD5**n!UT=o2Un{+5DQma+mcR?bnrHUZq-1~4_va+5$j zM9fSA=hbcZ>{poJ*V{~Tc2F!gbG@mk+AB!(mh5e|dG2@5*%PkqU0ySAi`sRE8Qvv#HFB9y|Lsc6)0Zdg zIV@0MF;_(7(*!SZ&tWB0q(~RRTq?2(vH%1<+dB*vrH^CEdShM>DynR_3v>$i z)MZWQqk5+r#&+NJTxYhA=JR^ zVo7wsj^!6P&XP0wqz_--v&rp2W!Dt~L$qm0mEO$KytDk#btLlP5#B>FvzM&^Cg2_9 z5?=zopDr82$wAP*(Yn;peQ|5Dz8~_4$jo45rN0V9(R0Kk9(UHrh7`s+P zQS&%D_9909)9xVA^_|ZP*2oCZbrWcPd~!y+`O@;o2(Oq=@S73!yyd(PYA)GmJaJ3$ z+t1;^1oRsk8tp*L=bvR(R&XoxNvjx&q}@t=aeA;Oaz_!aY(34j1n|-5nwKT8j=g?( zoEKeqrv9bG@P6LqF_P6;zwVCN{dQja?0Dm|7gzXa7RMk)`HH`>rd@+_L@2{M%sk_U)|zAFdZK z-UcMv=NYvO%{INQ@ZD)mkGLgOU;6jj-M^yt`!~zrSDpl=Z0{vZyfmPfK>)-dad-%{ zQ--8dtrIicgCdxsz7F+c?=aC2)C#bxOZUe*a>p9sbEsnvL23xM606gsZsjvU42%)X zA>m9OIh+GSKv=Ul9WnE1)JEUjoCxE%lBUuGkGD0EwfcxB@vu1-8t#D4)aOZB6{Y(J zt%#p7%KFCmV%;9TKYRT@w(RECPR~w{1Ap53&|h`hn&(&hR2Ip1f@P7UvsxPY+A z+A4&_KgOnIT{HK@P6C364!qgsXI8{@fcttVbahUh8T6@qkC)rWEZsYCk2 ziHA~OUJS@pOPzk-JDpqoz}3K2kv)m&xyyhcmP~AC;GR}4vV#0g8Q+O~e(TT$iA$#< zEMhvz7OVL)utj;k&V1qs@RSY9-_9~RX1CZCSVdr2o{x`-VQ`%DP9}{A2DTAU@Rck%)rQY zEfd`VB1I7|{SHPM0Ne9m0;-BnkS=~HBu%$#&T-ho8nRuT@yM4wm4TQs_OiVBLv7UJ z*$v-Jo6OPHt<>6Ai-LDm{$<@Qu^H(kfVgDm$xbjl)>-XV`C*0i&@if8Fv3?jDSDNW z-PxXwzLEIEQk?52gou?;^DCvd zzC=BCNseDo3XzJx-2Y_W@g<}CpNG-=<`#vznMKKPse=i!Rls5vpuCTyVRetwQ@1Uv zU+5>R%qZ0?D#C<0|DOHgeZ0~Myp1%Kt#(OC>7ft}7pb`!w4M>^UFE*f!7{gW*n&F! z@hLlR{;( zbdXw2$m<2uryHtoQe><2-?dbb{ij2~b)eMnYDg6>c5+SJ4S|36UTFX4#F=QQk+!>5 z@zlPzyx?!%5c{~DVm9n)XQ0Eq45|@58FAh9ef{mSB#rBuKhOHk2HW&QSf^`foHwuW zmZON**mnq^`^>G3lMB5jt{#uZ#eXNF7J9H{#rQQRIM`Gi%W<&)t#k=o?pByVXRL#5BfGV)*k6p7|8w{3BSCL1JhfBShZPc z+5GZE9+PP+JhxkgNZ=rDtd?9wVK}XiG*FhvZ$`12n;*u{PiaqiixF@U&B~lfor*?Y zyI%>BWTQ2FTMbNhVQ#rUY3tMiasNqty&O74?QN}O>ub49Du?W6Xh#vtK<7bWD1?X z_glBRv!t|XivGzL!ah^77Y%)Een6~@29q3J;^?4*(+DrPY}r6i2Vhzc`{G}9!WJ`6 zU1WIOsx(da23@r&IjPvFNdg(Zx04Nk!@)XmPVY!siIBseiJ)tA za2-lD@2$6DkIiT%da8KgA=6&dltmW=y7+L_(3d%VC7_b3Vgl~uxB{R%G*t*DXK;htcnxj2s*b( z7@0arNADaMbn&Zkk@7Z+pUR{OS`Pi6cFsH;%C>Fb_bkj{WM(Xlu?=Q4_H9U(jKSEq z388JsPK6e-+TXc zpZ9TGzw5fs`@GisJWs@t+!EASk{Q5#4kSoxi;SwYJZRqhBylrzIBsd7xgP)mVp@QG z4ca1te09^z$^)Hq0DmTwLtCe2!VF?Fl?>KM2Tk@FTs>-xI>V{e(8*bFX@wP|Z}a*W zFTRZOR(D`c%8PiIcRp~Oa75_AJ+qn#2X9hFd3{;#_zUxsi-N#ZwEQi`kqufmZ`>!0 z1KS6#TSk0q@%!^=5FR7=JM@~8NO__1WW0k{eA)b#C$Nf zGnz`P4W-23nbl8se`X%uoRWxC-mYi6x#@QH@HZc7@(~h9^WEaX`jMAh=9x;UPoc*t zd|l5)cnFg$40BCZ!5+g;gHx#J?MR}^#LRH^qujPL@1(DADbm+>IHlS?TH>P4O#pVu zYL^rD+w)h5d-4mpd-F%6-#>1u9Ug{tA%D*yexsGxQ+*C7NnDI&Uwv^QCP9e z(yvQH+8j@P-`H+?tf!_-QdJ?DyJ77N)fzc%uoVOcHRb}M)*jJbkmSpsk+g>r4=M#Q zL14^S0~XQpshu*-;JfYoRrl1etEBaaV(t95d!BrZTQmW%zhPzc$R?@Xt`8kbWQ=IN z-AoCCNqpX73Laws+KON(AfV~-T{9UChz9c4wR6E*H~}S5LDcT6rH!D6^798PVmek( z#K+`VLC(lwtUjH|v7Sa!(r4;)G(OFIjQQq2FaiK#O|4;qH)0=o1I683S24PR0?J(8 zK3RLq-(W44VlGPyagws$M+n*oeR>x*o@`ZvaZ&cT9C+@I*%$6uu&2RX@Q1rLdk8WD z9I(RWDY|%Izwbt09^LMDB|9?A04lpnh;TZDTIUwA+Td|m)}#m{Xz~@{f8hB=)oC8i zK%*@!RTy_-J)8;233aJjd&{k04Nuj}ec-7ym+9KVX4V0l^7iIkJ~F8?mg4zGZ=h_w zQ}*Am%696L3lG(Mb-mH~Az-<|`xVu}WN`=N3v_GAbcVoifMcn4fYsHM_ar_~7Few1 zs`tcX>q>t41OCegE4rpXX&-}oBqp=2Bl$YI0{6F92L1TxkQdgZ`;t4i8z1kwJuzCu15bZ0j;^=OuyyT+)5jEacrz z#q$n=%_JW!dAz>sQ!aTxGO{`6`O0#BRcA;ZryK@Y%yC8iV;>9SY-}NI} z+#rNuLRA7oI)#}WjktOYR*+S~p;rX`VP5R#UF_)HGo*SoD994cf^`|jym}*67Xizz z-#92@z7Q1);wj|ECqN*H`m6=Q%n~e0>3FiI)_fmV8;Fey+1(ZDFvJEi%14i0a&LHq z*!xT`IPu)1hN*nT;AiajwLgEn_bja#sQF5&khvUtNE+g9QNmwhjj^_-(_t0|Y4xv}Su->!S@1k>Jdw$|qh0HuNF zuWoPNVBg^-=dBViNKfVY_x1nwoe7#vqHpF#*fcw3AkmjfU!!3kqaYJMHE(}YFlR5AtV5l0iuv0_7;f?rSm3@;s z%PYyPcC#X(_wVhlYf7X&;M_>Wro_RerB3v0OMDC;KOX>-H z_?|^wpIv?<%P4-a;K}7}?&o*`NS`P81;qGYQ7yr-NT^`RP8$%p&;L!9R)R}oMiy8z zf#ZjM(K-{Pxz8tZ)Chxx5{Cy%dr3`w0ao9Uv6ZsXD3))?7IS`*(mm(QPwTr6KnI)k5I~s7cklKuNFnUt@O?B{G3V)p75gzfav zXpw&z9?LNT|5=d-=%q@6@cs|HbdWw8j3Pw|xmr))^Kwyh|e^gz53fFN93gBs4tZ4#(p$QPcIo95lCA+;;W;kQisUJB3 zO`o$a+Gq(^Iv*vp!(+K7!uE8a7e~eRh5I2FCv-~8i^j1(H>-(>b>RKBQm-~!03hTH z8Ke%y)%c>-ghc5H<(qlTBxtCCWteV8kxhA#DoyUt;55lhMlU;AFCm!PCv;wesbc!YoGDvOO00wb+-z&N5_dwBmtP+Un@L0-d&j!9G3ATgrIdDWA5 z8^qO*TTHxgWj`kJ%t5tD6Ro8(I22{5nFc!)P$DAu;%d8rny^d0~*Ee62IUJikq>F3PINZ{%{*Rf!OuIMX@ ziuh=SJx8lzTP$4r_OlttzM$7}@-#$s_)I1V~T=AZiMCeN+iHcZvn^+RnMjVGOB+}0TXOxzf=G=OT>}6o8>CiFJ6rl zP*Guz2c5Fy0^j=XyFFLWy|!*ra0Xg#oNT+@J?pn;_PlioAaS0T&4%Y+hd!kAWDRRQ zXJvlxm2X=tJnXnp4gQI@Nb1|)GgGJOfC6@bBC#EBIahS5vD2pNTcoR*j0ZI3jasm) zcs3N~JlyPLX_q~|@EVbIr9C^QZky5Xcb6=b6^-?k z(#l^>FFw8-|5*8r$Efo2JGJowAk#6$(&v@?_4#vcBJlifUPf&U@A&7IZhfbjZCaR< zN456~)={$ds0~(DZ_QsHIN&73$9s&l=PV&Sf8#hm_=)4YYNopQ-xbapzpq*;~@CY!o&COM5#l;MT-qWF5yBvLF(}t5va;iOLI$h5fS!QeKOybkc6>eaiVSS>pDsKf~y#Hl? z^EXzL<;9yY;1<3WkIT3q+q%6btN9FpeW`Do^;n?UBL%z-&(38pzg1)s$ma>45Y09kzk zfLAC$n&n(^I%#JmOnet=66hz>B;@UN&ru1Z5u;eF6@pwi*OJ+eW5G`OoSW>()y8V0`XnE+mTu#p0BDv9Djc92YPF48lSoPsq#`QbWn>k9`(Ba_D)jr{Q4lCbQ%~6|i$O`mRfPZgm(&t(*eU%IRQ8p5#`utfjp`+d6Qw8S6&*xtaL0UE?sMxE z2g~lt9nu_X{Qi|A?Oo{+Pv)05+RXqYUyku7|H!WB1DRbVhKpP<7RNc`Z$0+qYG+EM z*b}^AR^o^Rr^hQXA^4lK4XIyQ``=Io4sFES)hC>y>nJ>*AcHOy&oR_r`9N`Ibl<~5 z+pZcUvJ!HMct*L-lL}Y<{$Pc88#TMYzS!|qZjbHnHaE-9tawg1-Z;K*b8}As2xsvb zPKGNqhazyGhhtcuM-k$Df-;DT>ev@n=<8LJQm^X&czdxi@Z9B6XL{0D&j-!9m@17f zyv!IAzUr6|l|$#nlX85&Fu~F?4r?O1SceXqn|>1Xo)7N#1__QXt%ik#_Os~5Y_C)ALJpKYc;`C) zefF7Hb;Y~QO|yxiKU#p`$Z`P4r^1Pt?qbBQNzGz&K%sKdYN*`1R$o%MvAh+JamPZ4k+QbDK>*2LQz5o!3CS4d_pe#OxR0s~UMR{=$1y~GRy z)C8OP9Hs0tbHN?%z8>aQ_Mg3MD^Fri&qF_Z4&~;NdG_YJ&P0o$?bon2_ig-a3XZ6p zft7e_znzJjm*MI2j`*S&>DUSYh#SuP9qIVaeE1aNZXGP$gUd*|JcJD@GWHaE?jT5! z7vV@^${e2!q`9gi7di0qX5Mh7uo&$y-eX0Y{SAmC@FPEKf!jAJ&WC$bgkEX{K&Fl! zDIcJm$a{j`_f0M7JwLcSWD|sKQGis5PF*wrBwNI+S{YH;5X)!69zix@zRD>fqST<{ z&F{AB(sH(oqPg%YxpkDWCsO6%BPsMnLHR^cb8%t+Dh2(U^RhHsWM=5pM>B1qF27#L z+1lHe7Sje!#2-I@N<1OT8A>|G`#j?2)fsI`vr`#nFkx79k`!hAylnYHa=8nqHle3s zuW!tB^xyg;2sMkbd#5bgV5BHn;LQ%8esj}ZH15LkJ4gi>* z)1^z>PO4uT{Q)A7lsV4~ZT1rC>8En{@#h_cSkX9Ov1iZ^Z$HS)z)@IJKyTvV(v`Xj z+h_WGPIr}khTQ#{hOfSJ(p7F5DE4|JQu}Hsq&mXF0?pDXh6!^EIB~*BS??JjCT)}5{#=VA~)eR$4*3=93wQG(`bQc zk=9Omyl9BiXdv90`b~vY7(M(uL7k43@{su|zPaY>yTL>iNI0AkkTM{#JPW+%EvZO1 z-RTD%fisD-y!FOVt~YvFQ|VQ&fds@o|DkwtSQza}wj(9&;t1%~#1T?1#S){>zyGM+ z=4Q>yqg`wJdF}Tmsw5_qb_clfUs{Z9MeY;^U-It$upYUWmHDJgYS@N#rysxpM+IuD zh8t^p`$qjI{jx0W5Yk>Us29d}M6Xp@8!QKIZvJrWevckgpyq9tSvsCR@+nL#bZP(n zlfp!_L6f#jn$(S+wv0=RAG0N`D^pmSDcj~Y)E2OkKA4st`1X-kN_+becAJ}~gr;w& z-^0plj`NaJn`^EX-$5w0MBnPHXr-q2=mFmQTBdmFF5(?0$`bs~X6KL=MDkx6|1hZs zQ0DBtSuI^Rn1y1+<&X4J3=)~G?j@gvY@rVas6LwT(FtU7I5JPG`)ZWL%MY@`+1=Ui z=t91U98OHyy$Yt`TfReCrkSz7l=l6W2)Aqq5z#jMmVTNSp!JOJ&4{qKux@fs| zkc7ax@|*BYUF2w{c0QU%m<6jgauANh`Vd0B*@EA zeNvN3qPx528|K$QO0Pv^Qeux$Tfr_!1KfY6V?Xmd6)@l;5 z!8w_gOSSHDB`k_kEL3Fx=2T!}Y(R9rR$pN>+l=s+_&-&>MiT=B1Sid=kpENmU%b>W zk2crv7AtJ6A^|J%vFHRbrX)#7M3(|5$N+p(bXWEaQr=kj=OSNMgZ~fwpUd*3|1P^# z?M zCt1@wL4-SR0Tn@+-ICv`m%a;%$8Bc}{S5p?`V0Iuh?Xs^i-?O-6Ty8Ofr>!PaPo2h zh{1K>6m#*npuZ4*7XJeOlaQ7otdlqQIkR+`+J6TABK-yao2?|>=ePJE9GrK{JMsQIpO2wP=AC~3Li}0$_k7>U z3;*B)f6oX04?X~xw)}_x|64ylThl*Dyz%Gn`r)M~*~%v`jQhKNmheR0Es62(?B}0| WKR@^n|7U&tD*Z=4ziQ-X`M&`8(=n9* diff --git a/frontend/components/Domain/Recipe/RecipeActionMenu.vue b/frontend/components/Domain/Recipe/RecipeActionMenu.vue index 3ad0184d0..6822d830b 100644 --- a/frontend/components/Domain/Recipe/RecipeActionMenu.vue +++ b/frontend/components/Domain/Recipe/RecipeActionMenu.vue @@ -34,12 +34,6 @@
- - -
- - - - - {{ $globals.icons.timer }} - {{ $i18n.tc("recipe.timer.kitchen-timer") }} - -
- - - {{ timerEnded ? $globals.icons.stop : $globals.icons.pause }} - - -
- - - - - - -

:

-
- - - - -

:

-
- - - -
-
-
- -
-
-
-
- - - - - diff --git a/frontend/lang/messages/en-US.json b/frontend/lang/messages/en-US.json index 0fe00ce55..7b1a0f135 100644 --- a/frontend/lang/messages/en-US.json +++ b/frontend/lang/messages/en-US.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lib/icons/icons.ts b/frontend/lib/icons/icons.ts index 9c3a37373..08d527262 100644 --- a/frontend/lib/icons/icons.ts +++ b/frontend/lib/icons/icons.ts @@ -138,12 +138,6 @@ import { mdiDockTop, mdiDockBottom, mdiCheckboxOutline, - mdiTimer, - mdiTimerPlus, - mdiPause, - mdiStop, - mdiPlay, - mdiTimerPause, mdiFlipHorizontal, mdiFlipVertical, mdiRotateLeft, @@ -243,8 +237,6 @@ export const icons = { openInNew: mdiOpenInNew, orderAlphabeticalAscending: mdiOrderAlphabeticalAscending, pageLayoutBody: mdiPageLayoutBody, - pause: mdiPause, - play: mdiPlay, printer: mdiPrinter, printerSettings: mdiPrinterPosCog, refreshCircle: mdiRefreshCircle, @@ -265,12 +257,8 @@ export const icons = { sortClockAscending: mdiSortClockAscending, sortClockDescending: mdiSortClockDescending, star: mdiStar, - stop: mdiStop, testTube: mdiTestTube, timelineText: mdiTimelineText, - timer: mdiTimer, - timerPause: mdiTimerPause, - timerPlus: mdiTimerPlus, tools: mdiTools, potSteam: mdiPotSteamOutline, translate: mdiTranslate, diff --git a/frontend/nuxt.config.js b/frontend/nuxt.config.js index 6e08af69a..d513e065e 100644 --- a/frontend/nuxt.config.js +++ b/frontend/nuxt.config.js @@ -532,17 +532,6 @@ export default { // ["@nuxtjs/composition-api/dist/babel-plugin"], ], }, - // audio file support - // https://v2.nuxt.com/docs/features/configuration/#extend-webpack-to-load-audio-files - extend(config, ctx) { - config.module.rules.push({ - test: /\.(ogg|mp3|wav|mpe?g)$/i, - loader: 'file-loader', - options: { - name: '[path][name].[ext]' - } - }) - }, transpile: process.env.NODE_ENV !== "production" ? [/@vue[\\/]composition-api/] : null, }, }; From d48d2c24afa2f1eead396b36fb2e744938af863c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:03:37 -0600 Subject: [PATCH 12/46] fix(deps): update dependency pydantic-settings to v2.7.1 (#4805) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 73a665c1d..a26af6ae6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2190,13 +2190,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.7.0" +version = "2.7.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.7.0-py3-none-any.whl", hash = "sha256:e00c05d5fa6cbbb227c84bd7487c5c1065084119b750df7c8c1a554aed236eb5"}, - {file = "pydantic_settings-2.7.0.tar.gz", hash = "sha256:ac4bfd4a36831a48dbf8b2d9325425b549a0a6f18cea118436d728eb4f1c4d66"}, + {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, + {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, ] [package.dependencies] From a12e4fd5bbbe6b5a6a1a6b234d52ccde8f55a5b5 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 8 Jan 2025 08:04:20 -0600 Subject: [PATCH 13/46] chore(l10n): New Crowdin updates (#4862) --- frontend/lang/messages/af-ZA.json | 7 - frontend/lang/messages/ar-SA.json | 7 - frontend/lang/messages/bg-BG.json | 7 - frontend/lang/messages/ca-ES.json | 7 - frontend/lang/messages/cs-CZ.json | 7 - frontend/lang/messages/da-DK.json | 7 - frontend/lang/messages/de-DE.json | 7 - frontend/lang/messages/el-GR.json | 7 - frontend/lang/messages/en-GB.json | 7 - frontend/lang/messages/es-ES.json | 7 - frontend/lang/messages/et-EE.json | 1387 +++++++++++++++++ frontend/lang/messages/fi-FI.json | 7 - frontend/lang/messages/fr-BE.json | 13 +- frontend/lang/messages/fr-CA.json | 7 - frontend/lang/messages/fr-FR.json | 7 - frontend/lang/messages/gl-ES.json | 7 - frontend/lang/messages/he-IL.json | 7 - frontend/lang/messages/hr-HR.json | 7 - frontend/lang/messages/hu-HU.json | 7 - frontend/lang/messages/is-IS.json | 7 - frontend/lang/messages/it-IT.json | 15 +- frontend/lang/messages/ja-JP.json | 7 - frontend/lang/messages/ko-KR.json | 7 - frontend/lang/messages/lt-LT.json | 7 - frontend/lang/messages/lv-LV.json | 7 - frontend/lang/messages/nl-NL.json | 7 - frontend/lang/messages/no-NO.json | 7 - frontend/lang/messages/pl-PL.json | 7 - frontend/lang/messages/pt-BR.json | 7 - frontend/lang/messages/pt-PT.json | 7 - frontend/lang/messages/ro-RO.json | 7 - frontend/lang/messages/ru-RU.json | 7 - frontend/lang/messages/sk-SK.json | 7 - frontend/lang/messages/sl-SI.json | 7 - frontend/lang/messages/sr-SP.json | 7 - frontend/lang/messages/sv-SE.json | 7 - frontend/lang/messages/tr-TR.json | 7 - frontend/lang/messages/uk-UA.json | 7 - frontend/lang/messages/vi-VN.json | 7 - frontend/lang/messages/zh-CN.json | 7 - frontend/lang/messages/zh-TW.json | 7 - mealie/lang/messages/et-EE.json | 80 + .../seed/resources/foods/locales/et-EE.json | 692 ++++++++ .../seed/resources/foods/locales/it-IT.json | 16 +- .../seed/resources/labels/locales/et-EE.json | 65 + .../seed/resources/units/locales/et-EE.json | 141 ++ 46 files changed, 2380 insertions(+), 295 deletions(-) create mode 100644 frontend/lang/messages/et-EE.json create mode 100644 mealie/lang/messages/et-EE.json create mode 100644 mealie/repos/seed/resources/foods/locales/et-EE.json create mode 100644 mealie/repos/seed/resources/labels/locales/et-EE.json create mode 100644 mealie/repos/seed/resources/units/locales/et-EE.json diff --git a/frontend/lang/messages/af-ZA.json b/frontend/lang/messages/af-ZA.json index 8ea266c69..cafc431e7 100644 --- a/frontend/lang/messages/af-ZA.json +++ b/frontend/lang/messages/af-ZA.json @@ -570,13 +570,6 @@ "increase-scale-label": "Verhoog skaal met 1", "locked": "Gesluit", "public-link": "Openbare skakel", - "timer": { - "kitchen-timer": "Kombuis timer", - "start-timer": "Begin die kombuis timer", - "pause-timer": "Onderbreek die kombuis timer", - "resume-timer": "Hervat kombuis timer", - "stop-timer": "Stop die kombuis timer" - }, "edit-timeline-event": "Wysig tydlyn gebeurtenis", "timeline": "Tydlyn", "timeline-is-empty": "Nog niks op die tydlyn nie. Probeer hierdie resep maak!", diff --git a/frontend/lang/messages/ar-SA.json b/frontend/lang/messages/ar-SA.json index 965b9bbdc..f8e5b6aaa 100644 --- a/frontend/lang/messages/ar-SA.json +++ b/frontend/lang/messages/ar-SA.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/bg-BG.json b/frontend/lang/messages/bg-BG.json index 52cb5876e..cf665be86 100644 --- a/frontend/lang/messages/bg-BG.json +++ b/frontend/lang/messages/bg-BG.json @@ -570,13 +570,6 @@ "increase-scale-label": "Увеличи мащаба с 1", "locked": "Заключено", "public-link": "Публична връзка", - "timer": { - "kitchen-timer": "Кухненски таймер", - "start-timer": "Стартирай таймера", - "pause-timer": "Поставяне таймера на пауза", - "resume-timer": "Възобновяване на таймера", - "stop-timer": "Спри таймера" - }, "edit-timeline-event": "Редактирай събитие", "timeline": "Хронология на събитията", "timeline-is-empty": "Няма история на събитията. Опитайте да приготвите рецептата!", diff --git a/frontend/lang/messages/ca-ES.json b/frontend/lang/messages/ca-ES.json index 819bd9a5a..21faa4ef7 100644 --- a/frontend/lang/messages/ca-ES.json +++ b/frontend/lang/messages/ca-ES.json @@ -570,13 +570,6 @@ "increase-scale-label": "Multiplica", "locked": "Bloquejat", "public-link": "Enllaç públic", - "timer": { - "kitchen-timer": "Temporitzador de cuina", - "start-timer": "Iniciar temporitzador", - "pause-timer": "Pausa el temporitzador", - "resume-timer": "Reprèn el temporitzador", - "stop-timer": "Atura el temporitzador" - }, "edit-timeline-event": "Edita l'esdeveniment de la cronologia", "timeline": "Cronologia", "timeline-is-empty": "Encara no hi ha res a la cronologia. Prova de fer aquesta recepta!", diff --git a/frontend/lang/messages/cs-CZ.json b/frontend/lang/messages/cs-CZ.json index 5b116562c..856ae697b 100644 --- a/frontend/lang/messages/cs-CZ.json +++ b/frontend/lang/messages/cs-CZ.json @@ -570,13 +570,6 @@ "increase-scale-label": "Zvýšit násobení o 1", "locked": "Uzamčeno", "public-link": "Veřejný odkaz", - "timer": { - "kitchen-timer": "Kuchyňský časovač", - "start-timer": "Spustit časovač", - "pause-timer": "Pozastavit časovač", - "resume-timer": "Obnovit časovač", - "stop-timer": "Zastavit časovač" - }, "edit-timeline-event": "Upravit událost časové osy", "timeline": "Časová osa", "timeline-is-empty": "Zatím nic na časové ose není. Zkuste vytvořit tento recept!", diff --git a/frontend/lang/messages/da-DK.json b/frontend/lang/messages/da-DK.json index 7ab839ae9..2621480eb 100644 --- a/frontend/lang/messages/da-DK.json +++ b/frontend/lang/messages/da-DK.json @@ -570,13 +570,6 @@ "increase-scale-label": "Forøg skala med 1", "locked": "Låst", "public-link": "Offentligt link", - "timer": { - "kitchen-timer": "Køkken Ur", - "start-timer": "Start timer", - "pause-timer": "Sæt timer på pause", - "resume-timer": "Genoptag Timer", - "stop-timer": "Stop timer" - }, "edit-timeline-event": "Rediger tidslinjebegivenhed", "timeline": "Tidslinje", "timeline-is-empty": "Intet på tidslinjen endnu. Prøv at lave denne opskrift!", diff --git a/frontend/lang/messages/de-DE.json b/frontend/lang/messages/de-DE.json index da2b75fc2..fee834582 100644 --- a/frontend/lang/messages/de-DE.json +++ b/frontend/lang/messages/de-DE.json @@ -570,13 +570,6 @@ "increase-scale-label": "Maßstab um 1 erhöhen", "locked": "Gesperrt", "public-link": "Öffentlicher Link", - "timer": { - "kitchen-timer": "Küchenwecker", - "start-timer": "Wecker starten", - "pause-timer": "Wecker pausieren", - "resume-timer": "Wecker fortsetzen", - "stop-timer": "Wecker stoppen" - }, "edit-timeline-event": "Zeitstrahl-Ereignis bearbeiten", "timeline": "Zeitstrahl", "timeline-is-empty": "Noch nichts auf dem Zeitstrahl. Probier dieses Rezept aus!", diff --git a/frontend/lang/messages/el-GR.json b/frontend/lang/messages/el-GR.json index 927269b5c..102378d3a 100644 --- a/frontend/lang/messages/el-GR.json +++ b/frontend/lang/messages/el-GR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Αύξηση κλίμακας κατά 1", "locked": "Κλειδωμένο", "public-link": "Δημόσιος σύνδεσμος", - "timer": { - "kitchen-timer": "Χρονόμετρο Κουζίνας", - "start-timer": "Εναρξη χρονομέτρου", - "pause-timer": "Παύση χρονόμετρου", - "resume-timer": "Συνέχιση χρονομέτρου", - "stop-timer": "Διακοπή χρονόμετρου" - }, "edit-timeline-event": "Επεξεργασία συμβάντος χρονοδιαγράμματος", "timeline": "Χρονοδιάγραμμα", "timeline-is-empty": "Δεν υπάρχει τίποτα ακόμα στο χρονοδιάγραμμα. Δοκιμάστε να κάνετε αυτή τη συνταγή!", diff --git a/frontend/lang/messages/en-GB.json b/frontend/lang/messages/en-GB.json index 43d8d6161..38661f21c 100644 --- a/frontend/lang/messages/en-GB.json +++ b/frontend/lang/messages/en-GB.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/es-ES.json b/frontend/lang/messages/es-ES.json index 4e21a0142..5edd7acaf 100644 --- a/frontend/lang/messages/es-ES.json +++ b/frontend/lang/messages/es-ES.json @@ -570,13 +570,6 @@ "increase-scale-label": "Aumentar escala en 1", "locked": "Bloqueada", "public-link": "Enlace público", - "timer": { - "kitchen-timer": "Temporizador de cocina", - "start-timer": "Iniciar Temporizador", - "pause-timer": "Pausar Temporizador", - "resume-timer": "Reanudar Temporizador", - "stop-timer": "Detener temporizador" - }, "edit-timeline-event": "Editar evento en la cronología", "timeline": "Cronología", "timeline-is-empty": "Aún no hay nada en la línea de tiempo. ¡Intenta hacer esta receta!", diff --git a/frontend/lang/messages/et-EE.json b/frontend/lang/messages/et-EE.json new file mode 100644 index 000000000..383af8c9f --- /dev/null +++ b/frontend/lang/messages/et-EE.json @@ -0,0 +1,1387 @@ +{ + "about": { + "about": "Teave", + "about-mealie": "Mealie teave", + "api-docs": "API dokumentatsioon", + "api-port": "API Port", + "application-mode": "Rakenduse režiim", + "database-type": "Andmebaasi tüüp", + "database-url": "Andmebaasi URL", + "default-group": "Vaikegrupp", + "default-household": "Majapidamise vaikeväärtus", + "demo": "Demo", + "demo-status": "Demo seisund", + "development": "Arendus", + "docs": "Dokumentatsioon", + "download-log": "Allalaadimiste logi", + "download-recipe-json": "Viimati ekstraheeritud JSON", + "github": "Github", + "log-lines": "Logiread", + "not-demo": "Mitte-demo", + "portfolio": "Portfoolio", + "production": "Tootmine", + "support": "Tugi", + "version": "Versioon", + "unknown-version": "tundmatu", + "sponsor": "Sponsor" + }, + "asset": { + "assets": "Manused", + "code": "Kood", + "file": "Fail", + "image": "Pilt", + "new-asset": "Uus manus", + "pdf": "PDF", + "recipe": "Retsept", + "show-assets": "Näita manuseid", + "error-submitting-form": "Tõrge vormi esitamisel" + }, + "category": { + "categories": "Kategooriad", + "category-created": "Kategooriad loodud", + "category-creation-failed": "Kategooria loomine ebaõnnestus", + "category-deleted": "Kategooria kustutatud", + "category-deletion-failed": "Kategooria kustutamine ebaõnnestus", + "category-filter": "Kategooria filter", + "category-update-failed": "Kategooria uuendamine ebaõnnestus", + "category-updated": "Kategooria uuendatud", + "uncategorized-count": "Mitte-kategoriseritud {count}", + "create-a-category": "Loo kategooria", + "category-name": "Kategooria nimi", + "category": "Kategooria" + }, + "events": { + "apprise-url": "Apprise URL", + "database": "Andmebaas", + "delete-event": "Kustuta sündmus", + "event-delete-confirmation": "Kas oled kindel, et soovid sündmust kustutada?", + "event-deleted": "Sündmus kustutatud", + "event-updated": "Sündmus uuendatud", + "new-notification-form-description": "Mealie kasutab Apprise tarkvarateeki, et genereerida teavitusi. Need pakuvad teenustele mitmeid valikuid teavituse kasutamiseks. Konsulteeri nende wiki detailse juhendiga loomaks URL-i oma teenusele. Olemasolu korral võib sinu valitud teavitus hõlmata ka lisaomadusi.", + "new-version": "Uus versioon saadaval!", + "notification": "Teade", + "refresh": "Värskenda", + "scheduled": "Ajastatud", + "something-went-wrong": "Miski läks valesti", + "subscribed-events": "Tellitud sündmused", + "test-message-sent": "Test-sõnum saadetud", + "message-sent": "Sõnum saadetud", + "new-notification": "Uus teade", + "event-notifiers": "Sündmuste märguanded", + "apprise-url-skipped-if-blank": "Apprise URL (kui on tühi, jäetakse vahele)", + "enable-notifier": "Luba teavitaja", + "what-events": "Millised sündmused peaks see teavitaja tellimaa?", + "user-events": "Kasutaja sündmused", + "mealplan-events": "Toiduplaani sündmused", + "when-a-user-in-your-group-creates-a-new-mealplan": "Kui kasutaja sinu grupis loob uue toiduplaani", + "shopping-list-events": "Toidunimekirja sündmused", + "cookbook-events": "Kokaraamatu sündmused", + "tag-events": "Märksõna sündmused", + "category-events": "Kategooria sündmused", + "when-a-new-user-joins-your-group": "Kui uus kasutaja liitub sinu grupiga", + "recipe-events": "Retsepti sündmused" + }, + "general": { + "add": "Lisa", + "cancel": "Tühista", + "clear": "Tühjenda", + "close": "Sulge", + "confirm": "Kinnita", + "confirm-how-does-everything-look": "Kuidas näeb kõik välja?", + "confirm-delete-generic": "Kas olete kindel, et soovite selle eemaldada?", + "copied_message": "Kopeeritud!", + "create": "Loo", + "created": "Loodud", + "custom": "Kohandatud", + "dashboard": "Töölaud", + "delete": "Kustuta", + "disabled": "Keelatud", + "download": "Lae alla", + "duplicate": "Duplitseeri", + "edit": "Muuda", + "enabled": "Lubatud", + "exception": "Erand", + "failed-count": "Ebaõnnestunud: {count}", + "failure-uploading-file": "Faili üleslaadimine ebaõnnestunud", + "favorites": "Lemmiud", + "field-required": "Väli nõutud", + "file-folder-not-found": "Faili/kausta ei leitud", + "file-uploaded": "Fail üles laetud", + "filter": "Filter", + "friday": "Reede", + "general": "Üldine", + "get": "Hangi", + "home": "Avaleht", + "image": "Pilt", + "image-upload-failed": "Pildi üleslaadimine ebaõnnestus", + "import": "Impordi", + "json": "JSON", + "keyword": "Otsingusõna", + "link-copied": "Link kopeeritud!", + "loading": "Laadimine", + "loading-events": "Sündmuste laadimine", + "loading-recipe": "Laeb retsepti...", + "loading-ocr-data": "Laeb OCR admeid", + "loading-recipes": "Laeb retsepte", + "message": "Sõnum", + "monday": "Esmaspäev", + "name": "Nimi", + "new": "Uus", + "never": "Uuem", + "no": "Ei", + "no-recipe-found": "Retsepti ei leitud", + "ok": "OK", + "options": "Valikud:", + "plural-name": "Nimi mitmuses", + "print": "Prindi", + "print-preferences": "Printimise eelistused", + "random": "Juhuslik", + "rating": "Hinnang", + "recent": "Hiljutine", + "recipe": "Retsept", + "recipes": "Retseptid", + "rename-object": "Nimeta {0} ümber", + "reset": "Lähtesta", + "saturday": "Laupäev", + "save": "Salvesta", + "settings": "Seaded", + "share": "Jaga", + "show-all": "Näita kõiki", + "shuffle": "Sega", + "sort": "Sorteeri", + "sort-ascending": "Sorteeri kasvavalt", + "sort-descending": "Sorteeri kahanevalt", + "sort-alphabetically": "Tähestikuline", + "status": "Staatus", + "subject": "Teema", + "submit": "Esita", + "success-count": "Õnnestunud {count}", + "sunday": "Pühapäev", + "system": "Süsteem", + "templates": "Mallid:", + "test": "Test", + "themes": "Teemad", + "thursday": "Neljapäev", + "title": "Pealkiri", + "token": "Identifikaator", + "tuesday": "Teisipäev", + "type": "Tüüp", + "update": "Uuenda", + "updated": "Uuendatud", + "upload": "Lae üles", + "url": "URL", + "view": "Vaade", + "wednesday": "Kolmapäev", + "yes": "Jah", + "foods": "Toidud", + "units": "Ühikud", + "back": "Tagasi", + "next": "Järgmine", + "start": "Alusta", + "toggle-view": "Muuda vaadet", + "date": "Kuupäev", + "id": "ID", + "owner": "Omanik", + "change-owner": "Muuda omanikku", + "date-added": "Kuupäev lisatud", + "none": "Puudub", + "run": "Käivita", + "menu": "Menüü", + "a-name-is-required": "Nimi on kohustuslik", + "delete-with-name": "Kustuta {name}", + "confirm-delete-generic-with-name": "Kas olete kindel, et soovite kirje {name} kustutada?", + "confirm-delete-own-admin-account": "Pane tähele, et sa proovid kustutada oma admin kasutajat! Seda tegevust ei saa tagasi võtta ning su kasutaja on jäädavalt kustutatud.", + "organizer": "Korraldaja", + "transfer": "Vii üle", + "copy": "Kopeeri", + "color": "Värv", + "timestamp": "Ajatempel", + "last-made": "Viimati tehtud", + "learn-more": "Lisateave", + "this-feature-is-currently-inactive": "See funktsioon on hetkel mitte-aktiivne", + "clipboard-not-supported": "Lõikelaud ei ole toetatud", + "copied-to-clipboard": "Kopeeritud lõikelauale", + "your-browser-does-not-support-clipboard": "Sinu lehitseja ei toeta lõikelauda.", + "copied-items-to-clipboard": "Midagi ei kopeeritud lõikelauale | Üks asi kopeeritud lõikelauale | {count} asja kopeeritud lõikelauale", + "actions": "Tegevused", + "selected-count": "Valitud: {count}", + "export-all": "Ekspordi kõik", + "refresh": "Värskenda", + "upload-file": "Lae fail üles", + "created-on-date": "Loodud: {0}", + "unsaved-changes": "Sul on salvestamata muudatusi. Kas sa tahad salvestada enne lehelt lahkumist? Vajuta OK salvestamiseks või Tühista, et muudatused tühistada.", + "clipboard-copy-failure": "Lõikepuhvrisse kopeerimine ebaõnnestus", + "confirm-delete-generic-items": "Kas oled kindel, et tahad kustutada järgnevad asjad?", + "organizers": "Korraldajad", + "caution": "Ettevaatust", + "show-advanced": "Kuva täpsemad sätted", + "add-field": "Lisa väli", + "date-created": "Loomise kuupäev", + "date-updated": "Üleslaadimise kuupäev" + }, + "group": { + "are-you-sure-you-want-to-delete-the-group": "Kas oled kindel, et tahad kustutada {groupName}", + "cannot-delete-default-group": "Ei saa kustutada vaikegruppi", + "cannot-delete-group-with-users": "Ei saa kustutada kasutajatega gruppi", + "confirm-group-deletion": "Kinnita grupi kustutamine", + "create-group": "Loo grupp", + "error-updating-group": "Tõrge grupi uuendamisel", + "group": "Grupp", + "group-deleted": "Grupp kustutatud", + "group-deletion-failed": "Grupi kustutamine ebaõnnestus", + "group-id-with-value": "Grupi ID: {groupID}", + "group-name": "Grupi nimi", + "group-not-found": "Gruppi ei leitud", + "group-token": "Grupi identifikaator", + "group-with-value": "Grupp: {groupID}", + "groups": "Grupid", + "manage-groups": "Halda gruppe", + "user-group": "Kasutajagrupp", + "user-group-created": "Kasutajagrupp loodud", + "user-group-creation-failed": "Kasutajagrupi loomine ebaõnnestus", + "settings": { + "keep-my-recipes-private": "Hoia minu retseptid privaatsena", + "keep-my-recipes-private-description": "Muudab teie rühma ja kõik retseptid privaatseks. Saate seda alati hiljem muuta." + }, + "manage-members": "Halda liikmeid", + "manage-members-description": "Hallake oma leibkonnaliikmete õigusi. {manage} annab liikmele juurdepääsu andmehalduslehele ja {invite} võimaldab kasutajal luua teistele kasutajatele kutselinke. Grupi omanikud ei saa oma õigusi ise muuta.", + "manage": "Halda", + "manage-household": "Halda leibkonda", + "invite": "Kutsu", + "looking-to-update-your-profile": "Kas soovida uuendada oma profiili?", + "default-recipe-preferences-description": "Need on lähteseaded kui loote uut retseepti oma grupis. Neid saab muuta iga retsepti jaoks individuaalselt retsepti sätete menüüs.", + "default-recipe-preferences": "Retsepti vaikevalikud", + "group-preferences": "Grupi sätted", + "private-group": "Privaatne grupp", + "private-group-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded.", + "enable-public-access": "Luba avalik juurdepääs", + "enable-public-access-description": "Teeb grupi retseptid vaikimisi avalikuks ja lubab külalistel vaadata retsepte ilma sisse logimata", + "allow-users-outside-of-your-group-to-see-your-recipes": "Lubab kasutajatel väljaspool sinu gruppi näha retsepte", + "allow-users-outside-of-your-group-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link.", + "show-nutrition-information": "Näita toitumisalast teavet", + "show-nutrition-information-description": "Kui see on lubatud, kuvatakse saadavuse korral toitumisalane teave retseptis. Kui toitumisalane teave pole saadaval, siis toitumisalast teavet ei kuvata", + "show-recipe-assets": "Näita retsepti manuseid", + "show-recipe-assets-description": "Kui lubatud, kuvatakse retsepti manused retseptis", + "default-to-landscape-view": "Vaikimisi horisontaalvaade", + "default-to-landscape-view-description": "Kui see on lubatud, kuvatakse retsepti pealkiri horisontaalvaates", + "disable-users-from-commenting-on-recipes": "Keela kasutajatel retsepte kommenteerida", + "disable-users-from-commenting-on-recipes-description": "Peidab retsepti kommentaaride sektsioon ning keela kommenteerimine", + "disable-organizing-recipe-ingredients-by-units-and-food": "Keela retsepti koostisosade järjestamine ühikute ja toiduainete järgi", + "disable-organizing-recipe-ingredients-by-units-and-food-description": "Peidab koostisosade \"Toit\", \"Ühik\", ja \"Kogus\" lahtrid ning käsitleb koostisosi tavateksti väljadena", + "general-preferences": "Üldised eelistused", + "group-recipe-preferences": "Grupi retseptide eelistused", + "report": "Teavita", + "report-with-id": "Raporti ID: {id}", + "group-management": "Grupi manageerimine", + "admin-group-management": "Administraatorite grupi manageerimine", + "admin-group-management-text": "Selle grupi muudatused on koheselt nähtavad", + "group-id-value": "Grupi ID: {0}", + "total-households": "Kokku leibkondi", + "you-must-select-a-group-before-selecting-a-household": "Sa pead valima grupi enne leibkonna valimist" + }, + "household": { + "household": "Leibkond", + "households": "Leibkonnad", + "user-household": "Kasutaja leibkond", + "create-household": "Loo leibkond", + "household-name": "Leibkonna nimi", + "household-group": "Leibkonna grupp", + "household-management": "Leibkonna manageerimine", + "manage-households": "Manageeri leibkondi", + "admin-household-management": "Administraatori leibkonna manageerimine", + "admin-household-management-text": "Selle leibkonna muudatused on koheselt nähtaval", + "household-id-value": "Leibkonna ID: {0}", + "private-household": "Privaatne leibkond", + "private-household-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded.", + "lock-recipe-edits-from-other-households": "Lukusta retsepti muudatused teiste leibkondade eest", + "lock-recipe-edits-from-other-households-description": "Kui lubatud, ainult sinu leibkonna kasutajad saavad teha muudatusi sinu leibkonna retseptides", + "household-recipe-preferences": "Leibkonna retseptide seaded", + "default-recipe-preferences-description": "Need on vaikesätted uute retseptide loomiseks sinu leibkonnas. Neid saab muuta iga retsepti jaoks individuaalselt seadete menüü alt", + "allow-users-outside-of-your-household-to-see-your-recipes": "Luba kasutajatel väljaspool sinu leibkonda näha sinu retsepte", + "allow-users-outside-of-your-household-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link.", + "household-preferences": "Leibkonna seaded" + }, + "meal-plan": { + "create-a-new-meal-plan": "Loo uus toitumismplaan", + "update-this-meal-plan": "Uuenda seda toitumismplaani", + "dinner-this-week": "Õhtusöök sellel nädalal", + "dinner-today": "Õhtusöök täna", + "dinner-tonight": "ÕHTUSÖÖK TÄNA", + "edit-meal-plan": "Muuda toitumisplaani", + "end-date": "Lõppkuupäev", + "group": "Grupp (beeta)", + "main": "Pearoog", + "meal-planner": "Toitumismplaneerija", + "meal-plans": "Toitumismplanid", + "mealplan-categories": "TOITUMISPLAANI KATEGOORIAD", + "mealplan-created": "Toitumisplaan loodud", + "mealplan-creation-failed": "Toitumisplaani loomine ebaõnnestus", + "mealplan-deleted": "Toitumisplaan kustutatud", + "mealplan-deletion-failed": "Toitumisplaani kustutamine ebaõnnestus", + "mealplan-settings": "Toitumisplaani sätted", + "mealplan-update-failed": "Toitumisplaani uuendamine ebaõnnestus", + "mealplan-updated": "Toitumisplaan uuendatud", + "mealplan-households-description": "Kui leibkonda pole valitud, siis saab retsepte lisada igast leibkonnast", + "any-category": "Kõik kategooriad", + "any-tag": "Kõik märksõnad", + "any-household": "Kõik leibkonnad", + "no-meal-plan-defined-yet": "Toitumisplaani pole veel defineeritud", + "no-meal-planned-for-today": "Ühtegi einet pole tänaseks planeeritud", + "numberOfDays-hint": "Päevade arv lehe laadimisel", + "numberOfDays-label": "Vaike päevade arv", + "only-recipes-with-these-categories-will-be-used-in-meal-plans": "Ainult selle kategooria retsepte kasutatakse Toitumisplaanis", + "planner": "Planeerija", + "quick-week": "Kiire nädalaplaan", + "side": "Kõrvalroog", + "sides": "Kõrvalroad", + "start-date": "Alguskuupäev", + "rule-day": "Reegli päev", + "meal-type": "Eine tüüp", + "breakfast": "Hommikusöök", + "lunch": "Lõuna", + "dinner": "Õhtusöök", + "type-any": "Kõik", + "day-any": "Kõik", + "editor": "Editor", + "meal-recipe": "Toidu retsept", + "meal-title": "Toidu nimi", + "meal-note": "Toidu märkus", + "note-only": "Ainult märge", + "random-meal": "Suvaline toit", + "random-dinner": "Suvaline õhtusöök", + "random-side": "Suvaline kõrvalroog", + "this-rule-will-apply": "See reegel kehtib {dayCriteria} {mealTypeCriteria}.", + "to-all-days": "kõikidel päevadel", + "on-days": "on {0}s", + "for-all-meal-types": "for all meal types", + "for-type-meal-types": "for {0} meal types", + "meal-plan-rules": "Meal Plan Rules", + "new-rule": "New Rule", + "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", + "new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.", + "recipe-rules": "Recipe Rules", + "applies-to-all-days": "Applies to all days", + "applies-on-days": "Applies on {0}s", + "meal-plan-settings": "Meal Plan Settings" + }, + "migration": { + "migration-data-removed": "Migration data removed", + "new-migration": "New Migration", + "no-file-selected": "No File Selected", + "no-migration-data-available": "No Migration Data Available", + "previous-migrations": "Previous Migrations", + "recipe-migration": "Recipe Migration", + "chowdown": { + "description": "Migrate data from Chowdown", + "description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.", + "title": "Chowdown" + }, + "nextcloud": { + "description": "Migrate data from a Nextcloud Cookbook instance", + "description-long": "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.", + "title": "Nextcloud Cookbook" + }, + "copymethat": { + "description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.", + "title": "Copy Me That Recipe Manager" + }, + "paprika": { + "description-long": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.", + "title": "Paprika Recipe Manager" + }, + "mealie-pre-v1": { + "description-long": "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.", + "title": "Mealie Pre v1.0" + }, + "tandoor": { + "description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.", + "title": "Tandoor Recipes" + }, + "recipe-data-migrations": "Recipe Data Migrations", + "recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.", + "coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.", + "choose-migration-type": "Choose Migration Type", + "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.", + "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-2": "Recipe 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.", + "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": { + "title": "Plan to Eat", + "description-long": "Mealie can import recipies from Plan to Eat." + }, + "myrecipebox": { + "title": "My Recipe Box", + "description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below." + }, + "recipekeeper": { + "title": "Recipe Keeper", + "description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below." + } + }, + "new-recipe": { + "bulk-add": "Bulk Add", + "error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.", + "error-title": "Looks Like We Couldn't Find Anything", + "from-url": "Import a Recipe", + "github-issues": "GitHub Issues", + "google-ld-json-info": "Google ld+json Info", + "must-be-a-valid-url": "Must be a Valid URL", + "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list", + "recipe-markup-specification": "Recipe Markup Specification", + "recipe-url": "Recipe URL", + "recipe-html-or-json": "Recipe HTML or JSON", + "upload-a-recipe": "Upload a Recipe", + "upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.", + "url-form-hint": "Copy and paste a link from your favorite recipe website", + "view-scraped-data": "View Scraped Data", + "trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines", + "trim-prefix-description": "Trim first character from each line", + "split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns", + "import-by-url": "Import a recipe by URL", + "create-manually": "Create a recipe manually", + "make-recipe-image": "Make this the recipe image" + }, + "page": { + "404-page-not-found": "404 Page not found", + "all-recipes": "All Recipes", + "new-page-created": "New page created", + "page": "Page", + "page-creation-failed": "Page creation failed", + "page-deleted": "Page deleted", + "page-deletion-failed": "Page deletion failed", + "page-update-failed": "Page update failed", + "page-updated": "Page updated", + "pages-update-failed": "Pages update failed", + "pages-updated": "Pages updated", + "404-not-found": "404 Not Found", + "an-error-occurred": "An error occurred" + }, + "recipe": { + "add-key": "Add Key", + "add-to-favorites": "Add to Favorites", + "api-extras": "API Extras", + "calories": "Calories", + "calories-suffix": "calories", + "carbohydrate-content": "Carbohydrate", + "categories": "Categories", + "cholesterol-content": "Cholesterol", + "comment-action": "Comment", + "comment": "Comment", + "comments": "Comments", + "delete-confirmation": "Are you sure you want to delete this recipe?", + "delete-recipe": "Delete Recipe", + "description": "Description", + "disable-amount": "Disable Ingredient Amounts", + "disable-comments": "Disable Comments", + "duplicate": "Duplicate recipe", + "duplicate-name": "Name of the new recipe", + "edit-scale": "Edit Scale", + "fat-content": "Fat", + "fiber-content": "Fiber", + "grams": "grams", + "ingredient": "Ingredient", + "ingredients": "Ingredients", + "insert-ingredient": "Insert Ingredient", + "insert-section": "Insert Section", + "insert-above": "Insert Above", + "insert-below": "Insert Below", + "instructions": "Instructions", + "key-name-required": "Key Name Required", + "landscape-view-coming-soon": "Landscape View", + "milligrams": "milligrams", + "new-key-name": "New Key Name", + "no-white-space-allowed": "No White Space Allowed", + "note": "Note", + "nutrition": "Nutrition", + "object-key": "Object Key", + "object-value": "Object Value", + "original-url": "Original URL", + "perform-time": "Cook Time", + "prep-time": "Prep Time", + "protein-content": "Protein", + "public-recipe": "Public Recipe", + "recipe-created": "Recipe created", + "recipe-creation-failed": "Recipe creation failed", + "recipe-deleted": "Recipe deleted", + "recipe-image": "Recipe Image", + "recipe-image-updated": "Recipe image updated", + "recipe-name": "Recipe Name", + "recipe-settings": "Recipe Settings", + "recipe-update-failed": "Recipe update failed", + "recipe-updated": "Recipe updated", + "remove-from-favorites": "Remove from Favorites", + "remove-section": "Remove Section", + "saturated-fat-content": "Saturated fat", + "save-recipe-before-use": "Save recipe before use", + "section-title": "Section Title", + "servings": "Servings", + "serves-amount": "Serves {amount}", + "share-recipe-message": "I wanted to share my {0} recipe with you.", + "show-nutrition-values": "Show Nutrition Values", + "sodium-content": "Sodium", + "step-index": "Step: {step}", + "sugar-content": "Sugar", + "title": "Title", + "total-time": "Total Time", + "trans-fat-content": "Trans-fat", + "unable-to-delete-recipe": "Unable to Delete Recipe", + "unsaturated-fat-content": "Unsaturated fat", + "no-recipe": "No Recipe", + "locked-by-owner": "Locked by Owner", + "join-the-conversation": "Join the Conversation", + "add-recipe-to-mealplan": "Add Recipe to Mealplan", + "entry-type": "Entry Type", + "date-format-hint": "MM/DD/YYYY format", + "date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format", + "add-to-list": "Add to List", + "add-to-plan": "Add to Plan", + "add-to-timeline": "Add to Timeline", + "recipe-added-to-list": "Recipe added to list", + "recipes-added-to-list": "Recipes added to list", + "successfully-added-to-list": "Successfully added to list", + "recipe-added-to-mealplan": "Recipe added to mealplan", + "failed-to-add-recipes-to-list": "Failed to add recipe to list", + "failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan", + "failed-to-add-to-list": "Failed to add to list", + "yield": "Yield", + "yields-amount-with-text": "Yields {amount} {text}", + "yield-text": "Yield Text", + "quantity": "Quantity", + "choose-unit": "Choose Unit", + "press-enter-to-create": "Press Enter to Create", + "choose-food": "Choose Food", + "notes": "Notes", + "toggle-section": "Toggle Section", + "see-original-text": "See Original Text", + "original-text-with-value": "Original Text: {originalText}", + "ingredient-linker": "Ingredient Linker", + "linked-to-other-step": "Linked to other step", + "auto": "Auto", + "cook-mode": "Cook Mode", + "link-ingredients": "Link Ingredients", + "merge-above": "Merge Above", + "move-to-bottom": "Move To Bottom", + "move-to-top": "Move To Top", + "reset-scale": "Reset Scale", + "decrease-scale-label": "Decrease Scale by 1", + "increase-scale-label": "Increase Scale by 1", + "locked": "Locked", + "public-link": "Public Link", + "edit-timeline-event": "Edit Timeline Event", + "timeline": "Timeline", + "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", + "timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.", + "group-global-timeline": "{groupName} Global Timeline", + "open-timeline": "Open Timeline", + "made-this": "I Made This", + "how-did-it-turn-out": "How did it turn out?", + "user-made-this": "{user} made this", + "last-made-date": "Last Made {date}", + "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "message-key": "Message Key", + "parse": "Parse", + "attach-images-hint": "Attach images by dragging & dropping them into the editor", + "drop-image": "Drop image", + "enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature", + "recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.", + "parse-ingredients": "Parse ingredients", + "edit-markdown": "Edit Markdown", + "recipe-creation": "Recipe Creation", + "select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe", + "looking-for-migrations": "Looking For Migrations?", + "import-with-url": "Import with URL", + "create-recipe": "Create Recipe", + "create-recipe-description": "Create a new recipe from scratch.", + "create-recipes": "Create Recipes", + "import-with-zip": "Import with .zip", + "create-recipe-from-an-image": "Create Recipe from an Image", + "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", + "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", + "create-from-image": "Create from Image", + "should-translate-description": "Translate the recipe into my language", + "please-wait-image-procesing": "Please wait, the image is processing. This may take some time.", + "bulk-url-import": "Bulk URL Import", + "debug-scraper": "Debug Scraper", + "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.", + "new-recipe-names-must-be-unique": "New recipe names must be unique", + "scrape-recipe": "Scrape Recipe", + "scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.", + "scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?", + "scrape-recipe-suggest-bulk-importer": "Try out the bulk importer", + "scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?", + "scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly", + "import-original-keywords-as-tags": "Import original keywords as tags", + "stay-in-edit-mode": "Stay in Edit mode", + "import-from-zip": "Import from Zip", + "import-from-zip-description": "Import a single recipe that was exported from another Mealie instance.", + "import-from-html-or-json": "Import from HTML or JSON", + "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", + "json-import-format-description-colon": "To import via JSON, it must be in valid format:", + "json-editor": "JSON Editor", + "zip-files-must-have-been-exported-from-mealie": ".zip files must have been exported from Mealie", + "create-a-recipe-by-uploading-a-scan": "Create a recipe by uploading a scan.", + "upload-a-png-image-from-a-recipe-book": "Upload a png image from a recipe book", + "recipe-bulk-importer": "Recipe Bulk Importer", + "recipe-bulk-importer-description": "The Bulk recipe importer allows you to import multiple recipes at once by queueing the sites on the backend and running the task in the background. This can be useful when initially migrating to Mealie, or when you want to import a large number of recipes.", + "set-categories-and-tags": "Set Categories and Tags", + "bulk-imports": "Bulk Imports", + "bulk-import-process-has-started": "Bulk Import process has started", + "bulk-import-process-has-failed": "Bulk import process has failed", + "report-deletion-failed": "Report deletion failed", + "recipe-debugger": "Recipe Debugger", + "recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.", + "use-openai": "Use OpenAI", + "recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.", + "debug": "Debug", + "tree-view": "Tree View", + "recipe-servings": "Recipe Servings", + "recipe-yield": "Recipe Yield", + "recipe-yield-text": "Recipe Yield Text", + "unit": "Unit", + "upload-image": "Upload image", + "screen-awake": "Keep Screen Awake", + "remove-image": "Remove image", + "nextStep": "Next step", + "recipe-actions": "Recipe Actions", + "parser": { + "experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.", + "ingredient-parser": "Ingredient Parser", + "explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.", + "alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.", + "select-parser": "Select Parser", + "natural-language-processor": "Natural Language Processor", + "brute-parser": "Brute Parser", + "openai-parser": "OpenAI Parser", + "parse-all": "Parse All", + "no-unit": "No unit", + "missing-unit": "Create missing unit: {unit}", + "missing-food": "Create missing food: {food}", + "no-food": "No Food" + }, + "reset-servings-count": "Reset Servings Count", + "not-linked-ingredients": "Additional Ingredients" + }, + "recipe-finder": { + "recipe-finder": "Recipe Finder", + "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", + "selected-ingredients": "Selected Ingredients", + "no-ingredients-selected": "No ingredients selected", + "missing": "Missing", + "no-recipes-found": "No recipes found", + "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", + "include-ingredients-on-hand": "Include Ingredients On Hand", + "include-tools-on-hand": "Include Tools On Hand", + "max-missing-ingredients": "Max Missing Ingredients", + "max-missing-tools": "Max Missing Tools", + "selected-tools": "Selected Tools", + "other-filters": "Other Filters", + "ready-to-make": "Ready to Make", + "almost-ready-to-make": "Almost Ready to Make" + }, + "search": { + "advanced-search": "Advanced Search", + "and": "and", + "exclude": "Exclude", + "include": "Include", + "max-results": "Max Results", + "or": "Or", + "has-any": "Has Any", + "has-all": "Has All", + "clear-selection": "Clear Selection", + "results": "Results", + "search": "Search", + "search-mealie": "Search Mealie (press /)", + "search-placeholder": "Search...", + "tag-filter": "Tag Filter", + "search-hint": "Press '/'", + "advanced": "Advanced", + "auto-search": "Auto Search", + "no-results": "No results found" + }, + "settings": { + "add-a-new-theme": "Add a New Theme", + "admin-settings": "Admin Settings", + "backup": { + "backup-created": "Backup created successfully", + "backup-created-at-response-export_path": "Backup Created at {path}", + "backup-deleted": "Backup deleted", + "restore-success": "Restore successful", + "restore-fail": "Restore failed. Check your server logs for more details", + "backup-tag": "Backup Tag", + "create-heading": "Create A Backup", + "delete-backup": "Delete Backup", + "error-creating-backup-see-log-file": "Error Creating Backup. See Log File", + "full-backup": "Full Backup", + "import-summary": "Import Summary", + "partial-backup": "Partial Backup", + "unable-to-delete-backup": "Unable to Delete Backup.", + "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.", + "backup-restore": "Backup Restore", + "back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.", + "cannot-be-undone": "This action cannot be undone - use with caution.", + "postgresql-note": "If you are using PostGreSQL, please review the {backup-restore-process} prior to restoring.", + "backup-restore-process-in-the-documentation": "backup/restore process in the documentation", + "irreversible-acknowledgment": "I understand that this action is irreversible, destructive and may cause data loss", + "restore-backup": "Restore Backup" + }, + "backup-and-exports": "Backups", + "change-password": "Change Password", + "current": "Version:", + "custom-pages": "Custom Pages", + "edit-page": "Edit Page", + "events": "Events", + "first-day-of-week": "First day of the week", + "group-settings-updated": "Group Settings Updated", + "homepage": { + "all-categories": "All Categories", + "card-per-section": "Card Per Section", + "home-page": "Home Page", + "home-page-sections": "Home Page Sections", + "show-recent": "Show Recent" + }, + "language": "Language", + "latest": "Latest", + "local-api": "Local API", + "locale-settings": "Locale settings", + "migrations": "Migrations", + "new-page": "New Page", + "notify": "Notify", + "organize": "Organize", + "page-name": "Page Name", + "pages": "Pages", + "profile": "Profile", + "remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries", + "set-new-time": "Set New Time", + "settings-update-failed": "Settings update failed", + "settings-updated": "Settings updated", + "site-settings": "Site Settings", + "theme": { + "accent": "Accent", + "dark": "Dark", + "default-to-system": "Default to system", + "error": "Error", + "error-creating-theme-see-log-file": "Error creating theme. See log file.", + "error-deleting-theme": "Error deleting theme", + "error-updating-theme": "Error updating theme", + "info": "Info", + "light": "Light", + "primary": "Primary", + "secondary": "Secondary", + "success": "Success", + "switch-to-dark-mode": "Switch to dark mode", + "switch-to-light-mode": "Switch to light mode", + "theme-deleted": "Theme deleted", + "theme-name": "Theme Name", + "theme-name-is-required": "Theme Name is required.", + "theme-saved": "Theme Saved", + "theme-updated": "Theme updated", + "warning": "Warning", + "light-mode": "Light Mode", + "dark-mode": "Dark Mode" + }, + "token": { + "active-tokens": "ACTIVE TOKENS", + "api-token": "API Token", + "api-tokens": "API Tokens", + "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.", + "create-an-api-token": "Create an API Token", + "token-name": "Token Name", + "generate": "Generate", + "you-have-token-count": "You have no active tokens.|You have one active token.|You have {count} active tokens." + }, + "toolbox": { + "assign-all": "Assign All", + "bulk-assign": "Bulk Assign", + "new-name": "New Name", + "no-unused-items": "No Unused Items", + "recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected", + "remove-unused": "Remove Unused", + "title-case-all": "Title Case All", + "toolbox": "Toolbox", + "unorganized": "Unorganized" + }, + "webhooks": { + "test-webhooks": "Test Webhooks", + "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at", + "webhook-url": "Webhook URL", + "webhooks-caps": "WEBHOOKS", + "webhooks": "Webhooks", + "webhook-name": "Webhook Name", + "description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled." + }, + "bug-report": "Bug Report", + "bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.", + "tracker": "Tracker", + "configuration": "Configuration", + "docker-volume": "Docker Volume", + "docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.", + "volumes-are-misconfigured": "Volumes are misconfigured.", + "volumes-are-configured-correctly": "Volumes are configured correctly.", + "status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.", + "validate": "Validate", + "email-configuration-status": "Email Configuration Status", + "email-configured": "Email Configured", + "email-test-results": "Email Test Results", + "ready": "Ready", + "not-ready": "Not Ready - Check Environmental Variables", + "succeeded": "Succeeded", + "failed": "Failed", + "general-about": "General About", + "application-version": "Application Version", + "application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).", + "mealie-is-up-to-date": "Mealie is up to date", + "secure-site": "Secure Site", + "secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.", + "secure-site-success-text": "Site is accessed by localhost or https", + "server-side-base-url": "Server Side Base URL", + "server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.", + "server-side-base-url-success-text": "Server Side URL does not match the default", + "ldap-ready": "LDAP Ready", + "ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.", + "ldap-ready-success-text": "Required LDAP variables are all set.", + "build": "Build", + "recipe-scraper-version": "Recipe Scraper Version", + "oidc-ready": "OIDC Ready", + "oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.", + "oidc-ready-success-text": "Required OIDC variables are all set.", + "openai-ready": "OpenAI Ready", + "openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.", + "openai-ready-success-text": "Required OpenAI variables are all set." + }, + "shopping-list": { + "all-lists": "All Lists", + "create-shopping-list": "Create Shopping List", + "from-recipe": "From Recipe", + "list-name": "List Name", + "new-list": "New List", + "quantity": "Quantity: {0}", + "shopping-list": "Shopping List", + "shopping-lists": "Shopping Lists", + "food": "Food", + "note": "Note", + "label": "Label", + "save-label": "Save Label", + "linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.", + "toggle-food": "Toggle Food", + "manage-labels": "Manage Labels", + "are-you-sure-you-want-to-delete-this-item": "Are you sure you want to delete this item?", + "copy-as-text": "Copy as Text", + "copy-as-markdown": "Copy as Markdown", + "delete-checked": "Delete Checked", + "toggle-label-sort": "Toggle Label Sort", + "reorder-labels": "Reorder Labels", + "uncheck-all-items": "Uncheck All Items", + "check-all-items": "Check All Items", + "linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes", + "items-checked-count": "No items checked|One item checked|{count} items checked", + "no-label": "No Label", + "completed-on": "Completed on {date}", + "you-are-offline": "You are offline", + "you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.", + "are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?", + "are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?", + "are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?", + "no-shopping-lists-found": "No Shopping Lists Found" + }, + "sidebar": { + "all-recipes": "All Recipes", + "backups": "Backups", + "categories": "Categories", + "cookbooks": "Cookbooks", + "dashboard": "Dashboard", + "home-page": "Home Page", + "manage-users": "Manage Users", + "migrations": "Migrations", + "profile": "Profile", + "search": "Search", + "site-settings": "Site Settings", + "tags": "Tags", + "toolbox": "Toolbox", + "language": "Language", + "maintenance": "Maintenance", + "background-tasks": "Background Tasks", + "parser": "Parser", + "developer": "Developer", + "cookbook": "Cookbook", + "create-cookbook": "Create a new cookbook" + }, + "signup": { + "error-signing-up": "Error Signing Up", + "sign-up": "Sign Up", + "sign-up-link-created": "Sign up link created", + "sign-up-link-creation-failed": "Sign up link creation failed", + "sign-up-links": "Sign Up Links", + "sign-up-token-deleted": "Sign Up Token Deleted", + "sign-up-token-deletion-failed": "Sign up token deletion failed", + "welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator." + }, + "tag": { + "tag-created": "Tag created", + "tag-creation-failed": "Tag creation failed", + "tag-deleted": "Tag deleted", + "tag-deletion-failed": "Tag deletion failed", + "tag-update-failed": "Tag update failed", + "tag-updated": "Tag updated", + "tags": "Tags", + "untagged-count": "Untagged {count}", + "create-a-tag": "Create a Tag", + "tag-name": "Tag Name", + "tag": "Tag" + }, + "tool": { + "tools": "Tools", + "on-hand": "On Hand", + "create-a-tool": "Create a Tool", + "tool-name": "Tool Name", + "create-new-tool": "Create New Tool", + "on-hand-checkbox-label": "Show as On Hand (Checked)", + "required-tools": "Required Tools", + "tool": "Tool" + }, + "user": { + "admin": "Admin", + "are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link {link}?", + "are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user {activeName} ID: {activeId}?", + "auth-method": "Auth Method", + "confirm-link-deletion": "Confirm Link Deletion", + "confirm-password": "Confirm Password", + "confirm-user-deletion": "Confirm User Deletion", + "could-not-validate-credentials": "Could Not Validate Credentials", + "create-link": "Create Link", + "create-user": "Create User", + "current-password": "Current Password", + "e-mail-must-be-valid": "E-mail must be valid", + "edit-user": "Edit User", + "email": "Email", + "error-cannot-delete-super-user": "Error! Cannot Delete Super User", + "existing-password-does-not-match": "Existing password does not match", + "full-name": "Full Name", + "generate-password-reset-link": "Generate Password Reset Link", + "invite-only": "Invite Only", + "link-id": "Link ID", + "link-name": "Link Name", + "login": "Login", + "login-oidc": "Login with", + "or": "or", + "logout": "Logout", + "manage-users": "Manage Users", + "manage-users-description": "Create and manage users.", + "new-password": "New Password", + "new-user": "New User", + "password-has-been-reset-to-the-default-password": "Password has been reset to the default password", + "password-must-match": "Password must match", + "password-reset-failed": "Password reset failed", + "password-updated": "Password updated", + "password": "Password", + "password-strength": "Password is {strength}", + "please-enter-password": "Please enter your new password.", + "register": "Register", + "reset-password": "Reset Password", + "sign-in": "Sign in", + "total-mealplans": "Total MealPlans", + "total-users": "Total Users", + "upload-photo": "Upload Photo", + "use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password", + "user-created": "User created", + "user-creation-failed": "User creation failed", + "user-deleted": "User deleted", + "user-id-with-value": "User ID: {id}", + "user-id": "User ID", + "user-password": "User Password", + "user-successfully-logged-in": "User Successfully Logged In", + "user-update-failed": "User update failed", + "user-updated": "User updated", + "user": "User", + "username": "Username", + "users-header": "USERS", + "users": "Users", + "user-not-found": "User not found", + "webhook-time": "Webhook Time", + "webhooks-enabled": "Webhooks Enabled", + "you-are-not-allowed-to-create-a-user": "You are not allowed to create a user", + "you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user", + "enable-advanced-content": "Enable Advanced Content", + "enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later", + "favorite-recipes": "Favorite Recipes", + "email-or-username": "Email or Username", + "remember-me": "Remember Me", + "please-enter-your-email-and-password": "Please enter your email and password", + "invalid-credentials": "Invalid Credentials", + "account-locked-please-try-again-later": "Account Locked. Please try again later", + "user-favorites": "User Favorites", + "password-strength-values": { + "weak": "Weak", + "good": "Good", + "strong": "Strong", + "very-strong": "Very Strong" + }, + "user-management": "User Management", + "reset-locked-users": "Reset Locked Users", + "admin-user-creation": "Admin User Creation", + "admin-user-management": "Admin User Management", + "user-details": "User Details", + "user-name": "User Name", + "authentication-method": "Authentication Method", + "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'", + "permissions": "Permissions", + "administrator": "Administrator", + "user-can-invite-other-to-group": "User can invite others to group", + "user-can-manage-group": "User can manage group", + "user-can-manage-household": "User can manage household", + "user-can-organize-group-data": "User can organize group data", + "enable-advanced-features": "Enable advanced features", + "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", + "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", + "forgot-password": "Forgot Password", + "forgot-password-text": "Please enter your email address and we will send you a link to reset your password.", + "changes-reflected-immediately": "Changes to this user will be reflected immediately." + }, + "language-dialog": { + "translated": "translated", + "choose-language": "Choose Language", + "select-description": "Choose the language for the Mealie UI. The setting only applies to you, not other users.", + "how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!", + "read-the-docs": "Read the docs" + }, + "data-pages": { + "foods": { + "merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.", + "merge-food-example": "Merging {food1} into {food2}", + "seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.", + "seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.", + "combine-food": "Combine Food", + "source-food": "Source Food", + "target-food": "Target Food", + "create-food": "Create Food", + "food-label": "Food Label", + "edit-food": "Edit Food", + "food-data": "Food Data", + "example-food-singular": "ex: Onion", + "example-food-plural": "ex: Onions", + "label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.", + "on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list." + }, + "units": { + "seed-dialog-text": "Seed the database with common units based on your local language.", + "combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.", + "combine-unit": "Combine Unit", + "source-unit": "Source Unit", + "target-unit": "Target Unit", + "merging-unit-into-unit": "Merging {0} into {1}", + "create-unit": "Create Unit", + "abbreviation": "Abbreviation", + "plural-abbreviation": "Plural Abbreviation", + "description": "Description", + "display-as-fraction": "Display as Fraction", + "use-abbreviation": "Use Abbreviation", + "edit-unit": "Edit Unit", + "unit-data": "Unit Data", + "use-abbv": "Use Abbv.", + "fraction": "Fraction", + "example-unit-singular": "ex: Tablespoon", + "example-unit-plural": "ex: Tablespoons", + "example-unit-abbreviation-singular": "ex: Tbsp", + "example-unit-abbreviation-plural": "ex: Tbsps" + }, + "labels": { + "seed-dialog-text": "Seed the database with common labels based on your local language.", + "edit-label": "Edit Label", + "new-label": "New Label", + "labels": "Labels", + "assign-label": "Assign Label" + }, + "recipes": { + "purge-exports": "Purge Exports", + "are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?", + "confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.", + "the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.", + "settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.", + "selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.", + "recipe-data": "Recipe Data", + "recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.", + "recipe-columns": "Recipe Columns", + "data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.", + "data-exports": "Data Exports", + "tag": "Tag", + "categorize": "Categorize", + "update-settings": "Update Settings", + "tag-recipes": "Tag Recipes", + "categorize-recipes": "Categorize Recipes", + "export-recipes": "Export Recipes", + "delete-recipes": "Delete Recipes", + "source-unit-will-be-deleted": "Source Unit will be deleted" + }, + "recipe-actions": { + "recipe-actions-data": "Recipe Actions Data", + "new-recipe-action": "New Recipe Action", + "edit-recipe-action": "Edit Recipe Action", + "action-type": "Action Type" + }, + "create-alias": "Create Alias", + "manage-aliases": "Manage Aliases", + "seed-data": "Seed Data", + "seed": "Seed", + "data-management": "Data Management", + "data-management-description": "Select which data set you want to make changes to.", + "select-data": "Select Data", + "select-language": "Select Language", + "columns": "Columns", + "combine": "Combine", + "categories": { + "edit-category": "Edit Category", + "new-category": "New Category", + "category-data": "Category Data" + }, + "tags": { + "new-tag": "New Tag", + "edit-tag": "Edit Tag", + "tag-data": "Tag Data" + }, + "tools": { + "new-tool": "New Tool", + "edit-tool": "Edit Tool", + "tool-data": "Tool Data" + } + }, + "user-registration": { + "user-registration": "User Registration", + "registration-success": "Registration Success", + "join-a-group": "Join a Group", + "create-a-new-group": "Create a New Group", + "provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.", + "group-details": "Group Details", + "group-details-description": "Before you create an account you'll need to create a group. Your group will only contain you, but you'll be able to invite others later. Members in your group can share meal plans, shopping lists, recipes, and more!", + "use-seed-data": "Use Seed Data", + "use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes.", + "account-details": "Account Details" + }, + "validation": { + "group-name-is-taken": "Group name is taken", + "username-is-taken": "Username is taken", + "email-is-taken": "Email is taken", + "this-field-is-required": "This Field is Required" + }, + "export": { + "export": "Export", + "file-name": "File Name", + "size": "Size", + "link-expires": "Link Expires" + }, + "recipe-share": { + "expiration-date": "Expiration Date", + "share-recipe": "Share Recipe", + "default-30-days": "Default 30 Days", + "expires-at": "Expires At", + "recipe-link-copied-message": "Recipe link copied to clipboard" + }, + "banner-experimental": { + "title": "Experimental Feature", + "description": "This page contains experimental or still-baking features. Please excuse the mess.", + "issue-link-text": "Track our progress here" + }, + "form": { + "quantity-label-abbreviated": "Qty" + }, + "markdown-editor": { + "preview-markdown-button-label": "Preview Markdown" + }, + "demo": { + "info_message_with_version": "This is a Demo for version: {version}", + "demo_username": "Username: {username}", + "demo_password": "Password: {password}" + }, + "ocr-editor": { + "ocr-editor": "Ocr editor", + "toolbar": "Toolbar", + "selection-mode": "Selection mode", + "pan-and-zoom-picture": "Pan and zoom picture", + "split-text": "Split text", + "preserve-line-breaks": "Preserve original line breaks", + "split-by-block": "Split by text block", + "flatten": "Flatten regardless of original formating", + "help": { + "help": "Help", + "mouse-modes": "Mouse modes", + "selection-mode": "Selection Mode (default)", + "selection-mode-desc": "The selection mode is the main mode that can be used to enter data:", + "selection-mode-steps": { + "draw": "Draw a rectangle on the text you want to select.", + "click": "Click on any field on the right and then click back on the rectangle above the image.", + "result": "The selected text will appear inside the previously selected field." + }, + "pan-and-zoom-mode": "Pan and Zoom Mode", + "pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.", + "split-text-mode": "Split Text modes", + "split-modes": { + "line-mode": "Line mode (default)", + "line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.", + "block-mode": "Block mode", + "block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.", + "flat-mode": "Flat mode", + "flat-mode-desc": "In flat mode, the text will be added to the selected recipe field with no line breaks." + } + } + }, + "admin": { + "maintenance": { + "storage-details": "Storage Details", + "page-title": "Site Maintenance", + "summary-title": "Summary", + "button-label-get-summary": "Get Summary", + "button-label-open-details": "Details", + "info-description-data-dir-size": "Data Directory Size", + "info-description-log-file-size": "Log File Size", + "info-description-cleanable-directories": "Cleanable Directories", + "info-description-cleanable-images": "Cleanable Images", + "storage": { + "title-temporary-directory": "Temporary Directory (.temp)", + "title-backups-directory": "Backups Directory (backups)", + "title-groups-directory": "Groups Directory (groups)", + "title-recipes-directory": "Recipes Directory (recipes)", + "title-user-directory": "User Directory (user)" + }, + "action-delete-log-files-name": "Delete Log Files", + "action-delete-log-files-description": "Deletes all the log files", + "action-clean-directories-name": "Clean Directories", + "action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs", + "action-clean-temporary-files-name": "Clean Temporary Files", + "action-clean-temporary-files-description": "Removes all files and folders in the .temp directory", + "action-clean-images-name": "Clean Images", + "action-clean-images-description": "Removes all the images that don't end with .webp", + "actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.", + "actions-description-destructive": "destructive", + "actions-description-irreversible": "irreversible", + "logs-action-refresh": "Refresh Logs", + "logs-page-title": "Mealie Logs", + "logs-tail-lines-label": "Tail Lines" + }, + "mainentance": { + "actions-title": "Actions" + }, + "ingredients-natural-language-processor": "Ingredients Natural Language Processor", + "ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.", + "ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.", + "nlp": "NLP", + "brute": "Brute", + "openai": "OpenAI", + "show-individual-confidence": "Show individual confidence", + "ingredient-text": "Ingredient Text", + "average-confident": "{0} Confident", + "try-an-example": "Try an example", + "parser": "Parser", + "background-tasks": "Background Tasks", + "background-tasks-description": "Here you can view all the running background tasks and their status", + "no-logs-found": "No Logs Found", + "tasks": "Tasks", + "setup": { + "first-time-setup": "First Time Setup", + "welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started", + "already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage", + "common-settings-for-new-sites": "Here are some common settings for new sites", + "setup-complete": "Setup Complete!", + "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", + "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", + "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results", + "group-delete-note": "Groups with users or households cannot be deleted", + "household-delete-note": "Households with users cannot be deleted" + }, + "profile": { + "welcome-user": "👋 Welcome, {0}!", + "description": "Manage your profile, recipes, and group settings.", + "invite-link": "Invite Link", + "get-invite-link": "Get Invite Link", + "get-public-link": "Get Public Link", + "account-summary": "Account Summary", + "account-summary-description": "Here's a summary of your group's information.", + "group-statistics": "Group Statistics", + "group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.", + "household-statistics": "Household Statistics", + "household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.", + "storage-capacity": "Storage Capacity", + "storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.", + "personal": "Personal", + "personal-description": "These are settings that are personal to you. Changes here won't affect other users.", + "user-settings": "User Settings", + "user-settings-description": "Manage your preferences, change your password, and update your email.", + "api-tokens-description": "Manage your API Tokens for access from external applications.", + "group-description": "These items are shared within your group. Editing one of them will change it for the whole group!", + "group-settings": "Group Settings", + "group-settings-description": "Manage your common group settings, like privacy settings.", + "household-description": "These items are shared within your household. Editing one of them will change it for the whole household!", + "household-settings": "Household Settings", + "household-settings-description": "Manage your household settings, like mealplan and privacy settings.", + "cookbooks-description": "Manage a collection of recipe categories and generate pages for them.", + "members": "Members", + "members-description": "See who's in your household and manage their permissions.", + "webhooks-description": "Set up webhooks that trigger on days that you have mealplans scheduled.", + "notifiers": "Notifiers", + "notifiers-description": "Set up email and push notifications that trigger on specific events.", + "manage-data": "Manage Data", + "manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.", + "data-migrations": "Data Migrations", + "data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.", + "email-sent": "Email Sent", + "error-sending-email": "Error Sending Email", + "personal-information": "Personal Information", + "preferences": "Preferences", + "show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)", + "back-to-profile": "Back to Profile", + "looking-for-privacy-settings": "Looking for Privacy Settings?", + "manage-your-api-tokens": "Manage Your API Tokens", + "manage-user-profile": "Manage User Profile", + "manage-cookbooks": "Manage Cookbooks", + "manage-members": "Manage Members", + "manage-webhooks": "Manage Webhooks", + "manage-notifiers": "Manage Notifiers", + "manage-data-migrations": "Manage Data Migrations" + }, + "cookbook": { + "cookbooks": "Cookbooks", + "description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.", + "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", + "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "public-cookbook": "Public Cookbook", + "public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.", + "filter-options": "Filter Options", + "filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.", + "require-all-categories": "Require All Categories", + "require-all-tags": "Require All Tags", + "require-all-tools": "Require All Tools", + "cookbook-name": "Cookbook Name", + "cookbook-with-name": "Cookbook {0}", + "household-cookbook-name": "{0} Cookbook {1}", + "create-a-cookbook": "Create a Cookbook", + "cookbook": "Cookbook" + }, + "query-filter": { + "logical-operators": { + "and": "AND", + "or": "OR" + }, + "relational-operators": { + "equals": "equals", + "does-not-equal": "does not equal", + "is-greater-than": "is greater than", + "is-greater-than-or-equal-to": "is greater than or equal to", + "is-less-than": "is less than", + "is-less-than-or-equal-to": "is less than or equal to" + }, + "relational-keywords": { + "is": "is", + "is-not": "is not", + "is-one-of": "is one of", + "is-not-one-of": "is not one of", + "contains-all-of": "contains all of", + "is-like": "is like", + "is-not-like": "is not like" + } + } +} diff --git a/frontend/lang/messages/fi-FI.json b/frontend/lang/messages/fi-FI.json index 61548ca83..1c655a837 100644 --- a/frontend/lang/messages/fi-FI.json +++ b/frontend/lang/messages/fi-FI.json @@ -570,13 +570,6 @@ "increase-scale-label": "Suurenna mittakaavaa yhdellä", "locked": "Lukittu", "public-link": "Julkinen Linkki", - "timer": { - "kitchen-timer": "Munakello", - "start-timer": "Käynnistä ajastin", - "pause-timer": "Keskeytä ajastin", - "resume-timer": "Jatka ajastusta", - "stop-timer": "Pysäytä ajastin" - }, "edit-timeline-event": "Muokkaa Aikajanan Tapahtumaa", "timeline": "Aikajana", "timeline-is-empty": "Aikajana on tyhjä. Tee resepti.", diff --git a/frontend/lang/messages/fr-BE.json b/frontend/lang/messages/fr-BE.json index 3d07b64f1..4ea56dc68 100644 --- a/frontend/lang/messages/fr-BE.json +++ b/frontend/lang/messages/fr-BE.json @@ -570,13 +570,6 @@ "increase-scale-label": "Augmenter l’échelle de 1", "locked": "Verrouillé", "public-link": "Lien public", - "timer": { - "kitchen-timer": "Minuteur", - "start-timer": "Démarrer le minuteur", - "pause-timer": "Mettre en pause le minuteur", - "resume-timer": "Reprendre le minuteur", - "stop-timer": "Arrêter le minuteur" - }, "edit-timeline-event": "Modifier l’événement dans l’historique", "timeline": "Historique", "timeline-is-empty": "Pas encore d’historique. Essayez de cuisiner cette recette !", @@ -1352,7 +1345,7 @@ }, "cookbook": { "cookbooks": "Livres de recettes", - "description": "Les livres de recettes sont un autre moyen d’organiser des recettes en sélectionnant un ensemble précis de recettes, de classification et de filtres. La création d'un livre de recettes ajoute une entrée à la barre latérale et toutes les recettes avec les filtres choisies seront affichées dans le livre de recettes.", + "description": "Les livres de recettes sont un autre moyen d'organiser des recettes en sélectionnant un ensemble précis de recettes, de classification et de filtres. La création d'un livre de recettes ajoute une entrée à la barre latérale et toutes les recettes avec les filtres choisies seront affichées dans le livre de recettes.", "hide-cookbooks-from-other-households": "Masquer les livres de cuisine des autres foyers", "hide-cookbooks-from-other-households-description": "Lorsque cette option est activée, seuls les livres de cuisine de votre foyer apparaîtront dans la barre latérale", "public-cookbook": "Livre de recettes public", @@ -1384,8 +1377,8 @@ "relational-keywords": { "is": "est", "is-not": "n’est pas", - "is-one-of": "est un de", - "is-not-one-of": "n'est pas un de", + "is-one-of": "fait partie de", + "is-not-one-of": "ne fait pas partie de", "contains-all-of": "contient tout", "is-like": "est comme", "is-not-like": "n'est pas similaire à" diff --git a/frontend/lang/messages/fr-CA.json b/frontend/lang/messages/fr-CA.json index b3efa3ecd..f992a6a64 100644 --- a/frontend/lang/messages/fr-CA.json +++ b/frontend/lang/messages/fr-CA.json @@ -570,13 +570,6 @@ "increase-scale-label": "Augmenter l'échelle de 1", "locked": "Verrouillé", "public-link": "Lien public", - "timer": { - "kitchen-timer": "Minuteur", - "start-timer": "Démarrer le minuteur", - "pause-timer": "Mettre en pause le minuteur", - "resume-timer": "Reprendre le minuteur", - "stop-timer": "Arrêter le minuteur" - }, "edit-timeline-event": "Modifier l’événement dans l’historique", "timeline": "Historique", "timeline-is-empty": "Pas encore d’historique. Essayez de cuisiner cette recette !", diff --git a/frontend/lang/messages/fr-FR.json b/frontend/lang/messages/fr-FR.json index 51df58d26..d31ffa92a 100644 --- a/frontend/lang/messages/fr-FR.json +++ b/frontend/lang/messages/fr-FR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Augmenter l’échelle de 1", "locked": "Verrouillé", "public-link": "Lien public", - "timer": { - "kitchen-timer": "Minuteur", - "start-timer": "Démarrer le minuteur", - "pause-timer": "Mettre en pause le minuteur", - "resume-timer": "Reprendre le minuteur", - "stop-timer": "Arrêter le minuteur" - }, "edit-timeline-event": "Modifier l’événement dans l’historique", "timeline": "Historique", "timeline-is-empty": "Pas encore d’historique. Essayez de cuisiner cette recette !", diff --git a/frontend/lang/messages/gl-ES.json b/frontend/lang/messages/gl-ES.json index 314826a70..bdc2f9093 100644 --- a/frontend/lang/messages/gl-ES.json +++ b/frontend/lang/messages/gl-ES.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/he-IL.json b/frontend/lang/messages/he-IL.json index 604649e31..eb4e96718 100644 --- a/frontend/lang/messages/he-IL.json +++ b/frontend/lang/messages/he-IL.json @@ -570,13 +570,6 @@ "increase-scale-label": "העלה קנה מידה ב-1", "locked": "נעול", "public-link": "כתובת פומבית", - "timer": { - "kitchen-timer": "טיימר למטבח", - "start-timer": "התחל את הטיימר", - "pause-timer": "השהה את הטיימר", - "resume-timer": "המשך את הטיימר", - "stop-timer": "עצור את הטיימר" - }, "edit-timeline-event": "עריכת אירוע ציר זמן", "timeline": "ציר זמן", "timeline-is-empty": "אין כלום בציר הזמן. נסה לעשות את המתכון הזה!", diff --git a/frontend/lang/messages/hr-HR.json b/frontend/lang/messages/hr-HR.json index a0c27be7c..5e55c01c1 100644 --- a/frontend/lang/messages/hr-HR.json +++ b/frontend/lang/messages/hr-HR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Povećaj skaliranje za 1", "locked": "Zaključano", "public-link": "Javni Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Uredi Događaj Vremenske Crte", "timeline": "Vremenska Crta", "timeline-is-empty": "Još nema ništa na vremenskoj crti. Pokušajte napraviti ovaj recept!", diff --git a/frontend/lang/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json index efbf70a54..9cff7389f 100644 --- a/frontend/lang/messages/hu-HU.json +++ b/frontend/lang/messages/hu-HU.json @@ -570,13 +570,6 @@ "increase-scale-label": "Skála növelése 1-gyel", "locked": "Zárolt", "public-link": "Nyilvános link", - "timer": { - "kitchen-timer": "Konyhai időzítő", - "start-timer": "Időzítő elindítása", - "pause-timer": "Időzítő megállítása", - "resume-timer": "Időzítő folytatása", - "stop-timer": "Időzítő leállítása" - }, "edit-timeline-event": "Idővonal-esemény szerkesztése", "timeline": "Idővonal", "timeline-is-empty": "Az idővonalon még semmi sincs. Próbálja meg elkészíteni ezt a receptet!", diff --git a/frontend/lang/messages/is-IS.json b/frontend/lang/messages/is-IS.json index 9514f0165..9e029f4e6 100644 --- a/frontend/lang/messages/is-IS.json +++ b/frontend/lang/messages/is-IS.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 3966e6658..703f552dd 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -570,13 +570,6 @@ "increase-scale-label": "Aumenta la scala di 1", "locked": "Bloccato", "public-link": "Link Pubblico", - "timer": { - "kitchen-timer": "Contaminuti da cucina", - "start-timer": "Avvia timer", - "pause-timer": "Metti in pausa il contaminuti", - "resume-timer": "Riprendi il contaminuti", - "stop-timer": "Arresta il Timer" - }, "edit-timeline-event": "Modifica evento sulla linea temporale", "timeline": "Linea temporale", "timeline-is-empty": "Niente sulla linea temporale. Prova a fare questa ricetta!", @@ -625,8 +618,8 @@ "import-from-zip": "Importa da Zip", "import-from-zip-description": "Importa una singola ricetta esportata da un'altra istanza di Mealie.", "import-from-html-or-json": "Import from HTML or JSON", - "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", - "json-import-format-description-colon": "To import via JSON, it must be in valid format:", + "import-from-html-or-json-description": "Importa una singola ricetta da HTML o JSON grezzi. Utile se si ha una ricetta proveniente da siti da cui solitamente Mealie non riesce a importare, o da qualche altra fonte esterna.", + "json-import-format-description-colon": "Per importare tramite JSON, deve essere in un formato valido:", "json-editor": "Editor JSON", "zip-files-must-have-been-exported-from-mealie": "I file .zip devono essere stati esportati da Mealie", "create-a-recipe-by-uploading-a-scan": "Crea una ricetta caricando una scansione.", @@ -644,7 +637,7 @@ "recipe-debugger-use-openai-description": "Usa OpenAI per analizzare i risultati invece di affidarsi alla libreria scraper. Quando si crea una ricetta tramite URL, questo viene fatto automaticamente se la libreria scraper fallisce, ma è possibile testarlo manualmente qui.", "debug": "Debug", "tree-view": "Visualizzazione ad Albero", - "recipe-servings": "Recipe Servings", + "recipe-servings": "Porzioni ricetta", "recipe-yield": "Resa Ricetta", "recipe-yield-text": "Recipe Yield Text", "unit": "Unità", @@ -679,7 +672,7 @@ "missing": "Mancante", "no-recipes-found": "Nessuna ricetta trovata", "no-recipes-found-description": "Prova ad aggiungere altri ingredienti alla tua ricerca o a regolare i tuoi filtri", - "include-ingredients-on-hand": "Include Ingredients On Hand", + "include-ingredients-on-hand": "Includi ingredienti a mano", "include-tools-on-hand": "Include Tools On Hand", "max-missing-ingredients": "Max Ingredienti Mancanti", "max-missing-tools": "Massimo Strumenti Mancanti", diff --git a/frontend/lang/messages/ja-JP.json b/frontend/lang/messages/ja-JP.json index 5368e37cb..0472da4f7 100644 --- a/frontend/lang/messages/ja-JP.json +++ b/frontend/lang/messages/ja-JP.json @@ -570,13 +570,6 @@ "increase-scale-label": "スケールを 1 ずつ増やす", "locked": "ロック済み", "public-link": "公開リンク", - "timer": { - "kitchen-timer": "キッチンタイマー", - "start-timer": "タイマー開始", - "pause-timer": "タイマーを一時停止", - "resume-timer": "タイマーを再開", - "stop-timer": "タイマーを停止" - }, "edit-timeline-event": "タイムラインイベントの編集", "timeline": "タイムライン", "timeline-is-empty": "タイムラインにはまだ何もありません。レシピを作ってみてください!", diff --git a/frontend/lang/messages/ko-KR.json b/frontend/lang/messages/ko-KR.json index cedd55fef..9fe9208ff 100644 --- a/frontend/lang/messages/ko-KR.json +++ b/frontend/lang/messages/ko-KR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "잠김", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "타이머 시작", - "pause-timer": "타이머 일시 정지", - "resume-timer": "타이머 재개", - "stop-timer": "타이머 정지" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "타임라인", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/lt-LT.json b/frontend/lang/messages/lt-LT.json index 6238a854b..609b3c903 100644 --- a/frontend/lang/messages/lt-LT.json +++ b/frontend/lang/messages/lt-LT.json @@ -570,13 +570,6 @@ "increase-scale-label": "Padidinti mastelį 1 k.", "locked": "Užrakinta", "public-link": "Vieša nuoroda", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Redaguoti laiko juostos įvykį", "timeline": "Laiko juosta", "timeline-is-empty": "Laiko juosta tuščia. Pabandykit pagaminti šį receptą!", diff --git a/frontend/lang/messages/lv-LV.json b/frontend/lang/messages/lv-LV.json index ff9f267b3..846d56fba 100644 --- a/frontend/lang/messages/lv-LV.json +++ b/frontend/lang/messages/lv-LV.json @@ -570,13 +570,6 @@ "increase-scale-label": "Palieliniet skalu par 1", "locked": "Bloķēts", "public-link": "Publiskā saite", - "timer": { - "kitchen-timer": "Virtuves taimeris", - "start-timer": "Sākuma taimeris", - "pause-timer": "Pauzes taimeris", - "resume-timer": "Atjaunot taimeri", - "stop-timer": "Apturēšanas taimeris" - }, "edit-timeline-event": "Laika skalas notikuma rediģēšana", "timeline": "Laika skala", "timeline-is-empty": "Pagaidām nekas laika skalā. Mēģiniet pagatavot šo recepti!", diff --git a/frontend/lang/messages/nl-NL.json b/frontend/lang/messages/nl-NL.json index 0312ea41b..f4d25c4f1 100644 --- a/frontend/lang/messages/nl-NL.json +++ b/frontend/lang/messages/nl-NL.json @@ -570,13 +570,6 @@ "increase-scale-label": "Verhoog de schaal met 1", "locked": "Vergrendeld", "public-link": "Openbare link", - "timer": { - "kitchen-timer": "Kookwekker", - "start-timer": "Kookwekker starten", - "pause-timer": "Kookwekker pauzeren", - "resume-timer": "Kookwekker hervatten", - "stop-timer": "Kookwekker stoppen" - }, "edit-timeline-event": "Bewerk tijdlijngebeurtenis", "timeline": "Tijdlijn", "timeline-is-empty": "Nog niets op de tijdlijn. Probeer dit recept te maken!", diff --git a/frontend/lang/messages/no-NO.json b/frontend/lang/messages/no-NO.json index 13312e0c7..d5a3064dc 100644 --- a/frontend/lang/messages/no-NO.json +++ b/frontend/lang/messages/no-NO.json @@ -570,13 +570,6 @@ "increase-scale-label": "Øk skala med 1", "locked": "Låst", "public-link": "Offentlig lenke", - "timer": { - "kitchen-timer": "Kjøkkentimer", - "start-timer": "Start nedtelling", - "pause-timer": "Pause nedtelling", - "resume-timer": "Fortsett nedtelling", - "stop-timer": "Stopp nedtelling" - }, "edit-timeline-event": "Endre tidslinjehendelser", "timeline": "Tidslinje", "timeline-is-empty": "Ingenting på tidslinjen ennå. Prøv å lage denne oppskriften!", diff --git a/frontend/lang/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json index 8f4384069..6b75b9d4f 100644 --- a/frontend/lang/messages/pl-PL.json +++ b/frontend/lang/messages/pl-PL.json @@ -570,13 +570,6 @@ "increase-scale-label": "Zwiększ Skalę o 1", "locked": "Zablokowany", "public-link": "Link publiczny", - "timer": { - "kitchen-timer": "Minutnik", - "start-timer": "Włącz minutnik", - "pause-timer": "Zatrzymaj minutnik", - "resume-timer": "Wznów minutnik", - "stop-timer": "Zatrzymaj minutnik" - }, "edit-timeline-event": "Edytuj zdarzenie osi czasu", "timeline": "Oś czasu", "timeline-is-empty": "Nie ma jeszcze nic na osi czasu. Spróbuj przygotować ten przepis!", diff --git a/frontend/lang/messages/pt-BR.json b/frontend/lang/messages/pt-BR.json index c72248c53..47b1abc16 100644 --- a/frontend/lang/messages/pt-BR.json +++ b/frontend/lang/messages/pt-BR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Aumentar Escala por 1", "locked": "Bloqueado", "public-link": "Link público", - "timer": { - "kitchen-timer": "Temporizador da Cozinha", - "start-timer": "Iniciar Temporizador", - "pause-timer": "Pausar Temporizador", - "resume-timer": "Continuar Temporizador", - "stop-timer": "Parar Temporizador" - }, "edit-timeline-event": "Editar Linha do Tempo do Evento", "timeline": "Linha do Tempo", "timeline-is-empty": "Nada na linha do tempo ainda. Tente fazer esta receita!", diff --git a/frontend/lang/messages/pt-PT.json b/frontend/lang/messages/pt-PT.json index f35f9dd3b..53b00f1cd 100644 --- a/frontend/lang/messages/pt-PT.json +++ b/frontend/lang/messages/pt-PT.json @@ -570,13 +570,6 @@ "increase-scale-label": "Aumentar Escala em 1", "locked": "Bloqueado", "public-link": "Link público", - "timer": { - "kitchen-timer": "Temporizador de cozinha", - "start-timer": "Iniciar Temporizador", - "pause-timer": "Pausar Temporizador", - "resume-timer": "Retomar Temporizador", - "stop-timer": "Parar Temporizador" - }, "edit-timeline-event": "Editar evento da Cronologia", "timeline": "Cronologia", "timeline-is-empty": "Nada na Cronologia, ainda. Tente fazer esta receita!", diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index a296a4a08..1b27c4d48 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -570,13 +570,6 @@ "increase-scale-label": "Crește scara cu 1", "locked": "Blocat", "public-link": "Link public", - "timer": { - "kitchen-timer": "Cronometru bucătărie", - "start-timer": "Pornește cronometrul", - "pause-timer": "Pauză cronometru", - "resume-timer": "Reluați cronometrul", - "stop-timer": "Oprește Cronometrul" - }, "edit-timeline-event": "Modifică Evenimentul din Cronologie", "timeline": "Cronologie", "timeline-is-empty": "Nimic în timeline deocamdată. Încearcă să gătești o rețeta!", diff --git a/frontend/lang/messages/ru-RU.json b/frontend/lang/messages/ru-RU.json index b4e9fcf4d..c956176fa 100644 --- a/frontend/lang/messages/ru-RU.json +++ b/frontend/lang/messages/ru-RU.json @@ -570,13 +570,6 @@ "increase-scale-label": "Добавить порцию", "locked": "Заблокировано", "public-link": "Публичная ссылка", - "timer": { - "kitchen-timer": "Кухонный таймер", - "start-timer": "Запустить таймер", - "pause-timer": "Приостановить таймер", - "resume-timer": "Возобновить таймер", - "stop-timer": "Остановить таймер" - }, "edit-timeline-event": "Редактировать событие в истории", "timeline": "История", "timeline-is-empty": "В истории пока ничего нет. Попробуйте сделать этот рецепт!", diff --git a/frontend/lang/messages/sk-SK.json b/frontend/lang/messages/sk-SK.json index efe56d543..c29d7bd0a 100644 --- a/frontend/lang/messages/sk-SK.json +++ b/frontend/lang/messages/sk-SK.json @@ -570,13 +570,6 @@ "increase-scale-label": "Zvýšiť škálovanie o 1", "locked": "Zamknuté", "public-link": "Verejný odkaz", - "timer": { - "kitchen-timer": "Kuchynský časovač", - "start-timer": "Spustiť časovač", - "pause-timer": "Pozastaviť časovač", - "resume-timer": "Znova spustiť časovač", - "stop-timer": "Zastaviť časovač" - }, "edit-timeline-event": "Upraviť udalosť na časovej osi", "timeline": "Časová os", "timeline-is-empty": "Na časovej osi zatiaľ nič nie je. Skúste pripraviť tento recept!", diff --git a/frontend/lang/messages/sl-SI.json b/frontend/lang/messages/sl-SI.json index 92abb887f..cdfb3e4c5 100644 --- a/frontend/lang/messages/sl-SI.json +++ b/frontend/lang/messages/sl-SI.json @@ -570,13 +570,6 @@ "increase-scale-label": "Zvišaj merilo za 1", "locked": "Zaklenjeno", "public-link": "Javna povezava", - "timer": { - "kitchen-timer": "Kuhinjski časovnik", - "start-timer": "Zaženi časovnik", - "pause-timer": "Ustavi časovnik", - "resume-timer": "Nadaljuj časovnik", - "stop-timer": "Ustavi časovnik" - }, "edit-timeline-event": "Uredi dogodek na časovnici", "timeline": "Časovnica", "timeline-is-empty": "Zaenkrat je časovnica prazna. Poskusi tale recept!", diff --git a/frontend/lang/messages/sr-SP.json b/frontend/lang/messages/sr-SP.json index b2d468601..f51feb488 100644 --- a/frontend/lang/messages/sr-SP.json +++ b/frontend/lang/messages/sr-SP.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Уреди догађај на временској линији", "timeline": "Временска линија", "timeline-is-empty": "Још увек нема ништа на временској линији. Покушајте направити овај рецепт!", diff --git a/frontend/lang/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json index af92a42fa..506660010 100644 --- a/frontend/lang/messages/sv-SE.json +++ b/frontend/lang/messages/sv-SE.json @@ -570,13 +570,6 @@ "increase-scale-label": "Skala upp med 1", "locked": "Låst", "public-link": "Publik länk", - "timer": { - "kitchen-timer": "Kökstimer", - "start-timer": "Starta Timer", - "pause-timer": "Pausa Timer", - "resume-timer": "Återuppta Timer", - "stop-timer": "Stoppa Timer" - }, "edit-timeline-event": "Redigera tidslinjehändelse", "timeline": "Tidslinje", "timeline-is-empty": "Inget på tidslinjen än. Försök att göra detta recept!", diff --git a/frontend/lang/messages/tr-TR.json b/frontend/lang/messages/tr-TR.json index e7ffe3fae..63af78271 100644 --- a/frontend/lang/messages/tr-TR.json +++ b/frontend/lang/messages/tr-TR.json @@ -570,13 +570,6 @@ "increase-scale-label": "Ölçeği 1 artır", "locked": "Kilitli", "public-link": "Genel bağlantı", - "timer": { - "kitchen-timer": "Mutfak Saati", - "start-timer": "Zamanlayıcıyı Başlat", - "pause-timer": "Zamanlayıcıyı Duraklat", - "resume-timer": "Zamanlayıcıyı Sürdür", - "stop-timer": "Zamanlayıcıyı Durdur" - }, "edit-timeline-event": "Zaman Çizelgesi Etkinliğini Düzenle", "timeline": "Zaman çizelgesi", "timeline-is-empty": "Zaman çizelgesinde henüz bir şey yok. Bu tarifi yapmayı deneyin!", diff --git a/frontend/lang/messages/uk-UA.json b/frontend/lang/messages/uk-UA.json index e57386f88..dc65a750c 100644 --- a/frontend/lang/messages/uk-UA.json +++ b/frontend/lang/messages/uk-UA.json @@ -570,13 +570,6 @@ "increase-scale-label": "Збільшити масштабування на 1", "locked": "Заблоковано", "public-link": "Публічне посилання", - "timer": { - "kitchen-timer": "Кухонний таймер", - "start-timer": "Запустити таймер", - "pause-timer": "Призупинити таймер", - "resume-timer": "Відновити таймер", - "stop-timer": "Зупинити таймер" - }, "edit-timeline-event": "Редагувати подію хронології", "timeline": "Хронологія", "timeline-is-empty": "Хронологія порожня. Спробуйте зробити цей рецепт!", diff --git a/frontend/lang/messages/vi-VN.json b/frontend/lang/messages/vi-VN.json index f5ceabf05..37273d1c7 100644 --- a/frontend/lang/messages/vi-VN.json +++ b/frontend/lang/messages/vi-VN.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index 0c324965e..0cba6029f 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -570,13 +570,6 @@ "increase-scale-label": "加1倍", "locked": "已锁定", "public-link": "公开链接", - "timer": { - "kitchen-timer": "厨房计时器", - "start-timer": "开始计时", - "pause-timer": "暂停计时", - "resume-timer": "继续计时", - "stop-timer": "终止计时" - }, "edit-timeline-event": "编辑时间轴事件", "timeline": "时间轴", "timeline-is-empty": "时间轴还空空如也,试着先去制作一个食谱吧!", diff --git a/frontend/lang/messages/zh-TW.json b/frontend/lang/messages/zh-TW.json index 999b3b81c..64f030d8a 100644 --- a/frontend/lang/messages/zh-TW.json +++ b/frontend/lang/messages/zh-TW.json @@ -570,13 +570,6 @@ "increase-scale-label": "Increase Scale by 1", "locked": "Locked", "public-link": "Public Link", - "timer": { - "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" - }, "edit-timeline-event": "Edit Timeline Event", "timeline": "Timeline", "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", diff --git a/mealie/lang/messages/et-EE.json b/mealie/lang/messages/et-EE.json new file mode 100644 index 000000000..e5d8c10ce --- /dev/null +++ b/mealie/lang/messages/et-EE.json @@ -0,0 +1,80 @@ +{ + "generic": { + "server-error": "An unexpected error occurred" + }, + "recipe": { + "unique-name-error": "Recipe names must be unique", + "recipe-created": "Recipe Created", + "recipe-defaults": { + "ingredient-note": "1 Cup Flour", + "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" + }, + "servings-text": { + "makes": "Makes", + "serves": "Serves", + "serving": "Serving", + "servings": "Servings", + "yield": "Yield", + "yields": "Yields" + } + }, + "mealplan": { + "no-recipes-match-your-rules": "No recipes match your rules" + }, + "user": { + "user-updated": "User updated", + "password-updated": "Password updated", + "invalid-current-password": "Invalid current password", + "ldap-update-password-unavailable": "Unable to update password, user is controlled by LDAP" + }, + "group": { + "report-deleted": "Report deleted." + }, + "exceptions": { + "permission_denied": "You do not have permission to perform this action", + "no-entry-found": "The requested resource was not found", + "integrity-error": "Database integrity error", + "username-conflict-error": "This username is already taken", + "email-conflict-error": "This email is already in use" + }, + "notifications": { + "generic-created": "{name} was created", + "generic-updated": "{name} was updated", + "generic-created-with-url": "{name} has been created, {url}", + "generic-updated-with-url": "{name} has been updated, {url}", + "generic-duplicated": "{name} has been duplicated", + "generic-deleted": "{name} has been deleted" + }, + "datetime": { + "year": "year|years", + "day": "day|days", + "hour": "hour|hours", + "minute": "minute|minutes", + "second": "second|seconds", + "millisecond": "millisecond|milliseconds", + "microsecond": "microsecond|microseconds" + }, + "emails": { + "password": { + "subject": "Mealie Forgot Password", + "header_text": "Forgot Password", + "message_top": "You have requested to reset your password.", + "message_bottom": "Please click the button above to reset your password.", + "button_text": "Reset Password" + }, + "invitation": { + "subject": "Invitation to join Mealie", + "header_text": "You're Invited!", + "message_top": "You have been invited to join Mealie.", + "message_bottom": "Please click the button above to accept the invitation.", + "button_text": "Accept Invitation" + }, + "test": { + "subject": "Mealie Test Email", + "header_text": "Test Email", + "message_top": "This is a test email.", + "message_bottom": "Please click the button above to test the email.", + "button_text": "Open Mealie" + } + } +} diff --git a/mealie/repos/seed/resources/foods/locales/et-EE.json b/mealie/repos/seed/resources/foods/locales/et-EE.json new file mode 100644 index 000000000..4d14dbad3 --- /dev/null +++ b/mealie/repos/seed/resources/foods/locales/et-EE.json @@ -0,0 +1,692 @@ +{ + "acorn-squash": { + "name": "acorn squash" + }, + "alfalfa-sprouts": { + "name": "alfalfa sprouts" + }, + "anchovies": { + "name": "anchovies" + }, + "apples": { + "name": "apple", + "plural_name": "apples" + }, + "artichoke": { + "name": "artichoke" + }, + "arugula": { + "name": "arugula" + }, + "asparagus": { + "name": "asparagus" + }, + "avocado": { + "name": "avocado", + "plural_name": "avocado" + }, + "bacon": { + "name": "bacon" + }, + "baking-powder": { + "name": "baking powder" + }, + "baking-soda": { + "name": "baking soda" + }, + "baking-sugar": { + "name": "baking sugar" + }, + "bar-sugar": { + "name": "bar sugar" + }, + "basil": { + "name": "basil" + }, + "beans": { + "name": "beans" + }, + "bell-peppers": { + "name": "bell peppers", + "plural_name": "bell peppers" + }, + "blackberries": { + "name": "blackberries" + }, + "bok-choy": { + "name": "bok choy" + }, + "brassicas": { + "name": "brassicas" + }, + "bread": { + "name": "bread" + }, + "breadfruit": { + "name": "breadfruit" + }, + "broccoflower": { + "name": "broccoflower" + }, + "broccoli": { + "name": "broccoli" + }, + "broccoli-rabe": { + "name": "broccoli rabe" + }, + "broccolini": { + "name": "broccolini" + }, + "brown-sugar": { + "name": "brown sugar" + }, + "brussels-sprouts": { + "name": "brussels sprouts" + }, + "butter": { + "name": "butter" + }, + "butternut-pumpkin": { + "name": "butternut pumpkin" + }, + "butternut-squash": { + "name": "butternut squash" + }, + "cabbage": { + "name": "cabbage", + "plural_name": "cabbages" + }, + "cactus-edible": { + "name": "cactus, edible" + }, + "calabrese": { + "name": "calabrese" + }, + "cane-sugar": { + "name": "cane sugar" + }, + "cannabis": { + "name": "cannabis" + }, + "capsicum": { + "name": "capsicum" + }, + "caraway": { + "name": "caraway" + }, + "carrot": { + "name": "carrot", + "plural_name": "carrots" + }, + "caster-sugar": { + "name": "caster sugar" + }, + "castor-sugar": { + "name": "castor sugar" + }, + "catfish": { + "name": "catfish" + }, + "cauliflower": { + "name": "cauliflower", + "plural_name": "cauliflowers" + }, + "cayenne-pepper": { + "name": "cayenne pepper" + }, + "celeriac": { + "name": "celery root" + }, + "celery": { + "name": "celery" + }, + "cereal-grains": { + "name": "cereal grains" + }, + "chard": { + "name": "chard" + }, + "cheese": { + "name": "cheese" + }, + "chicory": { + "name": "chicory" + }, + "chilli-peppers": { + "name": "chilli pepper", + "plural_name": "chilli peppers" + }, + "chinese-leaves": { + "name": "chinese leaves" + }, + "chives": { + "name": "chives" + }, + "chocolate": { + "name": "chocolate" + }, + "cilantro": { + "name": "cilantro" + }, + "cinnamon": { + "name": "cinnamon" + }, + "clarified-butter": { + "name": "clarified butter" + }, + "coconut": { + "name": "coconut", + "plural_name": "coconuts" + }, + "coconut-milk": { + "name": "coconut milk" + }, + "cod": { + "name": "cod" + }, + "coffee": { + "name": "coffee" + }, + "collard-greens": { + "name": "collard greens" + }, + "confectioners-sugar": { + "name": "confectioners' sugar" + }, + "coriander": { + "name": "coriander" + }, + "corn": { + "name": "corn", + "plural_name": "corns" + }, + "corn-syrup": { + "name": "corn syrup" + }, + "cottonseed-oil": { + "name": "cottonseed oil" + }, + "courgette": { + "name": "courgette" + }, + "cream-of-tartar": { + "name": "cream of tartar" + }, + "cucumber": { + "name": "cucumber", + "plural_name": "cucumbers" + }, + "cumin": { + "name": "cumin" + }, + "daikon": { + "name": "daikon", + "plural_name": "daikons" + }, + "dairy-products-and-dairy-substitutes": { + "name": "dairy products and dairy substitutes" + }, + "dandelion": { + "name": "dandelion" + }, + "demerara-sugar": { + "name": "demerara sugar" + }, + "dough": { + "name": "dough" + }, + "edible-cactus": { + "name": "edible cactus" + }, + "eggplant": { + "name": "eggplant", + "plural_name": "eggplants" + }, + "eggs": { + "name": "egg", + "plural_name": "eggs" + }, + "endive": { + "name": "endive", + "plural_name": "endives" + }, + "fats": { + "name": "fats" + }, + "fava-beans": { + "name": "fava beans" + }, + "fiddlehead": { + "name": "fiddlehead" + }, + "fiddlehead-fern": { + "name": "fiddlehead fern", + "plural_name": "fiddlehead ferns" + }, + "fish": { + "name": "fish" + }, + "five-spice-powder": { + "name": "five spice powder" + }, + "flour": { + "name": "flour" + }, + "frisee": { + "name": "frisee" + }, + "fructose": { + "name": "fructose" + }, + "fruit": { + "name": "fruit" + }, + "fruit-sugar": { + "name": "fruit sugar" + }, + "ful": { + "name": "ful" + }, + "garam-masala": { + "name": "garam masala" + }, + "garlic": { + "name": "garlic", + "plural_name": "garlics" + }, + "gem-squash": { + "name": "gem squash" + }, + "ghee": { + "name": "ghee" + }, + "giblets": { + "name": "giblets" + }, + "ginger": { + "name": "ginger" + }, + "grains": { + "name": "grains" + }, + "granulated-sugar": { + "name": "granulated sugar" + }, + "grape-seed-oil": { + "name": "grape seed oil" + }, + "green-onion": { + "name": "green onion", + "plural_name": "green onions" + }, + "heart-of-palm": { + "name": "heart of palm", + "plural_name": "heart of palms" + }, + "hemp": { + "name": "hemp" + }, + "herbs": { + "name": "herbs" + }, + "honey": { + "name": "honey" + }, + "isomalt": { + "name": "isomalt" + }, + "jackfruit": { + "name": "jackfruit", + "plural_name": "jackfruits" + }, + "jaggery": { + "name": "jaggery" + }, + "jams": { + "name": "jams" + }, + "jellies": { + "name": "jellies" + }, + "jerusalem-artichoke": { + "name": "jerusalem artichoke" + }, + "jicama": { + "name": "jicama" + }, + "kale": { + "name": "kale" + }, + "kohlrabi": { + "name": "kohlrabi" + }, + "kumara": { + "name": "kumara" + }, + "leavening-agents": { + "name": "leavening agents" + }, + "leek": { + "name": "leek", + "plural_name": "leeks" + }, + "legumes": { + "name": "legumes" + }, + "lemongrass": { + "name": "lemongrass" + }, + "lentils": { + "name": "lentils" + }, + "lettuce": { + "name": "lettuce" + }, + "liver": { + "name": "liver", + "plural_name": "livers" + }, + "maize": { + "name": "maize" + }, + "maple-syrup": { + "name": "maple syrup" + }, + "meat": { + "name": "meat" + }, + "milk": { + "name": "milk" + }, + "mortadella": { + "name": "mortadella" + }, + "mushroom": { + "name": "mushroom", + "plural_name": "mushrooms" + }, + "mussels": { + "name": "mussels" + }, + "nanaimo-bar-mix": { + "name": "nanaimo bar mix" + }, + "nori": { + "name": "nori" + }, + "nutmeg": { + "name": "nutmeg" + }, + "nutritional-yeast-flakes": { + "name": "nutritional yeast flakes" + }, + "nuts": { + "name": "nuts" + }, + "octopuses": { + "name": "octopus", + "plural_name": "octopuses" + }, + "oils": { + "name": "oils" + }, + "okra": { + "name": "okra" + }, + "olive": { + "name": "olive" + }, + "olive-oil": { + "name": "olive oil" + }, + "onion": { + "name": "onion" + }, + "onion-family": { + "name": "onion family" + }, + "orange-blossom-water": { + "name": "orange blossom water" + }, + "oranges": { + "name": "orange", + "plural_name": "oranges" + }, + "oregano": { + "name": "oregano" + }, + "oysters": { + "name": "oysters" + }, + "panch-puran": { + "name": "panch puran" + }, + "paprika": { + "name": "paprika" + }, + "parsley": { + "name": "parsley" + }, + "parsnip": { + "name": "parsnip", + "plural_name": "parsnips" + }, + "pear": { + "name": "pear", + "plural_name": "pears" + }, + "peas": { + "name": "peas" + }, + "pepper": { + "name": "pepper", + "plural_name": "peppers" + }, + "pineapple": { + "name": "pineapple", + "plural_name": "pineapples" + }, + "plantain": { + "name": "plantain", + "plural_name": "plantains" + }, + "poppy-seeds": { + "name": "poppy seeds" + }, + "potato": { + "name": "potato", + "plural_name": "potatoes" + }, + "poultry": { + "name": "poultry" + }, + "powdered-sugar": { + "name": "powdered sugar" + }, + "pumpkin": { + "name": "pumpkin", + "plural_name": "pumpkins" + }, + "pumpkin-seeds": { + "name": "pumpkin seeds" + }, + "radish": { + "name": "radish", + "plural_name": "radishes" + }, + "raw-sugar": { + "name": "raw sugar" + }, + "refined-sugar": { + "name": "refined sugar" + }, + "rice": { + "name": "rice" + }, + "rice-flour": { + "name": "rice flour" + }, + "rock-sugar": { + "name": "rock sugar" + }, + "rum": { + "name": "rum" + }, + "salmon": { + "name": "salmon" + }, + "salt": { + "name": "salt" + }, + "salt-cod": { + "name": "salt cod" + }, + "scallion": { + "name": "scallion", + "plural_name": "scallions" + }, + "seafood": { + "name": "seafood" + }, + "seeds": { + "name": "seeds" + }, + "sesame-seeds": { + "name": "sesame seeds" + }, + "shallot": { + "name": "shallot", + "plural_name": "shallots" + }, + "skate": { + "name": "skate" + }, + "soda": { + "name": "soda" + }, + "soda-baking": { + "name": "soda, baking" + }, + "soybean": { + "name": "soybean" + }, + "spaghetti-squash": { + "name": "spaghetti squash", + "plural_name": "spaghetti squashes" + }, + "speck": { + "name": "speck" + }, + "spices": { + "name": "spices" + }, + "spinach": { + "name": "spinach" + }, + "spring-onion": { + "name": "spring onion", + "plural_name": "spring onions" + }, + "squash": { + "name": "squash", + "plural_name": "squashes" + }, + "squash-family": { + "name": "squash family" + }, + "stockfish": { + "name": "stockfish" + }, + "sugar": { + "name": "sugar" + }, + "sunchoke": { + "name": "sunchoke", + "plural_name": "sunchokes" + }, + "sunflower-seeds": { + "name": "sunflower seeds" + }, + "superfine-sugar": { + "name": "superfine sugar" + }, + "sweet-potato": { + "name": "sweet potato", + "plural_name": "sweet potatoes" + }, + "sweetcorn": { + "name": "sweetcorn", + "plural_name": "sweetcorns" + }, + "sweeteners": { + "name": "sweeteners" + }, + "tahini": { + "name": "tahini" + }, + "taro": { + "name": "taro", + "plural_name": "taroes" + }, + "teff": { + "name": "teff" + }, + "tomato": { + "name": "tomato", + "plural_name": "tomatoes" + }, + "trout": { + "name": "trout" + }, + "tubers": { + "name": "tuber", + "plural_name": "tubers" + }, + "tuna": { + "name": "tuna" + }, + "turbanado-sugar": { + "name": "turbanado sugar" + }, + "turnip": { + "name": "turnip", + "plural_name": "turnips" + }, + "unrefined-sugar": { + "name": "unrefined sugar" + }, + "vanilla": { + "name": "vanilla" + }, + "vegetables": { + "name": "vegetables" + }, + "watercress": { + "name": "watercress" + }, + "watermelon": { + "name": "watermelon", + "plural_name": "watermelons" + }, + "white-mushroom": { + "name": "white mushroom", + "plural_name": "white mushrooms" + }, + "white-sugar": { + "name": "white sugar" + }, + "xanthan-gum": { + "name": "xanthan gum" + }, + "yam": { + "name": "yam", + "plural_name": "yams" + }, + "yeast": { + "name": "yeast" + }, + "zucchini": { + "name": "zucchini", + "plural_name": "zucchinis" + } +} \ No newline at end of file diff --git a/mealie/repos/seed/resources/foods/locales/it-IT.json b/mealie/repos/seed/resources/foods/locales/it-IT.json index 224abbba4..923c586e6 100644 --- a/mealie/repos/seed/resources/foods/locales/it-IT.json +++ b/mealie/repos/seed/resources/foods/locales/it-IT.json @@ -248,7 +248,7 @@ }, "endive": { "name": "cicoria", - "plural_name": "endives" + "plural_name": "indivia" }, "fats": { "name": "grassi" @@ -261,7 +261,7 @@ }, "fiddlehead-fern": { "name": "germogli di felce", - "plural_name": "fiddlehead ferns" + "plural_name": "germogli di felce" }, "fish": { "name": "pesce" @@ -295,7 +295,7 @@ "plural_name": "agli" }, "gem-squash": { - "name": "gem squash" + "name": "zucca gemma" }, "ghee": { "name": "ghi" @@ -469,7 +469,7 @@ }, "parsnip": { "name": "pastinaca", - "plural_name": "parsnips" + "plural_name": "pastinache" }, "pear": { "name": "pera", @@ -488,7 +488,7 @@ }, "plantain": { "name": "platano", - "plural_name": "plantains" + "plural_name": "platani" }, "poppy-seeds": { "name": "semi di papavero" @@ -602,7 +602,7 @@ }, "sunchoke": { "name": "topinambur", - "plural_name": "sunchokes" + "plural_name": "topinambur" }, "sunflower-seeds": { "name": "semi di girasole" @@ -616,13 +616,13 @@ }, "sweetcorn": { "name": "mais dolce", - "plural_name": "sweetcorns" + "plural_name": "mais dolce" }, "sweeteners": { "name": "dolcificanti" }, "tahini": { - "name": "tahini" + "name": "tahina" }, "taro": { "name": "taro", diff --git a/mealie/repos/seed/resources/labels/locales/et-EE.json b/mealie/repos/seed/resources/labels/locales/et-EE.json new file mode 100644 index 000000000..fe4d0175f --- /dev/null +++ b/mealie/repos/seed/resources/labels/locales/et-EE.json @@ -0,0 +1,65 @@ +[ + { + "name": "Produce" + }, + { + "name": "Grains" + }, + { + "name": "Fruits" + }, + { + "name": "Vegetables" + }, + { + "name": "Meat" + }, + { + "name": "Seafood" + }, + { + "name": "Beverages" + }, + { + "name": "Baked Goods" + }, + { + "name": "Canned Goods" + }, + { + "name": "Condiments" + }, + { + "name": "Confectionary" + }, + { + "name": "Dairy Products" + }, + { + "name": "Frozen Foods" + }, + { + "name": "Health Foods" + }, + { + "name": "Household" + }, + { + "name": "Meat Products" + }, + { + "name": "Snacks" + }, + { + "name": "Spices" + }, + { + "name": "Sweets" + }, + { + "name": "Alcohol" + }, + { + "name": "Other" + } +] diff --git a/mealie/repos/seed/resources/units/locales/et-EE.json b/mealie/repos/seed/resources/units/locales/et-EE.json new file mode 100644 index 000000000..cdec105db --- /dev/null +++ b/mealie/repos/seed/resources/units/locales/et-EE.json @@ -0,0 +1,141 @@ +{ + "teaspoon": { + "name": "teaspoon", + "plural_name": "teaspoons", + "description": "", + "abbreviation": "tsp" + }, + "tablespoon": { + "name": "tablespoon", + "plural_name": "tablespoons", + "description": "", + "abbreviation": "tbsp" + }, + "cup": { + "name": "cup", + "plural_name": "cups", + "description": "", + "abbreviation": "c" + }, + "fluid-ounce": { + "name": "fluid ounce", + "plural_name": "fluid ounces", + "description": "", + "abbreviation": "fl oz" + }, + "pint": { + "name": "pint", + "plural_name": "pints", + "description": "", + "abbreviation": "pt" + }, + "quart": { + "name": "quart", + "plural_name": "quarts", + "description": "", + "abbreviation": "qt" + }, + "gallon": { + "name": "gallon", + "plural_name": "gallons", + "description": "", + "abbreviation": "gal" + }, + "milliliter": { + "name": "milliliter", + "plural_name": "milliliters", + "description": "", + "abbreviation": "ml" + }, + "liter": { + "name": "liter", + "plural_name": "liters", + "description": "", + "abbreviation": "l" + }, + "pound": { + "name": "pound", + "plural_name": "pounds", + "description": "", + "abbreviation": "lb", + "plural_abbreviation": "lbs" + }, + "ounce": { + "name": "ounce", + "plural_name": "ounces", + "description": "", + "abbreviation": "oz" + }, + "gram": { + "name": "gram", + "plural_name": "grams", + "description": "", + "abbreviation": "g" + }, + "kilogram": { + "name": "kilogram", + "plural_name": "kilograms", + "description": "", + "abbreviation": "kg" + }, + "milligram": { + "name": "milligram", + "plural_name": "milligrams", + "description": "", + "abbreviation": "mg" + }, + "splash": { + "name": "splash", + "plural_name": "splashes", + "description": "", + "abbreviation": "" + }, + "dash": { + "name": "dash", + "plural_name": "dashes", + "description": "", + "abbreviation": "" + }, + "serving": { + "name": "serving", + "plural_name": "servings", + "description": "", + "abbreviation": "" + }, + "head": { + "name": "head", + "plural_name": "heads", + "description": "", + "abbreviation": "" + }, + "clove": { + "name": "clove", + "plural_name": "cloves", + "description": "", + "abbreviation": "" + }, + "can": { + "name": "can", + "plural_name": "cans", + "description": "", + "abbreviation": "" + }, + "bunch": { + "name": "bunch", + "plural_name": "bunches", + "description": "", + "abbreviation": "" + }, + "pack": { + "name": "pack", + "plural_name": "packs", + "description": "", + "abbreviation": "" + }, + "pinch": { + "name": "pinch", + "plural_name": "pinches", + "description": "", + "abbreviation": "" + } +} \ No newline at end of file From 406ff384c91ef1b2e8ddc152374c502555731755 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 12:16:04 -0600 Subject: [PATCH 14/46] fix(deps): update dependency openai to v1.59.5 (#4864) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index a26af6ae6..f794a66e6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1590,13 +1590,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.59.4" +version = "1.59.5" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.59.4-py3-none-any.whl", hash = "sha256:82113498699998e98104f87c19a890e82df9b01251a0395484360575d3a1d98a"}, - {file = "openai-1.59.4.tar.gz", hash = "sha256:b946dc5a2308dc1e03efbda80bf1cd64b6053b536851ad519f57ee44401663d2"}, + {file = "openai-1.59.5-py3-none-any.whl", hash = "sha256:e646b44856b0dda9345d3c43639e056334d792d1690e99690313c0ef7ca4d8cc"}, + {file = "openai-1.59.5.tar.gz", hash = "sha256:9886e77c02dad9dc6a7b67a11ab372a56842a9b5d376aa476672175ab10e83a0"}, ] [package.dependencies] From b5e1debabc1abcc19ad646219f2d3180f08aca2a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:28:22 +0000 Subject: [PATCH 15/46] fix(deps): update dependency orjson to v3.10.14 (#4865) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 152 ++++++++++++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/poetry.lock b/poetry.lock index f794a66e6..97840a1a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1615,86 +1615,86 @@ realtime = ["websockets (>=13,<15)"] [[package]] name = "orjson" -version = "3.10.13" +version = "3.10.14" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.13-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1232c5e873a4d1638ef957c5564b4b0d6f2a6ab9e207a9b3de9de05a09d1d920"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26a0eca3035619fa366cbaf49af704c7cb1d4a0e6c79eced9f6a3f2437964b6"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4b6acd7c9c829895e50d385a357d4b8c3fafc19c5989da2bae11783b0fd4977"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1884e53c6818686891cc6fc5a3a2540f2f35e8c76eac8dc3b40480fb59660b00"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a428afb5720f12892f64920acd2eeb4d996595bf168a26dd9190115dbf1130d"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba5b13b8739ce5b630c65cb1c85aedbd257bcc2b9c256b06ab2605209af75a2e"}, - {file = "orjson-3.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cab83e67f6aabda1b45882254b2598b48b80ecc112968fc6483fa6dae609e9f0"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:62c3cc00c7e776c71c6b7b9c48c5d2701d4c04e7d1d7cdee3572998ee6dc57cc"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dc03db4922e75bbc870b03fc49734cefbd50fe975e0878327d200022210b82d8"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22f1c9a30b43d14a041a6ea190d9eca8a6b80c4beb0e8b67602c82d30d6eec3e"}, - {file = "orjson-3.10.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b42f56821c29e697c68d7d421410d7c1d8f064ae288b525af6a50cf99a4b1200"}, - {file = "orjson-3.10.13-cp310-cp310-win32.whl", hash = "sha256:0dbf3b97e52e093d7c3e93eb5eb5b31dc7535b33c2ad56872c83f0160f943487"}, - {file = "orjson-3.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:46c249b4e934453be4ff2e518cd1adcd90467da7391c7a79eaf2fbb79c51e8c7"}, - {file = "orjson-3.10.13-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a36c0d48d2f084c800763473020a12976996f1109e2fcb66cfea442fdf88047f"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0065896f85d9497990731dfd4a9991a45b0a524baec42ef0a63c34630ee26fd6"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92b4ec30d6025a9dcdfe0df77063cbce238c08d0404471ed7a79f309364a3d19"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a94542d12271c30044dadad1125ee060e7a2048b6c7034e432e116077e1d13d2"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3723e137772639af8adb68230f2aa4bcb27c48b3335b1b1e2d49328fed5e244c"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f00c7fb18843bad2ac42dc1ce6dd214a083c53f1e324a0fd1c8137c6436269b"}, - {file = "orjson-3.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0e2759d3172300b2f892dee85500b22fca5ac49e0c42cfff101aaf9c12ac9617"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee948c6c01f6b337589c88f8e0bb11e78d32a15848b8b53d3f3b6fea48842c12"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa6fe68f0981fba0d4bf9cdc666d297a7cdba0f1b380dcd075a9a3dd5649a69e"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbcd7aad6bcff258f6896abfbc177d54d9b18149c4c561114f47ebfe74ae6bfd"}, - {file = "orjson-3.10.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2149e2fcd084c3fd584881c7f9d7f9e5ad1e2e006609d8b80649655e0d52cd02"}, - {file = "orjson-3.10.13-cp311-cp311-win32.whl", hash = "sha256:89367767ed27b33c25c026696507c76e3d01958406f51d3a2239fe9e91959df2"}, - {file = "orjson-3.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:dca1d20f1af0daff511f6e26a27354a424f0b5cf00e04280279316df0f604a6f"}, - {file = "orjson-3.10.13-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a3614b00621c77f3f6487792238f9ed1dd8a42f2ec0e6540ee34c2d4e6db813a"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c976bad3996aa027cd3aef78aa57873f3c959b6c38719de9724b71bdc7bd14b"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f74d878d1efb97a930b8a9f9898890067707d683eb5c7e20730030ecb3fb930"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33ef84f7e9513fb13b3999c2a64b9ca9c8143f3da9722fbf9c9ce51ce0d8076e"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd2bcde107221bb9c2fa0c4aaba735a537225104173d7e19cf73f70b3126c993"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064b9dbb0217fd64a8d016a8929f2fae6f3312d55ab3036b00b1d17399ab2f3e"}, - {file = "orjson-3.10.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0044b0b8c85a565e7c3ce0a72acc5d35cda60793edf871ed94711e712cb637d"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7184f608ad563032e398f311910bc536e62b9fbdca2041be889afcbc39500de8"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d36f689e7e1b9b6fb39dbdebc16a6f07cbe994d3644fb1c22953020fc575935f"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:54433e421618cd5873e51c0e9d0b9fb35f7bf76eb31c8eab20b3595bb713cd3d"}, - {file = "orjson-3.10.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e1ba0c5857dd743438acecc1cd0e1adf83f0a81fee558e32b2b36f89e40cee8b"}, - {file = "orjson-3.10.13-cp312-cp312-win32.whl", hash = "sha256:a42b9fe4b0114b51eb5cdf9887d8c94447bc59df6dbb9c5884434eab947888d8"}, - {file = "orjson-3.10.13-cp312-cp312-win_amd64.whl", hash = "sha256:3a7df63076435f39ec024bdfeb4c9767ebe7b49abc4949068d61cf4857fa6d6c"}, - {file = "orjson-3.10.13-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2cdaf8b028a976ebab837a2c27b82810f7fc76ed9fb243755ba650cc83d07730"}, - {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a946796e390cbb803e069472de37f192b7a80f4ac82e16d6eb9909d9e39d56"}, - {file = "orjson-3.10.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d64f1db5ecbc21eb83097e5236d6ab7e86092c1cd4c216c02533332951afc"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:711878da48f89df194edd2ba603ad42e7afed74abcd2bac164685e7ec15f96de"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cf16f06cb77ce8baf844bc222dbcb03838f61d0abda2c3341400c2b7604e436e"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8257c3fb8dd7b0b446b5e87bf85a28e4071ac50f8c04b6ce2d38cb4abd7dff57"}, - {file = "orjson-3.10.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9c3a87abe6f849a4a7ac8a8a1dede6320a4303d5304006b90da7a3cd2b70d2c"}, - {file = "orjson-3.10.13-cp313-cp313-win32.whl", hash = "sha256:527afb6ddb0fa3fe02f5d9fba4920d9d95da58917826a9be93e0242da8abe94a"}, - {file = "orjson-3.10.13-cp313-cp313-win_amd64.whl", hash = "sha256:b5f7c298d4b935b222f52d6c7f2ba5eafb59d690d9a3840b7b5c5cda97f6ec5c"}, - {file = "orjson-3.10.13-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e49333d1038bc03a25fdfe11c86360df9b890354bfe04215f1f54d030f33c342"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:003721c72930dbb973f25c5d8e68d0f023d6ed138b14830cc94e57c6805a2eab"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63664bf12addb318dc8f032160e0f5dc17eb8471c93601e8f5e0d07f95003784"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6066729cf9552d70de297b56556d14b4f49c8f638803ee3c90fd212fa43cc6af"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a1152e2761025c5d13b5e1908d4b1c57f3797ba662e485ae6f26e4e0c466388"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b21d91c5c5ef8a201036d207b1adf3aa596b930b6ca3c71484dd11386cf6c3"}, - {file = "orjson-3.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b12a63f48bb53dba8453d36ca2661f2330126d54e26c1661e550b32864b28ce3"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a5a7624ab4d121c7e035708c8dd1f99c15ff155b69a1c0affc4d9d8b551281ba"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0fee076134398d4e6cb827002468679ad402b22269510cf228301b787fdff5ae"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ae537fcf330b3947e82c6ae4271e092e6cf16b9bc2cef68b14ffd0df1fa8832a"}, - {file = "orjson-3.10.13-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f81b26c03f5fb5f0d0ee48d83cea4d7bc5e67e420d209cc1a990f5d1c62f9be0"}, - {file = "orjson-3.10.13-cp38-cp38-win32.whl", hash = "sha256:0bc858086088b39dc622bc8219e73d3f246fb2bce70a6104abd04b3a080a66a8"}, - {file = "orjson-3.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:3ca6f17467ebbd763f8862f1d89384a5051b461bb0e41074f583a0ebd7120e8e"}, - {file = "orjson-3.10.13-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a11532cbfc2f5752c37e84863ef8435b68b0e6d459b329933294f65fa4bda1a"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c96d2fb80467d1d0dfc4d037b4e1c0f84f1fe6229aa7fea3f070083acef7f3d7"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dda4ba4d3e6f6c53b6b9c35266788053b61656a716a7fef5c884629c2a52e7aa"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f998bbf300690be881772ee9c5281eb9c0044e295bcd4722504f5b5c6092ff"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1cc42ed75b585c0c4dc5eb53a90a34ccb493c09a10750d1a1f9b9eff2bd12"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b0f29d485411e3c13d79604b740b14e4e5fb58811743f6f4f9693ee6480a8f"}, - {file = "orjson-3.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:233aae4474078d82f425134bb6a10fb2b3fc5a1a1b3420c6463ddd1b6a97eda8"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e384e330a67cf52b3597ee2646de63407da6f8fc9e9beec3eaaaef5514c7a1c9"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4222881d0aab76224d7b003a8e5fdae4082e32c86768e0e8652de8afd6c4e2c1"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e400436950ba42110a20c50c80dff4946c8e3ec09abc1c9cf5473467e83fd1c5"}, - {file = "orjson-3.10.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f47c9e7d224b86ffb086059cdcf634f4b3f32480f9838864aa09022fe2617ce2"}, - {file = "orjson-3.10.13-cp39-cp39-win32.whl", hash = "sha256:a9ecea472f3eb653e1c0a3d68085f031f18fc501ea392b98dcca3e87c24f9ebe"}, - {file = "orjson-3.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:5385935a73adce85cc7faac9d396683fd813566d3857fa95a0b521ef84a5b588"}, - {file = "orjson-3.10.13.tar.gz", hash = "sha256:eb9bfb14ab8f68d9d9492d4817ae497788a15fd7da72e14dfabc289c3bb088ec"}, + {file = "orjson-3.10.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:849ea7845a55f09965826e816cdc7689d6cf74fe9223d79d758c714af955bcb6"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5947b139dfa33f72eecc63f17e45230a97e741942955a6c9e650069305eb73d"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cde6d76910d3179dae70f164466692f4ea36da124d6fb1a61399ca589e81d69a"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6dfbaeb7afa77ca608a50e2770a0461177b63a99520d4928e27591b142c74b1"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa45e489ef80f28ff0e5ba0a72812b8cfc7c1ef8b46a694723807d1b07c89ebb"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5007abfdbb1d866e2aa8990bd1c465f0f6da71d19e695fc278282be12cffa5"}, + {file = "orjson-3.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b49e2af011c84c3f2d541bb5cd1e3c7c2df672223e7e3ea608f09cf295e5f8a"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:164ac155109226b3a2606ee6dda899ccfbe6e7e18b5bdc3fbc00f79cc074157d"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6b1225024cf0ef5d15934b5ffe9baf860fe8bc68a796513f5ea4f5056de30bca"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d6546e8073dc382e60fcae4a001a5a1bc46da5eab4a4878acc2d12072d6166d5"}, + {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f1d2942605c894162252d6259b0121bf1cb493071a1ea8cb35d79cb3e6ac5bc"}, + {file = "orjson-3.10.14-cp310-cp310-win32.whl", hash = "sha256:397083806abd51cf2b3bbbf6c347575374d160331a2d33c5823e22249ad3118b"}, + {file = "orjson-3.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:fa18f949d3183a8d468367056be989666ac2bef3a72eece0bade9cdb733b3c28"}, + {file = "orjson-3.10.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f506fd666dd1ecd15a832bebc66c4df45c1902fd47526292836c339f7ba665a9"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe5fd254cfb0eeee13b8ef7ecb20f5d5a56ddda8a587f3852ab2cedfefdb5f6"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ddc8c866d7467f5ee2991397d2ea94bcf60d0048bdd8ca555740b56f9042725"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af8e42ae4363773658b8d578d56dedffb4f05ceeb4d1d4dd3fb504950b45526"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84dd83110503bc10e94322bf3ffab8bc49150176b49b4984dc1cce4c0a993bf9"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5bfc0399cd4811bf10ec7a759c7ab0cd18080956af8ee138097d5b5296a95"}, + {file = "orjson-3.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868943660fb2a1e6b6b965b74430c16a79320b665b28dd4511d15ad5038d37d5"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33449c67195969b1a677533dee9d76e006001213a24501333624623e13c7cc8e"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4c9f60f9fb0b5be66e416dcd8c9d94c3eabff3801d875bdb1f8ffc12cf86905"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0de4d6315cfdbd9ec803b945c23b3a68207fd47cbe43626036d97e8e9561a436"}, + {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83adda3db595cb1a7e2237029b3249c85afbe5c747d26b41b802e7482cb3933e"}, + {file = "orjson-3.10.14-cp311-cp311-win32.whl", hash = "sha256:998019ef74a4997a9d741b1473533cdb8faa31373afc9849b35129b4b8ec048d"}, + {file = "orjson-3.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:9d034abdd36f0f0f2240f91492684e5043d46f290525d1117712d5b8137784eb"}, + {file = "orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d"}, + {file = "orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3"}, + {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780"}, + {file = "orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1"}, + {file = "orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406"}, + {file = "orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7"}, + {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15"}, + {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae"}, + {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010"}, + {file = "orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d"}, + {file = "orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364"}, + {file = "orjson-3.10.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a0fba3b8a587a54c18585f077dcab6dd251c170d85cfa4d063d5746cd595a0f"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175abf3d20e737fec47261d278f95031736a49d7832a09ab684026528c4d96db"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29ca1a93e035d570e8b791b6c0feddd403c6a5388bfe870bf2aa6bba1b9d9b8e"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f77202c80e8ab5a1d1e9faf642343bee5aaf332061e1ada4e9147dbd9eb00c46"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2ec73b7099b6a29b40a62e08a23b936423bd35529f8f55c42e27acccde7954"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d1679df9f9cd9504f8dff24555c1eaabba8aad7f5914f28dab99e3c2552c9d"}, + {file = "orjson-3.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691ab9a13834310a263664313e4f747ceb93662d14a8bdf20eb97d27ed488f16"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b11ed82054fce82fb74cea33247d825d05ad6a4015ecfc02af5fbce442fbf361"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:e70a1d62b8288677d48f3bea66c21586a5f999c64ecd3878edb7393e8d1b548d"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:16642f10c1ca5611251bd835de9914a4b03095e28a34c8ba6a5500b5074338bd"}, + {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3871bad546aa66c155e3f36f99c459780c2a392d502a64e23fb96d9abf338511"}, + {file = "orjson-3.10.14-cp38-cp38-win32.whl", hash = "sha256:0293a88815e9bb5c90af4045f81ed364d982f955d12052d989d844d6c4e50945"}, + {file = "orjson-3.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:6169d3868b190d6b21adc8e61f64e3db30f50559dfbdef34a1cd6c738d409dfc"}, + {file = "orjson-3.10.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:06d4ec218b1ec1467d8d64da4e123b4794c781b536203c309ca0f52819a16c03"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962c2ec0dcaf22b76dee9831fdf0c4a33d4bf9a257a2bc5d4adc00d5c8ad9034"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21d3be4132f71ef1360385770474f29ea1538a242eef72ac4934fe142800e37f"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28ed60597c149a9e3f5ad6dd9cebaee6fb2f0e3f2d159a4a2b9b862d4748860"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e947f70167fe18469f2023644e91ab3d24f9aed69a5e1c78e2c81b9cea553fb"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64410696c97a35af2432dea7bdc4ce32416458159430ef1b4beb79fd30093ad6"}, + {file = "orjson-3.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8050a5d81c022561ee29cd2739de5b4445f3c72f39423fde80a63299c1892c52"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b49a28e30d3eca86db3fe6f9b7f4152fcacbb4a467953cd1b42b94b479b77956"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ca041ad20291a65d853a9523744eebc3f5a4b2f7634e99f8fe88320695ddf766"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d313a2998b74bb26e9e371851a173a9b9474764916f1fc7971095699b3c6e964"}, + {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7796692136a67b3e301ef9052bde6fe8e7bd5200da766811a3a608ffa62aaff0"}, + {file = "orjson-3.10.14-cp39-cp39-win32.whl", hash = "sha256:eee4bc767f348fba485ed9dc576ca58b0a9eac237f0e160f7a59bce628ed06b3"}, + {file = "orjson-3.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:96a1c0ee30fb113b3ae3c748fd75ca74a157ff4c58476c47db4d61518962a011"}, + {file = "orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed"}, ] [[package]] From b45f54150bd951d91b81b78d8a63793d8efa39dc Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:15:06 -0600 Subject: [PATCH 16/46] chore(l10n): New Crowdin updates (#4869) --- frontend/lang/messages/et-EE.json | 798 ++++++++-------- frontend/lang/messages/hu-HU.json | 46 +- frontend/lang/messages/it-IT.json | 24 +- frontend/lang/messages/ro-RO.json | 868 +++++++++--------- mealie/lang/messages/hu-HU.json | 2 +- mealie/lang/messages/ro-RO.json | 62 +- .../seed/resources/foods/locales/hu-HU.json | 4 +- .../seed/resources/foods/locales/it-IT.json | 4 +- .../seed/resources/foods/locales/ro-RO.json | 272 +++--- .../seed/resources/units/locales/ro-RO.json | 72 +- 10 files changed, 1076 insertions(+), 1076 deletions(-) diff --git a/frontend/lang/messages/et-EE.json b/frontend/lang/messages/et-EE.json index 383af8c9f..6e3f0d320 100644 --- a/frontend/lang/messages/et-EE.json +++ b/frontend/lang/messages/et-EE.json @@ -352,455 +352,455 @@ "random-side": "Suvaline kõrvalroog", "this-rule-will-apply": "See reegel kehtib {dayCriteria} {mealTypeCriteria}.", "to-all-days": "kõikidel päevadel", - "on-days": "on {0}s", - "for-all-meal-types": "for all meal types", - "for-type-meal-types": "for {0} meal types", - "meal-plan-rules": "Meal Plan Rules", - "new-rule": "New Rule", - "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", - "new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.", - "recipe-rules": "Recipe Rules", - "applies-to-all-days": "Applies to all days", - "applies-on-days": "Applies on {0}s", - "meal-plan-settings": "Meal Plan Settings" + "on-days": "ajal {0}s", + "for-all-meal-types": "kõikide toidutüüpide jaoks", + "for-type-meal-types": "{0} toidutüübi jaoks", + "meal-plan-rules": "Toitumisplaani reeglid", + "new-rule": "Uus reegel", + "meal-plan-rules-description": "Sa võid luua reegleid valimaks automaatselt retsepte oma toitumisplaanis. Neid reegleid kasutatakse serveri poolt määramaks suvaliste retseptide kogumikku, millest koostatakse toitumisplaan. Kui reeglitel on sama päeva/tüübi piirangud, siis need reeglite filtrid liidetakse. Kuigi duplitseeritud reeglite loomine on võimlaik, on nende loomine praktikas ebavajalik", + "new-rule-description": "Luues uut reeglit toitumisplaanile saab piirata reegli kehtivus kindlale nädalapäevale ja/või kindlale toidutüübile. Et rakendada reeglit kõikidele päevadele või toidutüüpidele tuleb valida \"Kõik\", mis rakendab selle reegli kõikidele võimalikele päeva ja/või toidutüübi väärtustele.", + "recipe-rules": "Retsepti reeglid", + "applies-to-all-days": "Kehtib kõikide päevade kohta", + "applies-on-days": "Kehtib {0}l", + "meal-plan-settings": "Toitumisplaani sätted" }, "migration": { - "migration-data-removed": "Migration data removed", - "new-migration": "New Migration", - "no-file-selected": "No File Selected", - "no-migration-data-available": "No Migration Data Available", - "previous-migrations": "Previous Migrations", - "recipe-migration": "Recipe Migration", + "migration-data-removed": "Ületoomiste andmed eemaldatud", + "new-migration": "Uus ületoomine", + "no-file-selected": "Ühtegi faili ei ole valitud", + "no-migration-data-available": "Ületoomise andmed ei ole saadaval", + "previous-migrations": "Eelnevad ületoomised", + "recipe-migration": "Retsepti üle toomine", "chowdown": { - "description": "Migrate data from Chowdown", - "description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.", + "description": "Too Chowdowni andmed üle", + "description-long": "Meali toetab Chowdowni varamu formaati. Lae alla koodi varamu .zip failina ja lae see allolevasse kasti üles.", "title": "Chowdown" }, "nextcloud": { - "description": "Migrate data from a Nextcloud Cookbook instance", - "description-long": "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.", + "description": "Too Nextcloud Cookbooki andmed üle", + "description-long": "Nextcloudi retsepte saab importida .zip failist, mis sisaldab Nextcloudi poolt salvestatud andmeid. Vaata alltoodud näidiskausta struktuuri, et veenduda retseptide importimise võimalikkuses.", "title": "Nextcloud Cookbook" }, "copymethat": { - "description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.", - "title": "Copy Me That Recipe Manager" + "description-long": "Mealie võimaldab importida retsepte \"Copy Me That\"-st. Ekspordi oma retseptid HTML formaati ning lae .zip allolevasse kasti.", + "title": "Copy Me That retseptihaldur" }, "paprika": { - "description-long": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.", - "title": "Paprika Recipe Manager" + "description-long": "Mealie saab importida retsepte Paprika rakendusest. Ekspordi oma retseptid Paprikast, nimeta ekspordi laiend .zip-ks ning lae see üles allolevasse kasti", + "title": "Paprika retseptihaldur" }, "mealie-pre-v1": { - "description-long": "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.", - "title": "Mealie Pre v1.0" + "description-long": "Mealie saab importida retsepte Mealie rakendusest enne versiooni 1.0 väljalaskmist. Eksportige oma retseptid vanast installist ja laadige alla .zip fail. Pange tähele, et ekspordist saab importida ainult retsepte.", + "title": "Mealie v1.0-le eelnev versioon" }, "tandoor": { - "description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.", - "title": "Tandoor Recipes" + "description-long": "Mealie saab importida retsepte Tandoor-ist. Ekspordi oma andmed \"Default\" formaadis ning lae .zip allolevasse kasti", + "title": "Tandoor-i retsptid" }, - "recipe-data-migrations": "Recipe Data Migrations", - "recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.", - "coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.", - "choose-migration-type": "Choose Migration Type", - "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.", - "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-2": "Recipe 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.", - "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.", + "recipe-data-migrations": "Retsepti andmete ületoomised", + "recipe-data-migrations-explanation": "Retsepte saab üle tuua teisest toetatud rakendusest Mealiesse. See on hea viis tegemaks algust Mealie-ga.", + "coming-from-another-application-or-an-even-older-version-of-mealie": "Tuled teisest rakendusest või hoopis vanemast Mealie versioonist? Uuri ületoomise võimalusi ning vaata kas su andmeid saab importida.", + "choose-migration-type": "Vali ületoomise tüüp", + "tag-all-recipes": "Märgista kõik retseptid märgiga {tag-name}", + "nextcloud-text": "Nextcloudi retsepte saab importida .zip failist, mis sisaldab Nextcloudi poolt salvestatud andmeid. Vaata alltoodud näidiskausta struktuuri, et veenduda retseptide importimise võimalikkuses.", + "chowdown-text": "Meali toetab Chowdowni varamu formaati. Lae alla koodi varamu .zip failina ja lae see allolevasse kasti üles.", + "recipe-1": "Retsept 1", + "recipe-2": "Retsept 2", + "paprika-text": "Mealie saab importida retsepte Paprika rakendusest. Ekspordi oma retseptid Paprikast, nimeta ekspordi laiend .zip-ks ning lae see üles allolevasse kasti", + "mealie-text": "Mealie saab importida retsepte Mealie rakendusest enne versiooni 1.0 väljalaskmist. Eksportige oma retseptid vanast installist ja laadige alla .zip fail. Pange tähele, et ekspordist saab importida ainult retsepte.", "plantoeat": { "title": "Plan to Eat", - "description-long": "Mealie can import recipies from Plan to Eat." + "description-long": "Mealie saab importida retsepte Plan to Eat-st" }, "myrecipebox": { "title": "My Recipe Box", - "description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below." + "description-long": "Mealie saab importida retsepte My Recipe Box-st. Ekspordi oma retsept CSV formaadis ning lae .csv fail allolevasse kasti." }, "recipekeeper": { "title": "Recipe Keeper", - "description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below." + "description-long": "Mealie saab importida retsepte Recipe Keeper-st. Ekspordi oma retsept .zip formaadis ning lae .zip fail allolevasse kasti." } }, "new-recipe": { - "bulk-add": "Bulk Add", - "error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.", - "error-title": "Looks Like We Couldn't Find Anything", - "from-url": "Import a Recipe", - "github-issues": "GitHub Issues", - "google-ld-json-info": "Google ld+json Info", - "must-be-a-valid-url": "Must be a Valid URL", - "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list", - "recipe-markup-specification": "Recipe Markup Specification", - "recipe-url": "Recipe URL", - "recipe-html-or-json": "Recipe HTML or JSON", - "upload-a-recipe": "Upload a Recipe", - "upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.", - "url-form-hint": "Copy and paste a link from your favorite recipe website", - "view-scraped-data": "View Scraped Data", - "trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines", - "trim-prefix-description": "Trim first character from each line", - "split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns", - "import-by-url": "Import a recipe by URL", - "create-manually": "Create a recipe manually", - "make-recipe-image": "Make this the recipe image" + "bulk-add": "Mitme korraga lisamine", + "error-details": "Mealiesse saab importida ainult neid lehti, mis sisaldavad mikroandmeid või ld+jsonit. Enamik populaarseid retseptisaite toetavad seda. Kui teie saiti ei saa importida, kuid logis on JSON-andmeid, teatage sellest GitHubile koos URL-i ja üksikasjadega.", + "error-title": "Paistab, et me ei suutnud midagi leida", + "from-url": "Impordi retsept", + "github-issues": "GitHub issue-d", + "google-ld-json-info": "Google ld+json info", + "must-be-a-valid-url": "Peab olema valiidne URL", + "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Kleebi oma retsepti andmed. Igat rida koheldakse kui nimekirja punkti", + "recipe-markup-specification": "Retsepti Markup spetsifikatsioon", + "recipe-url": "Retsepti URL", + "recipe-html-or-json": "Retsepti HTML või JSON", + "upload-a-recipe": "Retsepti üleslaadimne", + "upload-individual-zip-file": "Lae üles üksik .zip fail, mis eksporditi teisest Mealie ekspemplarist.", + "url-form-hint": "Kopeeri ja kleebi link oma lemmikust retsepti leheküljest", + "view-scraped-data": "Kuva omandatud andmed", + "trim-whitespace-description": "Eemalda alguses ning lõpus olevad tühikud ning tühjad read", + "trim-prefix-description": "Eemalda esimene tähemärk igast reast", + "split-by-numbered-line-description": "Proovib paragrahvi poolitada sobitades \"1)\" või \"1\". mustrid", + "import-by-url": "Impordi retsept URL-lt", + "create-manually": "Loo retsept manuaalselt", + "make-recipe-image": "Sea see retsepti pildiks" }, "page": { - "404-page-not-found": "404 Page not found", - "all-recipes": "All Recipes", - "new-page-created": "New page created", - "page": "Page", - "page-creation-failed": "Page creation failed", - "page-deleted": "Page deleted", - "page-deletion-failed": "Page deletion failed", - "page-update-failed": "Page update failed", - "page-updated": "Page updated", - "pages-update-failed": "Pages update failed", - "pages-updated": "Pages updated", - "404-not-found": "404 Not Found", - "an-error-occurred": "An error occurred" + "404-page-not-found": "404 Lehte ei leitud", + "all-recipes": "Kõik retseptid", + "new-page-created": "Uus leht loodud", + "page": "Leht", + "page-creation-failed": "Lehe loomine ebaõnnestus", + "page-deleted": "Leht kustutatud", + "page-deletion-failed": "Lehe kustutamine ebaõnnestus", + "page-update-failed": "Lehe uuendamine ebaõnnestus", + "page-updated": "Leht uuendatud", + "pages-update-failed": "Lehtede uuendamine ebaõnnetus", + "pages-updated": "Lehed uuendatud", + "404-not-found": "404 Lehte ei leitud", + "an-error-occurred": "Ilmnes viga" }, "recipe": { - "add-key": "Add Key", - "add-to-favorites": "Add to Favorites", - "api-extras": "API Extras", - "calories": "Calories", - "calories-suffix": "calories", - "carbohydrate-content": "Carbohydrate", - "categories": "Categories", - "cholesterol-content": "Cholesterol", - "comment-action": "Comment", - "comment": "Comment", - "comments": "Comments", - "delete-confirmation": "Are you sure you want to delete this recipe?", - "delete-recipe": "Delete Recipe", - "description": "Description", - "disable-amount": "Disable Ingredient Amounts", - "disable-comments": "Disable Comments", - "duplicate": "Duplicate recipe", - "duplicate-name": "Name of the new recipe", - "edit-scale": "Edit Scale", - "fat-content": "Fat", - "fiber-content": "Fiber", - "grams": "grams", - "ingredient": "Ingredient", - "ingredients": "Ingredients", - "insert-ingredient": "Insert Ingredient", - "insert-section": "Insert Section", - "insert-above": "Insert Above", - "insert-below": "Insert Below", - "instructions": "Instructions", - "key-name-required": "Key Name Required", - "landscape-view-coming-soon": "Landscape View", - "milligrams": "milligrams", - "new-key-name": "New Key Name", - "no-white-space-allowed": "No White Space Allowed", - "note": "Note", - "nutrition": "Nutrition", - "object-key": "Object Key", - "object-value": "Object Value", - "original-url": "Original URL", - "perform-time": "Cook Time", - "prep-time": "Prep Time", - "protein-content": "Protein", - "public-recipe": "Public Recipe", - "recipe-created": "Recipe created", - "recipe-creation-failed": "Recipe creation failed", - "recipe-deleted": "Recipe deleted", - "recipe-image": "Recipe Image", - "recipe-image-updated": "Recipe image updated", - "recipe-name": "Recipe Name", - "recipe-settings": "Recipe Settings", - "recipe-update-failed": "Recipe update failed", - "recipe-updated": "Recipe updated", - "remove-from-favorites": "Remove from Favorites", - "remove-section": "Remove Section", - "saturated-fat-content": "Saturated fat", - "save-recipe-before-use": "Save recipe before use", - "section-title": "Section Title", - "servings": "Servings", - "serves-amount": "Serves {amount}", - "share-recipe-message": "I wanted to share my {0} recipe with you.", - "show-nutrition-values": "Show Nutrition Values", - "sodium-content": "Sodium", - "step-index": "Step: {step}", - "sugar-content": "Sugar", - "title": "Title", - "total-time": "Total Time", - "trans-fat-content": "Trans-fat", - "unable-to-delete-recipe": "Unable to Delete Recipe", - "unsaturated-fat-content": "Unsaturated fat", - "no-recipe": "No Recipe", - "locked-by-owner": "Locked by Owner", - "join-the-conversation": "Join the Conversation", - "add-recipe-to-mealplan": "Add Recipe to Mealplan", - "entry-type": "Entry Type", - "date-format-hint": "MM/DD/YYYY format", - "date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format", - "add-to-list": "Add to List", - "add-to-plan": "Add to Plan", - "add-to-timeline": "Add to Timeline", - "recipe-added-to-list": "Recipe added to list", - "recipes-added-to-list": "Recipes added to list", - "successfully-added-to-list": "Successfully added to list", - "recipe-added-to-mealplan": "Recipe added to mealplan", - "failed-to-add-recipes-to-list": "Failed to add recipe to list", - "failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan", - "failed-to-add-to-list": "Failed to add to list", - "yield": "Yield", - "yields-amount-with-text": "Yields {amount} {text}", - "yield-text": "Yield Text", - "quantity": "Quantity", - "choose-unit": "Choose Unit", - "press-enter-to-create": "Press Enter to Create", - "choose-food": "Choose Food", - "notes": "Notes", - "toggle-section": "Toggle Section", - "see-original-text": "See Original Text", - "original-text-with-value": "Original Text: {originalText}", - "ingredient-linker": "Ingredient Linker", - "linked-to-other-step": "Linked to other step", - "auto": "Auto", - "cook-mode": "Cook Mode", - "link-ingredients": "Link Ingredients", - "merge-above": "Merge Above", - "move-to-bottom": "Move To Bottom", - "move-to-top": "Move To Top", - "reset-scale": "Reset Scale", - "decrease-scale-label": "Decrease Scale by 1", - "increase-scale-label": "Increase Scale by 1", - "locked": "Locked", - "public-link": "Public Link", - "edit-timeline-event": "Edit Timeline Event", - "timeline": "Timeline", - "timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!", - "timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.", - "group-global-timeline": "{groupName} Global Timeline", - "open-timeline": "Open Timeline", - "made-this": "I Made This", - "how-did-it-turn-out": "How did it turn out?", - "user-made-this": "{user} made this", - "last-made-date": "Last Made {date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", - "message-key": "Message Key", - "parse": "Parse", - "attach-images-hint": "Attach images by dragging & dropping them into the editor", - "drop-image": "Drop image", - "enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature", - "recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.", - "parse-ingredients": "Parse ingredients", - "edit-markdown": "Edit Markdown", - "recipe-creation": "Recipe Creation", - "select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe", - "looking-for-migrations": "Looking For Migrations?", - "import-with-url": "Import with URL", - "create-recipe": "Create Recipe", - "create-recipe-description": "Create a new recipe from scratch.", - "create-recipes": "Create Recipes", - "import-with-zip": "Import with .zip", - "create-recipe-from-an-image": "Create Recipe from an Image", - "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", - "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", - "create-from-image": "Create from Image", - "should-translate-description": "Translate the recipe into my language", - "please-wait-image-procesing": "Please wait, the image is processing. This may take some time.", - "bulk-url-import": "Bulk URL Import", - "debug-scraper": "Debug Scraper", - "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.", - "new-recipe-names-must-be-unique": "New recipe names must be unique", - "scrape-recipe": "Scrape Recipe", - "scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.", - "scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?", - "scrape-recipe-suggest-bulk-importer": "Try out the bulk importer", - "scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?", - "scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly", - "import-original-keywords-as-tags": "Import original keywords as tags", - "stay-in-edit-mode": "Stay in Edit mode", - "import-from-zip": "Import from Zip", - "import-from-zip-description": "Import a single recipe that was exported from another Mealie instance.", - "import-from-html-or-json": "Import from HTML or JSON", - "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", - "json-import-format-description-colon": "To import via JSON, it must be in valid format:", + "add-key": "Lisa võti", + "add-to-favorites": "Lisa lemmik", + "api-extras": "API lisad", + "calories": "Kalorid", + "calories-suffix": "kalorid", + "carbohydrate-content": "Süsivesikud", + "categories": "Kategooriad", + "cholesterol-content": "Kolesterool", + "comment-action": "Kommentaar", + "comment": "Kommentaar", + "comments": "Kommentaarid", + "delete-confirmation": "Kas sa oled kindel, et tahad seda retsepti kustutada?", + "delete-recipe": "Kustuta retsept", + "description": "Kirjeldus", + "disable-amount": "Deaktiveeri koostisosade kogused", + "disable-comments": "Keela kommentaarid", + "duplicate": "Duplitseeri retsept", + "duplicate-name": "Uue retsepti nimi", + "edit-scale": "Muuda skaalat", + "fat-content": "Rasv", + "fiber-content": "Kiudaine", + "grams": "grammi", + "ingredient": "Koostisosa", + "ingredients": "Koostisosad", + "insert-ingredient": "Lisa koostisosa", + "insert-section": "Lisa sektsioon", + "insert-above": "Lisa üles", + "insert-below": "Lisa alla", + "instructions": "Juhised", + "key-name-required": "Võtmenimi on nõutud", + "landscape-view-coming-soon": "Horisontaalvaade", + "milligrams": "milligrammi", + "new-key-name": "Uus võtmenimi", + "no-white-space-allowed": "Tühikud pole lubatud", + "note": "Märkus", + "nutrition": "Toitained", + "object-key": "Objekti võti", + "object-value": "Ombjekti väärtus", + "original-url": "Originaalne URL", + "perform-time": "Kokkamisele kuluv aeg", + "prep-time": "Ettevalmistuseks kuluv aeg", + "protein-content": "Proteiin", + "public-recipe": "Avalik retsept", + "recipe-created": "Retsept loodud", + "recipe-creation-failed": "Retsepti loomine ebaõnnestus", + "recipe-deleted": "Retsept kustutatud", + "recipe-image": "Retsepti pilt", + "recipe-image-updated": "Retsepti pilt uuendatud", + "recipe-name": "Retsepti nimi", + "recipe-settings": "Retsepti seaded", + "recipe-update-failed": "Retsepti uuendamine ebaõnnestus", + "recipe-updated": "Retsept uuendatud", + "remove-from-favorites": "Eemalda lemmikutet", + "remove-section": "Eemalda sektsioon", + "saturated-fat-content": "Küllastunud rasvhapped", + "save-recipe-before-use": "Salvesta retsept enne kasutusele võttu", + "section-title": "Sektsiooni pealkiri", + "servings": "Portsioneid", + "serves-amount": "Jätkub {amount} inimesele", + "share-recipe-message": "Ma soovin jagada oma {0} retsepti sinuga", + "show-nutrition-values": "Näita toiteväärtusi", + "sodium-content": "Naatrium", + "step-index": "Samm: {step}", + "sugar-content": "Suhkur", + "title": "Pealkiri", + "total-time": "Koguaeg", + "trans-fat-content": "Transrasv", + "unable-to-delete-recipe": "Ei saa retsepti kustutada", + "unsaturated-fat-content": "Küllastamata rasvhape", + "no-recipe": "Retsept puudub", + "locked-by-owner": "Omaniku poolt lukustatud", + "join-the-conversation": "Liitu vestlusega", + "add-recipe-to-mealplan": "Lisa retsept toitumisplaani", + "entry-type": "Sisendi tüüp", + "date-format-hint": "KK/PP/AAAA formaat", + "date-format-hint-yyyy-mm-dd": "AAAA-KK-PP formaat", + "add-to-list": "Lisa nimekirja", + "add-to-plan": "Lisa plaani", + "add-to-timeline": "Lisa ajateljele", + "recipe-added-to-list": "Retsept lisatud nimekirja", + "recipes-added-to-list": "Retseptid lisatud nimekirja", + "successfully-added-to-list": "Edukalt lisatud nimekirja", + "recipe-added-to-mealplan": "Retsept lisatud toitumisplaani", + "failed-to-add-recipes-to-list": "Retsepti lisamine nimekirja ebaõnnestus", + "failed-to-add-recipe-to-mealplan": "Retsepti lisamine toitumisplaani ebaõnnestus", + "failed-to-add-to-list": "Nimekirja lisamine ebaõnnestus", + "yield": "Saagikus", + "yields-amount-with-text": "", + "yield-text": "Saaduse tekst", + "quantity": "Kogus", + "choose-unit": "Vali ühik", + "press-enter-to-create": "Loomiseks vajuta Enter", + "choose-food": "Vali toit", + "notes": "Märkmed", + "toggle-section": "Jaotise sisse- ja väljalülitamine", + "see-original-text": "Vaata originaalteksti", + "original-text-with-value": "Originaaltekst: {originalText}", + "ingredient-linker": "Koostisosa linkija", + "linked-to-other-step": "Lingitud järgmise sammuga", + "auto": "Automaatne", + "cook-mode": "Küpsetusviis", + "link-ingredients": "Lingi koostisosad", + "merge-above": "Liida üleval asuvad", + "move-to-bottom": "Liiguta alla", + "move-to-top": "Liiguta üles", + "reset-scale": "Lähtesta skaala", + "decrease-scale-label": "Vähenda skaalat ühe võrra", + "increase-scale-label": "Suurenda skaalat ühe võrra", + "locked": "Lukustatud", + "public-link": "Avalik link", + "edit-timeline-event": "Muuda sündmust ajasjoonel", + "timeline": "Ajajoon", + "timeline-is-empty": "Ajajoon on tühi. Proovi valmistada see retsept!", + "timeline-no-events-found-try-adjusting-filters": "Sündmused puuduvad. Proovi kohandada oma otsingufiltreid.", + "group-global-timeline": "{groupName} Globaalne ajajoon", + "open-timeline": "Ava ajajoon", + "made-this": "Olen seda valmistanud", + "how-did-it-turn-out": "Kuidas tuli see välja?", + "user-made-this": "{user} on seda valmistanud", + "last-made-date": "Viimati valmistatud: {date}", + "api-extras-description": "Retsepti väljavõtted on Meali API oluline funktsioon. Neid saab kasutada kohandatud JSON-võtme/väärtuse paaride loomiseks retseptis, et viidata kolmandate osapoolte rakendustele. Neid klahve saab kasutada teabe edastamiseks, näiteks automaatse toimingu või kohandatud sõnumi käivitamiseks teie valitud seadmele.", + "message-key": "Sõnumi võti", + "parse": "Analüüsi", + "attach-images-hint": "Lisa pildid manustesse neid lohistades ja vabastades need redaktorisse", + "drop-image": "Vabasta pilt", + "enable-ingredient-amounts-to-use-this-feature": "Luba koostisosa kogused, et kasutada seda omadust", + "recipes-with-units-or-foods-defined-cannot-be-parsed": "Retsepte, millel kogused või toidud on defineeritud, ei saa analüüsida", + "parse-ingredients": "Analüüsi koostisosi", + "edit-markdown": "Muuda Markdowni", + "recipe-creation": "Retsepti loomine", + "select-one-of-the-various-ways-to-create-a-recipe": "Retsepti loomiseks vali üks viis võimalikest", + "looking-for-migrations": "Otsid ületoomiseid?", + "import-with-url": "Impordi kasutades URLi", + "create-recipe": "Loo retsept", + "create-recipe-description": "Loo uus retsept algusest", + "create-recipes": "Loo retseptid", + "import-with-zip": "Impordi .zip failist", + "create-recipe-from-an-image": "Retsepti loomine pildist", + "create-recipe-from-an-image-description": "Retsepti loomiseks lae üles selle pilt. Mealie üritab ekstraheerida pildil oleva teksti ning luua retsepti sellest kasutades AI-d.", + "crop-and-rotate-the-image": "Kärpige ja pöörake pilti nii, et ainult tekst oleks nähtaval ja see oleks suunatud ülespoole.", + "create-from-image": "Pildist loomine", + "should-translate-description": "Tõlgi retsept minu keelde", + "please-wait-image-procesing": "Palun oota, pilti töödeldakse veel. See võib võtta veidi aega.", + "bulk-url-import": "Hulgiimport URL-ist", + "debug-scraper": "Otsige Scraperis probleeme", + "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Loo retsept selle nime kasutades. Igal retseptil peab olema unikaalne nimi", + "new-recipe-names-must-be-unique": "Uue retsepti nimed peavad olema unikaalsed", + "scrape-recipe": "Retsepti lugemine", + "scrape-recipe-description": "Lugege retsept URL-i abil. Sisestage soovitud retsepti URL, ja Mealie proovib selle saidi retsepti jäädvustada ja lisada selle teie kogusse.", + "scrape-recipe-have-a-lot-of-recipes": "Sul on palju retsepte ja sa soovida lugeda kõik sisse üheaegselt?", + "scrape-recipe-suggest-bulk-importer": "Proovi hulgiimportimist.", + "scrape-recipe-have-raw-html-or-json-data": "Sul on töötlemata HTMLi või JSONi andmed?", + "scrape-recipe-you-can-import-from-raw-data-directly": "Sa võid otse importida töötlemata andmetest", + "import-original-keywords-as-tags": "Impordi originaal võtmesõnad siltidena", + "stay-in-edit-mode": "Püsige redigeerimisrežiimis", + "import-from-zip": "Impordi .zip-st", + "import-from-zip-description": "Impordi üks retsept, mis oli eksporditud teisest Mealie paigaldusest.", + "import-from-html-or-json": "Impordi HTMLst või JSONist", + "import-from-html-or-json-description": "Importige üks retsept töötlemata HTML- või JSON-failist. See on kasulik, kui teil on retsept lehelt, mida Mealie ei suuda tavaliselt jäädvustada, või mõnest muust välisest allikast.", + "json-import-format-description-colon": "JSON-faili importimiseks peab see olema õiges formaadis:", "json-editor": "JSON Editor", - "zip-files-must-have-been-exported-from-mealie": ".zip files must have been exported from Mealie", - "create-a-recipe-by-uploading-a-scan": "Create a recipe by uploading a scan.", - "upload-a-png-image-from-a-recipe-book": "Upload a png image from a recipe book", - "recipe-bulk-importer": "Recipe Bulk Importer", - "recipe-bulk-importer-description": "The Bulk recipe importer allows you to import multiple recipes at once by queueing the sites on the backend and running the task in the background. This can be useful when initially migrating to Mealie, or when you want to import a large number of recipes.", - "set-categories-and-tags": "Set Categories and Tags", - "bulk-imports": "Bulk Imports", - "bulk-import-process-has-started": "Bulk Import process has started", - "bulk-import-process-has-failed": "Bulk import process has failed", - "report-deletion-failed": "Report deletion failed", - "recipe-debugger": "Recipe Debugger", - "recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.", - "use-openai": "Use OpenAI", - "recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.", - "debug": "Debug", - "tree-view": "Tree View", - "recipe-servings": "Recipe Servings", - "recipe-yield": "Recipe Yield", - "recipe-yield-text": "Recipe Yield Text", - "unit": "Unit", - "upload-image": "Upload image", - "screen-awake": "Keep Screen Awake", - "remove-image": "Remove image", - "nextStep": "Next step", - "recipe-actions": "Recipe Actions", + "zip-files-must-have-been-exported-from-mealie": ".zip failid peavad olema eksporditud Mealiest", + "create-a-recipe-by-uploading-a-scan": "Loo retsept laadides üles skanneeritud pilt.", + "upload-a-png-image-from-a-recipe-book": "Lae üles .png pilt retseptiraamatust", + "recipe-bulk-importer": "Retseptide hulgi-importimine", + "recipe-bulk-importer-description": "Retseptide hulgi-importimine võimaldab importida mitu retsepti korraga, asetades leheküljed taustaprogrammi järjekorda ja käivitades importimise ülesanded taustal. See on kasulik, kui lülitute ümber Mealie-le või kui soovite importida suure hulga retsepte.", + "set-categories-and-tags": "Sea kategooriad ning Sildid", + "bulk-imports": "Hulgi-impordid", + "bulk-import-process-has-started": "Hulgi-importimise protsess on alanud", + "bulk-import-process-has-failed": "Hulgi-importimise protsess ebaõnnestus", + "report-deletion-failed": "Raporti kustutamine ebaõnnestus", + "recipe-debugger": "Retsepti vigadeotsing", + "recipe-debugger-description": "Võtke selle retsepti URL, milles soovite vigu otsida, ja kleepige see siia. Retseptihaaraja otsib URL-i ja tulemused kuvatakse. Kui te ei näe tagastatud andmeid, ei toeta Mealie või selle kogumisteek lehte, mida proovite haarata.", + "use-openai": "Kasuta OpenAI-d", + "recipe-debugger-use-openai-description": "Kasutage tulemuste sõelumiseks kaabitsateegi asemel OpenAI-d. Kuigi URL-i kaudu retsepti loomisel tehakse seda kaabitsateegi mitte-toimimise korral automaatselt, saate seda proovida siin käsitsi.", + "debug": "Veaotsing", + "tree-view": "Puuvaade", + "recipe-servings": "Portsionite arv retseptis", + "recipe-yield": "Retsepti saagikus", + "recipe-yield-text": "Retsepti saagikuse tekst", + "unit": "Ühik", + "upload-image": "Lae pilt üles", + "screen-awake": "Hoia ekraan aktiivsena", + "remove-image": "Eemalda pilt", + "nextStep": "Järgmine samm", + "recipe-actions": "Retsepti toimingud", "parser": { - "experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.", - "ingredient-parser": "Ingredient Parser", - "explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.", - "alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.", - "select-parser": "Select Parser", - "natural-language-processor": "Natural Language Processor", - "brute-parser": "Brute Parser", - "openai-parser": "OpenAI Parser", - "parse-all": "Parse All", - "no-unit": "No unit", - "missing-unit": "Create missing unit: {unit}", - "missing-food": "Create missing food: {food}", - "no-food": "No Food" + "experimental-alert-text": "Mealie kasutab teie retseptide koostisosade analüüsimiseks ja ühikute ja tarvikute loomiseks loomulikku keeletöötlust. See funktsioon on katseline ja ei pruugi alati ootuspäraselt töötada. Kui te neid struktureeritud tulemusi ei soovi, võite vajutada nuppu \"Tühista\" ja teie muudatusi ei salvestata.", + "ingredient-parser": "Koostisosade analüüser", + "explanation": "Koostisosade sorteerimise tööriista kasutamiseks vajutage nuppu \"Sordi kõik\". Kui koostisosad on saadaval, saate üksused üle vaadata ja kontrollida, kas analüüsimine õnnestus. Mudeli usaldusväärtus on loetletud üksuse nimest paremal. See väärtus on üksikute väärtuste keskmine ja ei ole alati väga täpne.", + "alerts-explainer": "Teile antakse märku, kui leitakse sobiv toit või üksus, kuid seda pole andmebaasis olemas.", + "select-parser": "Vali parser", + "natural-language-processor": "Loomuliku keele töötlus", + "brute-parser": "Jõuline parser", + "openai-parser": "OpenAI parser", + "parse-all": "Parsi kõik", + "no-unit": "Ilma ühikuta", + "missing-unit": "Loo puuduv ühik: {unit}", + "missing-food": "Loo puuduv toit: {food}", + "no-food": "Toit puudub" }, - "reset-servings-count": "Reset Servings Count", - "not-linked-ingredients": "Additional Ingredients" + "reset-servings-count": "Lähtesta portsionite arv", + "not-linked-ingredients": "Lisa-koostisosad" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", - "max-missing-tools": "Max Missing Tools", - "selected-tools": "Selected Tools", - "other-filters": "Other Filters", - "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "recipe-finder": "Retsepti otsing", + "recipe-finder-description": "Otsi retsepte olemasolevate koostisosade järgi. Võimalik on ka filtreerida olemasolevate tööriistade järgi seades maksimaalse numbri puudu olevatest koostisosadest või tööriistadest.", + "selected-ingredients": "Valitud koostisosad", + "no-ingredients-selected": "Ühtegi koostisosa pole valitud", + "missing": "Puuduv", + "no-recipes-found": "Ühtegi retsepti ei leitud", + "no-recipes-found-description": "Proovi lisada veel koostisosi oma otsingupäringusse või proovi kohandada oma filtreid", + "include-ingredients-on-hand": "Kaasa olemasolevad olevad koostisosad", + "include-tools-on-hand": "Kaasa olemasolevad tööriistad", + "max-missing-ingredients": "Maksimaalne puuduvate koostisosade arv", + "max-missing-tools": "Maksimaalne puuduvate tööriistade arv", + "selected-tools": "Valitud tööriistad", + "other-filters": "Teised filtrid", + "ready-to-make": "Valmistamiseks valmis", + "almost-ready-to-make": "Peaaegu valmistamiseks valmis" }, "search": { - "advanced-search": "Advanced Search", - "and": "and", - "exclude": "Exclude", - "include": "Include", - "max-results": "Max Results", - "or": "Or", - "has-any": "Has Any", - "has-all": "Has All", - "clear-selection": "Clear Selection", - "results": "Results", - "search": "Search", - "search-mealie": "Search Mealie (press /)", - "search-placeholder": "Search...", - "tag-filter": "Tag Filter", - "search-hint": "Press '/'", - "advanced": "Advanced", - "auto-search": "Auto Search", - "no-results": "No results found" + "advanced-search": "Täpsem otsing", + "and": "ja", + "exclude": "Jäta välja", + "include": "Kaasa", + "max-results": "Maksimaalne tulemuste arv", + "or": "Või", + "has-any": "Hõlmab ühtegi", + "has-all": "Hõlmab kõiki", + "clear-selection": "Tühjenda valik", + "results": "Tulemused", + "search": "Otsing", + "search-mealie": "Otsi Mealies (vajuta \"/\" )", + "search-placeholder": "Otsi ...", + "tag-filter": "Sildifilter", + "search-hint": "Vajuta \"/\"", + "advanced": "Lisavalikud", + "auto-search": "Automaatotsing", + "no-results": "Tulemusi ei leitud" }, "settings": { - "add-a-new-theme": "Add a New Theme", - "admin-settings": "Admin Settings", + "add-a-new-theme": "Lisa uus teema", + "admin-settings": "Administraatori sätted", "backup": { - "backup-created": "Backup created successfully", - "backup-created-at-response-export_path": "Backup Created at {path}", - "backup-deleted": "Backup deleted", - "restore-success": "Restore successful", - "restore-fail": "Restore failed. Check your server logs for more details", - "backup-tag": "Backup Tag", - "create-heading": "Create A Backup", - "delete-backup": "Delete Backup", - "error-creating-backup-see-log-file": "Error Creating Backup. See Log File", - "full-backup": "Full Backup", - "import-summary": "Import Summary", - "partial-backup": "Partial Backup", - "unable-to-delete-backup": "Unable to Delete Backup.", - "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.", - "backup-restore": "Backup Restore", - "back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.", - "cannot-be-undone": "This action cannot be undone - use with caution.", - "postgresql-note": "If you are using PostGreSQL, please review the {backup-restore-process} prior to restoring.", - "backup-restore-process-in-the-documentation": "backup/restore process in the documentation", - "irreversible-acknowledgment": "I understand that this action is irreversible, destructive and may cause data loss", - "restore-backup": "Restore Backup" + "backup-created": "Tagavarakoopia edukalt loodud", + "backup-created-at-response-export_path": "Tagavarakoopia loodud asukohta {path}", + "backup-deleted": "Tagavarakoopia kustutatud", + "restore-success": "Taastamine edukas", + "restore-fail": "Taastamine ebaõnnestus. Vaata oma serveri logidest täpsemat infot", + "backup-tag": "Tagavarakoopia silt", + "create-heading": "Loo tagavarakoopia", + "delete-backup": "Kustuta tagavarakoopia", + "error-creating-backup-see-log-file": "Tõrge tagavarakoopia loomises. Vaata logifaili", + "full-backup": "Täielik tagavarakoopia", + "import-summary": "Impordi kokkuvõte", + "partial-backup": "Osaline tagavarakoopia", + "unable-to-delete-backup": "Ei saa kustutada tagavarakoopiat", + "experimental-description": "Varukoopiad on teie saidi andmebaasi ja kataloogi hetktõmmised. See sisaldab kogu teavet ja te ei saa sellest teabe alamhulki eemaldada. See on võrreldav Mealie hetkepildiga konkreetsel ajahetkel. Need toimivad andmebaaside viisina andmete importimiseks ja eksportimiseks, samuti saidi varukoopiate tegemiseks välisesse asukohta.", + "backup-restore": "Taasta tagavarakoopiast", + "back-restore-description": "Selle varukoopia taastamisel kirjutatakse üle kõik teie andmebaasis ja andmebaasihalduris olevad andmed ning asendatakse need selle varukoopia sisuga. {cannot-be-undone} Kui taastamine õnnestub, logitakse teid välja.", + "cannot-be-undone": "Seda tegevust ei saa tagasi võtta - kasuta ettevaatusega.", + "postgresql-note": "Kui sa kasutad PostGreSQL-i, palun vaata {backup-restore-process} enne taastamist.", + "backup-restore-process-in-the-documentation": "varundamise/taastamise protsessi dokumentatsioonis", + "irreversible-acknowledgment": "Ma saan aru, et seda tegevust ei ole võimalik tagasi võtta, on destruktiivne, ning võib põhjustada andmekadu", + "restore-backup": "Taasta tagavarakoopiast" }, - "backup-and-exports": "Backups", - "change-password": "Change Password", - "current": "Version:", - "custom-pages": "Custom Pages", - "edit-page": "Edit Page", - "events": "Events", - "first-day-of-week": "First day of the week", - "group-settings-updated": "Group Settings Updated", + "backup-and-exports": "Tagavarakoopiad", + "change-password": "Muuda salasõna", + "current": "Versioon:", + "custom-pages": "Kohandatud lehed", + "edit-page": "Muuda lehekülge", + "events": "Sündmused", + "first-day-of-week": "Nädala esimene päev", + "group-settings-updated": "Grupisätted uuendatud", "homepage": { - "all-categories": "All Categories", - "card-per-section": "Card Per Section", - "home-page": "Home Page", - "home-page-sections": "Home Page Sections", - "show-recent": "Show Recent" + "all-categories": "Kõik kategooriad", + "card-per-section": "Kaartide arv sektsioonis", + "home-page": "Pealeht", + "home-page-sections": "Pealehe sektsioonid", + "show-recent": "Näita viimatiseid" }, - "language": "Language", - "latest": "Latest", - "local-api": "Local API", - "locale-settings": "Locale settings", - "migrations": "Migrations", - "new-page": "New Page", - "notify": "Notify", - "organize": "Organize", - "page-name": "Page Name", - "pages": "Pages", - "profile": "Profile", - "remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries", - "set-new-time": "Set New Time", - "settings-update-failed": "Settings update failed", - "settings-updated": "Settings updated", - "site-settings": "Site Settings", + "language": "Keel", + "latest": "Viimatised", + "local-api": "Kohalik API", + "locale-settings": "Piirkondlikud seaded", + "migrations": "Ränded", + "new-page": "Uus leht", + "notify": "Teavita", + "organize": "Organiseeri", + "page-name": "Lehe nimi", + "pages": "Lehed", + "profile": "Profiil", + "remove-existing-entries-matching-imported-entries": "Kustutage olemasolevad kirjed, mis vastavad imporditud kirjetele", + "set-new-time": "Määra uus aeg", + "settings-update-failed": "Seadete uuendamine ebaõnnestus", + "settings-updated": "Seaded uuendatud", + "site-settings": "Lehe seaded", "theme": { - "accent": "Accent", - "dark": "Dark", - "default-to-system": "Default to system", - "error": "Error", - "error-creating-theme-see-log-file": "Error creating theme. See log file.", - "error-deleting-theme": "Error deleting theme", - "error-updating-theme": "Error updating theme", + "accent": "Aktsent", + "dark": "Tume", + "default-to-system": "Süsteemi vaikeseade", + "error": "Tõrge", + "error-creating-theme-see-log-file": "Tõrge teema loomise. Vaata logifaili.", + "error-deleting-theme": "Tõrge teema kustutamisel", + "error-updating-theme": "Tõrge teema uuendamisel", "info": "Info", - "light": "Light", - "primary": "Primary", - "secondary": "Secondary", - "success": "Success", - "switch-to-dark-mode": "Switch to dark mode", - "switch-to-light-mode": "Switch to light mode", - "theme-deleted": "Theme deleted", - "theme-name": "Theme Name", - "theme-name-is-required": "Theme Name is required.", - "theme-saved": "Theme Saved", - "theme-updated": "Theme updated", - "warning": "Warning", - "light-mode": "Light Mode", - "dark-mode": "Dark Mode" + "light": "Hele", + "primary": "Peamine", + "secondary": "Sekundaarne", + "success": "Edu", + "switch-to-dark-mode": "Lülitage tumedale režiimile", + "switch-to-light-mode": "Lülitage heledale režiimile", + "theme-deleted": "Teema kustutatud", + "theme-name": "Teema nimi", + "theme-name-is-required": "Teema nimi on nõutud.", + "theme-saved": "Teema salvestatud", + "theme-updated": "Teema uuendatud", + "warning": "Hoiatus", + "light-mode": "Hele režiim", + "dark-mode": "Tume režiim" }, "token": { - "active-tokens": "ACTIVE TOKENS", - "api-token": "API Token", - "api-tokens": "API Tokens", - "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.", - "create-an-api-token": "Create an API Token", - "token-name": "Token Name", - "generate": "Generate", - "you-have-token-count": "You have no active tokens.|You have one active token.|You have {count} active tokens." + "active-tokens": "AKTIIVSED IDENTIFIKAATORID", + "api-token": "API identifikaator", + "api-tokens": "API identifikaatorid", + "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Kopeerige see identifikaator, et seda mõnes teises rakenduses kasutada. Pärast seda ei saa te seda identifikaatorit enam näha.", + "create-an-api-token": "Loo API identifikaator", + "token-name": "Identifikaatori nimi", + "generate": "Genereeri", + "you-have-token-count": "Sul ei ole aktiivseid identifikaatoreid.|Sul on üks aktiivne identifikaator.|Sul on {count} aktiivset identifikaatorit." }, "toolbox": { - "assign-all": "Assign All", - "bulk-assign": "Bulk Assign", - "new-name": "New Name", - "no-unused-items": "No Unused Items", - "recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected", - "remove-unused": "Remove Unused", - "title-case-all": "Title Case All", - "toolbox": "Toolbox", + "assign-all": "Määra kõik", + "bulk-assign": "Hulgi-määramine", + "new-name": "Uus nimi", + "no-unused-items": "Kasutamata esemed puuduvad", + "recipes-affected": "Mõjutatud pole ühtegi retsepti|Mõjutatud üks retsept|Mõjutatud {count} retsepti", + "remove-unused": "Eemalda kasutuseta", + "title-case-all": "Kirjutada kõik suurelt", + "toolbox": "Tööriistakast", "unorganized": "Unorganized" }, "webhooks": { diff --git a/frontend/lang/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json index 9cff7389f..36a76612c 100644 --- a/frontend/lang/messages/hu-HU.json +++ b/frontend/lang/messages/hu-HU.json @@ -277,7 +277,7 @@ "admin-group-management-text": "A csoporthoz tartozó változtatások azonnal megjelennek.", "group-id-value": "Csoport azonosító: {0}", "total-households": "Háztartások száma", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "you-must-select-a-group-before-selecting-a-household": "A háztartás kiválasztása előtt ki kell választania egy csoportot" }, "household": { "household": "Háztartás", @@ -518,7 +518,7 @@ "save-recipe-before-use": "Recept mentése használat előtt", "section-title": "Szakasz címe", "servings": "Adag", - "serves-amount": "Serves {amount}", + "serves-amount": "Adag {amount}", "share-recipe-message": "Szeretném megossztani veled a {0} receptemet.", "show-nutrition-values": "Tápértékek megjelenítése", "sodium-content": "Nátrium", @@ -662,24 +662,24 @@ "no-food": "Élelmiszer nélküli" }, "reset-servings-count": "Adagok számának visszaállítása", - "not-linked-ingredients": "Additional Ingredients" + "not-linked-ingredients": "Kiegészítő hozzávalók" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", - "max-missing-tools": "Max Missing Tools", - "selected-tools": "Selected Tools", - "other-filters": "Other Filters", + "recipe-finder": "Receptkereső", + "recipe-finder-description": "Keressen recepteket a kéznél lévő összetevők alapján. A rendelkezésre álló eszközök alapján is szűrhet, és beállíthatja a hiányzó összetevők vagy eszközök maximális számát.", + "selected-ingredients": "Kiválasztott összetevők", + "no-ingredients-selected": "Nincsenek kiválasztott összetevők", + "missing": "Hiányzó", + "no-recipes-found": "Nem található recept", + "no-recipes-found-description": "Próbáljon meg több összetevőt hozzáadni a kereséshez, vagy állítsa be a szűrőket", + "include-ingredients-on-hand": "Beleértve a kéznél lévő összetevőket", + "include-tools-on-hand": "Beleértve a kéznél lévő eszközöket", + "max-missing-ingredients": "Maximálisan hiányzó összetevők száma", + "max-missing-tools": "Maximálisan hiányzó eszközök száma", + "selected-tools": "Kiválasztott eszközök", + "other-filters": "További szűrők", "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "almost-ready-to-make": "Majdnem készen áll" }, "search": { "advanced-search": "Részletes keresés", @@ -884,7 +884,7 @@ "are-you-sure-you-want-to-check-all-items": "Biztos, hogy minden elemet be akar jelölni?", "are-you-sure-you-want-to-uncheck-all-items": "Biztos, hogy minden elem kijelölését visszavonja?", "are-you-sure-you-want-to-delete-checked-items": "Biztosan törölni akarja az összes bejelölt elemet?", - "no-shopping-lists-found": "No Shopping Lists Found" + "no-shopping-lists-found": "Nem találhatók bevásárlólisták" }, "sidebar": { "all-recipes": "Minden recept", @@ -1296,7 +1296,7 @@ "profile": { "welcome-user": "👋 Üdvözöljük, {0}!", "description": "Profiljának, receptjeinek és csoportbeállításainak kezelése.", - "invite-link": "Invite Link", + "invite-link": "Meghívó link", "get-invite-link": "Meghívó link beszerzése", "get-public-link": "Nyilvánon link beszerzése", "account-summary": "Fiók áttekintése", @@ -1326,7 +1326,7 @@ "notifiers-description": "Állítson be olyan e-mail és push-értesítéseket, amelyek meghatározott események esetén lépnek működésbe.", "manage-data": "Adatok kezelése", "manage-data-description": "Az Ön Mealie adatainak kezelése: alapanyagok, mértékegységek, kategóriák, címkék, stb.", - "data-migrations": "Adat migráció", + "data-migrations": "Adatmigráció", "data-migrations-description": "Migrálja meglévő adatait más alkalmazásokból, például Nextcloud Recipes vagy Chowdown.", "email-sent": "E-mail elküldve", "error-sending-email": "Hiba történt az e-Mail küldésénél", @@ -1341,13 +1341,13 @@ "manage-members": "Tagok Kezelése", "manage-webhooks": "Webhookok kezelése", "manage-notifiers": "Értesítések kezelése", - "manage-data-migrations": "Adatok migrációjának kezelése" + "manage-data-migrations": "Adatmigráció kezelése" }, "cookbook": { "cookbooks": "Szakácskönyvek", "description": "A szakácskönyvek egy másik módja a receptek rendszerezésének a receptek, szervezők és egyéb szűrők keresztmetszeteinek létrehozásával. Egy szakácskönyv létrehozása egy bejegyzést ad az oldalsávhoz, és a kiválasztott szűrőkkel rendelkező összes recept megjelenik a szakácskönyvben.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "hide-cookbooks-from-other-households": "Szakácskönyvek elrejtése más háztartásoktól", + "hide-cookbooks-from-other-households-description": "Ha engedélyezve van, csak az Ön háztartásának szakácskönyvei jelennek meg az oldalsávban", "public-cookbook": "Nyilvános szakácskönyv", "public-cookbook-description": "A nyilvános szakácskönyvek megoszthatók a nem mealie felhasználókkal, és megjelennek a csoportod oldalán.", "filter-options": "Szűrési beállítások", diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 703f552dd..87ebe9907 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -526,7 +526,7 @@ "sugar-content": "Zuccheri", "title": "Titolo", "total-time": "Tempo Totale", - "trans-fat-content": "Trans-fat", + "trans-fat-content": "Grassi trans", "unable-to-delete-recipe": "Impossibile eliminare ricetta", "unsaturated-fat-content": "Grassi insaturi", "no-recipe": "Nessuna Ricetta", @@ -547,8 +547,8 @@ "failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare", "failed-to-add-to-list": "Errore durante l'aggiunta alla lista", "yield": "Porzioni", - "yields-amount-with-text": "Yields {amount} {text}", - "yield-text": "Yield Text", + "yields-amount-with-text": "Rendimenti {amount} {text}", + "yield-text": "Testo di rendimento", "quantity": "Quantità", "choose-unit": "Scegli Unità", "press-enter-to-create": "Premi invio per creare", @@ -617,7 +617,7 @@ "stay-in-edit-mode": "Rimani in modalità Modifica", "import-from-zip": "Importa da Zip", "import-from-zip-description": "Importa una singola ricetta esportata da un'altra istanza di Mealie.", - "import-from-html-or-json": "Import from HTML or JSON", + "import-from-html-or-json": "Importa da HTML o JSON", "import-from-html-or-json-description": "Importa una singola ricetta da HTML o JSON grezzi. Utile se si ha una ricetta proveniente da siti da cui solitamente Mealie non riesce a importare, o da qualche altra fonte esterna.", "json-import-format-description-colon": "Per importare tramite JSON, deve essere in un formato valido:", "json-editor": "Editor JSON", @@ -639,7 +639,7 @@ "tree-view": "Visualizzazione ad Albero", "recipe-servings": "Porzioni ricetta", "recipe-yield": "Resa Ricetta", - "recipe-yield-text": "Recipe Yield Text", + "recipe-yield-text": "Testo del rendimento ricetta", "unit": "Unità", "upload-image": "Carica immagine", "screen-awake": "Mantieni lo schermo acceso", @@ -661,19 +661,19 @@ "missing-food": "Crea cibo mancante: {food}", "no-food": "Nessun Alimento" }, - "reset-servings-count": "Reset Servings Count", + "reset-servings-count": "Reimposta conteggio porzioni", "not-linked-ingredients": "Ingredienti Aggiuntivi" }, "recipe-finder": { "recipe-finder": "Trova ricette", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", + "recipe-finder-description": "Cerca ricette in base agli ingredienti a portata di mano. Si può anche filtrare in base agli utensili che si ha a disposizione e impostare un numero massimo d'ingredienti o utensili mancanti.", "selected-ingredients": "Seleziona ingredienti", "no-ingredients-selected": "Nessun ingrediente selezionato", "missing": "Mancante", "no-recipes-found": "Nessuna ricetta trovata", "no-recipes-found-description": "Prova ad aggiungere altri ingredienti alla tua ricerca o a regolare i tuoi filtri", "include-ingredients-on-hand": "Includi ingredienti a mano", - "include-tools-on-hand": "Include Tools On Hand", + "include-tools-on-hand": "Includi strumenti a mano", "max-missing-ingredients": "Max Ingredienti Mancanti", "max-missing-tools": "Massimo Strumenti Mancanti", "selected-tools": "Strumenti Selezionati", @@ -1291,7 +1291,7 @@ "run-test": "Esegui test", "test-results": "Risultati dei test", "group-delete-note": "I gruppi con utenti o famiglie non possono essere eliminati", - "household-delete-note": "Households with users cannot be deleted" + "household-delete-note": "Le famiglie con utenti non possono essere eliminate" }, "profile": { "welcome-user": "👋 Benvenutǝ, {0}!", @@ -1345,9 +1345,9 @@ }, "cookbook": { "cookbooks": "Ricettari", - "description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "description": "I libri di cucina sono un altro modo per organizzare le ricette creando insiemi di ricette, ordinamenti e altri filtri. La creazione di un libro di cucina aggiungerà una voce alla barra laterale e tutte le ricette con i filtri scelti verranno visualizzate nel libro di cucina.", + "hide-cookbooks-from-other-households": "Nascondi i libri di cucina delle altre famiglie", + "hide-cookbooks-from-other-households-description": "Se abilitata, nella barra laterale appariranno solo libri di cucina della propria famiglia", "public-cookbook": "Ricettario Pubblico", "public-cookbook-description": "I ricettari pubblici possono essere condivisi con gli utenti non-mealie e saranno visualizzati nella pagina dei gruppi.", "filter-options": "Opzioni Filtro", diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index 1b27c4d48..653e03bab 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -548,7 +548,7 @@ "failed-to-add-to-list": "Adăugarea la listă a eșuat", "yield": "Producție", "yields-amount-with-text": "Produce {amount} {text}", - "yield-text": "Yield Text", + "yield-text": "Text pentru cantitate obținută", "quantity": "Cantitate", "choose-unit": "Alegeţi unitatea", "press-enter-to-create": "Apăsați Enter pentru a crea", @@ -637,9 +637,9 @@ "recipe-debugger-use-openai-description": "Folosește OpenAI pentru a analiza rezultatele în loc să te bazezi pe biblioteca de \"scraping\". La crearea unei rețete prin URL, acest lucru se face automat în cazul în care biblioteca de \"scraping\" eșuează, dar puteți testa manual acest lucru aici.", "debug": "Depanare", "tree-view": "Vizualizare Ierarhică", - "recipe-servings": "Recipe Servings", + "recipe-servings": "Porții rețetă", "recipe-yield": "Producere rețetă", - "recipe-yield-text": "Recipe Yield Text", + "recipe-yield-text": "Text pentru cantitatea obținută din rețetă", "unit": "Unitate", "upload-image": "Încărcare imagine", "screen-awake": "Păstrare ecran aprins", @@ -661,25 +661,25 @@ "missing-food": "Creează mâncare lipsă: {food}", "no-food": "Niciun aliment" }, - "reset-servings-count": "Reset Servings Count", - "not-linked-ingredients": "Additional Ingredients" + "reset-servings-count": "Resetează numărul de serviri", + "not-linked-ingredients": "Ingrediente suplimentare" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", - "max-missing-tools": "Max Missing Tools", - "selected-tools": "Selected Tools", - "other-filters": "Other Filters", - "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "recipe-finder": "Căutător de rețete", + "recipe-finder-description": "Caută rețete pe baza ingredientelor pe care le ai la dispoziție. Poți, de asemenea, să filtrezi după ustensilele pe care le ai și să setezi un număr maxim de ingrediente sau ustensile lipsă.", + "selected-ingredients": "Ingrediente selectate", + "no-ingredients-selected": "Nici un ingredient selectat", + "missing": "Lipsă", + "no-recipes-found": "Nu au fost găsite rețete", + "no-recipes-found-description": "Încercați să adăugați mai multe ingrediente la căutare sau să ajustați filtrele", + "include-ingredients-on-hand": "Include ingredientele Din Mână", + "include-tools-on-hand": "Include Ustensilele Disponibile", + "max-missing-ingredients": "Maxim Ingrediente lipsă", + "max-missing-tools": "Număr maxim de ustensile lipsă", + "selected-tools": "Ustensile Selectate", + "other-filters": "Alte filtre", + "ready-to-make": "Gata de făcut", + "almost-ready-to-make": "Aproape gata de făcut" }, "search": { "advanced-search": "Căutare avansată", @@ -799,7 +799,7 @@ "no-unused-items": "Niciun element neutilizat", "recipes-affected": "Nicio rețetă afectata|O rețetă afectata|{count} rețete afectate", "remove-unused": "Elimină neutilizate", - "title-case-all": "Title Case All", + "title-case-all": "Transformare în \"Title Case\" pentru tot textul", "toolbox": "Instrumente", "unorganized": "Neorganizate" }, @@ -872,516 +872,516 @@ "copy-as-markdown": "Copiază ca Markdown", "delete-checked": "Șterge selecționate", "toggle-label-sort": "Comută sortare etichete", - "reorder-labels": "Reorder Labels", - "uncheck-all-items": "Uncheck All Items", - "check-all-items": "Check All Items", - "linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes", - "items-checked-count": "No items checked|One item checked|{count} items checked", - "no-label": "No Label", - "completed-on": "Completed on {date}", - "you-are-offline": "You are offline", - "you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.", - "are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?", - "are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?", - "are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?", - "no-shopping-lists-found": "No Shopping Lists Found" + "reorder-labels": "Reordonare etichete", + "uncheck-all-items": "Debifează toate elementele", + "check-all-items": "Bifează toate elementele", + "linked-recipes-count": "Nicio rețetă legată|O rețetă legată|{count} rețete legate", + "items-checked-count": "Niciun element bifat|Un element bifat|{count} elemente bifate", + "no-label": "Fără etichetă", + "completed-on": "Finalizat pe {date}", + "you-are-offline": "Ești offline", + "you-are-offline-description": "Nu toate funcțiile sunt disponibile în timp ce sunteți offline. Încă mai puteți adăuga, modifica sau șterge articolele, dar nu vei putea sincroniza modificările la server până nu vei fi din nou online.", + "are-you-sure-you-want-to-check-all-items": "Sunteți sigur că doriți să bifați toate elementele?", + "are-you-sure-you-want-to-uncheck-all-items": "Sunteți sigur că doriți să debifați toate elementele?", + "are-you-sure-you-want-to-delete-checked-items": "Sunteți sigur că doriți să ștergeți toate elementele selectate?", + "no-shopping-lists-found": "Nu s-au găsit liste de cumpărături" }, "sidebar": { - "all-recipes": "All Recipes", - "backups": "Backups", - "categories": "Categories", - "cookbooks": "Cookbooks", - "dashboard": "Dashboard", - "home-page": "Home Page", - "manage-users": "Manage Users", - "migrations": "Migrations", - "profile": "Profile", - "search": "Search", - "site-settings": "Site Settings", - "tags": "Tags", - "toolbox": "Toolbox", - "language": "Language", - "maintenance": "Maintenance", - "background-tasks": "Background Tasks", + "all-recipes": "Toate reţetele", + "backups": "Copii de rezervă", + "categories": "Categorii", + "cookbooks": "Cărți de rețete", + "dashboard": "Panou de control", + "home-page": "Pagina principală", + "manage-users": "Gestionare utilizatori", + "migrations": "Migraţii", + "profile": "Profil", + "search": "Căutare", + "site-settings": "Setările site-ului", + "tags": "Etichete", + "toolbox": "Instrumente", + "language": "Limbă", + "maintenance": "Mentenanță", + "background-tasks": "Sarcini de fundal", "parser": "Parser", - "developer": "Developer", - "cookbook": "Cookbook", - "create-cookbook": "Create a new cookbook" + "developer": "Dezvoltator", + "cookbook": "Carte de bucate", + "create-cookbook": "Creați o nouă carte de bucate" }, "signup": { - "error-signing-up": "Error Signing Up", - "sign-up": "Sign Up", - "sign-up-link-created": "Sign up link created", - "sign-up-link-creation-failed": "Sign up link creation failed", - "sign-up-links": "Sign Up Links", - "sign-up-token-deleted": "Sign Up Token Deleted", - "sign-up-token-deletion-failed": "Sign up token deletion failed", - "welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator." + "error-signing-up": "Eroare la înregistrare", + "sign-up": "Înregistrați-vă", + "sign-up-link-created": "Link creat pentru înregistrare", + "sign-up-link-creation-failed": "Crearea link-ului de înregistrare a eșuat", + "sign-up-links": "Link-uri de înregistrare", + "sign-up-token-deleted": "Token de înscriere șters", + "sign-up-token-deletion-failed": "Ștergerea token-ului de înscriere a eșuat", + "welcome-to-mealie": "Bun venit la Mealie! Pentru a deveni utilizator al acestei instanțe trebuie să aveți un link valid de invitație. Dacă nu ați primit o invitație nu vă puteți înregistra. Pentru a primi un link, contactați administratorul site-ului." }, "tag": { - "tag-created": "Tag created", - "tag-creation-failed": "Tag creation failed", - "tag-deleted": "Tag deleted", - "tag-deletion-failed": "Tag deletion failed", - "tag-update-failed": "Tag update failed", - "tag-updated": "Tag updated", - "tags": "Tags", - "untagged-count": "Untagged {count}", + "tag-created": "Etichetă creată", + "tag-creation-failed": "Crearea etichetei a eșuat", + "tag-deleted": "Etichetă ștearsă", + "tag-deletion-failed": "Ștergerea etichetei a eșuat", + "tag-update-failed": "Actualizarea etichetei a eșuat", + "tag-updated": "Etichetă actualizată", + "tags": "Etichete", + "untagged-count": "Fără etichetă {count}", "create-a-tag": "Creează o eticheta", - "tag-name": "Tag Name", + "tag-name": "Denumire etichetă", "tag": "Etichetă" }, "tool": { - "tools": "Tools", - "on-hand": "On Hand", - "create-a-tool": "Create a Tool", - "tool-name": "Tool Name", - "create-new-tool": "Create New Tool", - "on-hand-checkbox-label": "Show as On Hand (Checked)", - "required-tools": "Required Tools", + "tools": "Ustensile pentru gătit", + "on-hand": "La îndemână", + "create-a-tool": "Creează o unealtă pentru gătit", + "tool-name": "Nume unealtă pentru gătit", + "create-new-tool": "Creează o nouă unealtă pentru gătit", + "on-hand-checkbox-label": "Afișare ca la îndemână (verificat)", + "required-tools": "Ustensile necesare", "tool": "Instrument" }, "user": { "admin": "Admin", - "are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link {link}?", - "are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user {activeName} ID: {activeId}?", - "auth-method": "Auth Method", - "confirm-link-deletion": "Confirm Link Deletion", - "confirm-password": "Confirm Password", - "confirm-user-deletion": "Confirm User Deletion", - "could-not-validate-credentials": "Could Not Validate Credentials", - "create-link": "Create Link", - "create-user": "Create User", - "current-password": "Current Password", - "e-mail-must-be-valid": "E-mail must be valid", - "edit-user": "Edit User", + "are-you-sure-you-want-to-delete-the-link": "Sunteți sigur că doriți să ștergeți linkul {link}?", + "are-you-sure-you-want-to-delete-the-user": "Sunteți sigur că doriți să ștergeți utilizatorul {activeName} ID: {activeId}?", + "auth-method": "Metoda de autentificare", + "confirm-link-deletion": "Confirmă ștergerea link-ului", + "confirm-password": "Confirmă parola", + "confirm-user-deletion": "Confirmă ștergerea utilizatorului", + "could-not-validate-credentials": "Credențialele nu au putut fi validate", + "create-link": "Creare legătură", + "create-user": "Creează utilizator", + "current-password": "Parola actuală", + "e-mail-must-be-valid": "E-mailul trebuie să fie valid", + "edit-user": "Editare utilizator", "email": "Email", - "error-cannot-delete-super-user": "Error! Cannot Delete Super User", - "existing-password-does-not-match": "Existing password does not match", - "full-name": "Full Name", - "generate-password-reset-link": "Generate Password Reset Link", - "invite-only": "Invite Only", - "link-id": "Link ID", - "link-name": "Link Name", - "login": "Login", - "login-oidc": "Login with", - "or": "or", - "logout": "Logout", - "manage-users": "Manage Users", - "manage-users-description": "Create and manage users.", - "new-password": "New Password", - "new-user": "New User", - "password-has-been-reset-to-the-default-password": "Password has been reset to the default password", - "password-must-match": "Password must match", - "password-reset-failed": "Password reset failed", - "password-updated": "Password updated", - "password": "Password", - "password-strength": "Password is {strength}", + "error-cannot-delete-super-user": "Eroare! Nu se poate șterge Super Utilizatorul", + "existing-password-does-not-match": "Parola existentă nu corespunde", + "full-name": "Nume complet", + "generate-password-reset-link": "Generează link-ul de resetare a parolei", + "invite-only": "Doar pe bază de invitație", + "link-id": "ID Link", + "link-name": "Nume Link", + "login": "Autentificare", + "login-oidc": "Autentifică-te cu", + "or": "sau", + "logout": "Deconectare", + "manage-users": "Gestionare utilizatori", + "manage-users-description": "Creați și gestionați utilizatorii.", + "new-password": "Parolă Nouă", + "new-user": "Utilizator nou", + "password-has-been-reset-to-the-default-password": "Parola a fost resetată la parola implicită", + "password-must-match": "Parola trebuie să se potrivească", + "password-reset-failed": "Resetarea parolei a eșuat", + "password-updated": "Parola a fost actualizată", + "password": "Parolă", + "password-strength": "Parola este {strength}", "please-enter-password": "Vă rugăm să introduceţi parola nouă.", - "register": "Register", - "reset-password": "Reset Password", - "sign-in": "Sign in", - "total-mealplans": "Total MealPlans", - "total-users": "Total Users", - "upload-photo": "Upload Photo", - "use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password", - "user-created": "User created", - "user-creation-failed": "User creation failed", - "user-deleted": "User deleted", - "user-id-with-value": "User ID: {id}", - "user-id": "User ID", - "user-password": "User Password", - "user-successfully-logged-in": "User Successfully Logged In", - "user-update-failed": "User update failed", - "user-updated": "User updated", - "user": "User", - "username": "Username", - "users-header": "USERS", - "users": "Users", + "register": "Înregistrare", + "reset-password": "Resetare parolă", + "sign-in": "Autentificare", + "total-mealplans": "Total planuri de masă", + "total-users": "Total utilizatori", + "upload-photo": "Încarcă Poză", + "use-8-characters-or-more-for-your-password": "Folosește cel puțin 8 caractere pentru parola ta", + "user-created": "Utilizator creat", + "user-creation-failed": "Eșuare creare utilizator", + "user-deleted": "Utilizator șters", + "user-id-with-value": "ID utilizator: {id}", + "user-id": "ID utilizator", + "user-password": "Parolă Utilizator", + "user-successfully-logged-in": "Utilizator logat cu succes", + "user-update-failed": "Actualizare utilizator eșuată", + "user-updated": "Utilizator actualizat", + "user": "Utilizator", + "username": "Nume de utilizator", + "users-header": "UTILIZATORI", + "users": "Utilizatori", "user-not-found": "Utilizatorul nu a fost găsit", - "webhook-time": "Webhook Time", - "webhooks-enabled": "Webhooks Enabled", - "you-are-not-allowed-to-create-a-user": "You are not allowed to create a user", - "you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user", - "enable-advanced-content": "Enable Advanced Content", - "enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later", - "favorite-recipes": "Favorite Recipes", - "email-or-username": "Email or Username", - "remember-me": "Remember Me", - "please-enter-your-email-and-password": "Please enter your email and password", - "invalid-credentials": "Invalid Credentials", - "account-locked-please-try-again-later": "Account Locked. Please try again later", - "user-favorites": "User Favorites", + "webhook-time": "Timpul Webhook-ului", + "webhooks-enabled": "Webhook-uri activate", + "you-are-not-allowed-to-create-a-user": "Nu ai permisiunea de a crea un utilizator", + "you-are-not-allowed-to-delete-this-user": "Nu ai permisiunea de a șterge acest utilizator", + "enable-advanced-content": "Activează conținutul avansat", + "enable-advanced-content-description": "Activează caracteristici avansate cum ar fi scalarea rețetelor, cheile API, Webhooks și Managementul de date. Nu-ți face griji, poți schimba oricând asta mai târziu", + "favorite-recipes": "Rețete favorite", + "email-or-username": "Email sau nume de utilizator", + "remember-me": "Ține-mă minte", + "please-enter-your-email-and-password": "Te rugăm să introduci adresa de email și parola", + "invalid-credentials": "Datele de autentificare sunt invalide", + "account-locked-please-try-again-later": "Cont blocat. Te rugăm să încerci mai târziu", + "user-favorites": "Favoritele Utilizatorului", "password-strength-values": { - "weak": "Weak", - "good": "Good", - "strong": "Strong", - "very-strong": "Very Strong" + "weak": "Slabă", + "good": "Bună", + "strong": "Puternică", + "very-strong": "Foarte puternică" }, - "user-management": "User Management", - "reset-locked-users": "Reset Locked Users", - "admin-user-creation": "Admin User Creation", + "user-management": "Management utilizatori", + "reset-locked-users": "Resetare utilizatori blocați", + "admin-user-creation": "Creare utilizator Admin", "admin-user-management": "Gestionare utilizatori de tip administrator", - "user-details": "User Details", - "user-name": "User Name", - "authentication-method": "Authentication Method", + "user-details": "Detalii Utilizator", + "user-name": "Nume Utilizator", + "authentication-method": "Metodă de autentificare", "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie", - "permissions": "Permissions", + "permissions": "Permisiuni", "administrator": "Administrator", - "user-can-invite-other-to-group": "User can invite others to group", - "user-can-manage-group": "User can manage group", - "user-can-manage-household": "User can manage household", - "user-can-organize-group-data": "User can organize group data", - "enable-advanced-features": "Enable advanced features", - "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", - "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", + "user-can-invite-other-to-group": "Utilizatorul poate invita alte persoane în grup", + "user-can-manage-group": "Utilizatorul poate gestiona grupul", + "user-can-manage-household": "Utilizatorul poate gestiona gospodăria", + "user-can-organize-group-data": "Utilizatorul poate organiza datele grupului", + "enable-advanced-features": "Activează funcțiile avansate", + "it-looks-like-this-is-your-first-time-logging-in": "Se pare că este prima dată când te conectezi.", + "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nu mai vrei să vezi acest lucru? Asigură-te că îți schimbi adresa de e-mail în setările de utilizator!", "forgot-password": "Recuperare parola", "forgot-password-text": "Va rugam introduceti adresa de e-mail pentru a va trimite un link de resetare parola.", - "changes-reflected-immediately": "Changes to this user will be reflected immediately." + "changes-reflected-immediately": "Modificările aduse acestui utilizator vor fi reflectate imediat." }, "language-dialog": { - "translated": "translated", - "choose-language": "Choose Language", - "select-description": "Choose the language for the Mealie UI. The setting only applies to you, not other users.", - "how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!", - "read-the-docs": "Read the docs" + "translated": "tradus", + "choose-language": "Alege Limba", + "select-description": "Alegeți limba pentru interfața Mealie. Setarea se aplică doar în cazul dvs., nu și în cazul altor utilizatori.", + "how-to-contribute-description": "Ceva nu este tradus încă, este greșit sau limba ta lipsită din listă? {read-the-docs-link} despre cum să contribui!", + "read-the-docs": "Citește documentația" }, "data-pages": { "foods": { - "merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.", - "merge-food-example": "Merging {food1} into {food2}", - "seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.", - "seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.", - "combine-food": "Combine Food", - "source-food": "Source Food", - "target-food": "Target Food", - "create-food": "Create Food", - "food-label": "Food Label", - "edit-food": "Edit Food", - "food-data": "Food Data", - "example-food-singular": "ex: Onion", - "example-food-plural": "ex: Onions", - "label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.", - "on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list." + "merge-dialog-text": "Combinarea alimentelor selectate va fuziona alimentul sursă și alimentul țintă într-un singur aliment. Alimentul sursă va fi șters, iar toate referințele către alimentul sursă vor fi actualizate pentru a indica alimentul țintă.", + "merge-food-example": "Combinarea {food1} în {food2}", + "seed-dialog-text": "Populează baza de date cu alimente în funcție de limba ta locală. Aceasta va crea peste 200 de alimente comune care pot fi utilizate pentru a organiza baza de date. Alimentele sunt traduse printr-un efort comunitar.", + "seed-dialog-warning": "Aveți deja unele elemente în baza dvs. de date. Această acțiune nu va reconcilia duplicatele, va trebui să le gestionați manual.", + "combine-food": "Combină mâncarea", + "source-food": "Sursa de mâncare", + "target-food": "Mâncare țintită", + "create-food": "Crează mâncare", + "food-label": "Etichetă mâncare", + "edit-food": "Editează Mâncare", + "food-data": "Date despre mâncare", + "example-food-singular": "ex: Ceapă", + "example-food-plural": "ex: Cepe", + "label-overwrite-warning": "Acest lucru va atribui eticheta aleasă tuturor alimentelor selectate și ar putea suprascrie etichetele existente.", + "on-hand-checkbox-label": "Setarea acestui indicator va face ca acest aliment să fie debifat în mod implicit atunci când se adaugă o rețetă pe lista de cumpărături." }, "units": { - "seed-dialog-text": "Seed the database with common units based on your local language.", - "combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.", - "combine-unit": "Combine Unit", - "source-unit": "Source Unit", - "target-unit": "Target Unit", - "merging-unit-into-unit": "Merging {0} into {1}", - "create-unit": "Create Unit", - "abbreviation": "Abbreviation", - "plural-abbreviation": "Plural Abbreviation", - "description": "Description", - "display-as-fraction": "Display as Fraction", - "use-abbreviation": "Use Abbreviation", - "edit-unit": "Edit Unit", - "unit-data": "Unit Data", - "use-abbv": "Use Abbv.", - "fraction": "Fraction", - "example-unit-singular": "ex: Tablespoon", - "example-unit-plural": "ex: Tablespoons", - "example-unit-abbreviation-singular": "ex: Tbsp", - "example-unit-abbreviation-plural": "ex: Tbsps" + "seed-dialog-text": "Populează baza de date cu unități comune în funcție de limba ta locală.", + "combine-unit-description": "Combinarea unităților selectate va fuziona Unitatea Sursă și Unitatea Țintă într-o singură unitate. {source-unit-will-be-deleted} iar toate referințele către Unitatea Sursă vor fi actualizate pentru a indica Unitatea Țintă.", + "combine-unit": "Combină unitatea", + "source-unit": "Unitate Sursă", + "target-unit": "Unitatea Țintă", + "merging-unit-into-unit": "Combinarea {0} în {1}", + "create-unit": "Creează o unitate", + "abbreviation": "Abreviere", + "plural-abbreviation": "Abreviere la Plural", + "description": "Descriere", + "display-as-fraction": "Afișează ca Fracție", + "use-abbreviation": "Utilizează Abreviere", + "edit-unit": "Editează Unitatea", + "unit-data": "Date Unitate", + "use-abbv": "Utilizare Abrv.", + "fraction": "Fracție", + "example-unit-singular": "ex: Lingură", + "example-unit-plural": "ex: Linguri", + "example-unit-abbreviation-singular": "ex: Lg", + "example-unit-abbreviation-plural": "ex: Lg" }, "labels": { - "seed-dialog-text": "Seed the database with common labels based on your local language.", - "edit-label": "Edit Label", - "new-label": "New Label", - "labels": "Labels", - "assign-label": "Assign Label" + "seed-dialog-text": "Populează baza de date cu unități comune în funcție de limba ta locală.", + "edit-label": "Editare etichetă", + "new-label": "Etichetă Nouă", + "labels": "Etichete", + "assign-label": "Atribuie etichetă" }, "recipes": { - "purge-exports": "Purge Exports", - "are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?", - "confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.", - "the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.", - "settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.", - "selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.", - "recipe-data": "Recipe Data", - "recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.", - "recipe-columns": "Recipe Columns", - "data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.", - "data-exports": "Data Exports", - "tag": "Tag", - "categorize": "Categorize", - "update-settings": "Update Settings", - "tag-recipes": "Tag Recipes", - "categorize-recipes": "Categorize Recipes", - "export-recipes": "Export Recipes", - "delete-recipes": "Delete Recipes", - "source-unit-will-be-deleted": "Source Unit will be deleted" + "purge-exports": "Curăță Exporturile", + "are-you-sure-you-want-to-delete-all-export-data": "Sunteţi sigur că doriţi să ştergeţi toate datele de export?", + "confirm-delete-recipes": "Ești sigur că vrei să ștergi următoarele rețete? Această acțiune nu poate fi anulată.", + "the-following-recipes-selected-length-will-be-exported": "Următoarele rețete ({0}) vor fi exportate.", + "settings-chosen-explanation": "Setările alese aici, cu excepția opțiunii blocate, vor fi aplicate tuturor rețetelor selectate.", + "selected-length-recipe-s-settings-will-be-updated": "{count} setări rețetă(e) vor fi actualizate.", + "recipe-data": "Date reţetă", + "recipe-data-description": "Utilizează această secțiune pentru a gestiona datele asociate rețetelor tale. Poți efectua mai multe acțiuni în masă asupra rețetelor, inclusiv exportare, ștergere, adăugare de etichete și atribuirea de categorii.", + "recipe-columns": "Coloane Rețetă", + "data-exports-description": "Această secțiune oferă linkuri către exporturile disponibile, care sunt gata pentru descărcare. Aceste exporturi au o perioadă de valabilitate limitată, așa că asigură-te că le descarci cât timp sunt încă disponibile.", + "data-exports": "Exporturi de date", + "tag": "Etichetă", + "categorize": "Categorizare", + "update-settings": "Actualizare setări", + "tag-recipes": "Etichete de Rețete", + "categorize-recipes": "Categorizează Rețetele", + "export-recipes": "Exportă rețetele", + "delete-recipes": "Șterge rețete", + "source-unit-will-be-deleted": "Unitatea Sursă va fi ștearsă" }, "recipe-actions": { - "recipe-actions-data": "Recipe Actions Data", - "new-recipe-action": "New Recipe Action", - "edit-recipe-action": "Edit Recipe Action", - "action-type": "Action Type" + "recipe-actions-data": "Date acțiuni rețetă", + "new-recipe-action": "Acțiune rețetă nouă", + "edit-recipe-action": "Editează Acțiune Rețetă", + "action-type": "Tip de acțiune" }, - "create-alias": "Create Alias", - "manage-aliases": "Manage Aliases", - "seed-data": "Seed Data", - "seed": "Seed", - "data-management": "Data Management", - "data-management-description": "Select which data set you want to make changes to.", - "select-data": "Select Data", - "select-language": "Select Language", - "columns": "Columns", - "combine": "Combine", + "create-alias": "Creează Alias", + "manage-aliases": "Gestionare Aliasuri", + "seed-data": "Date Populare", + "seed": "Populare", + "data-management": "Gestionarea datelor", + "data-management-description": "Selectează setul de date la care dorești să faci modificări.", + "select-data": "Selectează setul de date", + "select-language": "Selectează limba", + "columns": "Coloane", + "combine": "Combina", "categories": { - "edit-category": "Edit Category", - "new-category": "New Category", - "category-data": "Category Data" + "edit-category": "Editează Categoria", + "new-category": "Categorie nouă", + "category-data": "Date categorie" }, "tags": { - "new-tag": "New Tag", - "edit-tag": "Edit Tag", - "tag-data": "Tag Data" + "new-tag": "Etichetă nouă", + "edit-tag": "Editează eticheta", + "tag-data": "Date etichetă" }, "tools": { - "new-tool": "New Tool", - "edit-tool": "Edit Tool", - "tool-data": "Tool Data" + "new-tool": "Ustensilă nouă", + "edit-tool": "Editare Ustensilă", + "tool-data": "Date ustensilă" } }, "user-registration": { - "user-registration": "User Registration", - "registration-success": "Registration Success", - "join-a-group": "Join a Group", - "create-a-new-group": "Create a New Group", - "provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.", - "group-details": "Group Details", - "group-details-description": "Before you create an account you'll need to create a group. Your group will only contain you, but you'll be able to invite others later. Members in your group can share meal plans, shopping lists, recipes, and more!", - "use-seed-data": "Use Seed Data", - "use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes.", - "account-details": "Account Details" + "user-registration": "Înregistrare Utilizator", + "registration-success": "Înregistrare cu succes", + "join-a-group": "Alătură-te unui Grup", + "create-a-new-group": "Creează un Grup Nou", + "provide-registration-token-description": "Vă rugăm să furnizați token-ul de înregistrare asociat cu grupul la care doriți să vă alăturați. Va trebui să obțineți acest lucru de la un membru existent al grupului.", + "group-details": "Detalii grup", + "group-details-description": "Înainte de a crea un cont, va trebui să creezi un grup. Grupul tău va conține inițial doar pe tine, dar vei putea invita și alte persoane ulterior. Membrii din grupul tău vor putea să partajeze planuri de mese, liste de cumpărături, rețete și multe altele!", + "use-seed-data": "Utilizează setul de date a populării", + "use-seed-data-description": "Mealie vine cu o colecție de Alimente, Unități, și Etichete care pot fi utilizate pentru a popula grupul tău cu date utile pentru organizarea rețetelor.", + "account-details": "Detalii Cont" }, "validation": { - "group-name-is-taken": "Group name is taken", - "username-is-taken": "Username is taken", - "email-is-taken": "Email is taken", - "this-field-is-required": "This Field is Required" + "group-name-is-taken": "Numele grupului este folosit deja", + "username-is-taken": "Numele de utilizator este deja înregistrat", + "email-is-taken": "Adresa de email este deja utilizată", + "this-field-is-required": "Acest câmp este obligatoriu" }, "export": { - "export": "Export", - "file-name": "File Name", - "size": "Size", - "link-expires": "Link Expires" + "export": "Exportă", + "file-name": "Nume Fişier", + "size": "Dimensiune", + "link-expires": "Link-ul expiră" }, "recipe-share": { - "expiration-date": "Expiration Date", - "share-recipe": "Share Recipe", - "default-30-days": "Default 30 Days", - "expires-at": "Expires At", - "recipe-link-copied-message": "Recipe link copied to clipboard" + "expiration-date": "Data expirării", + "share-recipe": "Distribuie rețeta", + "default-30-days": "Implicit 30 de zile", + "expires-at": "Expiră la", + "recipe-link-copied-message": "Link-ul rețetei copiat în clipboard" }, "banner-experimental": { - "title": "Experimental Feature", - "description": "This page contains experimental or still-baking features. Please excuse the mess.", - "issue-link-text": "Track our progress here" + "title": "Funcționalitate experimentală", + "description": "Această pagină conține funcții experimentale sau încă în dezvoltare. Vă rugăm să scuzați eventualele inconveniențe.", + "issue-link-text": "Urmărește progresul nostru aici" }, "form": { - "quantity-label-abbreviated": "Qty" + "quantity-label-abbreviated": "Cantitate" }, "markdown-editor": { - "preview-markdown-button-label": "Preview Markdown" + "preview-markdown-button-label": "Previzualizare Markdown" }, "demo": { - "info_message_with_version": "This is a Demo for version: {version}", - "demo_username": "Username: {username}", - "demo_password": "Password: {password}" + "info_message_with_version": "Acesta este un Demo pentru versiunea: {version}", + "demo_username": "Nume utilizator: {username}", + "demo_password": "Parolă: {password}" }, "ocr-editor": { - "ocr-editor": "Ocr editor", - "toolbar": "Toolbar", - "selection-mode": "Selection mode", - "pan-and-zoom-picture": "Pan and zoom picture", - "split-text": "Split text", - "preserve-line-breaks": "Preserve original line breaks", - "split-by-block": "Split by text block", - "flatten": "Flatten regardless of original formating", + "ocr-editor": "Editor Ocr", + "toolbar": "Bară de instrumente", + "selection-mode": "Mod de selecţie", + "pan-and-zoom-picture": "Zoomează și panoramează imaginea", + "split-text": "Divizare text", + "preserve-line-breaks": "Păstrează liniile de pauză originale", + "split-by-block": "Împarte după bloc text", + "flatten": "Aplatizează indiferent de formatarea originală", "help": { - "help": "Help", - "mouse-modes": "Mouse modes", - "selection-mode": "Selection Mode (default)", - "selection-mode-desc": "The selection mode is the main mode that can be used to enter data:", + "help": "Ajutor", + "mouse-modes": "Moduri Mouse", + "selection-mode": "Mod selecţie (implicit)", + "selection-mode-desc": "Modul de selecţie este modul principal care poate fi folosit pentru a introduce date:", "selection-mode-steps": { - "draw": "Draw a rectangle on the text you want to select.", - "click": "Click on any field on the right and then click back on the rectangle above the image.", - "result": "The selected text will appear inside the previously selected field." + "draw": "Desenează un dreptunghi pe textul pe care vrei să-l selectezi.", + "click": "Dă click pe orice câmp din dreapta și apoi apasă înapoi pe dreptunghiul de deasupra imaginii.", + "result": "Textul selectat va apărea în interiorul câmpului selectat anterior." }, - "pan-and-zoom-mode": "Pan and Zoom Mode", - "pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.", - "split-text-mode": "Split Text modes", + "pan-and-zoom-mode": "Mod panoramă și zoom", + "pan-and-zoom-desc": "Selectează pan și zoom făcând clic pe pictogramă. Acest mod permite să mărești imaginea și să te deplasezi pentru a facilita utilizarea imaginilor mari.", + "split-text-mode": "Divizare moduri text", "split-modes": { - "line-mode": "Line mode (default)", - "line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.", - "block-mode": "Block mode", - "block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.", - "flat-mode": "Flat mode", - "flat-mode-desc": "In flat mode, the text will be added to the selected recipe field with no line breaks." + "line-mode": "Mod linie (implicit)", + "line-mode-desc": "În modul linie, textul va fi propagat prin menținerea pauzelor de linie inițiale. Acest mod este util atunci când se folosește adăugarea în bloc pe o listă de ingrediente atunci când un ingredient este o linie.", + "block-mode": "Mod bloc", + "block-mode-desc": "În modul bloc, textul va fi împărțit în blocuri. Acest mod este util atunci când adaugă în masă instrucțiuni care sunt de obicei scrise în paragrafe.", + "flat-mode": "Mod plat", + "flat-mode-desc": "În modul forfetar, textul va fi adăugat la câmpul de rețetă selectat fără linii de pauză." } } }, "admin": { "maintenance": { - "storage-details": "Storage Details", - "page-title": "Site Maintenance", - "summary-title": "Summary", - "button-label-get-summary": "Get Summary", - "button-label-open-details": "Details", - "info-description-data-dir-size": "Data Directory Size", - "info-description-log-file-size": "Log File Size", - "info-description-cleanable-directories": "Cleanable Directories", - "info-description-cleanable-images": "Cleanable Images", + "storage-details": "Detalii stocare", + "page-title": "Mentenanță site", + "summary-title": "Rezumat", + "button-label-get-summary": "Obține Sumar", + "button-label-open-details": "Detalii", + "info-description-data-dir-size": "Mărime Folder de Date", + "info-description-log-file-size": "Dimensiune fișier jurnal", + "info-description-cleanable-directories": "Foldere ce pot fi curățate", + "info-description-cleanable-images": "Imagini ce pot fi curățate", "storage": { - "title-temporary-directory": "Temporary Directory (.temp)", - "title-backups-directory": "Backups Directory (backups)", - "title-groups-directory": "Groups Directory (groups)", - "title-recipes-directory": "Recipes Directory (recipes)", - "title-user-directory": "User Directory (user)" + "title-temporary-directory": "Folderul temporar (.temp)", + "title-backups-directory": "Folder de copii de rezervă (backups)", + "title-groups-directory": "Dosar de grupuri (grupuri)", + "title-recipes-directory": "Dosar de rețete (rețete)", + "title-user-directory": "Folder de utilizatori (utilizator)" }, - "action-delete-log-files-name": "Delete Log Files", - "action-delete-log-files-description": "Deletes all the log files", - "action-clean-directories-name": "Clean Directories", - "action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs", - "action-clean-temporary-files-name": "Clean Temporary Files", - "action-clean-temporary-files-description": "Removes all files and folders in the .temp directory", - "action-clean-images-name": "Clean Images", - "action-clean-images-description": "Removes all the images that don't end with .webp", - "actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.", - "actions-description-destructive": "destructive", - "actions-description-irreversible": "irreversible", - "logs-action-refresh": "Refresh Logs", - "logs-page-title": "Mealie Logs", - "logs-tail-lines-label": "Tail Lines" + "action-delete-log-files-name": "Ştergere fişiere jurnal", + "action-delete-log-files-description": "Şterge toate fişierele jurnal", + "action-clean-directories-name": "Dosare Curate", + "action-clean-directories-description": "Elimină toate folderele de rețete care nu sunt UUID-uri valide", + "action-clean-temporary-files-name": "Curăță Fișierele Temporare", + "action-clean-temporary-files-description": "Elimină toate fişierele şi folderele din folderul .temp", + "action-clean-images-name": "Curăță Imaginile", + "action-clean-images-description": "Elimină toate imaginile care nu se termină cu .webp", + "actions-description": "Acțiunile de întreținere sunt {destructive_in_bold} și trebuie utilizate cu precauție. Efectuarea oricăreia dintre aceste acțiuni este {irreversible_in_bold}.", + "actions-description-destructive": "distructiv", + "actions-description-irreversible": "ireversibil", + "logs-action-refresh": "Reîmprospătare Jurnale", + "logs-page-title": "Jurnale Mealie", + "logs-tail-lines-label": "Linii de final" }, "mainentance": { - "actions-title": "Actions" + "actions-title": "Acțiuni" }, - "ingredients-natural-language-processor": "Ingredients Natural Language Processor", - "ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.", - "ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.", + "ingredients-natural-language-processor": "Procesor de limbaj natural pentru ingrediente", + "ingredients-natural-language-processor-explanation": "Mealie utilizează Conditional Random Fields (CRFs) pentru a analiza și procesa ingredientele. Modelul folosit pentru ingrediente se bazează pe un set de date care conține peste 100.000 de ingrediente, compilat de New York Times. Rețineți că, deoarece modelul a fost antrenat doar în limba engleză, rezultatele pot varia atunci când este utilizat în alte limbi. Această pagină este un spațiu de testare pentru experimentarea cu modelul.", + "ingredients-natural-language-processor-explanation-2": "Nu este perfect, dar în general oferă rezultate foarte bune și reprezintă un punct de plecare solid pentru a analiza manual ingredientele în câmpuri individuale. Alternativ, puteți utiliza procesorul \"Brute\" care folosește o tehnică de potrivire a modelelor pentru a identifica ingredientele.", "nlp": "NLP", "brute": "Brute", "openai": "OpenAI", - "show-individual-confidence": "Show individual confidence", - "ingredient-text": "Ingredient Text", - "average-confident": "{0} Confident", - "try-an-example": "Try an example", + "show-individual-confidence": "Afișare încredere individuală", + "ingredient-text": "Textul ingredientului", + "average-confident": "{0} Încrezător", + "try-an-example": "Încearcă un exemplu", "parser": "Parser", - "background-tasks": "Background Tasks", - "background-tasks-description": "Here you can view all the running background tasks and their status", - "no-logs-found": "No Logs Found", - "tasks": "Tasks", + "background-tasks": "Sarcini de fundal", + "background-tasks-description": "Aici puteți vizualiza toate sarcinile de fundal care rulează și starea lor", + "no-logs-found": "Nu s-au găsit jurnale", + "tasks": "Sarcini", "setup": { - "first-time-setup": "First Time Setup", - "welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started", - "already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage", - "common-settings-for-new-sites": "Here are some common settings for new sites", - "setup-complete": "Setup Complete!", - "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", - "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", - "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." + "first-time-setup": "Configurare pentru prima dată", + "welcome-to-mealie-get-started": "Bine ai venit la Mealie! Să începem", + "already-set-up-bring-to-homepage": "Sunt deja configurat, du-mă direct la pagina principală", + "common-settings-for-new-sites": "Aici sunt câteva setări comune pentru noile site-uri", + "setup-complete": "Configurare finalizată!", + "here-are-a-few-things-to-help-you-get-started": "Aici sunt câteva lucruri care te ajută să începi cu Mealie", + "restore-from-v1-backup": "Aveţi o copie de rezervă dintr-o instanţă anterioară a lui Mealie v1? O puteţi restaura aici.", + "manage-profile-or-get-invite-link": "Gestionează-ți propriul profil, sau apasă un link de invitație pentru a distribui cu alții." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results", - "group-delete-note": "Groups with users or households cannot be deleted", - "household-delete-note": "Households with users cannot be deleted" + "debug-openai-services": "Depanare servicii OpenAI", + "debug-openai-services-description": "Utilizați această pagină pentru a depana serviciile OpenAI. Puteți testa conexiunea OpenAI și vedea rezultatele aici. Dacă aveți servicii de imagine activate, puteți de asemenea să furnizați o imagine.", + "run-test": "Rulează Testul", + "test-results": "Rezultate test", + "group-delete-note": "Grupurile cu utilizatori sau gospodării nu pot fi șterse", + "household-delete-note": "Gospodăriile cu utilizatorii nu pot fi șterse" }, "profile": { - "welcome-user": "👋 Welcome, {0}!", - "description": "Manage your profile, recipes, and group settings.", - "invite-link": "Invite Link", - "get-invite-link": "Get Invite Link", - "get-public-link": "Get Public Link", - "account-summary": "Account Summary", - "account-summary-description": "Here's a summary of your group's information.", - "group-statistics": "Group Statistics", - "group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.", - "household-statistics": "Household Statistics", - "household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.", - "storage-capacity": "Storage Capacity", - "storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.", + "welcome-user": "👋 Bine ai venit, {0}!", + "description": "Gestionează-ți profilul, rețetele și setările de grup.", + "invite-link": "Link de invitație", + "get-invite-link": "Obține link-ul de invitație", + "get-public-link": "Obțineți link-ul public", + "account-summary": "Sumar Cont", + "account-summary-description": "Iată un rezumat al informaţiilor grupului tău.", + "group-statistics": "Statistici Grup", + "group-statistics-description": "Statisticile Grupului Tău oferă informații despre cum folosești Mealie.", + "household-statistics": "Statistici Gospodărie", + "household-statistics-description": "Statisticile tale pentru gospodării oferă o perspectivă despre cum folosești Mealie.", + "storage-capacity": "Spațiu de stocare", + "storage-capacity-description": "Capacitatea ta de stocare este un calcul al imaginilor si al fișierelor pe care le-ai încărcat.", "personal": "Personal", - "personal-description": "These are settings that are personal to you. Changes here won't affect other users.", - "user-settings": "User Settings", - "user-settings-description": "Manage your preferences, change your password, and update your email.", - "api-tokens-description": "Manage your API Tokens for access from external applications.", - "group-description": "These items are shared within your group. Editing one of them will change it for the whole group!", - "group-settings": "Group Settings", - "group-settings-description": "Manage your common group settings, like privacy settings.", - "household-description": "These items are shared within your household. Editing one of them will change it for the whole household!", - "household-settings": "Household Settings", - "household-settings-description": "Manage your household settings, like mealplan and privacy settings.", - "cookbooks-description": "Manage a collection of recipe categories and generate pages for them.", - "members": "Members", - "members-description": "See who's in your household and manage their permissions.", + "personal-description": "Acestea sunt setări personale pentru tine. Modificările de aici nu vor afecta alţi utilizatori.", + "user-settings": "Setări utilizator", + "user-settings-description": "Gestionează-ți preferințele, schimbă-ți parola și actualizează adresa de e-mail.", + "api-tokens-description": "Gestionați tokenurile API pentru acces de la aplicațiile externe.", + "group-description": "Aceste elemente sunt partajate în cadrul grupului dvs. Editarea unuia dintre ele îl va schimba pentru întregul grup!", + "group-settings": "Setarile Grupului", + "group-settings-description": "Gestionează setările de grup obișnuite, cum ar fi setările de confidențialitate.", + "household-description": "Aceste elemente sunt partajate în gospodăria ta. Editarea unuia dintre ele o va schimba pentru întreaga gospodărie!", + "household-settings": "Setări pentru gospodărie", + "household-settings-description": "Gestionați setările pentru gospodărie cum ar fi planul de mese și setările de confidențialitate.", + "cookbooks-description": "Gestionează o colecție de categorii de rețete și generează pagini pentru ele.", + "members": "Membri", + "members-description": "Vezi cine se află în gospodăria ta și gestionează permisiunile lor.", "webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.", - "notifiers": "Notifiers", + "notifiers": "Notificatori", "notifiers-description": "Setup email and push notifications that trigger on specific events.", - "manage-data": "Manage Data", - "manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.", - "data-migrations": "Data Migrations", - "data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.", - "email-sent": "Email Sent", - "error-sending-email": "Error Sending Email", - "personal-information": "Personal Information", - "preferences": "Preferences", - "show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)", - "back-to-profile": "Back to Profile", - "looking-for-privacy-settings": "Looking for Privacy Settings?", - "manage-your-api-tokens": "Manage Your API Tokens", - "manage-user-profile": "Manage User Profile", - "manage-cookbooks": "Manage Cookbooks", - "manage-members": "Manage Members", - "manage-webhooks": "Manage Webhooks", - "manage-notifiers": "Manage Notifiers", - "manage-data-migrations": "Manage Data Migrations" + "manage-data": "Gestionează Datele", + "manage-data-description": "Gestionează-ți datele Mealie; Alimente, Unități, Categorii, Etichete și multe altele.", + "data-migrations": "Migrări de date", + "data-migrations-description": "Migrați datele existente din alte aplicații, cum ar fi rețetele Nextcloud și Chowdown.", + "email-sent": "E-mail trimis", + "error-sending-email": "Eroare la trimiterea e-mailului", + "personal-information": "Informații personale", + "preferences": "Preferințe", + "show-advanced-description": "Arată caracteristici avansate (Chei API, Webhook-uri și Administrare date)", + "back-to-profile": "Înapoi la profil", + "looking-for-privacy-settings": "Cauți setările de confidențialitate?", + "manage-your-api-tokens": "Gestionați tokenurile API", + "manage-user-profile": "Gestionare profil utilizator", + "manage-cookbooks": "Gestionare Cărți de Bucate", + "manage-members": "Gestionare Membri", + "manage-webhooks": "Gestionare Webhook-uri", + "manage-notifiers": "Gestionează notificatorii", + "manage-data-migrations": "Gestionați migrările de date" }, "cookbook": { - "cookbooks": "Cookbooks", - "description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", - "public-cookbook": "Public Cookbook", - "public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.", - "filter-options": "Filter Options", - "filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.", - "require-all-categories": "Require All Categories", - "require-all-tags": "Require All Tags", - "require-all-tools": "Require All Tools", - "cookbook-name": "Cookbook Name", - "cookbook-with-name": "Cookbook {0}", - "household-cookbook-name": "{0} Cookbook {1}", - "create-a-cookbook": "Create a Cookbook", - "cookbook": "Cookbook" + "cookbooks": "Cărţi de bucate", + "description": "Cărțile de bucate sunt o altă modalitate de a organiza rețete prin crearea unor secțiuni de rețete, organizatori, și alte filtre. Crearea unei carte de bucate va adăuga o înregistrare în bara laterală și toate rețetele cu filtrele alese vor fi afișate în carte de bucate.", + "hide-cookbooks-from-other-households": "Ascunde cărţile de bucate din alte gospodării", + "hide-cookbooks-from-other-households-description": "Când este activată, vor apărea doar cărți de bucate de la gospodăria ta pe bara laterală", + "public-cookbook": "Carte de bucate publică", + "public-cookbook-description": "Cărțile de bucate publice pot fi partajate cu utilizatorii care nu sunt pe mealie și vor fi afișate pe pagina grupurilor dvs.", + "filter-options": "Opțiuni filtrare", + "filter-options-description": "Atunci când este nevoie ca toate să fie selectate, cartea de bucate va include numai rețete care au toate articolele selectate. Acest lucru se aplică pentru fiecare subset de selectori și nu pentru o secțiune transversală a elementelor selectate.", + "require-all-categories": "Necesită toate categoriile", + "require-all-tags": "Necesită toate etichetele", + "require-all-tools": "Necesită toate ustensilele", + "cookbook-name": "Numele Cărţii de bucate", + "cookbook-with-name": "Cartea de bucate {0}", + "household-cookbook-name": "{0} carte de bucate {1}", + "create-a-cookbook": "Creează o carte de bucate", + "cookbook": "Carte de bucate" }, "query-filter": { "logical-operators": { - "and": "AND", - "or": "OR" + "and": "ȘI", + "or": "SAU" }, "relational-operators": { - "equals": "equals", - "does-not-equal": "does not equal", - "is-greater-than": "is greater than", - "is-greater-than-or-equal-to": "is greater than or equal to", - "is-less-than": "is less than", - "is-less-than-or-equal-to": "is less than or equal to" + "equals": "este egal cu", + "does-not-equal": "nu este egal cu", + "is-greater-than": "este mai mare ca", + "is-greater-than-or-equal-to": "este mai mare sau egală cu", + "is-less-than": "este mai mic decât", + "is-less-than-or-equal-to": "este mai mic sau egal cu" }, "relational-keywords": { - "is": "is", - "is-not": "is not", - "is-one-of": "is one of", - "is-not-one-of": "is not one of", - "contains-all-of": "contains all of", - "is-like": "is like", - "is-not-like": "is not like" + "is": "este", + "is-not": "nu este", + "is-one-of": "este unul din", + "is-not-one-of": "nu este unul din", + "contains-all-of": "conţine toate din", + "is-like": "este similar", + "is-not-like": "nu este similar" } } } diff --git a/mealie/lang/messages/hu-HU.json b/mealie/lang/messages/hu-HU.json index e31d01c89..e2c199c43 100644 --- a/mealie/lang/messages/hu-HU.json +++ b/mealie/lang/messages/hu-HU.json @@ -11,7 +11,7 @@ }, "servings-text": { "makes": "Makes", - "serves": "Serves", + "serves": "Adag", "serving": "Adag", "servings": "Adag", "yield": "Yield", diff --git a/mealie/lang/messages/ro-RO.json b/mealie/lang/messages/ro-RO.json index 8c1829958..95bb62b48 100644 --- a/mealie/lang/messages/ro-RO.json +++ b/mealie/lang/messages/ro-RO.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "Numele rețetei trebuie să fie unic", - "recipe-created": "Recipe Created", + "recipe-created": "Rețetă creată", "recipe-defaults": { - "ingredient-note": "1 Cup Flour", - "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" + "ingredient-note": "1 Cană de Făină", + "step-text": "Pașii rețetei precum și alte domenii din sintaxa markdown de pe pagina de rețetă.\n\n**Adăugați un link**\n\n[Link-ul meu](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "Creează", + "serves": "Servește", + "serving": "Porție", + "servings": "Porții", + "yield": "Recoltă", + "yields": "Producţii" } }, "mealplan": { @@ -46,35 +46,35 @@ "generic-deleted": "{name} a fost șters" }, "datetime": { - "year": "year|years", - "day": "day|days", - "hour": "hour|hours", - "minute": "minute|minutes", - "second": "second|seconds", - "millisecond": "millisecond|milliseconds", - "microsecond": "microsecond|microseconds" + "year": "an|ani", + "day": "zi|zile", + "hour": "oră|ore", + "minute": "minut|minute", + "second": "secundă|secunde", + "millisecond": "milisecundă|milisecunde", + "microsecond": "microsecundă|microsecunde" }, "emails": { "password": { - "subject": "Mealie Forgot Password", - "header_text": "Forgot Password", - "message_top": "You have requested to reset your password.", - "message_bottom": "Please click the button above to reset your password.", - "button_text": "Reset Password" + "subject": "Mealie Parolă Uitată", + "header_text": "Am uitat parola", + "message_top": "Ai solicitat resetarea parolei.", + "message_bottom": "Vă rugăm să faceţi clic pe butonul de mai sus pentru a reseta parola.", + "button_text": "Resetare parolă" }, "invitation": { - "subject": "Invitation to join Mealie", - "header_text": "You're Invited!", - "message_top": "You have been invited to join Mealie.", - "message_bottom": "Please click the button above to accept the invitation.", - "button_text": "Accept Invitation" + "subject": "Invitație de a te alătura Mealie", + "header_text": "Ești invitat!", + "message_top": "Ai fost invitat să te alături lui Mealie.", + "message_bottom": "Vă rugăm să faceţi clic pe butonul de mai sus pentru a accepta invitaţia.", + "button_text": "Acceptă invitația" }, "test": { - "subject": "Mealie Test Email", - "header_text": "Test Email", - "message_top": "This is a test email.", - "message_bottom": "Please click the button above to test the email.", - "button_text": "Open Mealie" + "subject": "E-mail test Mealie", + "header_text": "Email de test", + "message_top": "Acesta este un e-mail de test.", + "message_bottom": "Vă rugăm să faceţi clic pe butonul de mai sus pentru a testa e-mailul.", + "button_text": "Deschide Mealie" } } } diff --git a/mealie/repos/seed/resources/foods/locales/hu-HU.json b/mealie/repos/seed/resources/foods/locales/hu-HU.json index bb4126076..0bdd500d3 100644 --- a/mealie/repos/seed/resources/foods/locales/hu-HU.json +++ b/mealie/repos/seed/resources/foods/locales/hu-HU.json @@ -650,7 +650,7 @@ }, "turnip": { "name": "fehér répa", - "plural_name": "turnips" + "plural_name": "fehérrépa" }, "unrefined-sugar": { "name": "finomitatlan cukor" @@ -670,7 +670,7 @@ }, "white-mushroom": { "name": "fehér gomba", - "plural_name": "white mushrooms" + "plural_name": "fehér gomba" }, "white-sugar": { "name": "fehér cukor" diff --git a/mealie/repos/seed/resources/foods/locales/it-IT.json b/mealie/repos/seed/resources/foods/locales/it-IT.json index 923c586e6..8db917eb8 100644 --- a/mealie/repos/seed/resources/foods/locales/it-IT.json +++ b/mealie/repos/seed/resources/foods/locales/it-IT.json @@ -285,7 +285,7 @@ "name": "fruttosio" }, "ful": { - "name": "ful" + "name": "ful medames" }, "garam-masala": { "name": "garam masala" @@ -337,7 +337,7 @@ }, "jackfruit": { "name": "iaca", - "plural_name": "jackfruits" + "plural_name": "jackfruit" }, "jaggery": { "name": "jaggery" diff --git a/mealie/repos/seed/resources/foods/locales/ro-RO.json b/mealie/repos/seed/resources/foods/locales/ro-RO.json index 500e4148f..7f5c588e7 100644 --- a/mealie/repos/seed/resources/foods/locales/ro-RO.json +++ b/mealie/repos/seed/resources/foods/locales/ro-RO.json @@ -1,22 +1,22 @@ { "acorn-squash": { - "name": "acorn squash" + "name": "dovleac ghindă" }, "alfalfa-sprouts": { - "name": "alfalfa sprouts" + "name": "vlăstari de lucernă" }, "anchovies": { - "name": "anchovies" + "name": "anșoa" }, "apples": { "name": "mere", - "plural_name": "apples" + "plural_name": "mere" }, "artichoke": { - "name": "artichoke" + "name": "anghinare" }, "arugula": { - "name": "arugula" + "name": "rucola" }, "asparagus": { "name": "sparanghel" @@ -35,10 +35,10 @@ "name": "bicarbonat de sodiu" }, "baking-sugar": { - "name": "baking sugar" + "name": "zahăr pudră" }, "bar-sugar": { - "name": "bar sugar" + "name": "zahăr fin" }, "basil": { "name": "busuioc" @@ -48,34 +48,34 @@ }, "bell-peppers": { "name": "ardei gras", - "plural_name": "bell peppers" + "plural_name": "ardei gras" }, "blackberries": { "name": "mure" }, "bok-choy": { - "name": "bok choy" + "name": "varză chinezească" }, "brassicas": { - "name": "brassicas" + "name": "brasicacee" }, "bread": { "name": "pâine" }, "breadfruit": { - "name": "breadfruit" + "name": "fructul de pâine" }, "broccoflower": { "name": "broccoflower" }, "broccoli": { - "name": "broccoli" + "name": "brocoli" }, "broccoli-rabe": { - "name": "broccoli rabe" + "name": "broccoli asiatic" }, "broccolini": { - "name": "broccolini" + "name": "broccoli tânăr" }, "brown-sugar": { "name": "zahăr brun" @@ -87,14 +87,14 @@ "name": "unt" }, "butternut-pumpkin": { - "name": "butternut pumpkin" + "name": "dovleac plăcintar" }, "butternut-squash": { - "name": "butternut squash" + "name": "dovleac butternut" }, "cabbage": { "name": "varză", - "plural_name": "cabbages" + "plural_name": "verze" }, "cactus-edible": { "name": "cactus, comestibil" @@ -103,33 +103,33 @@ "name": "calabrese" }, "cane-sugar": { - "name": "cane sugar" + "name": "zahăr din trestie" }, "cannabis": { - "name": "cannabis" + "name": "canabis" }, "capsicum": { - "name": "capsicum" + "name": "ardei gras" }, "caraway": { - "name": "caraway" + "name": "chimen" }, "carrot": { "name": "morcov", - "plural_name": "carrots" + "plural_name": "morcovi" }, "caster-sugar": { - "name": "caster sugar" + "name": "zahăr tos fin" }, "castor-sugar": { - "name": "castor sugar" + "name": "zahăr tos fin" }, "catfish": { "name": "somn" }, "cauliflower": { "name": "conopidă", - "plural_name": "cauliflowers" + "plural_name": "conopidă" }, "cayenne-pepper": { "name": "piper cayenne" @@ -141,10 +141,10 @@ "name": "țelină" }, "cereal-grains": { - "name": "cereal grains" + "name": "boabe de cereale" }, "chard": { - "name": "chard" + "name": "sfeclă elvețiană" }, "cheese": { "name": "brânză" @@ -154,10 +154,10 @@ }, "chilli-peppers": { "name": "ardei iuţi", - "plural_name": "chilli peppers" + "plural_name": "ardei iuți" }, "chinese-leaves": { - "name": "chinese leaves" + "name": "frunze chinezești" }, "chives": { "name": "arpagic" @@ -172,11 +172,11 @@ "name": "scorţişoară" }, "clarified-butter": { - "name": "clarified butter" + "name": "unt clarificat sau ghee" }, "coconut": { "name": "nucă de cocos", - "plural_name": "coconuts" + "plural_name": "nuci de cocos" }, "coconut-milk": { "name": "lapte de cocos" @@ -188,49 +188,49 @@ "name": "cafea" }, "collard-greens": { - "name": "collard greens" + "name": "varză creață" }, "confectioners-sugar": { - "name": "confectioners' sugar" + "name": "zahăr pudră" }, "coriander": { "name": "coriandru" }, "corn": { "name": "porumb", - "plural_name": "corns" + "plural_name": "porumbi" }, "corn-syrup": { "name": "sirop de porumb" }, "cottonseed-oil": { - "name": "cottonseed oil" + "name": "ulei de bumbac" }, "courgette": { "name": "dovlecel" }, "cream-of-tartar": { - "name": "cream of tartar" + "name": "cremă de tartar" }, "cucumber": { "name": "castravete", - "plural_name": "cucumbers" + "plural_name": "castraveți" }, "cumin": { "name": "chimion" }, "daikon": { - "name": "ridiche albă", - "plural_name": "daikons" + "name": "ridiche asiatică", + "plural_name": "ridichi asiatice" }, "dairy-products-and-dairy-substitutes": { "name": "produse lactate şi înlocuitori ai acestora" }, "dandelion": { - "name": "dandelion" + "name": "păpădie" }, "demerara-sugar": { - "name": "demerara sugar" + "name": "zahăr demerara" }, "dough": { "name": "aluat" @@ -240,40 +240,40 @@ }, "eggplant": { "name": "vânătă", - "plural_name": "eggplants" + "plural_name": "vinete" }, "eggs": { "name": "ouă", - "plural_name": "eggs" + "plural_name": "ouă" }, "endive": { "name": "andivă", - "plural_name": "endives" + "plural_name": "andive" }, "fats": { "name": "grăsimi" }, "fava-beans": { - "name": "fava beans" + "name": "bob" }, "fiddlehead": { - "name": "fiddlehead" + "name": "frunze tinere de ferigă" }, "fiddlehead-fern": { - "name": "fiddlehead fern", - "plural_name": "fiddlehead ferns" + "name": "frunză tânără de ferigă", + "plural_name": "frunze tinere de ferigă" }, "fish": { "name": "peşte" }, "five-spice-powder": { - "name": "five spice powder" + "name": "amestec de cinci condimente" }, "flour": { "name": "făină" }, "frisee": { - "name": "frisee" + "name": "salată frisée" }, "fructose": { "name": "fructoză" @@ -282,7 +282,7 @@ "name": "fruct" }, "fruit-sugar": { - "name": "fruit sugar" + "name": "zahăr din fructe" }, "ful": { "name": "ful" @@ -292,42 +292,42 @@ }, "garlic": { "name": "usturoi", - "plural_name": "garlics" + "plural_name": "usturoi" }, "gem-squash": { - "name": "gem squash" + "name": "dovleac gem" }, "ghee": { "name": "ghee" }, "giblets": { - "name": "giblets" + "name": "măruntaie" }, "ginger": { "name": "ghimbir" }, "grains": { - "name": "grains" + "name": "cereale" }, "granulated-sugar": { - "name": "granulated sugar" + "name": "zahăr granulat" }, "grape-seed-oil": { - "name": "grape seed oil" + "name": "ulei de semințe de struguri" }, "green-onion": { "name": "ceapă verde", - "plural_name": "green onions" + "plural_name": "cepe verzi" }, "heart-of-palm": { - "name": "heart of palm", - "plural_name": "heart of palms" + "name": "miez de palmier", + "plural_name": "miezuri de palmier" }, "hemp": { "name": "cânepă" }, "herbs": { - "name": "herbs" + "name": "ierburi" }, "honey": { "name": "miere" @@ -337,25 +337,25 @@ }, "jackfruit": { "name": "jackfruit", - "plural_name": "jackfruits" + "plural_name": "jackfruit-uri" }, "jaggery": { - "name": "jaggery" + "name": "zahăr brun nerafinat" }, "jams": { - "name": "jams" + "name": "gemuri" }, "jellies": { - "name": "jellies" + "name": "jeleuri" }, "jerusalem-artichoke": { - "name": "jerusalem artichoke" + "name": "anghinare de ierusalim" }, "jicama": { - "name": "jicama" + "name": "nap mexican" }, "kale": { - "name": "kale" + "name": "varză furajeră" }, "kohlrabi": { "name": "gulie" @@ -364,27 +364,27 @@ "name": "kumara" }, "leavening-agents": { - "name": "leavening agents" + "name": "agenți de dospire" }, "leek": { - "name": "leek", - "plural_name": "leeks" + "name": "praz", + "plural_name": "praz" }, "legumes": { - "name": "legumes" + "name": "leguminoase" }, "lemongrass": { - "name": "lemongrass" + "name": "iarbă de lămâie" }, "lentils": { "name": "linte" }, "lettuce": { - "name": "lettuce" + "name": "salată" }, "liver": { "name": "ficat", - "plural_name": "livers" + "plural_name": "ficaţi" }, "maize": { "name": "porumb" @@ -403,13 +403,13 @@ }, "mushroom": { "name": "ciupercă", - "plural_name": "mushrooms" + "plural_name": "ciuperci" }, "mussels": { "name": "midii" }, "nanaimo-bar-mix": { - "name": "nanaimo bar mix" + "name": "amestec pentru prăjitura nanaimo" }, "nori": { "name": "nori" @@ -418,20 +418,20 @@ "name": "nucşoară" }, "nutritional-yeast-flakes": { - "name": "nutritional yeast flakes" + "name": "fulgi de drojdie nutritivă" }, "nuts": { "name": "nuci" }, "octopuses": { "name": "caracatiţe", - "plural_name": "octopuses" + "plural_name": "caracatiţe" }, "oils": { "name": "uleiuri" }, "okra": { - "name": "okra" + "name": "bame" }, "olive": { "name": "măslină" @@ -443,14 +443,14 @@ "name": "ceapă" }, "onion-family": { - "name": "onion family" + "name": "familie de ceapă" }, "orange-blossom-water": { - "name": "orange blossom water" + "name": "apă de flori de portocal" }, "oranges": { "name": "portocale", - "plural_name": "oranges" + "plural_name": "portocale" }, "oregano": { "name": "oregano" @@ -459,60 +459,60 @@ "name": "stridii" }, "panch-puran": { - "name": "panch puran" + "name": "amestec de condimente indiene" }, "paprika": { - "name": "paprika" + "name": "boia" }, "parsley": { - "name": "parsley" + "name": "pătrunjel" }, "parsnip": { "name": "păstârnac", - "plural_name": "parsnips" + "plural_name": "păstârnac" }, "pear": { "name": "pară", - "plural_name": "pears" + "plural_name": "pere" }, "peas": { - "name": "peas" + "name": "mazăre" }, "pepper": { "name": "piper", - "plural_name": "peppers" + "plural_name": "ardei" }, "pineapple": { "name": "ananas", - "plural_name": "pineapples" + "plural_name": "ananas" }, "plantain": { - "name": "plantain", - "plural_name": "plantains" + "name": "banană", + "plural_name": "banane" }, "poppy-seeds": { "name": "semințe de mac" }, "potato": { "name": "cartof", - "plural_name": "potatoes" + "plural_name": "cartofi" }, "poultry": { - "name": "poultry" + "name": "carne de pasăre" }, "powdered-sugar": { "name": "zahăr praf" }, "pumpkin": { "name": "dovleac", - "plural_name": "pumpkins" + "plural_name": "dovleci" }, "pumpkin-seeds": { "name": "semințe de dovleac" }, "radish": { "name": "ridiche", - "plural_name": "radishes" + "plural_name": "ridichi" }, "raw-sugar": { "name": "zahăr brut" @@ -527,7 +527,7 @@ "name": "făină de orez" }, "rock-sugar": { - "name": "rock sugar" + "name": "zahăr cristalizat" }, "rum": { "name": "rom" @@ -539,11 +539,11 @@ "name": "sare" }, "salt-cod": { - "name": "salt cod" + "name": "cod sărat" }, "scallion": { - "name": "scallion", - "plural_name": "scallions" + "name": "ceapă verde", + "plural_name": "cepe verzi" }, "seafood": { "name": "fruct de mare" @@ -555,27 +555,27 @@ "name": "semințe de susan" }, "shallot": { - "name": "shallot", - "plural_name": "shallots" + "name": "eșalotă", + "plural_name": "eșalote" }, "skate": { - "name": "skate" + "name": "pește patin" }, "soda": { - "name": "soda" + "name": "băutură carbogazoasă" }, "soda-baking": { - "name": "soda, baking" + "name": "bicarbonat de sodiu" }, "soybean": { "name": "boabe de soia" }, "spaghetti-squash": { - "name": "spaghetti squash", - "plural_name": "spaghetti squashes" + "name": "dovleac spaghetti", + "plural_name": "dovlecei spaghetti" }, "speck": { - "name": "speck" + "name": "speck jambon crud-uscat" }, "spices": { "name": "condimente" @@ -584,39 +584,39 @@ "name": "spanac" }, "spring-onion": { - "name": "spring onion", - "plural_name": "spring onions" + "name": "ceapă verde", + "plural_name": "cepe verzi" }, "squash": { - "name": "squash", - "plural_name": "squashes" + "name": "dovleac", + "plural_name": "dovleci" }, "squash-family": { - "name": "squash family" + "name": "familia dovleacului" }, "stockfish": { - "name": "stockfish" + "name": "pește uscat" }, "sugar": { - "name": "sugar" + "name": "zahăr" }, "sunchoke": { - "name": "sunchoke", - "plural_name": "sunchokes" + "name": "topinambur", + "plural_name": "topinamburi" }, "sunflower-seeds": { "name": "semințe de floarea-soarelui" }, "superfine-sugar": { - "name": "superfine sugar" + "name": "zahăr extrafin" }, "sweet-potato": { "name": "cartof dulce", - "plural_name": "sweet potatoes" + "plural_name": "cartofi dulci" }, "sweetcorn": { "name": "porumb dulce", - "plural_name": "sweetcorns" + "plural_name": "porumb dulce" }, "sweeteners": { "name": "îndulcitori" @@ -626,51 +626,51 @@ }, "taro": { "name": "taro", - "plural_name": "taroes" + "plural_name": "tarouri" }, "teff": { "name": "teff" }, "tomato": { "name": "roșie", - "plural_name": "tomatoes" + "plural_name": "roșii" }, "trout": { "name": "păstrăv" }, "tubers": { - "name": "tuber", - "plural_name": "tubers" + "name": "tubercul", + "plural_name": "tuberculi" }, "tuna": { "name": "ton" }, "turbanado-sugar": { - "name": "turbanado sugar" + "name": "zahăr brut" }, "turnip": { "name": "nap", - "plural_name": "turnips" + "plural_name": "napi" }, "unrefined-sugar": { "name": "zahăr nerafinat" }, "vanilla": { - "name": "vanilla" + "name": "vanilie" }, "vegetables": { "name": "legume" }, "watercress": { - "name": "watercress" + "name": "năsturel" }, "watermelon": { "name": "pepene", - "plural_name": "watermelons" + "plural_name": "pepeni verzi" }, "white-mushroom": { "name": "ciupercă albă", - "plural_name": "white mushrooms" + "plural_name": "ciuperci albe" }, "white-sugar": { "name": "zahăr alb" @@ -679,14 +679,14 @@ "name": "gumă xanthan" }, "yam": { - "name": "yam", - "plural_name": "yams" + "name": "cartof dulce", + "plural_name": "cartofi dulci" }, "yeast": { "name": "drojdie" }, "zucchini": { - "name": "zucchini", - "plural_name": "zucchinis" + "name": "dovlecel", + "plural_name": "dovlecei" } } \ No newline at end of file diff --git a/mealie/repos/seed/resources/units/locales/ro-RO.json b/mealie/repos/seed/resources/units/locales/ro-RO.json index bd1725b0b..00eacc6ff 100644 --- a/mealie/repos/seed/resources/units/locales/ro-RO.json +++ b/mealie/repos/seed/resources/units/locales/ro-RO.json @@ -1,140 +1,140 @@ { "teaspoon": { - "name": "linguriţă", - "plural_name": "teaspoons", + "name": "linguriță", + "plural_name": "lingurițe", "description": "", - "abbreviation": "tsp" + "abbreviation": "lț" }, "tablespoon": { "name": "lingură", - "plural_name": "tablespoons", + "plural_name": "linguri", "description": "", "abbreviation": "tbsp" }, "cup": { - "name": "cup", - "plural_name": "cups", + "name": "cană", + "plural_name": "căni", "description": "", "abbreviation": "c" }, "fluid-ounce": { - "name": "fluid ounce", - "plural_name": "fluid ounces", + "name": "uncie fluidă", + "plural_name": "uncii fluide", "description": "", "abbreviation": "fl oz" }, "pint": { "name": "halbă", - "plural_name": "pints", + "plural_name": "halbă", "description": "", "abbreviation": "pt" }, "quart": { "name": "quart", - "plural_name": "quarts", + "plural_name": "sferturi de galon", "description": "", "abbreviation": "qt" }, "gallon": { "name": "galon", - "plural_name": "gallons", + "plural_name": "galoane", "description": "", "abbreviation": "gal" }, "milliliter": { "name": "mililitru", - "plural_name": "milliliters", + "plural_name": "mililitri", "description": "", "abbreviation": "ml" }, "liter": { "name": "litru", - "plural_name": "liters", + "plural_name": "litri", "description": "", "abbreviation": "l" }, "pound": { "name": "livră", - "plural_name": "pounds", + "plural_name": "livre", "description": "", "abbreviation": "lb", - "plural_abbreviation": "lbs" + "plural_abbreviation": "lb" }, "ounce": { "name": "uncie", - "plural_name": "ounces", + "plural_name": "uncii", "description": "", "abbreviation": "uncii" }, "gram": { "name": "gram", - "plural_name": "grams", + "plural_name": "grame", "description": "", "abbreviation": "h" }, "kilogram": { "name": "kilogram", - "plural_name": "kilograms", + "plural_name": "kilograme", "description": "", "abbreviation": "kg" }, "milligram": { "name": "miligram", - "plural_name": "milligrams", + "plural_name": "miligrame", "description": "", "abbreviation": "mg" }, "splash": { - "name": "splash", - "plural_name": "splashes", + "name": "strop", + "plural_name": "stropi", "description": "", "abbreviation": "" }, "dash": { - "name": "dash", - "plural_name": "dashes", + "name": "linie", + "plural_name": "linii", "description": "", "abbreviation": "" }, "serving": { - "name": "serving", - "plural_name": "servings", + "name": "porție", + "plural_name": "porții", "description": "", "abbreviation": "" }, "head": { - "name": "head", - "plural_name": "heads", + "name": "căpățână", + "plural_name": "căpățâni", "description": "", "abbreviation": "" }, "clove": { - "name": "clove", - "plural_name": "cloves", + "name": "cățel", + "plural_name": "căței", "description": "", "abbreviation": "" }, "can": { "name": "cutie", - "plural_name": "cans", + "plural_name": "cutii", "description": "", "abbreviation": "" }, "bunch": { - "name": "bunch", - "plural_name": "bunches", + "name": "legătură", + "plural_name": "legături", "description": "", "abbreviation": "" }, "pack": { - "name": "pack", - "plural_name": "packs", + "name": "pachet", + "plural_name": "pachete", "description": "", "abbreviation": "" }, "pinch": { - "name": "pinch", - "plural_name": "pinches", + "name": "praf", + "plural_name": "prafuri", "description": "", "abbreviation": "" } From bfa3a3e8263d5e0f165fe1b71e5a777c913dac88 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:27:41 +0000 Subject: [PATCH 17/46] fix(deps): update dependency apprise to v1.9.2 (#4867) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 97840a1a5..ba3ed04a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -88,13 +88,13 @@ files = [ [[package]] name = "apprise" -version = "1.9.1" +version = "1.9.2" description = "Push Notifications that work with just about every platform!" optional = false python-versions = ">=3.6" files = [ - {file = "apprise-1.9.1-py3-none-any.whl", hash = "sha256:0792954fbd4d92233b2b481bcbfed2c20b62a193f5565b25c4a369d4a3a8ce85"}, - {file = "apprise-1.9.1.tar.gz", hash = "sha256:79ecd02c41d86dffd211bb35cc5c06c846e777041abe1d0701f989980de44689"}, + {file = "apprise-1.9.2-py3-none-any.whl", hash = "sha256:52bd580058d8534b204bfc9ca53b5810c6a935d1bed7c463147e244b2c93362b"}, + {file = "apprise-1.9.2.tar.gz", hash = "sha256:290eb1217028dd5040802371494d70c1bcab907e6634a77c263489dbe4fd73a8"}, ] [package.dependencies] From 357e45c26411425021ce5acbc7d2f03fdeee3830 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:40:18 +0000 Subject: [PATCH 18/46] fix(deps): update dependency pydantic to v2.10.5 (#4870) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index ba3ed04a5..167e32a81 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2058,13 +2058,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.4" +version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, - {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, + {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, + {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] [package.dependencies] From 9918d36a1abdfb24cb6fd6de40e6be4da542ef55 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:55:33 -0600 Subject: [PATCH 19/46] chore(deps): update dependency pytest-asyncio to v0.25.2 (#4863) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 167e32a81..a2962ef77 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2362,13 +2362,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.25.1" +version = "0.25.2" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" files = [ - {file = "pytest_asyncio-0.25.1-py3-none-any.whl", hash = "sha256:c84878849ec63ff2ca509423616e071ef9cd8cc93c053aa33b5b8fb70a990671"}, - {file = "pytest_asyncio-0.25.1.tar.gz", hash = "sha256:79be8a72384b0c917677e00daa711e07db15259f4d23203c59012bcd989d4aee"}, + {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, + {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, ] [package.dependencies] From 25bd742903bb21d1f0a086db86a1179e3b0f66d1 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:07:46 -0600 Subject: [PATCH 20/46] chore(l10n): New Crowdin updates (#4875) --- frontend/lang/messages/da-DK.json | 34 +- frontend/lang/messages/et-EE.json | 306 +++++++++--------- frontend/lang/messages/hu-HU.json | 4 +- frontend/lang/messages/ro-RO.json | 10 +- mealie/lang/messages/da-DK.json | 6 +- mealie/lang/messages/hu-HU.json | 4 +- .../seed/resources/foods/locales/da-DK.json | 10 +- .../seed/resources/foods/locales/hu-HU.json | 18 +- .../seed/resources/units/locales/da-DK.json | 2 +- 9 files changed, 197 insertions(+), 197 deletions(-) diff --git a/frontend/lang/messages/da-DK.json b/frontend/lang/messages/da-DK.json index 2621480eb..d788f610d 100644 --- a/frontend/lang/messages/da-DK.json +++ b/frontend/lang/messages/da-DK.json @@ -277,7 +277,7 @@ "admin-group-management-text": "Ændringer i denne gruppe vil træde i kraft øjeblikkeligt.", "group-id-value": "Gruppe-ID: {0}", "total-households": "Husholdninger i Alt", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "you-must-select-a-group-before-selecting-a-household": "Du skal vælge en gruppe, før du vælger en husstand" }, "household": { "household": "Husholdning", @@ -665,21 +665,21 @@ "not-linked-ingredients": "Additional Ingredients" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", + "recipe-finder": "Opskrift Finder", "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", + "selected-ingredients": "Valgte Ingredienser", + "no-ingredients-selected": "Ingen ingredienser valgt", + "missing": "Mangler", + "no-recipes-found": "Ingen opskrifter fundet", + "no-recipes-found-description": "Prøv at tilføje flere ingredienser til din søgning eller justere dine filtre", + "include-ingredients-on-hand": "Inkluder ingredienser du allerede har", + "include-tools-on-hand": "Inkluder værktøjer du allerede har", + "max-missing-ingredients": "Maksimum Manglende Ingredienser", "max-missing-tools": "Max Missing Tools", "selected-tools": "Selected Tools", - "other-filters": "Other Filters", - "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "other-filters": "Andre filtre", + "ready-to-make": "Klar til at lave", + "almost-ready-to-make": "Næsten klar til at lave" }, "search": { "advanced-search": "Avanceret søgning", @@ -884,7 +884,7 @@ "are-you-sure-you-want-to-check-all-items": "Er du sikker på, at du vil markere alle elementer?", "are-you-sure-you-want-to-uncheck-all-items": "Er du sikker på, at du vil fjerne markeringen af alle elementer?", "are-you-sure-you-want-to-delete-checked-items": "Er du sikker på, at du vil sletter de valgte elementer?", - "no-shopping-lists-found": "No Shopping Lists Found" + "no-shopping-lists-found": "Ingen Indkøbslister fundet" }, "sidebar": { "all-recipes": "Alle opskr.", @@ -1296,7 +1296,7 @@ "profile": { "welcome-user": "👋 Velkommen, {0}!", "description": "Administrer din profil, opskrifter og gruppeindstillinger.", - "invite-link": "Invite Link", + "invite-link": "Invitationslink", "get-invite-link": "Få Invitationslink", "get-public-link": "Offentligt link", "account-summary": "Kontooversigt", @@ -1346,8 +1346,8 @@ "cookbook": { "cookbooks": "Kogebøger", "description": "Kogebøger er en anden måde at organisere opskrifter ved at skabe tværsnit af opskrifter, arrangører, og andre filtre. Oprettelse af en kogebog vil tilføje et link i sidemenuen, og alle opskrifter med de valgte filtre vil blive vist i kogebogen.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "hide-cookbooks-from-other-households": "Skjul kogebøger fra andre husholdninger", + "hide-cookbooks-from-other-households-description": "Når aktiveret, kun kogebøger fra din husstand vises på sidepanelet", "public-cookbook": "Offentlig kogebog", "public-cookbook-description": "Offentlige kogebøger kan deles med personer, der ikke er oprettet som brugere i Mealie og vil blive vist på din gruppe side.", "filter-options": "Filtreringsindstillinger", diff --git a/frontend/lang/messages/et-EE.json b/frontend/lang/messages/et-EE.json index 6e3f0d320..5c145c3ec 100644 --- a/frontend/lang/messages/et-EE.json +++ b/frontend/lang/messages/et-EE.json @@ -801,177 +801,177 @@ "remove-unused": "Eemalda kasutuseta", "title-case-all": "Kirjutada kõik suurelt", "toolbox": "Tööriistakast", - "unorganized": "Unorganized" + "unorganized": "Organiseerimata" }, "webhooks": { - "test-webhooks": "Test Webhooks", - "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at", - "webhook-url": "Webhook URL", - "webhooks-caps": "WEBHOOKS", - "webhooks": "Webhooks", - "webhook-name": "Webhook Name", - "description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled." + "test-webhooks": "Testi Webhooke", + "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Allpool loetletud URL-id saavad järjekorra alusel Webhooke, mis sisaldavad toitumisplaanis olevaid retsepti andmeid. Praegu töötavad veebihaagid aadressil", + "webhook-url": "Webhooki URL", + "webhooks-caps": "WEBHOOKID", + "webhooks": "Webhookid", + "webhook-name": "Webhooki nimi", + "description": "Allolevad veebihaagid käivitatakse siis, kui päevaks on määratud toidukord. Kindlal kellaajal saadetakse webhookid koos päeva retseptiinfoga. Webhookide teostamise aeg pole täpne, kuid neid teostatakse iga viie minuti tagant." }, - "bug-report": "Bug Report", - "bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.", + "bug-report": "Vearaport", + "bug-report-information": "Kasuta seda informatsiooni vearaporti koostamiseks. Sinu instantsi detailide edastamine arendajatele on parim meetod sinu probleemi kiireks lahendamiseks.", "tracker": "Tracker", - "configuration": "Configuration", - "docker-volume": "Docker Volume", - "docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.", - "volumes-are-misconfigured": "Volumes are misconfigured.", - "volumes-are-configured-correctly": "Volumes are configured correctly.", - "status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.", - "validate": "Validate", - "email-configuration-status": "Email Configuration Status", - "email-configured": "Email Configured", - "email-test-results": "Email Test Results", - "ready": "Ready", - "not-ready": "Not Ready - Check Environmental Variables", - "succeeded": "Succeeded", - "failed": "Failed", - "general-about": "General About", - "application-version": "Application Version", - "application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).", - "mealie-is-up-to-date": "Mealie is up to date", - "secure-site": "Secure Site", - "secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.", - "secure-site-success-text": "Site is accessed by localhost or https", - "server-side-base-url": "Server Side Base URL", - "server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.", - "server-side-base-url-success-text": "Server Side URL does not match the default", - "ldap-ready": "LDAP Ready", - "ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.", - "ldap-ready-success-text": "Required LDAP variables are all set.", + "configuration": "Konfiguratsioon", + "docker-volume": "Dockeri failisüsteem", + "docker-volume-help": "Mealie nõuab, et frontendi konteiner ja taustaprogramm jagaksid sama Dockeri failisüsteemi või salvestusruumi. See tagab, et frontendi konteiner pääseb korralikult juurde kettale salvestatud piltidele ja ressurssidele.", + "volumes-are-misconfigured": "Failisüsteemid on valesti konfigureeritud.", + "volumes-are-configured-correctly": "Failisüsteemid on õigesti konfigureeritud", + "status-unknown-try-running-a-validation": "Olek teadmata. Proovi valideerida. ", + "validate": "Valideeri", + "email-configuration-status": "Emaili konfiguratsiooni olek", + "email-configured": "Email konfigureeritud", + "email-test-results": "Emaili testi tulemused", + "ready": "Valmis", + "not-ready": "Ei ole valmis - kontrolli keskkonna muutujaid", + "succeeded": "Õnnestus", + "failed": "Ebaõnnestus", + "general-about": "Üldine info", + "application-version": "Rakenduse versioon", + "application-version-error-text": "Sinu praegune versioon ({0}) ei ühti viimatise väljalaskega. Kaalu uuendamist viimatisele versioonile ({1}).", + "mealie-is-up-to-date": "Mealie on ajakohane", + "secure-site": "Turvaline lehekülg", + "secure-site-error-text": "Esitage kohaliku või turvalise serveri kaudu, kasutades https-i. Lõikelaud ja muud brauseri API-d ei pruugi töötada.", + "secure-site-success-text": "Lehekülge külastatakse läbi localhost-i või hhtps-i", + "server-side-base-url": "Serveri poolne baas-URL", + "server-side-base-url-error-text": "„BASE_URL” on API serveri vaikeväärtus. See põhjustab probleeme e-kirjade jms jaoks serveris loodud teavituslinkidega.", + "server-side-base-url-success-text": "Serveri poole URL ei kattu vaikeväärtusega", + "ldap-ready": "LDAP valmis", + "ldap-ready-error-text": "Kõik LDAP väärtused ei ole konfigureeritud.Seda teadet võib ignoreerida kui sa ei kasuta autentimist LDAPiga.", + "ldap-ready-success-text": "Kõigile LDAP muutujatele on väärtused seatud.", "build": "Build", - "recipe-scraper-version": "Recipe Scraper Version", - "oidc-ready": "OIDC Ready", - "oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.", - "oidc-ready-success-text": "Required OIDC variables are all set.", - "openai-ready": "OpenAI Ready", - "openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.", - "openai-ready-success-text": "Required OpenAI variables are all set." + "recipe-scraper-version": "Retsepti kaabitsa versioon", + "oidc-ready": "OIDC valmis", + "oidc-ready-error-text": "Kõik OIDC väärtused pole konfigureeritud. Seda teadet võib ignoreerida kui sa ei kasuta autentimist OIDC-ga.", + "oidc-ready-success-text": "Kõigile OIDC muutujatele on väärtused seatud.", + "openai-ready": "OpenAI on valmis", + "openai-ready-error-text": "Kõik OpenAI väärtused pole konfigureeritud. Seda teadet võib ignoreerida kui sa ei kasuta OpenAI funktsionaalsust.", + "openai-ready-success-text": "Kõigile OpenAI muutujatele on väärtused seatud." }, "shopping-list": { - "all-lists": "All Lists", - "create-shopping-list": "Create Shopping List", - "from-recipe": "From Recipe", - "list-name": "List Name", - "new-list": "New List", - "quantity": "Quantity: {0}", - "shopping-list": "Shopping List", - "shopping-lists": "Shopping Lists", - "food": "Food", - "note": "Note", - "label": "Label", - "save-label": "Save Label", - "linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.", - "toggle-food": "Toggle Food", - "manage-labels": "Manage Labels", - "are-you-sure-you-want-to-delete-this-item": "Are you sure you want to delete this item?", - "copy-as-text": "Copy as Text", - "copy-as-markdown": "Copy as Markdown", - "delete-checked": "Delete Checked", - "toggle-label-sort": "Toggle Label Sort", - "reorder-labels": "Reorder Labels", - "uncheck-all-items": "Uncheck All Items", - "check-all-items": "Check All Items", - "linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes", - "items-checked-count": "No items checked|One item checked|{count} items checked", - "no-label": "No Label", - "completed-on": "Completed on {date}", - "you-are-offline": "You are offline", - "you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.", - "are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?", - "are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?", - "are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?", - "no-shopping-lists-found": "No Shopping Lists Found" + "all-lists": "Kõik nimekirjad", + "create-shopping-list": "Loo ostunimekiri", + "from-recipe": "Retseptist", + "list-name": "Nimekirja nimi", + "new-list": "Uus Nimekiri", + "quantity": "Kogus: {0}", + "shopping-list": "Ostunimekiri", + "shopping-lists": "Ostunimekirjad", + "food": "Toit", + "note": "Märkus", + "label": "Silt", + "save-label": "Salvesta silt", + "linked-item-warning": "See üksus on lingitud ühele või rohkemale retseptile. Muutes ühikuid või toite võib anda ootamatuid tulemusi kui lisate või eemaldate retsepti sellest nimekirjast.", + "toggle-food": "Vaheta toit", + "manage-labels": "Halda silte", + "are-you-sure-you-want-to-delete-this-item": "Kas sa oled kindel, et tahad selle üksuse kustutada?", + "copy-as-text": "Kopeeri tekstina", + "copy-as-markdown": "Kopeeri Markdownina", + "delete-checked": "Kustuta valitud", + "toggle-label-sort": "Vaheta märgise sort", + "reorder-labels": "Muuda märgiste järjestust", + "uncheck-all-items": "Tühista kõik valikud", + "check-all-items": "Vali kõik üksused", + "linked-recipes-count": "Lingitud retsepte pole: üks lingitud retsept: {count} lingitud retsepti", + "items-checked-count": "Üksusi pole valitud: üks üksus on kontrollitud: {count} üksust on märgitud", + "no-label": "Märgis puudub", + "completed-on": "Lõpetatud {date}", + "you-are-offline": "Sa oled offline", + "you-are-offline-description": "Kogu funktsionaalsus pole saadaval offline režiimis. Sellegi poolest saad sa lisada, muuta ja eemaldada üksuseid, kuid sa ei saa sükroniseerida oma muudatusi serveriga enne kui oled tagasi online .", + "are-you-sure-you-want-to-check-all-items": "Kas oled kindel, et tahad valida kõik üksused?", + "are-you-sure-you-want-to-uncheck-all-items": "Kas oled kindel, et tahad tühistada kõik valikud?", + "are-you-sure-you-want-to-delete-checked-items": "Kas oled kindel, et tahad kustutada kõik valitud üksused?", + "no-shopping-lists-found": "Poenimekirja ei leitud" }, "sidebar": { - "all-recipes": "All Recipes", - "backups": "Backups", - "categories": "Categories", - "cookbooks": "Cookbooks", - "dashboard": "Dashboard", - "home-page": "Home Page", - "manage-users": "Manage Users", - "migrations": "Migrations", - "profile": "Profile", - "search": "Search", - "site-settings": "Site Settings", - "tags": "Tags", - "toolbox": "Toolbox", - "language": "Language", - "maintenance": "Maintenance", - "background-tasks": "Background Tasks", - "parser": "Parser", - "developer": "Developer", - "cookbook": "Cookbook", - "create-cookbook": "Create a new cookbook" + "all-recipes": "Kõik retseptid", + "backups": "Tagavarakoopiad", + "categories": "Kategooriad", + "cookbooks": "Kokaraamatud", + "dashboard": "Töölaud", + "home-page": "Pealeht", + "manage-users": "Halda kasutajaid", + "migrations": "Ränded", + "profile": "Profiil", + "search": "Otsing", + "site-settings": "Lehe seaded", + "tags": "Sildid", + "toolbox": "Tööriistakast", + "language": "Keel", + "maintenance": "Hooldamine", + "background-tasks": "Taustaülesanded", + "parser": "Tekstianalüüser", + "developer": "Arendaja", + "cookbook": "Kokaraamat", + "create-cookbook": "Loo uus kokaraamat" }, "signup": { - "error-signing-up": "Error Signing Up", - "sign-up": "Sign Up", - "sign-up-link-created": "Sign up link created", - "sign-up-link-creation-failed": "Sign up link creation failed", - "sign-up-links": "Sign Up Links", - "sign-up-token-deleted": "Sign Up Token Deleted", - "sign-up-token-deletion-failed": "Sign up token deletion failed", - "welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator." + "error-signing-up": "Tõrge registreerimisel", + "sign-up": "Registreeri", + "sign-up-link-created": "Registreerimislink loodud", + "sign-up-link-creation-failed": "Registreerimislingi loomine ebaõnnestus", + "sign-up-links": "Registreerimislingid", + "sign-up-token-deleted": "Tegistreerimise identifikaator kustutatud", + "sign-up-token-deletion-failed": "Tegistreerimise identifikaatori kustutatamine ebaõnnestus", + "welcome-to-mealie": "Tere tulemast Mealiesse! Kui soovite selle rakenduse kasutajaks saada, peab teil olema kehtiv kutselink. Kui te pole kutset saanud, ei saa te registreeruda. Lingi saamiseks võtke ühendust lehe administraatoriga." }, "tag": { - "tag-created": "Tag created", - "tag-creation-failed": "Tag creation failed", - "tag-deleted": "Tag deleted", - "tag-deletion-failed": "Tag deletion failed", - "tag-update-failed": "Tag update failed", - "tag-updated": "Tag updated", - "tags": "Tags", - "untagged-count": "Untagged {count}", - "create-a-tag": "Create a Tag", - "tag-name": "Tag Name", - "tag": "Tag" + "tag-created": "Silt loodud", + "tag-creation-failed": "Sildi loomine ebaõnnestus", + "tag-deleted": "Silt kustutatud", + "tag-deletion-failed": "Sildi kustutamine ebaõnnestus", + "tag-update-failed": "Sildi uuendamine ebaõnnestus", + "tag-updated": "Silt uuendatud", + "tags": "Sildid", + "untagged-count": "Sildistamata: {count}", + "create-a-tag": "Loo silt", + "tag-name": "Sildi nimi", + "tag": "Silt" }, "tool": { - "tools": "Tools", - "on-hand": "On Hand", - "create-a-tool": "Create a Tool", - "tool-name": "Tool Name", - "create-new-tool": "Create New Tool", - "on-hand-checkbox-label": "Show as On Hand (Checked)", - "required-tools": "Required Tools", - "tool": "Tool" + "tools": "Tööriistad", + "on-hand": "Olemasolev", + "create-a-tool": "Loo tööriist", + "tool-name": "Tööriista nimi", + "create-new-tool": "Loo uus tööriist", + "on-hand-checkbox-label": "Kuva tööriistad, mis mulle juba kuuluvad (valitud)", + "required-tools": "Nõutud tööriistad", + "tool": "Tööriist" }, "user": { - "admin": "Admin", - "are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link {link}?", - "are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user {activeName} ID: {activeId}?", - "auth-method": "Auth Method", - "confirm-link-deletion": "Confirm Link Deletion", - "confirm-password": "Confirm Password", - "confirm-user-deletion": "Confirm User Deletion", - "could-not-validate-credentials": "Could Not Validate Credentials", - "create-link": "Create Link", - "create-user": "Create User", - "current-password": "Current Password", - "e-mail-must-be-valid": "E-mail must be valid", - "edit-user": "Edit User", + "admin": "Administraator", + "are-you-sure-you-want-to-delete-the-link": "Kas sa oled kindel, et tahad kustutada linki {link}?", + "are-you-sure-you-want-to-delete-the-user": "Kas oled kindel, et tahad kustutada kasutaja {activeName} ID {activeId}?", + "auth-method": "Autentimise meetod", + "confirm-link-deletion": "Kinnita lingi kustutamine", + "confirm-password": "Kinnita salasõna", + "confirm-user-deletion": "Kinnita kasutaja kustutamine", + "could-not-validate-credentials": "Ei saanud valideerida tunnusandmeid", + "create-link": "Loo link", + "create-user": "Loo kasutaja", + "current-password": "Praegune salasõna", + "e-mail-must-be-valid": "E-mail peab olema kehtiv", + "edit-user": "Kasutaja muutmine", "email": "Email", - "error-cannot-delete-super-user": "Error! Cannot Delete Super User", - "existing-password-does-not-match": "Existing password does not match", - "full-name": "Full Name", - "generate-password-reset-link": "Generate Password Reset Link", - "invite-only": "Invite Only", - "link-id": "Link ID", - "link-name": "Link Name", - "login": "Login", - "login-oidc": "Login with", - "or": "or", - "logout": "Logout", - "manage-users": "Manage Users", - "manage-users-description": "Create and manage users.", - "new-password": "New Password", - "new-user": "New User", - "password-has-been-reset-to-the-default-password": "Password has been reset to the default password", + "error-cannot-delete-super-user": "Viga! Ei saa peakasutajat ei saa kustutada", + "existing-password-does-not-match": "Parool ei ühti", + "full-name": "Täisnimi", + "generate-password-reset-link": "Genereeri link salasõna lähtestamiseks", + "invite-only": "Ainult kutsega", + "link-id": "Lingi ID", + "link-name": "Lingi nimi", + "login": "Sisselogimine", + "login-oidc": "Logi sisse kasutades", + "or": "või", + "logout": "Logi välja", + "manage-users": "Halda kasutajaid", + "manage-users-description": "Loo ja halda kasutajaid", + "new-password": "Uus salasõna", + "new-user": "Uus kasutaja", + "password-has-been-reset-to-the-default-password": "Salasõna on lähtestatud selle vaikeväärtusega.", "password-must-match": "Password must match", "password-reset-failed": "Password reset failed", "password-updated": "Password updated", diff --git a/frontend/lang/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json index 36a76612c..9c81e850d 100644 --- a/frontend/lang/messages/hu-HU.json +++ b/frontend/lang/messages/hu-HU.json @@ -637,7 +637,7 @@ "recipe-debugger-use-openai-description": "Használja az OpenAI-t az eredmények elemzésére, ahelyett, hogy a scraper könyvtárra hagyatkozna. Ha URL-címen keresztül hoz létre receptet, ez automatikusan megtörténik, ha a scraper könyvtár nem működik, ám itt manuálisan is tesztelheti.", "debug": "Hibakeresés", "tree-view": "Fa nézet", - "recipe-servings": "Recipe Servings", + "recipe-servings": "Recept tálalások", "recipe-yield": "Adagonkénti információk", "recipe-yield-text": "Recipe Yield Text", "unit": "Mennyiségi egység", @@ -678,7 +678,7 @@ "max-missing-tools": "Maximálisan hiányzó eszközök száma", "selected-tools": "Kiválasztott eszközök", "other-filters": "További szűrők", - "ready-to-make": "Ready to Make", + "ready-to-make": "Előkészítve", "almost-ready-to-make": "Majdnem készen áll" }, "search": { diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index 653e03bab..c1120e0f0 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -490,7 +490,7 @@ "insert-below": "Inserare dedesubt", "instructions": "Instrucțiuni", "key-name-required": "Numele cheii este necesar", - "landscape-view-coming-soon": "Landscape View (Coming Soon)", + "landscape-view-coming-soon": "Afișare în mod peisaj", "milligrams": "miligrame", "new-key-name": "Nume cheie nouă", "no-white-space-allowed": "Nu este permis niciun spațiu alb", @@ -1245,7 +1245,7 @@ }, "action-delete-log-files-name": "Ştergere fişiere jurnal", "action-delete-log-files-description": "Şterge toate fişierele jurnal", - "action-clean-directories-name": "Dosare Curate", + "action-clean-directories-name": "Curăță folderele", "action-clean-directories-description": "Elimină toate folderele de rețete care nu sunt UUID-uri valide", "action-clean-temporary-files-name": "Curăță Fișierele Temporare", "action-clean-temporary-files-description": "Elimină toate fişierele şi folderele din folderul .temp", @@ -1253,7 +1253,7 @@ "action-clean-images-description": "Elimină toate imaginile care nu se termină cu .webp", "actions-description": "Acțiunile de întreținere sunt {destructive_in_bold} și trebuie utilizate cu precauție. Efectuarea oricăreia dintre aceste acțiuni este {irreversible_in_bold}.", "actions-description-destructive": "distructiv", - "actions-description-irreversible": "ireversibil", + "actions-description-irreversible": "ireversibilă", "logs-action-refresh": "Reîmprospătare Jurnale", "logs-page-title": "Jurnale Mealie", "logs-tail-lines-label": "Linii de final" @@ -1321,9 +1321,9 @@ "cookbooks-description": "Gestionează o colecție de categorii de rețete și generează pagini pentru ele.", "members": "Membri", "members-description": "Vezi cine se află în gospodăria ta și gestionează permisiunile lor.", - "webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.", + "webhooks-description": "Configurați webhook-uri care se declanșează în zile în care aveți planurile de mese planificate.", "notifiers": "Notificatori", - "notifiers-description": "Setup email and push notifications that trigger on specific events.", + "notifiers-description": "Configurați notificările de e-mail și push care declanșează evenimente specifice.", "manage-data": "Gestionează Datele", "manage-data-description": "Gestionează-ți datele Mealie; Alimente, Unități, Categorii, Etichete și multe altele.", "data-migrations": "Migrări de date", diff --git a/mealie/lang/messages/da-DK.json b/mealie/lang/messages/da-DK.json index 229f3e555..2e1681a21 100644 --- a/mealie/lang/messages/da-DK.json +++ b/mealie/lang/messages/da-DK.json @@ -4,7 +4,7 @@ }, "recipe": { "unique-name-error": "Opskriftsnavnet er allerede i brug", - "recipe-created": "Recipe Created", + "recipe-created": "Opskrift oprettet", "recipe-defaults": { "ingredient-note": "1 kop mel", "step-text": "Du kan bruge markdown kode i beskrivelser og andre felter i opskrifter.\n\n**Tilføj et link**\n\n[Mit link](https://demo.mealie.io)\n" @@ -12,8 +12,8 @@ "servings-text": { "makes": "Makes", "serves": "Serves", - "serving": "Serving", - "servings": "Servings", + "serving": "Servering", + "servings": "Portioner", "yield": "Yield", "yields": "Yields" } diff --git a/mealie/lang/messages/hu-HU.json b/mealie/lang/messages/hu-HU.json index e2c199c43..3577b86f5 100644 --- a/mealie/lang/messages/hu-HU.json +++ b/mealie/lang/messages/hu-HU.json @@ -10,11 +10,11 @@ "step-text": "A recept lépései és a receptoldal egyéb mezői támogatják a markdown szintaxist.\n\n**Hivatkozás hozzáadása**\n\n[Saját link](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", + "makes": "Elkészítések", "serves": "Adag", "serving": "Adag", "servings": "Adag", - "yield": "Yield", + "yield": "Adag", "yields": "Yields" } }, diff --git a/mealie/repos/seed/resources/foods/locales/da-DK.json b/mealie/repos/seed/resources/foods/locales/da-DK.json index d0f810b7d..c5a00e426 100644 --- a/mealie/repos/seed/resources/foods/locales/da-DK.json +++ b/mealie/repos/seed/resources/foods/locales/da-DK.json @@ -106,7 +106,7 @@ "name": "rørsukker" }, "cannabis": { - "name": "cannabis" + "name": "kanabis" }, "capsicum": { "name": "paprika" @@ -240,7 +240,7 @@ }, "eggplant": { "name": "aubergine", - "plural_name": "eggplants" + "plural_name": "aubergine" }, "eggs": { "name": "æg", @@ -480,7 +480,7 @@ }, "pepper": { "name": "peber", - "plural_name": "peppers" + "plural_name": "peberfrugter" }, "pineapple": { "name": "ananas", @@ -589,7 +589,7 @@ }, "squash": { "name": "squash", - "plural_name": "squashes" + "plural_name": "squash" }, "squash-family": { "name": "squashfamilien" @@ -687,6 +687,6 @@ }, "zucchini": { "name": "sommersquash", - "plural_name": "zucchinis" + "plural_name": "courgette" } } \ No newline at end of file diff --git a/mealie/repos/seed/resources/foods/locales/hu-HU.json b/mealie/repos/seed/resources/foods/locales/hu-HU.json index 0bdd500d3..85621ea1a 100644 --- a/mealie/repos/seed/resources/foods/locales/hu-HU.json +++ b/mealie/repos/seed/resources/foods/locales/hu-HU.json @@ -261,7 +261,7 @@ }, "fiddlehead-fern": { "name": "hegedűfej páfrány", - "plural_name": "fiddlehead ferns" + "plural_name": "hegedűfej páfrányok" }, "fish": { "name": "hal" @@ -321,7 +321,7 @@ }, "heart-of-palm": { "name": "pálma szíve", - "plural_name": "heart of palms" + "plural_name": "pálmák szívei" }, "hemp": { "name": "kender" @@ -333,11 +333,11 @@ "name": "méz" }, "isomalt": { - "name": "isomalt" + "name": "izomalt" }, "jackfruit": { "name": "jákafa", - "plural_name": "jackfruits" + "plural_name": "jákafák" }, "jaggery": { "name": "nádcukor" @@ -543,7 +543,7 @@ }, "scallion": { "name": "zöldhagyma", - "plural_name": "scallions" + "plural_name": "zöldhagymák" }, "seafood": { "name": "tenger gyümölcsei" @@ -589,7 +589,7 @@ }, "squash": { "name": "tök", - "plural_name": "squashes" + "plural_name": "tökök" }, "squash-family": { "name": "tökfélék" @@ -602,7 +602,7 @@ }, "sunchoke": { "name": "csicsóka", - "plural_name": "sunchokes" + "plural_name": "csicsókák" }, "sunflower-seeds": { "name": "napraforgómag" @@ -616,7 +616,7 @@ }, "sweetcorn": { "name": "csemegekukorica", - "plural_name": "sweetcorns" + "plural_name": "csemegekukorica" }, "sweeteners": { "name": "édesítőszerek" @@ -626,7 +626,7 @@ }, "taro": { "name": "taró", - "plural_name": "taroes" + "plural_name": "tarók" }, "teff": { "name": "egynyári fürtfű" diff --git a/mealie/repos/seed/resources/units/locales/da-DK.json b/mealie/repos/seed/resources/units/locales/da-DK.json index 3d71b22d6..518705433 100644 --- a/mealie/repos/seed/resources/units/locales/da-DK.json +++ b/mealie/repos/seed/resources/units/locales/da-DK.json @@ -3,7 +3,7 @@ "name": "teske", "plural_name": "teskeer", "description": "", - "abbreviation": "tsk." + "abbreviation": "tsk" }, "tablespoon": { "name": "spiseske", From 398b41ed23f38cbd9092005888e649deed0fdda1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:48:47 +1100 Subject: [PATCH 21/46] fix(deps): update dependency openai to v1.59.6 (#4872) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index a2962ef77..b96f5247a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1590,13 +1590,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.59.5" +version = "1.59.6" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.59.5-py3-none-any.whl", hash = "sha256:e646b44856b0dda9345d3c43639e056334d792d1690e99690313c0ef7ca4d8cc"}, - {file = "openai-1.59.5.tar.gz", hash = "sha256:9886e77c02dad9dc6a7b67a11ab372a56842a9b5d376aa476672175ab10e83a0"}, + {file = "openai-1.59.6-py3-none-any.whl", hash = "sha256:b28ed44eee3d5ebe1a3ea045ee1b4b50fea36ecd50741aaa5ce5a5559c900cb6"}, + {file = "openai-1.59.6.tar.gz", hash = "sha256:c7670727c2f1e4473f62fea6fa51475c8bc098c9ffb47bfb9eef5be23c747934"}, ] [package.dependencies] From 2be4bd1f7c0d26da3e8e342cad1bab7cf20e38f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Jan 2025 10:58:59 +0000 Subject: [PATCH 22/46] fix(deps): update dependency sqlalchemy to v2.0.37 (#4873) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 118 ++++++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/poetry.lock b/poetry.lock index b96f5247a..3da9f6aac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2908,72 +2908,72 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.36" +version = "2.0.37" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, - {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, - {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, - {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, - {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, - {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, - {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, - {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, - {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, - {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72"}, + {file = "SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989"}, + {file = "SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761"}, + {file = "SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2"}, + {file = "SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44f569d0b1eb82301b92b72085583277316e7367e038d97c3a1a899d9a05e342"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2eae3423e538c10d93ae3e87788c6a84658c3ed6db62e6a61bb9495b0ad16bb"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfff7be361048244c3aa0f60b5e63221c5e0f0e509f4e47b8910e22b57d10ae7"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5bc3339db84c5fb9130ac0e2f20347ee77b5dd2596ba327ce0d399752f4fce39"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:84b9f23b0fa98a6a4b99d73989350a94e4a4ec476b9a7dfe9b79ba5939f5e80b"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-win32.whl", hash = "sha256:51bc9cfef83e0ac84f86bf2b10eaccb27c5a3e66a1212bef676f5bee6ef33ebb"}, + {file = "SQLAlchemy-2.0.37-cp37-cp37m-win_amd64.whl", hash = "sha256:8e47f1af09444f87c67b4f1bb6231e12ba6d4d9f03050d7fc88df6d075231a49"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6b788f14c5bb91db7f468dcf76f8b64423660a05e57fe277d3f4fad7b9dcb7ce"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521ef85c04c33009166777c77e76c8a676e2d8528dc83a57836b63ca9c69dcd1"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75311559f5c9881a9808eadbeb20ed8d8ba3f7225bef3afed2000c2a9f4d49b9"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce918ada64c956b62ca2c2af59b125767097ec1dca89650a6221e887521bfd7"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9d087663b7e1feabea8c578d6887d59bb00388158e8bff3a76be11aa3f748ca2"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cf95a60b36997dad99692314c4713f141b61c5b0b4cc5c3426faad570b31ca01"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-win32.whl", hash = "sha256:d75ead7dd4d255068ea0f21492ee67937bd7c90964c8f3c2bea83c7b7f81b95f"}, + {file = "SQLAlchemy-2.0.37-cp38-cp38-win_amd64.whl", hash = "sha256:74bbd1d0a9bacf34266a7907d43260c8d65d31d691bb2356f41b17c2dca5b1d0"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:648ec5acf95ad59255452ef759054f2176849662af4521db6cb245263ae4aa33"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35bd2df269de082065d4b23ae08502a47255832cc3f17619a5cea92ce478b02b"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f581d365af9373a738c49e0c51e8b18e08d8a6b1b15cc556773bcd8a192fa8b"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82df02816c14f8dc9f4d74aea4cb84a92f4b0620235daa76dde002409a3fbb5a"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94b564e38b344d3e67d2e224f0aec6ba09a77e4582ced41e7bfd0f757d926ec9"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:955a2a765aa1bd81aafa69ffda179d4fe3e2a3ad462a736ae5b6f387f78bfeb8"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-win32.whl", hash = "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278"}, + {file = "SQLAlchemy-2.0.37-cp39-cp39-win_amd64.whl", hash = "sha256:4b12885dc85a2ab2b7d00995bac6d967bffa8594123b02ed21e8eb2205a7584b"}, + {file = "SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1"}, + {file = "sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] From e50299e7ce52ae1436a2bbf025976003fc8acfc3 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sat, 11 Jan 2025 11:19:37 -0600 Subject: [PATCH 23/46] chore(l10n): New Crowdin updates (#4877) --- frontend/lang/messages/et-EE.json | 114 +++++++++++++++--------------- frontend/lang/messages/pl-PL.json | 2 +- frontend/lang/messages/ro-RO.json | 4 +- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/frontend/lang/messages/et-EE.json b/frontend/lang/messages/et-EE.json index 5c145c3ec..ea63b0643 100644 --- a/frontend/lang/messages/et-EE.json +++ b/frontend/lang/messages/et-EE.json @@ -972,65 +972,65 @@ "new-password": "Uus salasõna", "new-user": "Uus kasutaja", "password-has-been-reset-to-the-default-password": "Salasõna on lähtestatud selle vaikeväärtusega.", - "password-must-match": "Password must match", - "password-reset-failed": "Password reset failed", - "password-updated": "Password updated", - "password": "Password", - "password-strength": "Password is {strength}", - "please-enter-password": "Please enter your new password.", - "register": "Register", - "reset-password": "Reset Password", - "sign-in": "Sign in", - "total-mealplans": "Total MealPlans", - "total-users": "Total Users", - "upload-photo": "Upload Photo", - "use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password", - "user-created": "User created", - "user-creation-failed": "User creation failed", - "user-deleted": "User deleted", - "user-id-with-value": "User ID: {id}", - "user-id": "User ID", - "user-password": "User Password", - "user-successfully-logged-in": "User Successfully Logged In", - "user-update-failed": "User update failed", - "user-updated": "User updated", - "user": "User", - "username": "Username", - "users-header": "USERS", - "users": "Users", - "user-not-found": "User not found", - "webhook-time": "Webhook Time", - "webhooks-enabled": "Webhooks Enabled", - "you-are-not-allowed-to-create-a-user": "You are not allowed to create a user", - "you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user", - "enable-advanced-content": "Enable Advanced Content", - "enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later", - "favorite-recipes": "Favorite Recipes", - "email-or-username": "Email or Username", - "remember-me": "Remember Me", - "please-enter-your-email-and-password": "Please enter your email and password", - "invalid-credentials": "Invalid Credentials", - "account-locked-please-try-again-later": "Account Locked. Please try again later", - "user-favorites": "User Favorites", + "password-must-match": "Salasõnad peavad kattuma", + "password-reset-failed": "Salasõna lähtestamine ebaõnnestus", + "password-updated": "Salasõna uuendatud", + "password": "Salasõna", + "password-strength": "Salasõna on {strength}", + "please-enter-password": "Palun sisesta oma uus salasõna.", + "register": "Registreeri", + "reset-password": "Lähtesta salasõna", + "sign-in": "Logi sisse", + "total-mealplans": "Kõik toitumisplaanid", + "total-users": "Kõik kasutajad", + "upload-photo": "Lae pilt üles", + "use-8-characters-or-more-for-your-password": "Kasutage oma salasõna jaoks vähemalt 8 tähemärki.", + "user-created": "Kasutaja loodud", + "user-creation-failed": "Kasutaja loomine ebaõnnestus", + "user-deleted": "Kasutaja kustutatud", + "user-id-with-value": "Kasutaja ID: {id}", + "user-id": "Kasutaja ID", + "user-password": "Kasutaja salasõna", + "user-successfully-logged-in": "Kasutaja edukalt sisse logitud", + "user-update-failed": "Kasutaja uuendamine ebaõnnestus", + "user-updated": "Kasutaja uuendatud", + "user": "Kasutaja", + "username": "Kasutajanimi", + "users-header": "KASUTAJAD", + "users": "Kasutajad", + "user-not-found": "Kasutajaid ei leitud", + "webhook-time": "Webhooki nimi", + "webhooks-enabled": "Webhookid lubatud", + "you-are-not-allowed-to-create-a-user": "Sul ei ole õigust luua uut kasutajat", + "you-are-not-allowed-to-delete-this-user": "Sul ei ole õigust kustutada seda kasutajat", + "enable-advanced-content": "Lubage täpsem sisu", + "enable-advanced-content-description": "Võimaldab täiustatud funktsioone, nagu retseptide skaleerimine, API võtmed, veebihaagid ja andmehaldus. Ärge muretsege, saate seda alati hiljem muuta.", + "favorite-recipes": "Lemmikretseptid", + "email-or-username": "Email või kasutajanimi", + "remember-me": "Mäleta mind", + "please-enter-your-email-and-password": "Palun sisesta oma email ja salasõna", + "invalid-credentials": "Valed kasutajaandmed", + "account-locked-please-try-again-later": "Kasutaja lukustatud. Palun proovi hiljem uuesti", + "user-favorites": "Kasutaja lemmikud", "password-strength-values": { - "weak": "Weak", - "good": "Good", - "strong": "Strong", - "very-strong": "Very Strong" + "weak": "Nõrk", + "good": "Hea", + "strong": "Tugev", + "very-strong": "Väga tugev" }, - "user-management": "User Management", - "reset-locked-users": "Reset Locked Users", - "admin-user-creation": "Admin User Creation", - "admin-user-management": "Admin User Management", - "user-details": "User Details", - "user-name": "User Name", - "authentication-method": "Authentication Method", - "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'", - "permissions": "Permissions", - "administrator": "Administrator", - "user-can-invite-other-to-group": "User can invite others to group", - "user-can-manage-group": "User can manage group", - "user-can-manage-household": "User can manage household", + "user-management": "Kasutajate haldamine", + "reset-locked-users": "Lähtesta lukustatud kasutajad", + "admin-user-creation": "Administraatori kasutaja loomine", + "admin-user-management": "Administraator-kasutaja haldamine", + "user-details": "Kasutaja üksikasjad", + "user-name": "Kasutaja nimi", + "authentication-method": "Autentimise meetod", + "authentication-method-hint": "Sellega määratakse kuidas kasutaja autendib Mealiega. Kui sa pole kindel, siis vali \"Mealie\"", + "permissions": "Õigused", + "administrator": "Administraator", + "user-can-invite-other-to-group": "Kasutaja võib kutsuda teisi gruppi", + "user-can-manage-group": "Kasutaja võib hallata gruppi", + "user-can-manage-household": "Kasutaja võib hallata leibkonda", "user-can-organize-group-data": "User can organize group data", "enable-advanced-features": "Enable advanced features", "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", diff --git a/frontend/lang/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json index 6b75b9d4f..313fd9626 100644 --- a/frontend/lang/messages/pl-PL.json +++ b/frontend/lang/messages/pl-PL.json @@ -518,7 +518,7 @@ "save-recipe-before-use": "Zapisz przepis przed użyciem", "section-title": "Tytuł rozdziału", "servings": "Porcje", - "serves-amount": "{amount} porcji", + "serves-amount": "Porcje {amount}", "share-recipe-message": "Chcę podzielić się z Tobą moim przepisem na {0}.", "show-nutrition-values": "Pokaż wartości odżywcze", "sodium-content": "Sód", diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index c1120e0f0..6aa00aee8 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -4,7 +4,7 @@ "about-mealie": "Despre Mealie", "api-docs": "Documentație API", "api-port": "API Port", - "application-mode": "Application Mode", + "application-mode": "Mod Aplicație", "database-type": "Tipul bazei de date", "database-url": "URL bază de date", "default-group": "Grup implicit", @@ -890,7 +890,7 @@ "all-recipes": "Toate reţetele", "backups": "Copii de rezervă", "categories": "Categorii", - "cookbooks": "Cărți de rețete", + "cookbooks": "Cărţi de bucate", "dashboard": "Panou de control", "home-page": "Pagina principală", "manage-users": "Gestionare utilizatori", From dde93e78c947e054f0f382156e42fb28089c66db Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 12 Jan 2025 10:49:18 -0600 Subject: [PATCH 24/46] chore(l10n): New Crowdin updates (#4882) --- frontend/lang/messages/ar-SA.json | 274 +++++++++--------- mealie/lang/messages/ar-SA.json | 70 ++--- .../seed/resources/labels/locales/ar-SA.json | 12 +- .../seed/resources/units/locales/ar-SA.json | 62 ++-- 4 files changed, 209 insertions(+), 209 deletions(-) diff --git a/frontend/lang/messages/ar-SA.json b/frontend/lang/messages/ar-SA.json index f8e5b6aaa..8e3a53c57 100644 --- a/frontend/lang/messages/ar-SA.json +++ b/frontend/lang/messages/ar-SA.json @@ -250,60 +250,60 @@ "invite": "دعوة", "looking-to-update-your-profile": "هل ترغب في تحديث ملفك الشخصي؟", "default-recipe-preferences-description": "هذه هي الإعدادات الافتراضية عند إنشاء وصفة جديدة في مجموعتك. يمكن تغيير هذه الوصفات الفردية في قائمة إعدادات الوصفات.", - "default-recipe-preferences": "Default Recipe Preferences", + "default-recipe-preferences": "تفضيلات الوصفة الافتراضية", "group-preferences": "إعدادات المجموعة", "private-group": "مجموعة خاصة", - "private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings", - "enable-public-access": "Enable Public Access", - "enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in", + "private-group-description": "سيؤدي تعيين مجموعتك إلى الخاص إلى تعطيل جميع خيارات العرض العام. وهذا يلغي أي إعدادات عرض عام فردية", + "enable-public-access": "تمكين الوصول للعموم", + "enable-public-access-description": "جعل وصفات المجموعة عامة بشكل افتراضي، والسماح للزوار بعرض الوصفات دون تسجيل الدخول", "allow-users-outside-of-your-group-to-see-your-recipes": "السماح للمستخدمين خارج مجموعتك لمشاهدة وصفاتك", - "allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link", + "allow-users-outside-of-your-group-to-see-your-recipes-description": "عند التمكين يمكنك استخدام رابط المشاركة العامة لمشاركة وصفات محددة دون تفويض المستخدم. عند التعطيل، يمكنك مشاركة الوصفات فقط مع المستخدمين الموجودين في مجموعتك أو مع رابط خاص تم إنشاؤه مسبقاً", "show-nutrition-information": "عرض معلومات التغذية", - "show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown", - "show-recipe-assets": "Show recipe assets", - "show-recipe-assets-description": "When enabled the recipe assets will be shown on the recipe if available", - "default-to-landscape-view": "Default to landscape view", - "default-to-landscape-view-description": "When enabled the recipe header section will be shown in landscape view", + "show-nutrition-information-description": "عندما يتم تمكين المعلومات الغذائية ستظهر على الوصفة إذا كانت متاحة. وفي حالة عدم توافر معلومات عن التغذية، لن تظهر المعلومات المتعلقة بالتغذية", + "show-recipe-assets": "إظهار أصول الوصفة", + "show-recipe-assets-description": "عند تمكين الوصفة، سيتم عرض أصول الوصفة على الوصفة إذا كانت متوفرة", + "default-to-landscape-view": "الافتراضي للعرض الأفقي", + "default-to-landscape-view-description": "عند تمكين قسم رأس الوصفة سوف يظهر في العرض الأفقي", "disable-users-from-commenting-on-recipes": "إيقاف المستخدمين من التعليق على الوصفات", - "disable-users-from-commenting-on-recipes-description": "Hides the comment section on the recipe page and disables commenting", - "disable-organizing-recipe-ingredients-by-units-and-food": "Disable organizing recipe ingredients by units and food", - "disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields", - "general-preferences": "General Preferences", - "group-recipe-preferences": "Group Recipe Preferences", + "disable-users-from-commenting-on-recipes-description": "يخفي قسم التعليق على صفحة الوصفة ويعطل التعليق", + "disable-organizing-recipe-ingredients-by-units-and-food": "تعطيل تنظيم عناصر الوصفة حسب الوحدات والطعام", + "disable-organizing-recipe-ingredients-by-units-and-food-description": "يخفي حقول الطعام والوحدة والكمية للمكونات ويعامل المكونات كحقول نصية عادية", + "general-preferences": "الإعدادات العامة", + "group-recipe-preferences": "تفضيلات الوصفة للمجموعة", "report": "تقرير", - "report-with-id": "Report ID: {id}", - "group-management": "Group Management", - "admin-group-management": "Admin Group Management", - "admin-group-management-text": "Changes to this group will be reflected immediately.", - "group-id-value": "Group Id: {0}", - "total-households": "Total Households", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "report-with-id": "معرف التقرير: {id}", + "group-management": "إدارة المجموعة", + "admin-group-management": "إدارة مجموعة المشرف", + "admin-group-management-text": "التغييرات التي ستطرأ على هذه المجموعة ستنعكس على الفور.", + "group-id-value": "معرف المجموعة: {0}", + "total-households": "مجموع المنزل", + "you-must-select-a-group-before-selecting-a-household": "يجب عليك تحديد مجموعة قبل تحديد المنزل" }, "household": { - "household": "Household", - "households": "Households", - "user-household": "User Household", - "create-household": "Create Household", - "household-name": "Household Name", - "household-group": "Household Group", - "household-management": "Household Management", - "manage-households": "Manage Households", - "admin-household-management": "Admin Household Management", - "admin-household-management-text": "Changes to this household will be reflected immediately.", - "household-id-value": "Household Id: {0}", - "private-household": "Private Household", - "private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings", - "lock-recipe-edits-from-other-households": "Lock recipe edits from other households", - "lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household", - "household-recipe-preferences": "Household Recipe Preferences", - "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.", - "allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes", - "allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link", - "household-preferences": "Household Preferences" + "household": "المنزل", + "households": "المنازل", + "user-household": "منزل المستخدم", + "create-household": "إنشاء منزل", + "household-name": "اسم المنزل", + "household-group": "مجموعة المنزل", + "household-management": "إدارة المنزل", + "manage-households": "إدارة المنازل", + "admin-household-management": "إدارة مشرف المنزل", + "admin-household-management-text": "التغييرات التي ستطرأ على هذا المنزل ستنعكس على الفور.", + "household-id-value": "معرف المنزل: {0}", + "private-household": "منزل خاص", + "private-household-description": "سيؤدي تعيين المنزل إلى خاص إلى تعطيل جميع خيارات العرض العام. وهذا يلغي أي إعدادات عرض عام فردية", + "lock-recipe-edits-from-other-households": "إقفال تحرير الوصفة من المنازل الأخرى", + "lock-recipe-edits-from-other-households-description": "عند التمكين, المستخدمين فقط في أسرتك المعيشية يمكنهم تعديل الوصفات التي أنشأتها أسرتك", + "household-recipe-preferences": "تفضيلات الوصفة المنزلية", + "default-recipe-preferences-description": "هذه هي الإعدادات الافتراضية عند إنشاء وصفة جديدة في منزلك. يمكن تغيير الوصفات الفردية في قائمة إعدادات الوصفة.", + "allow-users-outside-of-your-household-to-see-your-recipes": "السماح للمستخدمين خارج منزلك بمشاهدة وصفاتك", + "allow-users-outside-of-your-household-to-see-your-recipes-description": "عند التمكين يمكنك استخدام رابط المشاركة العامة لمشاركة وصفات محددة دون تفويض المستخدم. عند التعطيل، يمكنك مشاركة الوصفات فقط مع المستخدمين الموجودين في منزلك أو مع رابط خاص تم إنشاؤه مسبقاً", + "household-preferences": "تفضيلات المنزل" }, "meal-plan": { "create-a-new-meal-plan": "إنشاء خطة وجبة جديدة", - "update-this-meal-plan": "Update this Meal Plan", + "update-this-meal-plan": "تحديث خِطَّة الوجبة الغذائية هذه", "dinner-this-week": "العشاء لهذا الأسبوع", "dinner-today": "العشاء اليوم", "dinner-tonight": "العشاء الليلة", @@ -321,95 +321,95 @@ "mealplan-settings": "اعدادات خطة الوجبات", "mealplan-update-failed": "فشل تحديث خطة الوجبات", "mealplan-updated": "تم تحديث خطة الوجبات", - "mealplan-households-description": "If no household is selected, recipes can be added from any household", - "any-category": "Any Category", - "any-tag": "Any Tag", - "any-household": "Any Household", + "mealplan-households-description": "إذا لم يتم اختيار منزل، يمكن إضافة وصفات من أي منزل", + "any-category": "أي فئة", + "any-tag": "أي وسم", + "any-household": "أي منزل", "no-meal-plan-defined-yet": "لم يتم تحديد خطة بعد", "no-meal-planned-for-today": "لم يتم تخطيط وجبة لهذا اليوم", - "numberOfDays-hint": "Number of days on page load", - "numberOfDays-label": "Default Days", + "numberOfDays-hint": "عدد الأيام عند تحميل الصفحة", + "numberOfDays-label": "الأيام الافتراضية", "only-recipes-with-these-categories-will-be-used-in-meal-plans": "فقط الوجبات التي تحتوي على التصنيفات التالية سوف تستخدم لإنشاء خطتك", "planner": "المخطط", - "quick-week": "Quick Week", + "quick-week": "أسبوع سريع", "side": "وجبة جانبية", "sides": "الوجبات الجانبية", "start-date": "تاريخ البدء", - "rule-day": "Rule Day", + "rule-day": "يوم القاعدة", "meal-type": "نوع الوجبة", "breakfast": "الإفطار", "lunch": "الغداء", "dinner": "العشاء", "type-any": "أي", "day-any": "أي", - "editor": "Editor", + "editor": "المحرر", "meal-recipe": "وصفة الوجبة", "meal-title": "عنوان الوجبة", "meal-note": "ملاحظة الوجبة", "note-only": "ملاحظة فقط", "random-meal": "وجبة عشوائية", "random-dinner": "عشاء عشوائي", - "random-side": "Random Side", - "this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.", + "random-side": "جانب عشوائي", + "this-rule-will-apply": "هذه القاعدة سوف تطبق على {dayCriteria} {mealTypeCriteria}.", "to-all-days": "إلى جميع الأيام", - "on-days": "on {0}s", + "on-days": "على أيام {0}", "for-all-meal-types": "لجميع أنواع الوجبات", - "for-type-meal-types": "for {0} meal types", - "meal-plan-rules": "Meal Plan Rules", + "for-type-meal-types": "لأنواع الوجبات {0}", + "meal-plan-rules": "قواعد خِطَّة وجبة الطعام", "new-rule": "قاعدة جديدة", - "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", - "new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.", + "meal-plan-rules-description": "يمكنك إنشاء قواعد لاختيار الوصفات التلقائية لخطط وجبتك الغذائية. وتستخدم هذه القواعد من قبل الخادم لتحديد مجموعة عشوائية من الوصفات التي يتم اختيارها من خلال إنشاء خطط الوجبات. لاحظ أنه إذا كانت القواعد تحتوي على نفس قيود اليوم/النوع فسيتم دمج عوامل تصفية القاعدة. من الناحية العملية، ليس من الضروري إنشاء قواعد مكررة، ولكن من الممكن فعل ذلك.", + "new-rule-description": "عند إنشاء قاعدة جديدة لخطة وجبة غذائية، يمكنك تقييد القاعدة لتكون قابلة للتطبيق ليوم محدد من الأسبوع و/أو نوع محدد من الوجبات. لتطبيق قاعدة على جميع الأيام أو جميع أنواع الوجبات الغذائية يمكنك تعيين القاعدة إلى \"أي كان\" التي ستطبقها على جميع القيم الممكنة لليوم و/أو نوع الوجبة.", "recipe-rules": "قواعد الوصفات", "applies-to-all-days": "ينطبق على جميع الأيام", - "applies-on-days": "Applies on {0}s", - "meal-plan-settings": "Meal Plan Settings" + "applies-on-days": "يطبق على أيام {0}", + "meal-plan-settings": "إعدادات خِطَّة الوجبات الغذائية" }, "migration": { - "migration-data-removed": "Migration data removed", - "new-migration": "New Migration", + "migration-data-removed": "حذف بيانات الهجرة", + "new-migration": "هجرة جديدة", "no-file-selected": "لم يتمّ اختيار أيّ ملفّ", - "no-migration-data-available": "No Migration Data Available", - "previous-migrations": "Previous Migrations", + "no-migration-data-available": "لا توجد بيانات هجرة متوفرة", + "previous-migrations": "الهجرة السابقة", "recipe-migration": "نقل الوصفة", "chowdown": { - "description": "Migrate data from Chowdown", - "description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.", - "title": "Chowdown" + "description": "نقل البيانات من \"Chowdown\"", + "description-long": "ميلي يدعم بشكل محلي تنسيق مستودع طعام. يجب تنزيل مستودع التعليمات البرمجية CODE REPOSITORY كملف مضغوط ZIP وتحميله أدناه.", + "title": "\"Chowdown\"" }, "nextcloud": { - "description": "Migrate data from a Nextcloud Cookbook instance", - "description-long": "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.", - "title": "Nextcloud Cookbook" + "description": "نقل البيانات من نموذج كتاب طبخ NEXTCLOUD", + "description-long": "يمكن استيراد الوصفات السحابية من مِلَفّ مضغوط ZIP يحتوي على البيانات المخزنة في Nextcloud. راجع بنية مجلد المثال أدناه للتأكد من أن وصفاتك قابلة للاستيراد.", + "title": "كتاب طبخ " }, "copymethat": { - "description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.", - "title": "Copy Me That Recipe Manager" + "description-long": "يمكن لميلي استيراد الوصفات من نسخ لي. يجب تصدير وصفاتك بتنسيق HTML، ثم تحميل ZIP أدناه.", + "title": "انسخ لي مدير الوصفة" }, "paprika": { - "description-long": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.", - "title": "Paprika Recipe Manager" + "description-long": "يمكن لميلي استيراد الوصفات من تطبيق PAPRIKA. يجب تصدير وصفاتك من PAPRIKA، وإعادة تسمية امتداد التصدير إلى .ZIP وتحميله أدناه.", + "title": "مدير وصفة بابريكا" }, "mealie-pre-v1": { "description-long": "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.", - "title": "Mealie Pre v1.0" + "title": "ميلي إصدار قبل 1.0" }, "tandoor": { "description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.", - "title": "Tandoor Recipes" + "title": "وصفات تاندور" }, - "recipe-data-migrations": "Recipe Data Migrations", + "recipe-data-migrations": "وصفة 2", "recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.", "coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.", - "choose-migration-type": "Choose Migration Type", - "tag-all-recipes": "Tag all recipes with {tag-name} tag", + "choose-migration-type": "اختر نوع الترحيل", + "tag-all-recipes": "وسم جميع الوصفات باستخدام علامة {tag-name}", "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.", - "recipe-1": "Recipe 1", - "recipe-2": "Recipe 2", + "recipe-1": "وصفة 1", + "recipe-2": "وصفة 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.", "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": { - "title": "Plan to Eat", + "title": "خِطَّة تناول الطعام", "description-long": "Mealie can import recipies from Plan to Eat." }, "myrecipebox": { @@ -417,44 +417,44 @@ "description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below." }, "recipekeeper": { - "title": "Recipe Keeper", + "title": "مدير الوصفة", "description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below." } }, "new-recipe": { - "bulk-add": "Bulk Add", + "bulk-add": "إضافة مجموعة", "error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.", "error-title": "Looks Like We Couldn't Find Anything", - "from-url": "Import a Recipe", + "from-url": "استيراد وصفة", "github-issues": "مشاكل GitHub", "google-ld-json-info": "معرف Google + معلومات json", "must-be-a-valid-url": "يجب أن يكون عنوان URL صالحًا", "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list", "recipe-markup-specification": "Recipe Markup Specification", - "recipe-url": "Recipe URL", - "recipe-html-or-json": "Recipe HTML or JSON", - "upload-a-recipe": "Upload a Recipe", - "upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.", - "url-form-hint": "Copy and paste a link from your favorite recipe website", - "view-scraped-data": "View Scraped Data", - "trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines", - "trim-prefix-description": "Trim first character from each line", + "recipe-url": "رابط الوصفة", + "recipe-html-or-json": "وصفة HTML أو JSON", + "upload-a-recipe": "تحميل وصفة", + "upload-individual-zip-file": "تحميل مِلَفّ zip فردي تم تصديره من مثيل Malie آخر.", + "url-form-hint": "نسخ ولصق رابط من موقعك المفضل للوصفة", + "view-scraped-data": "عرض البيانات المكشوفة", + "trim-whitespace-description": "قص المسافات البيضاء البادئة واللاحقة وكذلك الأسطر الفارغة", + "trim-prefix-description": "قص الحرف الأول من كل سطر", "split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns", - "import-by-url": "Import a recipe by URL", - "create-manually": "Create a recipe manually", - "make-recipe-image": "Make this the recipe image" + "import-by-url": "استيراد وصفة عن طريق عنوان URL", + "create-manually": "إنشاء وصفة يدوياً", + "make-recipe-image": "اجعل هذه صورة الوصفة" }, "page": { - "404-page-not-found": "404 Page not found", - "all-recipes": "All Recipes", - "new-page-created": "New page created", + "404-page-not-found": "404: لم يتم العثور على الصفحة", + "all-recipes": "جميع الوصفات", + "new-page-created": "تم إنشاء الصفحة الجديدة", "page": "الصفحة", - "page-creation-failed": "Page creation failed", + "page-creation-failed": "فشل إنشاء الصفحة", "page-deleted": "تم حذف الصفحة", "page-deletion-failed": "حذف الصفحة فشل", "page-update-failed": "تحديث الصفحة فشل", "page-updated": "تم تحديث صفحة", - "pages-update-failed": "Pages update failed", + "pages-update-failed": "فشل تحديث الصفحات", "pages-updated": "Pages updated", "404-not-found": "لم يتم العثور على الصفحة. خطأ 404", "an-error-occurred": "حصل خطأ ما" @@ -500,42 +500,42 @@ "object-value": "Object Value", "original-url": "Original URL", "perform-time": "Cook Time", - "prep-time": "Prep Time", - "protein-content": "Protein", - "public-recipe": "Public Recipe", - "recipe-created": "Recipe created", - "recipe-creation-failed": "Recipe creation failed", - "recipe-deleted": "Recipe deleted", - "recipe-image": "Recipe Image", - "recipe-image-updated": "Recipe image updated", - "recipe-name": "Recipe Name", - "recipe-settings": "Recipe Settings", - "recipe-update-failed": "Recipe update failed", - "recipe-updated": "Recipe updated", - "remove-from-favorites": "Remove from Favorites", - "remove-section": "Remove Section", - "saturated-fat-content": "Saturated fat", - "save-recipe-before-use": "Save recipe before use", - "section-title": "Section Title", - "servings": "Servings", - "serves-amount": "Serves {amount}", - "share-recipe-message": "I wanted to share my {0} recipe with you.", + "prep-time": "وقت التحضير", + "protein-content": "البروتين", + "public-recipe": "وصفة عامة", + "recipe-created": "تم إنشاء الوصفة", + "recipe-creation-failed": "فشل إنشاء الوصفة", + "recipe-deleted": "تم حذف الوصفة", + "recipe-image": "صورة الوصفة", + "recipe-image-updated": "تم تحديث صورة الوصفة", + "recipe-name": "اسم الوصفة", + "recipe-settings": "إعدادات الوصفة", + "recipe-update-failed": "فشل تحديث الوصفة", + "recipe-updated": "تم تحديث الوصفة", + "remove-from-favorites": "إزالة من المفضلات", + "remove-section": "إزالة القسم", + "saturated-fat-content": "الدهون المشبعة", + "save-recipe-before-use": "حفظ الوصفة قبل الاستخدام", + "section-title": "عنوان القسم", + "servings": "حصص الطعام", + "serves-amount": "{amount} حصص", + "share-recipe-message": "أردت أن أشارككم وصفة {0} الخاصة بي.", "show-nutrition-values": "Show Nutrition Values", - "sodium-content": "Sodium", - "step-index": "Step: {step}", - "sugar-content": "Sugar", - "title": "Title", - "total-time": "Total Time", - "trans-fat-content": "Trans-fat", - "unable-to-delete-recipe": "Unable to Delete Recipe", - "unsaturated-fat-content": "Unsaturated fat", - "no-recipe": "No Recipe", - "locked-by-owner": "Locked by Owner", - "join-the-conversation": "Join the Conversation", - "add-recipe-to-mealplan": "Add Recipe to Mealplan", - "entry-type": "Entry Type", - "date-format-hint": "MM/DD/YYYY format", - "date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format", + "sodium-content": "صوديوم", + "step-index": "الخطوة: {step}", + "sugar-content": "سكر", + "title": "العنوان", + "total-time": "الوقت الإجمالي", + "trans-fat-content": "الدهون المتحولة", + "unable-to-delete-recipe": "تعذر حذف الوصفة", + "unsaturated-fat-content": "دهون غير مشبعة", + "no-recipe": "لا يوجد وصفة", + "locked-by-owner": "مقفلة من قبل المالك", + "join-the-conversation": "انضم للمحادثة", + "add-recipe-to-mealplan": "إضافة الوصفة إلى خِطَّة الوجبة", + "entry-type": "نوع الإدخال", + "date-format-hint": "صيغة MM/DD/YYYYY", + "date-format-hint-yyyy-mm-dd": "صيغة YYY-MM-DD", "add-to-list": "Add to List", "add-to-plan": "Add to Plan", "add-to-timeline": "Add to Timeline", diff --git a/mealie/lang/messages/ar-SA.json b/mealie/lang/messages/ar-SA.json index 590474cab..dd6c0fc42 100644 --- a/mealie/lang/messages/ar-SA.json +++ b/mealie/lang/messages/ar-SA.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "يجب أن تكون أسماء الوصفات فريدة", - "recipe-created": "Recipe Created", + "recipe-created": "تم إنشاء الوصفة", "recipe-defaults": { - "ingredient-note": "1 Cup Flour", - "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" + "ingredient-note": "كوب 1 طحين", + "step-text": "تدعم خطوات الوصفة بالإضافة إلى الحقول الأخرى في صفحة الوصفة صياغة تخفيض السعر. **أضف رابطًا** [الرابط الخاص بي](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "تصنع", + "serves": "يكفي ل", + "serving": "حصة الطعام", + "servings": "حصص الطعام", + "yield": "العائد", + "yields": "العائد" } }, "mealplan": { @@ -28,53 +28,53 @@ "ldap-update-password-unavailable": "غير قادر على تحديث كلمة المرور، المستخدم يتم التحكم به بواسطة LDAP" }, "group": { - "report-deleted": "تم حذف التقرير" + "report-deleted": "تم حذف التقرير." }, "exceptions": { - "permission_denied": "لا يوجد لديك صلاحيات كافية لتفيذ هذا الإجراء", + "permission_denied": "لا يوجد لديك صلاحيات كافية لتنفيذ هذا الإجراء", "no-entry-found": "لم يتم العثور على الصفحة المطلوبة", "integrity-error": "خطأ في سلامة قاعدة البيانات", - "username-conflict-error": "اسم المستخدم هذا مستخدم بالفعل", + "username-conflict-error": "اسم المستخدم هذا مستخدم مسبقاً", "email-conflict-error": "هذا البريد مستخدم مسبقاً" }, "notifications": { "generic-created": "تم إنشاء {name}", "generic-updated": "تم تحديث {name}", - "generic-created-with-url": "تم إنشاء {name} ، {url}", + "generic-created-with-url": "تم إنشاء {name}، {url}", "generic-updated-with-url": "{name} تم تحديثه، {url}", "generic-duplicated": "تم تكرار {name}", "generic-deleted": "تم حذف {name}" }, "datetime": { - "year": "year|years", - "day": "day|days", - "hour": "hour|hours", - "minute": "minute|minutes", - "second": "second|seconds", - "millisecond": "millisecond|milliseconds", - "microsecond": "microsecond|microseconds" + "year": "سنة|سنوات", + "day": "يوم|أيام", + "hour": "ساعة|ساعات", + "minute": "دقيقة|دقائق", + "second": "ثانية|ثواني", + "millisecond": "مللي ثانية|مللي ثانية", + "microsecond": "مكرو ثانية|مكرو ثانية" }, "emails": { "password": { - "subject": "Mealie Forgot Password", - "header_text": "Forgot Password", - "message_top": "You have requested to reset your password.", - "message_bottom": "Please click the button above to reset your password.", - "button_text": "Reset Password" + "subject": "نسيت كلمة المرور", + "header_text": "نسيت كلمة المرور", + "message_top": "لقد طلبت إعادة تعيين كلمة المرور الخاصة بك.", + "message_bottom": "الرجاء النقر على الزر أعلاه لإعادة تعيين كلمة المرور الخاصة بك.", + "button_text": "إعادة ضبط كلمة المرور" }, "invitation": { - "subject": "Invitation to join Mealie", - "header_text": "You're Invited!", - "message_top": "You have been invited to join Mealie.", - "message_bottom": "Please click the button above to accept the invitation.", - "button_text": "Accept Invitation" + "subject": "دعوة للانضمام إلى ميلي", + "header_text": "أنت مدعو!", + "message_top": "لقد تمت دعوتك للانضمام إلى ميلي.", + "message_bottom": "الرجاء النقر على الزر أعلاه لقبول الدعوة.", + "button_text": "قَبُول الدعوة" }, "test": { - "subject": "Mealie Test Email", - "header_text": "Test Email", - "message_top": "This is a test email.", - "message_bottom": "Please click the button above to test the email.", - "button_text": "Open Mealie" + "subject": "بريد إلكتروني لاختبار ميلي", + "header_text": "بريد إلكتروني تجريبي", + "message_top": "هذا بريد إلكتروني اختباري.", + "message_bottom": "الرجاء النقر على الزر أعلاه لاختبار البريد الإلكتروني.", + "button_text": "فتح ميلي" } } } diff --git a/mealie/repos/seed/resources/labels/locales/ar-SA.json b/mealie/repos/seed/resources/labels/locales/ar-SA.json index 994be3de0..6e362c5ab 100644 --- a/mealie/repos/seed/resources/labels/locales/ar-SA.json +++ b/mealie/repos/seed/resources/labels/locales/ar-SA.json @@ -1,12 +1,12 @@ [ { - "name": "Produce" + "name": "المنتج" }, { "name": "الحبوب" }, { - "name": "الفواكة" + "name": "آلفواكه" }, { "name": "الخضراوات" @@ -27,10 +27,10 @@ "name": "المعلبات" }, { - "name": "Condiments" + "name": "الباهرات" }, { - "name": "Confectionary" + "name": "الحَلْوَيَات" }, { "name": "منتجات الألبان" @@ -42,7 +42,7 @@ "name": "الأغذية الصحية" }, { - "name": "Household" + "name": "المنزل" }, { "name": "منتجات اللحوم" @@ -54,7 +54,7 @@ "name": "التوابل" }, { - "name": "الحلويات" + "name": "الحَلْوَيَات" }, { "name": "الكحول" diff --git a/mealie/repos/seed/resources/units/locales/ar-SA.json b/mealie/repos/seed/resources/units/locales/ar-SA.json index 68a197426..7d57ddd40 100644 --- a/mealie/repos/seed/resources/units/locales/ar-SA.json +++ b/mealie/repos/seed/resources/units/locales/ar-SA.json @@ -1,140 +1,140 @@ { "teaspoon": { "name": "ملعقة صغيرة", - "plural_name": "teaspoons", + "plural_name": "ملعقة صغيرة", "description": "", "abbreviation": "ملعقة صغيرة" }, "tablespoon": { "name": "ملعقة كبيرة", - "plural_name": "tablespoons", + "plural_name": "ملعقة كبيرة", "description": "", "abbreviation": "ملعقة كبيرة" }, "cup": { "name": "كوب", - "plural_name": "cups", + "plural_name": "كوب", "description": "", - "abbreviation": "c" + "abbreviation": "درجة مئوية" }, "fluid-ounce": { - "name": "أوقية 200gm", - "plural_name": "fluid ounces", + "name": "أونصة سائل", + "plural_name": "أونصة سائل", "description": "", - "abbreviation": "أوقية 200gm" + "abbreviation": "أونصة سائل" }, "pint": { "name": "نصف لتر", - "plural_name": "pints", + "plural_name": "نصف لتر", "description": "", "abbreviation": "نصف لتر" }, "quart": { "name": "الربع", - "plural_name": "quarts", + "plural_name": "لتر", "description": "", "abbreviation": "الربع" }, "gallon": { "name": "جالون", - "plural_name": "gallons", + "plural_name": "جالون", "description": "", "abbreviation": "جالون" }, "milliliter": { - "name": "ميليلتر", - "plural_name": "milliliters", + "name": "ميلي لتر", + "plural_name": "مللي لترات", "description": "", "abbreviation": "مل" }, "liter": { "name": "لتر", - "plural_name": "liters", + "plural_name": "لترات", "description": "", "abbreviation": "لتر" }, "pound": { "name": "رطل", - "plural_name": "pounds", + "plural_name": "رطل", "description": "", "abbreviation": "رطل", - "plural_abbreviation": "lbs" + "plural_abbreviation": "رطل" }, "ounce": { "name": "أوقية / ألأونضه", - "plural_name": "ounces", + "plural_name": "أوقية / ألأونضه", "description": "", "abbreviation": "أونصة" }, "gram": { "name": "جرام", - "plural_name": "grams", + "plural_name": "جرامات", "description": "", "abbreviation": "غرام" }, "kilogram": { "name": "كيلوغرام", - "plural_name": "kilograms", + "plural_name": "كيلوغرامات", "description": "", "abbreviation": "كيلوغرام" }, "milligram": { "name": "مليغرام", - "plural_name": "milligrams", + "plural_name": "ميليغرامات", "description": "", "abbreviation": "مليغرام" }, "splash": { "name": "دفقة", - "plural_name": "splashes", + "plural_name": "رشه", "description": "", "abbreviation": "" }, "dash": { "name": "اندفاع", - "plural_name": "dashes", + "plural_name": "رشه", "description": "", "abbreviation": "" }, "serving": { "name": "حصة الطعام", - "plural_name": "servings", + "plural_name": "حصة طعام", "description": "", "abbreviation": "" }, "head": { "name": "رأس", - "plural_name": "heads", + "plural_name": "رؤوس", "description": "", "abbreviation": "" }, "clove": { "name": "القرنفل", - "plural_name": "cloves", + "plural_name": "القرنفل", "description": "", "abbreviation": "" }, "can": { "name": "يمكن", - "plural_name": "cans", + "plural_name": "علب", "description": "", "abbreviation": "" }, "bunch": { - "name": "bunch", - "plural_name": "bunches", + "name": "باقة", + "plural_name": "باقات", "description": "", "abbreviation": "" }, "pack": { - "name": "pack", - "plural_name": "packs", + "name": "حُزْمَة", + "plural_name": "حزمات", "description": "", "abbreviation": "" }, "pinch": { - "name": "pinch", - "plural_name": "pinches", + "name": "رشه", + "plural_name": "رشاة", "description": "", "abbreviation": "" } From 2e13f33eb156facfee3483c9cf6a4f305c18b424 Mon Sep 17 00:00:00 2001 From: Chip Date: Mon, 13 Jan 2025 08:39:42 -0500 Subject: [PATCH 25/46] docs: Update FAQ to include Nutritional Values and enabling per recipe / household (#4887) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- docs/docs/documentation/getting-started/faq.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index b07dc44ab..27f63136a 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -33,6 +33,24 @@ Do the following for each recipe you want to intelligently handle ingredients. Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations. +## How do I enable Nutrtional Values? +Mealie can store Nutritional Information for Recipes. Please note that the values you enter are static for the recipe and no scaling is being done when channging Servings / Yield. + +Do the following to enable Nutritional Values on individual Recipes, or to modify your Household Recipe Preferences + +### Show Nutritional Values on a Single Recipe +1. Go to a recipe +2. Click the Edit button/icon +3. Click the Recipe Settings gear and select `Show Nutritional Values` +4. Scroll down to manually fill out the Nutritional Values +5. Save + +### Show Nutritional Values by default +1. Click your username in the top left +2. Click the 'Household Settings' button +3. Under 'Household Recipe Preferences', click to select 'Show nutrition information' +4. Click 'Update' + ## Is it safe to upgrade Mealie? Yes. If you are using the v1 branches (including beta), you can upgrade to the latest version of Mealie without performing a site Export/Restore. This process was required in previous versions of Mealie, however we've automated the database migration process to make it easier to upgrade. Note that if you were using the v0.5.x version, you CANNOT upgrade to the latest version automatically. You must follow the migration instructions in the documentation. From 7f99e2fc36d34e1506e99d1055d367ecf9d0fdff Mon Sep 17 00:00:00 2001 From: Chip Date: Mon, 13 Jan 2025 10:19:27 -0500 Subject: [PATCH 26/46] docs: Fix Spelling Errors on Nutritional Values (#4888) --- docs/docs/documentation/getting-started/faq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index 27f63136a..a8f2f28e8 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -33,8 +33,8 @@ Do the following for each recipe you want to intelligently handle ingredients. Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations. -## How do I enable Nutrtional Values? -Mealie can store Nutritional Information for Recipes. Please note that the values you enter are static for the recipe and no scaling is being done when channging Servings / Yield. +## How do I enable Nutritional Values? +Mealie can store Nutritional Information for Recipes. Please note that the values you enter are static for the recipe and no scaling is being done when changing Servings / Yield. Do the following to enable Nutritional Values on individual Recipes, or to modify your Household Recipe Preferences From ea0bec23366d9116410912544290797f2d1f29bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:31:42 +0000 Subject: [PATCH 27/46] chore(auto): Update pre-commit hooks (#4886) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@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 8696d87f2..15b353d9c 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.8.6 + rev: v0.9.1 hooks: - id: ruff - id: ruff-format From 2c2de1e95b13e1c838ab43759c592497d2c06824 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:43:55 +0000 Subject: [PATCH 28/46] chore(deps): update dependency ruff to ^0.9.0 (#4871) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- mealie/db/fixes/fix_group_with_no_name.py | 3 +- mealie/db/fixes/fix_migration_data.py | 4 +- mealie/repos/repository_cookbooks.py | 4 +- mealie/services/migrations/tandoor.py | 2 +- mealie/services/scraper/cleaner.py | 20 ++-------- poetry.lock | 40 +++++++++---------- pyproject.toml | 2 +- .../test_group_mealplan.py | 34 ++++++++-------- .../test_group_webhooks.py | 6 +-- .../test_recipe_bulk_action.py | 3 +- .../test_recipe_cross_household.py | 4 +- .../user_recipe_tests/test_recipe_owner.py | 4 +- .../repository_tests/test_pagination.py | 16 ++++---- .../test_recipe_repository.py | 24 +++++------ .../repository_tests/test_search.py | 6 +-- .../tasks/test_create_timeline_events.py | 34 ++++++++-------- ..._delete_old_checked_shopping_list_items.py | 4 +- .../scheduler/tasks/test_post_webhook.py | 30 +++++++------- .../user_services/test_user_service.py | 6 +-- tests/unit_tests/test_alembic.py | 6 +-- .../validator_tests/test_create_plan_entry.py | 8 ++-- 22 files changed, 124 insertions(+), 138 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 15b353d9c..acbc1c120 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.9.1 + rev: v0.9.0 hooks: - id: ruff - id: ruff-format diff --git a/mealie/db/fixes/fix_group_with_no_name.py b/mealie/db/fixes/fix_group_with_no_name.py index 992c5483b..e367d1c3a 100644 --- a/mealie/db/fixes/fix_group_with_no_name.py +++ b/mealie/db/fixes/fix_group_with_no_name.py @@ -26,8 +26,7 @@ def fix_group_with_no_name(session: Session): return logger.info( - f'{len(groups)} {"group" if len(groups) == 1 else "groups"} found with a missing name; ' - f"applying default name" + f"{len(groups)} {'group' if len(groups) == 1 else 'groups'} found with a missing name; applying default name" ) offset = 0 diff --git a/mealie/db/fixes/fix_migration_data.py b/mealie/db/fixes/fix_migration_data.py index 200b160d5..2ec83cae2 100644 --- a/mealie/db/fixes/fix_migration_data.py +++ b/mealie/db/fixes/fix_migration_data.py @@ -51,7 +51,7 @@ def fix_dangling_refs(session: Session): if result.rowcount: logger.info( - f'Reassigned {result.rowcount} {"row" if result.rowcount == 1 else "rows"} ' + f"Reassigned {result.rowcount} {'row' if result.rowcount == 1 else 'rows'} " f'in "{table_name}" table to default user ({default_user.id})' ) @@ -63,7 +63,7 @@ def fix_dangling_refs(session: Session): if result.rowcount: logger.info( - f'Deleted {result.rowcount} {"row" if result.rowcount == 1 else "rows"} ' + f"Deleted {result.rowcount} {'row' if result.rowcount == 1 else 'rows'} " f'in "{table_name}" table with invalid user ids' ) diff --git a/mealie/repos/repository_cookbooks.py b/mealie/repos/repository_cookbooks.py index d453c3f70..4a42f390c 100644 --- a/mealie/repos/repository_cookbooks.py +++ b/mealie/repos/repository_cookbooks.py @@ -24,7 +24,7 @@ class RepositoryCookbooks(HouseholdRepositoryGeneric[ReadCookBook, CookBook]): return super().create(data) except IntegrityError: self.session.rollback() - data.slug = slugify(f"{data.name} ({i+1})") + data.slug = slugify(f"{data.name} ({i + 1})") raise # raise the last IntegrityError @@ -45,7 +45,7 @@ class RepositoryCookbooks(HouseholdRepositoryGeneric[ReadCookBook, CookBook]): return super().update(match_value, data) except IntegrityError: self.session.rollback() - data.slug = slugify(f"{data.name} ({i+1})") + data.slug = slugify(f"{data.name} ({i + 1})") raise # raise the last IntegrityError diff --git a/mealie/services/migrations/tandoor.py b/mealie/services/migrations/tandoor.py index ba8979245..ef78698ab 100644 --- a/mealie/services/migrations/tandoor.py +++ b/mealie/services/migrations/tandoor.py @@ -112,7 +112,7 @@ class TandoorMigrator(BaseMigrator): recipes_as_dicts: list[dict] = [] for i, recipe_zip_file in enumerate(source_dir.glob("*.zip")): try: - recipe_dir = str(source_dir.joinpath(f"recipe_{i+1}")) + recipe_dir = str(source_dir.joinpath(f"recipe_{i + 1}")) os.makedirs(recipe_dir) with zipfile.ZipFile(recipe_zip_file) as recipe_zip: diff --git a/mealie/services/scraper/cleaner.py b/mealie/services/scraper/cleaner.py index 1089008c4..b5acb88b7 100644 --- a/mealie/services/scraper/cleaner.py +++ b/mealie/services/scraper/cleaner.py @@ -129,10 +129,7 @@ def clean_image(image: str | list | dict | None = None, default: str = "no image case [{"@id": str(_)}, *_]: return [x["@id"] for x in image if "@id" in x] case _: - logger.exception( - f"Unexpected type for image: { - type(image)}, {image}" - ) + logger.exception(f"Unexpected type for image: {type(image)}, {image}") return [default] @@ -227,10 +224,7 @@ def clean_instructions(steps_object: list | dict | str, default: list | None = N ) ) case _: - raise TypeError( - f"Unexpected type for instructions: { - type(steps_object)}, {steps_object}" - ) + raise TypeError(f"Unexpected type for instructions: {type(steps_object)}, {steps_object}") def _sanitize_instruction_text(line: str | dict) -> str: @@ -290,10 +284,7 @@ def clean_ingredients(ingredients: list | str | None, default: list | None = Non case str(ingredients): return [clean_string(ingredient) for ingredient in ingredients.splitlines() if ingredient.strip()] case _: - raise TypeError( - f"Unexpected type for ingredients: { - type(ingredients)}, {ingredients}" - ) + raise TypeError(f"Unexpected type for ingredients: {type(ingredients)}, {ingredients}") def clean_int(val: str | int | None, min: int | None = None, max: int | None = None): @@ -531,10 +522,7 @@ def clean_categories(category: str | list) -> list[str]: # return [cat["name"] for cat in category if "name" in cat] case _: - raise TypeError( - f"Unexpected type for category: { - type(category)}, {category}" - ) + raise TypeError(f"Unexpected type for category: {type(category)}, {category}") def clean_tags(data: str | list[str]) -> list[str]: diff --git a/poetry.lock b/poetry.lock index 3da9f6aac..3ed33307c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2828,29 +2828,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.8.6" +version = "0.9.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"}, - {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"}, - {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"}, - {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"}, - {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"}, - {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"}, - {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"}, - {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"}, - {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"}, - {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"}, - {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"}, - {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"}, + {file = "ruff-0.9.0-py3-none-linux_armv6l.whl", hash = "sha256:949b3513f931741e006cf267bf89611edff04e1f012013424022add3ce78f319"}, + {file = "ruff-0.9.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:99fbcb8c7fe94ae1e462ab2a1ef17cb20b25fb6438b9f198b1bcf5207a0a7916"}, + {file = "ruff-0.9.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b022afd8eb0fcfce1e0adec84322abf4d6ce3cd285b3b99c4f17aae7decf749"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336567ce92c9ca8ec62780d07b5fa11fbc881dc7bb40958f93a7d621e7ab4589"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d338336c44bda602dc8e8766836ac0441e5b0dfeac3af1bd311a97ebaf087a75"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9b3ececf523d733e90b540e7afcc0494189e8999847f8855747acd5a9a8c45f"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a11c0872a31232e473e2e0e2107f3d294dbadd2f83fb281c3eb1c22a24866924"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5fd06220c17a9cc0dc7fc6552f2ac4db74e8e8bff9c401d160ac59d00566f54"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0457e775c74bf3976243f910805242b7dcd389e1d440deccbd1194ca17a5728c"}, + {file = "ruff-0.9.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05415599bbcb318f730ea1b46a39e4fbf71f6a63fdbfa1dda92efb55f19d7ecf"}, + {file = "ruff-0.9.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fbf9864b009e43cfc1c8bed1a6a4c529156913105780af4141ca4342148517f5"}, + {file = "ruff-0.9.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:37b3da222b12e2bb2ce628e02586ab4846b1ed7f31f42a5a0683b213453b2d49"}, + {file = "ruff-0.9.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:733c0fcf2eb0c90055100b4ed1af9c9d87305b901a8feb6a0451fa53ed88199d"}, + {file = "ruff-0.9.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8221a454bfe5ccdf8017512fd6bb60e6ec30f9ea252b8a80e5b73619f6c3cefd"}, + {file = "ruff-0.9.0-py3-none-win32.whl", hash = "sha256:d345f2178afd192c7991ddee59155c58145e12ad81310b509bd2e25c5b0247b3"}, + {file = "ruff-0.9.0-py3-none-win_amd64.whl", hash = "sha256:0cbc0905d94d21305872f7f8224e30f4bbcd532bc21b2225b2446d8fc7220d19"}, + {file = "ruff-0.9.0-py3-none-win_arm64.whl", hash = "sha256:7b1148771c6ca88f820d761350a053a5794bc58e0867739ea93eb5e41ad978cd"}, + {file = "ruff-0.9.0.tar.gz", hash = "sha256:143f68fa5560ecf10fc49878b73cee3eab98b777fcf43b0e62d43d42f5ef9d8b"}, ] [[package]] @@ -3421,4 +3421,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "ee922a45c721fc906d1b41e9b693211c57795900e05f59fdf802e1c2d7481bef" +content-hash = "1561f8552de2253187d19299bb098f0ab53b1def90a0fa121a3cba379d5b0da8" diff --git a/pyproject.toml b/pyproject.toml index 0421a0802..aa4e1ba29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,7 +64,7 @@ pylint = "^3.0.0" pytest = "^8.0.0" pytest-asyncio = "^0.25.0" rich = "^13.5.2" -ruff = "^0.8.0" +ruff = "^0.9.0" types-PyYAML = "^6.0.4" types-python-dateutil = "^2.8.18" types-python-slugify = "^6.0.0" diff --git a/tests/integration_tests/user_household_tests/test_group_mealplan.py b/tests/integration_tests/user_household_tests/test_group_mealplan.py index 664ead9a2..f78b0eb86 100644 --- a/tests/integration_tests/user_household_tests/test_group_mealplan.py +++ b/tests/integration_tests/user_household_tests/test_group_mealplan.py @@ -1,5 +1,5 @@ import random -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from uuid import UUID from fastapi.testclient import TestClient @@ -42,11 +42,11 @@ def create_rule( ): qf_parts: list[str] = [] if tags: - qf_parts.append(f'tags.id CONTAINS ALL [{",".join([str(tag.id) for tag in tags])}]') + qf_parts.append(f"tags.id CONTAINS ALL [{','.join([str(tag.id) for tag in tags])}]") if categories: - qf_parts.append(f'recipe_category.id CONTAINS ALL [{",".join([str(cat.id) for cat in categories])}]') + qf_parts.append(f"recipe_category.id CONTAINS ALL [{','.join([str(cat.id) for cat in categories])}]") if households: - qf_parts.append(f'household_id IN [{",".join([str(household.id) for household in households])}]') + qf_parts.append(f"household_id IN [{','.join([str(household.id) for household in households])}]") query_filter_string = " AND ".join(qf_parts) return unique_user.repos.group_meal_plan_rules.create( @@ -64,9 +64,9 @@ def test_create_mealplan_no_recipe(api_client: TestClient, unique_user: TestUser title = random_string(length=25) text = random_string(length=25) new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="breakfast", title=title, text=text + date=datetime.now(UTC).date(), entry_type="breakfast", title=title, text=text ).model_dump() - new_plan["date"] = datetime.now(timezone.utc).date().strftime("%Y-%m-%d") + new_plan["date"] = datetime.now(UTC).date().strftime("%Y-%m-%d") response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) @@ -86,10 +86,10 @@ def test_create_mealplan_with_recipe(api_client: TestClient, unique_user: TestUs recipe = response.json() recipe_id = recipe["id"] - new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="dinner", recipe_id=recipe_id - ).model_dump(by_alias=True) - new_plan["date"] = datetime.now(timezone.utc).date().strftime("%Y-%m-%d") + new_plan = CreatePlanEntry(date=datetime.now(UTC).date(), entry_type="dinner", recipe_id=recipe_id).model_dump( + by_alias=True + ) + new_plan["date"] = datetime.now(UTC).date().strftime("%Y-%m-%d") new_plan["recipeId"] = str(recipe_id) response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) @@ -101,14 +101,14 @@ def test_create_mealplan_with_recipe(api_client: TestClient, unique_user: TestUs def test_crud_mealplan(api_client: TestClient, unique_user: TestUser): new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), + date=datetime.now(UTC).date(), entry_type="breakfast", title=random_string(), text=random_string(), ).model_dump() # Create - new_plan["date"] = datetime.now(timezone.utc).date().strftime("%Y-%m-%d") + new_plan["date"] = datetime.now(UTC).date().strftime("%Y-%m-%d") response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) response_json = response.json() assert response.status_code == 201 @@ -139,13 +139,13 @@ def test_crud_mealplan(api_client: TestClient, unique_user: TestUser): def test_get_all_mealplans(api_client: TestClient, unique_user: TestUser): for _ in range(3): new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), + date=datetime.now(UTC).date(), entry_type="breakfast", title=random_string(), text=random_string(), ).model_dump() - new_plan["date"] = datetime.now(timezone.utc).date().strftime("%Y-%m-%d") + new_plan["date"] = datetime.now(UTC).date().strftime("%Y-%m-%d") response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) assert response.status_code == 201 @@ -159,7 +159,7 @@ def test_get_all_mealplans(api_client: TestClient, unique_user: TestUser): def test_get_slice_mealplans(api_client: TestClient, unique_user: TestUser): # Make List of 10 dates from now to +10 days - dates = [datetime.now(timezone.utc).date() + timedelta(days=x) for x in range(10)] + dates = [datetime.now(UTC).date() + timedelta(days=x) for x in range(10)] # Make a list of 10 meal plans meal_plans = [ @@ -193,7 +193,7 @@ def test_get_mealplan_today(api_client: TestClient, unique_user: TestUser): # Create Meal Plans for today test_meal_plans = [ CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="breakfast", title=random_string(), text=random_string() + date=datetime.now(UTC).date(), entry_type="breakfast", title=random_string(), text=random_string() ).model_dump() for _ in range(3) ] @@ -212,7 +212,7 @@ def test_get_mealplan_today(api_client: TestClient, unique_user: TestUser): response_json = response.json() for meal_plan in response_json: - assert meal_plan["date"] == datetime.now(timezone.utc).date().strftime("%Y-%m-%d") + assert meal_plan["date"] == datetime.now(UTC).date().strftime("%Y-%m-%d") def test_get_mealplan_with_rules_categories_and_tags_filter(api_client: TestClient, unique_user: TestUser): diff --git a/tests/integration_tests/user_household_tests/test_group_webhooks.py b/tests/integration_tests/user_household_tests/test_group_webhooks.py index dac4d01bb..3dd7d87b5 100644 --- a/tests/integration_tests/user_household_tests/test_group_webhooks.py +++ b/tests/integration_tests/user_household_tests/test_group_webhooks.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest from fastapi.testclient import TestClient @@ -14,7 +14,7 @@ def webhook_data(): "name": "Test-Name", "url": "https://my-fake-url.com", "time": "00:00", - "scheduledTime": datetime.now(timezone.utc), + "scheduledTime": datetime.now(UTC), } @@ -41,7 +41,7 @@ def test_read_webhook(api_client: TestClient, unique_user: TestUser, webhook_dat assert webhook["id"] == item_id assert webhook["name"] == webhook_data["name"] assert webhook["url"] == webhook_data["url"] - assert webhook["scheduledTime"] == str(webhook_data["scheduledTime"].astimezone(timezone.utc).time()) + assert webhook["scheduledTime"] == str(webhook_data["scheduledTime"].astimezone(UTC).time()) assert webhook["enabled"] == webhook_data["enabled"] diff --git a/tests/integration_tests/user_recipe_tests/test_recipe_bulk_action.py b/tests/integration_tests/user_recipe_tests/test_recipe_bulk_action.py index d952ac936..3b2d2cea8 100644 --- a/tests/integration_tests/user_recipe_tests/test_recipe_bulk_action.py +++ b/tests/integration_tests/user_recipe_tests/test_recipe_bulk_action.py @@ -6,7 +6,6 @@ import sqlalchemy from fastapi.testclient import TestClient from mealie.core.dependencies.dependencies import validate_file_token -from mealie.repos.repository_factory import AllRepositories from mealie.schema.recipe.recipe_bulk_actions import ExportTypes from mealie.schema.recipe.recipe_category import CategorySave, TagSave from tests import utils @@ -137,7 +136,7 @@ def test_bulk_export_recipes(api_client: TestClient, unique_user: TestUser, ten_ assert validate_file_token(response_data["fileToken"]) == Path(export_path) # Use Export Token to download export - response = api_client.get(f'/api/utils/download?token={response_data["fileToken"]}') + response = api_client.get(f"/api/utils/download?token={response_data['fileToken']}") assert response.status_code == 200 diff --git a/tests/integration_tests/user_recipe_tests/test_recipe_cross_household.py b/tests/integration_tests/user_recipe_tests/test_recipe_cross_household.py index fa6b58aba..700a6d8c0 100644 --- a/tests/integration_tests/user_recipe_tests/test_recipe_cross_household.py +++ b/tests/integration_tests/user_recipe_tests/test_recipe_cross_household.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest from fastapi.testclient import TestClient @@ -242,7 +242,7 @@ def test_user_can_update_last_made_on_other_household( assert recipe["id"] == str(h2_recipe_id) old_last_made = recipe["lastMade"] - now = datetime.now(timezone.utc).isoformat().replace("+00:00", "Z") + now = datetime.now(UTC).isoformat().replace("+00:00", "Z") response = api_client.patch( api_routes.recipes_slug_last_made(h2_recipe_slug), json={"timestamp": now}, headers=unique_user.token ) diff --git a/tests/integration_tests/user_recipe_tests/test_recipe_owner.py b/tests/integration_tests/user_recipe_tests/test_recipe_owner.py index 86913b398..3b6372281 100644 --- a/tests/integration_tests/user_recipe_tests/test_recipe_owner.py +++ b/tests/integration_tests/user_recipe_tests/test_recipe_owner.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from fastapi.testclient import TestClient @@ -106,7 +106,7 @@ def test_user_update_last_made(api_client: TestClient, user_tuple: list[TestUser response = api_client.put(api_routes.recipes + f"/{recipe_name}", json=recipe, headers=usr_1.token) # User 2 should be able to update the last made timestamp - last_made_json = {"timestamp": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")} + last_made_json = {"timestamp": datetime.now(UTC).isoformat().replace("+00:00", "Z")} response = api_client.patch( api_routes.recipes_slug_last_made(recipe_name), json=last_made_json, headers=usr_2.token ) diff --git a/tests/unit_tests/repository_tests/test_pagination.py b/tests/unit_tests/repository_tests/test_pagination.py index 528d77419..36e3c3d3b 100644 --- a/tests/unit_tests/repository_tests/test_pagination.py +++ b/tests/unit_tests/repository_tests/test_pagination.py @@ -1,7 +1,7 @@ import random import time from collections import defaultdict -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from random import randint from urllib.parse import parse_qsl, urlsplit @@ -238,7 +238,7 @@ def test_pagination_filter_null(unique_user: TestUser): user_id=unique_user.user_id, group_id=unique_user.group_id, name=random_string(), - last_made=datetime.now(timezone.utc), + last_made=datetime.now(UTC), ) ) @@ -626,7 +626,7 @@ def test_pagination_filter_datetimes( ) def test_pagination_order_by_multiple(unique_user: TestUser, order_direction: OrderDirection): database = unique_user.repos - current_time = datetime.now(timezone.utc) + current_time = datetime.now(UTC) alphabet = ["a", "b", "c", "d", "e"] abbreviations = alphabet.copy() @@ -687,7 +687,7 @@ def test_pagination_order_by_multiple_directions( unique_user: TestUser, order_by_str: str, order_direction: OrderDirection ): database = unique_user.repos - current_time = datetime.now(timezone.utc) + current_time = datetime.now(UTC) alphabet = ["a", "b", "c", "d", "e"] abbreviations = alphabet.copy() @@ -735,7 +735,7 @@ def test_pagination_order_by_multiple_directions( ) def test_pagination_order_by_nested_model(unique_user: TestUser, order_direction: OrderDirection): database = unique_user.repos - current_time = datetime.now(timezone.utc) + current_time = datetime.now(UTC) alphabet = ["a", "b", "c", "d", "e"] labels = database.group_multi_purpose_labels.create_many( @@ -766,7 +766,7 @@ def test_pagination_order_by_nested_model(unique_user: TestUser, order_direction def test_pagination_order_by_doesnt_filter(unique_user: TestUser): database = unique_user.repos - current_time = datetime.now(timezone.utc) + current_time = datetime.now(UTC) label = database.group_multi_purpose_labels.create( MultiPurposeLabelSave(name=random_string(), group_id=unique_user.group_id) @@ -810,7 +810,7 @@ def test_pagination_order_by_nulls( unique_user: TestUser, null_position: OrderByNullPosition, order_direction: OrderDirection ): database = unique_user.repos - current_time = datetime.now(timezone.utc) + current_time = datetime.now(UTC) label = database.group_multi_purpose_labels.create( MultiPurposeLabelSave(name=random_string(), group_id=unique_user.group_id) @@ -916,7 +916,7 @@ def test_pagination_shopping_list_items_with_labels(unique_user: TestUser): def test_pagination_filter_dates(api_client: TestClient, unique_user: TestUser): - today = datetime.now(timezone.utc).date() + today = datetime.now(UTC).date() yesterday = today - timedelta(days=1) tomorrow = today + timedelta(days=1) diff --git a/tests/unit_tests/repository_tests/test_recipe_repository.py b/tests/unit_tests/repository_tests/test_recipe_repository.py index 9c9dde4f4..8b4c2ddf6 100644 --- a/tests/unit_tests/repository_tests/test_recipe_repository.py +++ b/tests/unit_tests/repository_tests/test_recipe_repository.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from typing import cast from uuid import UUID @@ -340,12 +340,12 @@ def test_recipe_repo_pagination_by_categories(unique_user: TestUser): page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination_query.pagination_seed = str(datetime.now(timezone.utc)) + pagination_query.pagination_seed = str(datetime.now(UTC)) random_ordered.append(database.recipes.page_all(pagination_query, categories=[category_slug]).items) assert not all(i == random_ordered[0] for i in random_ordered) @@ -437,12 +437,12 @@ def test_recipe_repo_pagination_by_tags(unique_user: TestUser): page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination_query.pagination_seed = str(datetime.now(timezone.utc)) + pagination_query.pagination_seed = str(datetime.now(UTC)) random_ordered.append(database.recipes.page_all(pagination_query, tags=[tag_slug]).items) assert len(random_ordered[0]) == 15 assert not all(i == random_ordered[0] for i in random_ordered) @@ -534,12 +534,12 @@ def test_recipe_repo_pagination_by_tools(unique_user: TestUser): page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination_query.pagination_seed = str(datetime.now(timezone.utc)) + pagination_query.pagination_seed = str(datetime.now(UTC)) random_ordered.append(database.recipes.page_all(pagination_query, tools=[tool_id]).items) assert len(random_ordered[0]) == 15 assert not all(i == random_ordered[0] for i in random_ordered) @@ -619,12 +619,12 @@ def test_recipe_repo_pagination_by_foods(unique_user: TestUser): page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination_query.pagination_seed = str(datetime.now(timezone.utc)) + pagination_query.pagination_seed = str(datetime.now(UTC)) random_ordered.append(database.recipes.page_all(pagination_query, foods=[food_id]).items) assert len(random_ordered[0]) == 15 assert not all(i == random_ordered[0] for i in random_ordered) @@ -696,12 +696,12 @@ def test_random_order_recipe_search( page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination.pagination_seed = str(datetime.now(timezone.utc)) + pagination.pagination_seed = str(datetime.now(UTC)) random_ordered.append(repo.page_all(pagination, search="soup").items) assert not all(i == random_ordered[0] for i in random_ordered) @@ -713,7 +713,7 @@ def test_order_by_rating(user_tuple: tuple[TestUser, TestUser]): recipes: list[Recipe] = [] for i in range(3): - slug = f"recipe-{i+1}-{random_string(5)}" + slug = f"recipe-{i + 1}-{random_string(5)}" recipes.append( repo.create( Recipe( diff --git a/tests/unit_tests/repository_tests/test_search.py b/tests/unit_tests/repository_tests/test_search.py index eb9da4317..461d28d32 100644 --- a/tests/unit_tests/repository_tests/test_search.py +++ b/tests/unit_tests/repository_tests/test_search.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime import pytest from sqlalchemy.orm import Session @@ -129,11 +129,11 @@ def test_random_order_search( page=1, per_page=-1, order_by="random", - pagination_seed=str(datetime.now(timezone.utc)), + pagination_seed=str(datetime.now(UTC)), order_direction=OrderDirection.asc, ) random_ordered = [] for _ in range(5): - pagination.pagination_seed = str(datetime.now(timezone.utc)) + pagination.pagination_seed = str(datetime.now(UTC)) random_ordered.append(repo.page_all(pagination, search="unit").items) assert not all(i == random_ordered[0] for i in random_ordered) diff --git a/tests/unit_tests/services_tests/scheduler/tasks/test_create_timeline_events.py b/tests/unit_tests/services_tests/scheduler/tasks/test_create_timeline_events.py index d3ef48866..9dbe7145d 100644 --- a/tests/unit_tests/services_tests/scheduler/tasks/test_create_timeline_events.py +++ b/tests/unit_tests/services_tests/scheduler/tasks/test_create_timeline_events.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from fastapi.testclient import TestClient from pydantic import UUID4 @@ -34,10 +34,10 @@ def test_new_mealplan_event(api_client: TestClient, unique_user: TestUser): response_json = response.json() initial_event_count = len(response_json["items"]) - new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="dinner", recipe_id=recipe_id - ).model_dump(by_alias=True) - new_plan["date"] = datetime.now(timezone.utc).date().isoformat() + new_plan = CreatePlanEntry(date=datetime.now(UTC).date(), entry_type="dinner", recipe_id=recipe_id).model_dump( + by_alias=True + ) + new_plan["date"] = datetime.now(UTC).date().isoformat() new_plan["recipeId"] = str(recipe_id) response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) @@ -65,7 +65,7 @@ def test_new_mealplan_event(api_client: TestClient, unique_user: TestUser): response = api_client.get(api_routes.recipes_slug(recipe_name), headers=unique_user.token) new_recipe_data: dict = response.json() recipe = RecipeSummary.model_validate(new_recipe_data) - assert recipe.last_made.date() == datetime.now(timezone.utc).date() # type: ignore + assert recipe.last_made.date() == datetime.now(UTC).date() # type: ignore # make sure nothing else was updated for data in [original_recipe_data, new_recipe_data]: @@ -101,10 +101,10 @@ def test_new_mealplan_event_duplicates(api_client: TestClient, unique_user: Test response_json = response.json() initial_event_count = len(response_json["items"]) - new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="dinner", recipe_id=recipe_id - ).model_dump(by_alias=True) - new_plan["date"] = datetime.now(timezone.utc).date().isoformat() + new_plan = CreatePlanEntry(date=datetime.now(UTC).date(), entry_type="dinner", recipe_id=recipe_id).model_dump( + by_alias=True + ) + new_plan["date"] = datetime.now(UTC).date().isoformat() new_plan["recipeId"] = str(recipe_id) response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) @@ -148,9 +148,9 @@ def test_new_mealplan_events_with_multiple_recipes(api_client: TestClient, uniqu mealplan_count_by_recipe_id[recipe.id] = 0 # type: ignore for _ in range(random_int(1, 5)): new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="dinner", recipe_id=str(recipe.id) + date=datetime.now(UTC).date(), entry_type="dinner", recipe_id=str(recipe.id) ).model_dump(by_alias=True) - new_plan["date"] = datetime.now(timezone.utc).date().isoformat() + new_plan["date"] = datetime.now(UTC).date().isoformat() new_plan["recipeId"] = str(recipe.id) response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) @@ -200,17 +200,17 @@ def test_preserve_future_made_date(api_client: TestClient, unique_user: TestUser recipe = RecipeSummary.model_validate(response.json()) recipe_id = str(recipe.id) - future_dt = datetime.now(timezone.utc) + timedelta(days=random_int(1, 10)) + future_dt = datetime.now(UTC) + timedelta(days=random_int(1, 10)) recipe.last_made = future_dt response = api_client.put( api_routes.recipes_slug(recipe.slug), json=utils.jsonify(recipe), headers=unique_user.token ) assert response.status_code == 200 - new_plan = CreatePlanEntry( - date=datetime.now(timezone.utc).date(), entry_type="dinner", recipe_id=recipe_id - ).model_dump(by_alias=True) - new_plan["date"] = datetime.now(timezone.utc).date().isoformat() + new_plan = CreatePlanEntry(date=datetime.now(UTC).date(), entry_type="dinner", recipe_id=recipe_id).model_dump( + by_alias=True + ) + new_plan["date"] = datetime.now(UTC).date().isoformat() new_plan["recipeId"] = str(recipe_id) response = api_client.post(api_routes.households_mealplans, json=new_plan, headers=unique_user.token) diff --git a/tests/unit_tests/services_tests/scheduler/tasks/test_delete_old_checked_shopping_list_items.py b/tests/unit_tests/services_tests/scheduler/tasks/test_delete_old_checked_shopping_list_items.py index 34e435205..782814670 100644 --- a/tests/unit_tests/services_tests/scheduler/tasks/test_delete_old_checked_shopping_list_items.py +++ b/tests/unit_tests/services_tests/scheduler/tasks/test_delete_old_checked_shopping_list_items.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from mealie.schema.household.group_shopping_list import ShoppingListItemCreate, ShoppingListItemOut, ShoppingListSave from mealie.services.scheduler.tasks.delete_old_checked_shopping_list_items import ( @@ -44,7 +44,7 @@ def test_cleanup(unique_user: TestUser): for item in unchecked_items + checked_items: assert item in shopping_list.list_items - checked_items.sort(key=lambda x: x.updated_at or datetime.now(timezone.utc), reverse=True) + checked_items.sort(key=lambda x: x.updated_at or datetime.now(UTC), reverse=True) expected_kept_items = unchecked_items + checked_items[:MAX_CHECKED_ITEMS] expected_deleted_items = checked_items[MAX_CHECKED_ITEMS:] diff --git a/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py b/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py index 6a218d322..d56c5c52c 100644 --- a/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py +++ b/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from uuid import UUID from pydantic import UUID4 @@ -31,7 +31,7 @@ def webhook_factory( name=name or random_string(), url=url or random_string(), webhook_type=webhook_type, - scheduled_time=scheduled_time.time() if scheduled_time else datetime.now(timezone.utc).time(), + scheduled_time=scheduled_time.time() if scheduled_time else datetime.now(UTC).time(), group_id=group_id, household_id=household_id, ) @@ -45,7 +45,7 @@ def test_get_scheduled_webhooks_filter_query(unique_user: TestUser): database = unique_user.repos expected: list[SaveWebhook] = [] - start = datetime.now(timezone.utc) + start = datetime.now(UTC) for _ in range(5): new_item = webhook_factory( @@ -65,7 +65,7 @@ def test_get_scheduled_webhooks_filter_query(unique_user: TestUser): expected.append(new_item) event_bus_listener = WebhookEventListener(UUID(unique_user.group_id), UUID(unique_user.household_id)) - results = event_bus_listener.get_scheduled_webhooks(start, datetime.now(timezone.utc) + timedelta(minutes=5)) + results = event_bus_listener.get_scheduled_webhooks(start, datetime.now(UTC) + timedelta(minutes=5)) assert len(results) == len(expected) @@ -85,8 +85,8 @@ def test_event_listener_get_meals_by_date_range(unique_user: TestUser): """ meal_repo = unique_user.repos.meals - start_date = datetime.now(timezone.utc) - timedelta(days=7) - end_date = datetime.now(timezone.utc) + start_date = datetime.now(UTC) - timedelta(days=7) + end_date = datetime.now(UTC) meal_1 = meal_repo.create( { @@ -152,8 +152,8 @@ def test_event_listener_get_meals_by_date_range(unique_user: TestUser): def test_get_meals_by_date_range(unique_user: TestUser): meal_repo = unique_user.repos.meals - start_date = datetime.now(timezone.utc) - timedelta(days=7) - end_date = datetime.now(timezone.utc) + start_date = datetime.now(UTC) - timedelta(days=7) + end_date = datetime.now(UTC) meal_1 = meal_repo.create( { @@ -210,8 +210,8 @@ def test_get_meals_by_date_range_no_meals(unique_user: TestUser): """ meal_repo = unique_user.repos.meals - start_date = datetime.now(timezone.utc) - timedelta(days=7) - end_date = datetime.now(timezone.utc) + start_date = datetime.now(UTC) - timedelta(days=7) + end_date = datetime.now(UTC) meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) @@ -224,7 +224,7 @@ def test_get_meals_by_date_range_single_day(unique_user: TestUser): """ meal_repo = unique_user.repos.meals - single_day = datetime.now(timezone.utc) + single_day = datetime.now(UTC) meal_1 = meal_repo.create( { @@ -255,12 +255,12 @@ def test_get_meals_by_date_range_no_overlap(unique_user: TestUser): """ meal_repo = unique_user.repos.meals - start_date = datetime.now(timezone.utc) + timedelta(days=1) - end_date = datetime.now(timezone.utc) + timedelta(days=10) + start_date = datetime.now(UTC) + timedelta(days=1) + end_date = datetime.now(UTC) + timedelta(days=10) meal_1 = meal_repo.create( { - "date": datetime.now(timezone.utc) - timedelta(days=5), + "date": datetime.now(UTC) - timedelta(days=5), "entry_type": "dinner", "title": "Meal Outside Range", "text": "This meal is outside the tested date range", @@ -289,7 +289,7 @@ def test_get_meals_by_date_range_invalid_date_range(unique_user: TestUser): """ meal_repo = unique_user.repos.meals - start_date = datetime.now(timezone.utc) + start_date = datetime.now(UTC) end_date = start_date - timedelta(days=1) meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) diff --git a/tests/unit_tests/services_tests/user_services/test_user_service.py b/tests/unit_tests/services_tests/user_services/test_user_service.py index 279932715..81e1235d5 100644 --- a/tests/unit_tests/services_tests/user_services/test_user_service.py +++ b/tests/unit_tests/services_tests/user_services/test_user_service.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta import pytest @@ -65,7 +65,7 @@ def test_lock_unlocker_user(unique_user: TestUser) -> None: assert not unlocked_user.is_locked # Sanity check that the is_locked property is working - user.locked_at = datetime.now(timezone.utc) - timedelta(days=2) + user.locked_at = datetime.now(UTC) - timedelta(days=2) assert not user.is_locked @@ -98,7 +98,7 @@ def test_reset_locked_users(unique_user: TestUser, use_task: bool) -> None: assert user.login_attemps == 5 # Test that the locked user is unlocked by reset - user.locked_at = datetime.now(timezone.utc) - timedelta(days=2) + user.locked_at = datetime.now(UTC) - timedelta(days=2) database.users.update(user.id, user) if use_task: unlocked = locked_user_reset() diff --git a/tests/unit_tests/test_alembic.py b/tests/unit_tests/test_alembic.py index 1bcc621ff..7ded6c732 100644 --- a/tests/unit_tests/test_alembic.py +++ b/tests/unit_tests/test_alembic.py @@ -39,9 +39,9 @@ def test_alembic_revisions_are_in_order() -> None: last = None for migration in migrations: if last is not None: - assert ( - last.revision == migration.down_revision - ), f"{last.revision} != {migration.down_revision} for {migration.path}" + assert last.revision == migration.down_revision, ( + f"{last.revision} != {migration.down_revision} for {migration.path}" + ) last = migration last = migration diff --git a/tests/unit_tests/validator_tests/test_create_plan_entry.py b/tests/unit_tests/validator_tests/test_create_plan_entry.py index 37e4c8959..7be2af7c8 100644 --- a/tests/unit_tests/validator_tests/test_create_plan_entry.py +++ b/tests/unit_tests/validator_tests/test_create_plan_entry.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from uuid import uuid4 import pytest @@ -7,7 +7,7 @@ from mealie.schema.meal_plan.new_meal import CreatePlanEntry def test_create_plan_with_title(): - entry = CreatePlanEntry(date=datetime.now(timezone.utc).date(), title="Test Title") + entry = CreatePlanEntry(date=datetime.now(UTC).date(), title="Test Title") assert entry.title == "Test Title" assert entry.recipe_id is None @@ -15,7 +15,7 @@ def test_create_plan_with_title(): def test_create_plan_with_slug(): uuid = uuid4() - entry = CreatePlanEntry(date=datetime.now(timezone.utc).date(), recipe_id=uuid) + entry = CreatePlanEntry(date=datetime.now(UTC).date(), recipe_id=uuid) assert entry.recipe_id == uuid assert entry.title == "" @@ -23,4 +23,4 @@ def test_create_plan_with_slug(): def test_slug_or_title_validation(): with pytest.raises(ValueError): - CreatePlanEntry(date=datetime.now(timezone.utc).date(), slug="", title="") + CreatePlanEntry(date=datetime.now(UTC).date(), slug="", title="") From e565b919dfa96bab999f55d5f081b136d4505ceb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:57:35 +0100 Subject: [PATCH 29/46] fix(deps): update dependency openai to v1.59.7 (#4890) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3ed33307c..ffc87b64a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1590,13 +1590,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.59.6" +version = "1.59.7" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.59.6-py3-none-any.whl", hash = "sha256:b28ed44eee3d5ebe1a3ea045ee1b4b50fea36ecd50741aaa5ce5a5559c900cb6"}, - {file = "openai-1.59.6.tar.gz", hash = "sha256:c7670727c2f1e4473f62fea6fa51475c8bc098c9ffb47bfb9eef5be23c747934"}, + {file = "openai-1.59.7-py3-none-any.whl", hash = "sha256:cfa806556226fa96df7380ab2e29814181d56fea44738c2b0e581b462c268692"}, + {file = "openai-1.59.7.tar.gz", hash = "sha256:043603def78c00befb857df9f0a16ee76a3af5984ba40cb7ee5e2f40db4646bf"}, ] [package.dependencies] From e9892aba8988a526846271417870b0d4cacbf262 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:19:49 -0600 Subject: [PATCH 30/46] feat: Move "on hand" and "last made" to household (#4616) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- docs/docs/overrides/api.html | 2 +- .../Recipe/RecipeDialogAddToShoppingList.vue | 10 +- .../Domain/Recipe/RecipeLastMade.vue | 35 +- .../RecipePageParts/RecipePageInfoCard.vue | 1 - .../RecipePageIngredientToolsView.vue | 37 ++- frontend/components/global/AppLoader.vue | 15 +- .../composables/recipes/use-recipe-tools.ts | 1 - frontend/composables/store/use-food-store.ts | 1 - frontend/composables/store/use-tool-store.ts | 7 +- frontend/lib/api/types/admin.ts | 2 +- frontend/lib/api/types/cookbook.ts | 2 +- frontend/lib/api/types/household.ts | 29 +- frontend/lib/api/types/meal-plan.ts | 2 +- frontend/lib/api/types/recipe.ts | 20 +- frontend/lib/api/user/households.ts | 6 + .../g/_groupSlug/recipes/tools/index.vue | 44 ++- frontend/pages/group/data/foods.vue | 68 +++- frontend/pages/group/data/recipe-actions.vue | 5 - frontend/pages/group/data/tools.vue | 57 +++- ...d3b3_add_household_to_recipe_last_made_.py | 263 +++++++++++++++ mealie/db/models/household/__init__.py | 2 + mealie/db/models/household/household.py | 17 + .../models/household/household_to_recipe.py | 60 ++++ mealie/db/models/recipe/ingredient.py | 37 ++- mealie/db/models/recipe/recipe.py | 5 + mealie/db/models/recipe/tool.py | 39 ++- mealie/repos/repository_factory.py | 16 +- mealie/repos/repository_generic.py | 10 +- mealie/repos/repository_household.py | 25 +- mealie/repos/repository_recipes.py | 148 ++++----- .../controller_household_self_service.py | 11 +- .../routes/households/controller_mealplan.py | 4 +- mealie/routes/organizers/controller_tools.py | 1 + mealie/routes/recipe/recipe_crud_routes.py | 12 +- mealie/routes/unit_and_foods/foods.py | 1 + mealie/schema/household/__init__.py | 10 + mealie/schema/household/household.py | 31 +- mealie/schema/recipe/recipe.py | 12 +- mealie/schema/recipe/recipe_ingredient.py | 18 +- mealie/schema/recipe/recipe_tool.py | 28 +- mealie/schema/response/query_filter.py | 117 ++++--- .../household_services/household_service.py | 51 ++- mealie/services/recipe/recipe_service.py | 12 +- .../scheduler/tasks/create_timeline_events.py | 7 +- pyproject.toml | 6 +- .../test_household_self_service.py | 65 ++++ .../test_recipe_cross_household.py | 55 +++- .../test_recipe_suggestions.py | 82 ++++- .../repository_tests/test_pagination.py | 103 ++++++ .../test_recipe_repository.py | 61 +++- .../backup_v2_tests/test_backup_v2.py | 307 ++++++++++-------- .../tasks/test_create_timeline_events.py | 53 ++- tests/utils/api_routes/__init__.py | 5 + 53 files changed, 1618 insertions(+), 400 deletions(-) create mode 100644 mealie/alembic/versions/2024-11-20-17.30.41_b9e516e2d3b3_add_household_to_recipe_last_made_.py create mode 100644 mealie/db/models/household/household_to_recipe.py diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 8c7f4880d..a6f596205 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue index 789d59bd4..6f233b84f 100644 --- a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue +++ b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue @@ -204,6 +204,10 @@ export default defineComponent({ shoppingListShowAllToggled: false, }); + const userHousehold = computed(() => { + return $auth.user?.householdSlug || ""; + }); + const shoppingListChoices = computed(() => { return props.shoppingLists.filter((list) => preferences.value.viewAllLists || list.userId === $auth.user?.id); }); @@ -248,8 +252,9 @@ export default defineComponent({ } const shoppingListIngredients: ShoppingListIngredient[] = recipe.recipeIngredient.map((ing) => { + const householdsWithFood = (ing.food?.householdsWithIngredientFood || []); return { - checked: !ing.food?.onHand, + checked: !householdsWithFood.includes(userHousehold.value), ingredient: ing, disableAmount: recipe.settings?.disableAmount || false, } @@ -276,7 +281,8 @@ export default defineComponent({ } // Store the on-hand ingredients for later - if (ing.ingredient.food?.onHand) { + const householdsWithFood = (ing.ingredient.food?.householdsWithIngredientFood || []); + if (householdsWithFood.includes(userHousehold.value)) { onHandIngs.push(ing); return sections; } diff --git a/frontend/components/Domain/Recipe/RecipeLastMade.vue b/frontend/components/Domain/Recipe/RecipeLastMade.vue index d60de97b4..178db28bd 100644 --- a/frontend/components/Domain/Recipe/RecipeLastMade.vue +++ b/frontend/components/Domain/Recipe/RecipeLastMade.vue @@ -96,7 +96,12 @@ {{ $globals.icons.calendar }} - {{ $t('recipe.last-made-date', { date: value ? new Date(value).toLocaleDateString($i18n.locale) : $t("general.never") } ) }} +
+ {{ $t('recipe.last-made-date', { date: lastMade ? new Date(lastMade).toLocaleDateString($i18n.locale) : $t("general.never") } ) }} +
+
+ +
@@ -110,7 +115,7 @@