Compare commits

...

233 Commits

Author SHA1 Message Date
vabene1111
dc320f2e6d Merge branch 'develop' 2025-01-18 09:30:51 +01:00
vabene1111
acbca83553 fixed test to reflect new permission 2025-01-18 09:30:43 +01:00
vabene1111
cb26c5dfc8 allow gif 2025-01-18 09:23:56 +01:00
vabene1111
b5c4174700 default mediafiles content disposition header attatchement 2025-01-18 09:22:46 +01:00
vabene1111
3e37d11c6a restrict file upload to certain types 2025-01-18 09:22:29 +01:00
vabene1111
36e83a9d01 restrict local external recipes to superusers and restrict file path/type 2025-01-18 08:57:46 +01:00
vabene1111
efcd759869 Merge pull request #3496 from TandoorRecipes/dependabot/pip/django-4.2.18
Bump django from 4.2.17 to 4.2.18
2025-01-18 08:11:35 +01:00
dependabot[bot]
7c81396ec5 Bump django from 4.2.17 to 4.2.18
Bumps [django](https://github.com/django/django) from 4.2.17 to 4.2.18.
- [Commits](https://github.com/django/django/compare/4.2.17...4.2.18)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 13:58:22 +00:00
smilerz
9b50665375 bump recipe-scrapers
fixes #3495
2025-01-17 07:57:30 -06:00
Anton Shevtsov
83795581e6 Translated using Weblate (Ukrainian)
Currently translated at 44.3% (253 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-01-16 18:58:38 +00:00
Anton Shevtsov
af51524109 Translated using Weblate (Ukrainian)
Currently translated at 2.8% (14 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-01-16 18:58:38 +00:00
vabene1111
738aa12243 Merge branch 'develop' 2025-01-05 11:38:52 +01:00
vabene1111
f25de4b4ce remove healthcheck 2025-01-05 11:38:35 +01:00
vabene1111
698aa5a753 Merge branch 'develop' 2025-01-01 09:24:51 +01:00
vabene1111
6444680e06 Merge pull request #3475 from TandoorRecipes/dependabot/pip/cryptography-44.0.0
Bump cryptography from 43.0.1 to 44.0.0
2025-01-01 08:16:19 +01:00
dependabot[bot]
c604369e86 Bump cryptography from 43.0.1 to 44.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.1 to 44.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.1...44.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 00:33:49 +00:00
vabene1111
79abb8bf8f Merge branch 'develop' 2024-12-29 13:46:24 +01:00
vabene1111
fd4236672e update gitignore like vue3 branch 2024-12-29 13:46:17 +01:00
vabene1111
00148a2993 made shopping list compatible with SLR entries without a recipe 2024-12-29 13:44:43 +01:00
vabene1111
359fcb24cf fixed social signup form 2024-12-29 13:42:12 +01:00
vabene1111
f5d7919f72 Merge pull request #3448 from igorsantos07/patch-1
Update system.html: Django Recipes > Tandoor
2024-12-28 08:26:53 +01:00
vabene1111
86c4278553 Merge pull request #3454 from TandoorRecipes/dependabot/pip/jinja2-3.1.5
Bump jinja2 from 3.1.4 to 3.1.5
2024-12-28 08:26:44 +01:00
dependabot[bot]
2a5c0bb740 Bump jinja2 from 3.1.4 to 3.1.5
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.5)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-28 07:25:33 +00:00
Igor Santos
432dfa9e86 Update system.html: Django Recipes > Tandoor 2024-12-24 02:28:21 -03:00
vabene1111
f61a8371f4 Revert "added user filkes to recipe and added is_image flag to user file"
This reverts commit 0bcdf5e0a3.
2024-12-22 12:12:37 +01:00
vabene1111
0bcdf5e0a3 added user filkes to recipe and added is_image flag to user file 2024-12-22 12:05:47 +01:00
vabene1111
169f799a23 Merge pull request #3428 from hawthorc/develop
Add note about Python 3.12 dependency to manual.md
2024-12-11 15:19:59 +01:00
vabene1111
942d1130a1 Merge pull request #3416 from zodac/develop
Adding healthcheck to docker image
2024-12-11 15:17:28 +01:00
vabene1111
64cc20aed2 Merge pull request #3426 from TandoorRecipes/dependabot/pip/icalendar-6.1.0
Bump icalendar from 5.0.11 to 6.1.0
2024-12-11 15:12:09 +01:00
vabene1111
3a6731ec8d Merge pull request #3425 from TandoorRecipes/dependabot/pip/pytest-factoryboy-2.7.0
Bump pytest-factoryboy from 2.6.0 to 2.7.0
2024-12-11 15:11:32 +01:00
vabene1111
e6f11a17b9 Merge pull request #3423 from TandoorRecipes/dependabot/pip/pytest-django-4.9.0
Bump pytest-django from 4.8.0 to 4.9.0
2024-12-11 15:11:17 +01:00
vabene1111
cc1cd610e7 Merge pull request #3424 from TandoorRecipes/dependabot/pip/crispy-bootstrap4-2024.10
Bump crispy-bootstrap4 from 2024.1 to 2024.10
2024-12-11 15:10:19 +01:00
vabene1111
6a3b5ee844 Merge pull request #3431 from TandoorRecipes/dependabot/pip/django-4.2.17
Bump django from 4.2.16 to 4.2.17
2024-12-11 15:09:46 +01:00
Matjaž T
49b119571e Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-12-10 07:58:36 +00:00
Vincenzo Reale
e024e3deb0 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-09 00:58:36 +00:00
dependabot[bot]
7ccedb559d Bump django from 4.2.16 to 4.2.17
Bumps [django](https://github.com/django/django) from 4.2.16 to 4.2.17.
- [Commits](https://github.com/django/django/compare/4.2.16...4.2.17)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-06 18:57:23 +00:00
zodac
103daf000d Using --spider for healthcheck, which performs a HEAD request instead of a GET request 2024-12-02 20:44:12 +13:00
Vincenzo Reale
70df456307 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-12-02 04:53:51 +00:00
Carter Hawthorne
375174ee41 Add note about Python 3.12 dependency to manual.md 2024-12-01 18:38:38 -08:00
dependabot[bot]
f19beba014 Bump icalendar from 5.0.11 to 6.1.0
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.11 to 6.1.0.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/main/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.11...v6.1.0)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:31 +00:00
dependabot[bot]
865756e4b2 Bump pytest-factoryboy from 2.6.0 to 2.7.0
Bumps [pytest-factoryboy](https://github.com/pytest-dev/pytest-factoryboy) from 2.6.0 to 2.7.0.
- [Changelog](https://github.com/pytest-dev/pytest-factoryboy/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-factoryboy/compare/2.6.0...2.7.0)

---
updated-dependencies:
- dependency-name: pytest-factoryboy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:28 +00:00
dependabot[bot]
41f834db08 Bump crispy-bootstrap4 from 2024.1 to 2024.10
Bumps [crispy-bootstrap4](https://github.com/django-crispy-forms/crispy-bootstrap4) from 2024.1 to 2024.10.
- [Release notes](https://github.com/django-crispy-forms/crispy-bootstrap4/releases)
- [Changelog](https://github.com/django-crispy-forms/crispy-bootstrap4/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/crispy-bootstrap4/compare/2024.1...2024.10)

---
updated-dependencies:
- dependency-name: crispy-bootstrap4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:26 +00:00
dependabot[bot]
2c94753a5a Bump pytest-django from 4.8.0 to 4.9.0
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.8.0 to 4.9.0.
- [Release notes](https://github.com/pytest-dev/pytest-django/releases)
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.8.0...v4.9.0)

---
updated-dependencies:
- dependency-name: pytest-django
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 00:39:23 +00:00
zodac
0e05c77fa7 Adding healthcheck to docker image 2024-11-29 14:15:24 +13:00
vabene1111
793c152b26 Merge pull request #3412 from lavanyamehn/duplicate_urls
Display a warning message when duplicate recipe is imported
2024-11-27 15:50:54 +01:00
Lavanya Mehndiratta
9df75f551c Changed functionality to only display a warning message 2024-11-26 18:09:55 -05:00
vabene1111
da49280ef2 Merge branch 'develop' 2024-11-26 17:29:57 +01:00
vabene1111
e6087d5129 use Sandbox Environment to render templates 2024-11-26 17:18:47 +01:00
vabene1111
4f9bff20c8 Merge pull request #3411 from bishtawi/bishtawi/secret-files
Support reading more secrets from files
2024-11-25 16:46:56 +01:00
Anders Obro
683f1ac10a Translated using Weblate (Danish)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2024-11-25 12:45:13 +00:00
Bishtawi
e844d2995a Support reading secrets from files 2024-11-24 12:31:17 -08:00
vabene1111
c0af3d19cd Merge branch 'develop' 2024-11-23 21:59:46 +01:00
vabene1111
78d20e8340 removed log 2024-11-23 21:59:40 +01:00
vabene1111
6a90caee04 removed log 2024-11-23 21:58:57 +01:00
vabene1111
98c95a94bc fixed youtube importer 2024-11-23 21:56:32 +01:00
vabene1111
d4dc4a30b8 fixed system page 2024-11-23 13:26:12 +01:00
Oleh Hudyma
70d2dc089c Translated using Weblate (Ukrainian)
Currently translated at 2.2% (11 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2024-11-22 07:58:36 +00:00
Matjaž T
8698ad3054 Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-22 07:58:36 +00:00
Daniel Legin
6188f175ae Translated using Weblate (Croatian)
Currently translated at 30.9% (151 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/hr/
2024-11-19 06:58:39 +00:00
Daniel Legin
189fab2401 Translated using Weblate (Croatian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hr/
2024-11-19 06:58:39 +00:00
Anders Obro
a3adba1941 Translated using Weblate (Danish)
Currently translated at 94.5% (539 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/
2024-11-19 06:58:39 +00:00
Mario Dvorsek
cea41af1b8 Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-19 06:58:39 +00:00
Matjaž T
a325070f7f Translated using Weblate (Slovenian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-19 06:58:39 +00:00
Matjaž T
d782c54c2c Translated using Weblate (Slovenian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-19 06:58:39 +00:00
vabene1111
58917fbc4d Merge pull request #3403 from TandoorRecipes/dependabot/pip/aiohttp-3.10.11
Bump aiohttp from 3.10.2 to 3.10.11
2024-11-19 07:11:06 +01:00
dependabot[bot]
8b0547aeb9 Bump aiohttp from 3.10.2 to 3.10.11
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-19 06:10:25 +00:00
Daniel Legin
9efc101161 Added translation using Weblate (Croatian) 2024-11-18 19:04:53 +00:00
Daniel Legin
691e8a940b Added translation using Weblate (Croatian) 2024-11-18 11:13:47 +00:00
Matjaž T
bee7623eaf Translated using Weblate (Slovenian)
Currently translated at 71.7% (409 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-17 16:58:38 +00:00
Matjaž T
430697879f Translated using Weblate (Slovenian)
Currently translated at 84.0% (410 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-17 16:58:38 +00:00
Vincenzo Reale
749974654a Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-11-17 16:58:36 +00:00
Matjaž T
f31a661aaf Translated using Weblate (Slovenian)
Currently translated at 71.7% (409 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-16 14:09:25 +00:00
Matjaž T
70ea3acb05 Translated using Weblate (Slovenian)
Currently translated at 15.3% (75 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-11-16 14:09:25 +00:00
vabene1111
81547563c6 Merge branch 'develop' 2024-11-14 16:07:51 +01:00
vabene1111
c107f2f497 fixed system view 2024-11-14 16:06:58 +01:00
Владислав
5fea2131cd Translated using Weblate (Russian)
Currently translated at 5.5% (27 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/ru/
2024-11-12 17:58:38 +00:00
Владислав
d671df30a3 Translated using Weblate (Russian)
Currently translated at 82.9% (473 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-11-12 17:58:38 +00:00
vabene1111
100b75a5d2 Merge branch 'develop' 2024-11-12 16:15:31 +01:00
vabene1111
7dba36d210 switched to space stats 2024-11-12 16:15:01 +01:00
vabene1111
0dea5c9877 api stats 2024-11-12 15:53:13 +01:00
vabene1111
1777dfe821 Revert "Merge pull request #3334 from TandoorRecipes/dependabot/pip/pytest-asyncio-0.24.0"
This reverts commit c30e1bb43a, reversing
changes made to 31051086ba.
2024-11-11 18:10:14 +01:00
vabene1111
2b6edfb96d fixed import_export docs format 2024-11-11 18:06:29 +01:00
vabene1111
faa3c99965 Merge pull request #3280 from vitoller/feature/import-gourmet
import of gourmet files
2024-11-11 18:04:55 +01:00
vabene1111
1cc5a0a094 Merge pull request #3382 from TandoorRecipes/dependabot/pip/django-cors-headers-4.6.0
Bump django-cors-headers from 4.3.1 to 4.6.0
2024-11-11 17:58:58 +01:00
vabene1111
cbafbd44a4 Merge pull request #3337 from TandoorRecipes/dependabot/pip/flake8-7.1.1
Bump flake8 from 6.1.0 to 7.1.1
2024-11-11 17:58:52 +01:00
vabene1111
f16a804758 Merge pull request #3335 from TandoorRecipes/dependabot/pip/lxml-5.3.0
Bump lxml from 5.1.0 to 5.3.0
2024-11-11 17:58:36 +01:00
vabene1111
c30e1bb43a Merge pull request #3334 from TandoorRecipes/dependabot/pip/pytest-asyncio-0.24.0
Bump pytest-asyncio from 0.23.5 to 0.24.0
2024-11-11 17:58:29 +01:00
vabene1111
31051086ba Merge pull request #3333 from TandoorRecipes/dependabot/pip/requests-2.32.3
Bump requests from 2.32.0 to 2.32.3
2024-11-11 17:58:22 +01:00
vabene1111
67d3c852dd Merge pull request #3381 from TandoorRecipes/dependabot/npm_and_yarn/vue/elliptic-6.6.0
Bump elliptic from 6.5.7 to 6.6.0 in /vue
2024-11-11 17:57:18 +01:00
Aija Kozlovska
4ea9b10fc4 Translated using Weblate (Latvian)
Currently translated at 2.8% (16 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/lv/
2024-11-05 10:58:36 +00:00
Aija Kozlovska
e609f4e0e0 Translated using Weblate (Latvian)
Currently translated at 67.6% (330 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/lv/
2024-11-05 10:58:36 +00:00
Dragan
b9ee2611a3 Translated using Weblate (Slovenian)
Currently translated at 54.0% (308 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2024-11-04 10:29:24 +00:00
Johnny Ip
8de3c41958 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-04 10:29:24 +00:00
Johnny Ip
2a350a9bbe Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hant/
2024-11-04 10:29:23 +00:00
Johnny Ip
89c4c09481 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-11-04 10:29:23 +00:00
Aija Kozlovska
a97b023504 Translated using Weblate (Latvian)
Currently translated at 45.9% (224 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/lv/
2024-11-04 10:29:23 +00:00
Aija Kozlovska
4aa7152ab4 Added translation using Weblate (Latvian) 2024-11-04 08:31:40 +00:00
Johnny Ip
80ff8ddb12 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-03 16:34:45 +00:00
Johnny Ip
45aeeaa069 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2024-11-03 16:32:49 +00:00
Vincenzo Reale
0c24db72c6 Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-11-01 06:58:36 +00:00
Vincenzo Reale
95c4d72b74 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-11-01 06:58:36 +00:00
dependabot[bot]
1330c0e7a3 Bump django-cors-headers from 4.3.1 to 4.6.0
Bumps [django-cors-headers](https://github.com/adamchainz/django-cors-headers) from 4.3.1 to 4.6.0.
- [Changelog](https://github.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/django-cors-headers/compare/4.3.1...4.6.0)

---
updated-dependencies:
- dependency-name: django-cors-headers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 00:03:14 +00:00
Vincenzo Reale
9af22bcf9f Translated using Weblate (Italian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-31 06:00:00 +00:00
Vincenzo Reale
d24214c463 Translated using Weblate (Italian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-31 06:00:00 +00:00
dependabot[bot]
e8101dd433 Bump elliptic from 6.5.7 to 6.6.0 in /vue
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-31 02:20:39 +00:00
Vincenzo Reale
94bd343eed Translated using Weblate (Italian)
Currently translated at 96.6% (551 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-30 16:02:55 +00:00
Vincenzo Reale
f409633ade Translated using Weblate (Italian)
Currently translated at 93.4% (456 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-30 16:02:55 +00:00
Vincenzo Reale
e927418535 Translated using Weblate (Italian)
Currently translated at 82.6% (471 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2024-10-30 13:30:42 +00:00
Vincenzo Reale
be9f9d68db Translated using Weblate (Italian)
Currently translated at 89.3% (436 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2024-10-30 13:30:42 +00:00
vabene1111
3a002cce9e Merge pull request #3359 from Chronophylos/mealie-import
Fix null-constrait errors in mealie import
2024-10-14 08:25:11 +02:00
vabene1111
416ddf3d34 Merge pull request #3361 from tlambertz/paprika-fix
Fix Paprika Import Images when not downloading from URL.
2024-10-14 08:22:19 +02:00
vabene1111
8b0a19c6a2 Merge pull request #3357 from TandoorRecipes/dependabot/npm_and_yarn/vue/elliptic-6.5.7
Bump elliptic from 6.5.4 to 6.5.7 in /vue
2024-10-13 12:30:59 +02:00
Thomas Lambertz
757fa1b768 Fix Paprika Import Images when not downloading from URL.
Previously, the code only tried to use the cropped image from paprika when downloading actively failed.
But if a user takes an image himself, the url will be empty, thus downloading won't be attempted and won't fail.
This change makes it so that the download is tried first, but the photo_data is always tried if no image exists for whatever reason.
2024-10-12 21:15:37 +02:00
Chronophylos
736d829bd0 Fix null-constrait errors in mealie import 2024-10-12 16:01:32 +02:00
dependabot[bot]
6829d5351d Bump elliptic from 6.5.4 to 6.5.7 in /vue
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-12 03:18:39 +00:00
vabene1111
805eb87754 Merge pull request #3353 from TandoorRecipes/dependabot/pip/django-4.2.16
Bump django from 4.2.15 to 4.2.16
2024-10-10 13:07:43 +02:00
dependabot[bot]
e910ec4a51 Bump django from 4.2.15 to 4.2.16
Bumps [django](https://github.com/django/django) from 4.2.15 to 4.2.16.
- [Commits](https://github.com/django/django/compare/4.2.15...4.2.16)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 21:29:14 +00:00
vabene1111
4c0ace1d84 Merge branch 'develop' 2024-10-08 18:25:17 +02:00
vabene1111
cae26e7fe0 updated recipe scrapers 2024-10-08 18:22:03 +02:00
supaeasy
8d070349a6 Translated using Weblate (German)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-10-02 23:58:36 +00:00
vabene1111
166697d791 Merge pull request #3340 from TandoorRecipes/revert-3326-develop
Revert "Update connectors.md"
2024-10-02 14:29:36 +02:00
vabene1111
90d93b733d Revert "Update connectors.md" 2024-10-02 14:29:24 +02:00
vabene1111
272d2e94a1 Merge pull request #3327 from IkkiOcean/patch-1
Update manual.md with required python version
2024-10-02 09:24:46 +02:00
vabene1111
f84a401714 Merge pull request #3326 from supaeasy/develop
Update connectors.md
2024-10-02 09:23:01 +02:00
Jorge Martinez
f6b19d40b1 Translated using Weblate (Spanish)
Currently translated at 99.2% (566 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2024-10-01 18:58:35 +00:00
dependabot[bot]
969b7ba492 Bump flake8 from 6.1.0 to 7.1.1
Bumps [flake8](https://github.com/pycqa/flake8) from 6.1.0 to 7.1.1.
- [Commits](https://github.com/pycqa/flake8/compare/6.1.0...7.1.1)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:42 +00:00
dependabot[bot]
c9edec6308 Bump lxml from 5.1.0 to 5.3.0
Bumps [lxml](https://github.com/lxml/lxml) from 5.1.0 to 5.3.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.1.0...lxml-5.3.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:37 +00:00
dependabot[bot]
9f0ff1348c Bump pytest-asyncio from 0.23.5 to 0.24.0
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.23.5 to 0.24.0.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.23.5...v0.24.0)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:31 +00:00
dependabot[bot]
c85d62fc66 Bump requests from 2.32.0 to 2.32.3
Bumps [requests](https://github.com/psf/requests) from 2.32.0 to 2.32.3.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.0...v2.32.3)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 00:42:28 +00:00
Vivek Prakash
dae51a8d3e Update manual.md with required python version
The code written in https://github.com/TandoorRecipes/recipes/blob/develop/cookbook/connectors/connector_manager.py makes use of features introduced in Python 3.10, such as the structural pattern matching (match and case) and the union types with the pipe operator (|) which are not compatible with Python 3.9. That's why the minimum required python version for the manual installation should be python version 3.10.
2024-10-01 00:53:04 +05:30
supaeasy
d522534a12 Update connectors.md
Fixed errors in description:
- add / after api
- omit 'todo.' when adding HA-Entity
2024-09-30 14:17:18 +02:00
supaeasy
a38308a24a Translated using Weblate (German)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2024-09-27 13:58:36 +00:00
supaeasy
b981960221 Translated using Weblate (German)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-27 13:58:35 +00:00
nenormalniy
7d1461a752 Translated using Weblate (Russian)
Currently translated at 63.3% (361 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-26 03:58:35 +00:00
Emmker
24a589fe41 Translated using Weblate (Greek)
Currently translated at 46.3% (226 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/el/
2024-09-23 21:58:37 +00:00
supaeasy
b1d28a46c3 Translated using Weblate (German)
Currently translated at 98.9% (483 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-09-23 21:58:37 +00:00
vabene1111
6b376fbfbb Merge pull request #3302 from mikhail5555/dont-log-sensitive-headers-in-err
Allow HomeAssistant Connector to work with Debug=False (and logging improvements)
2024-09-23 07:44:01 +02:00
vabene1111
c532b1f94f Merge branch 'develop' into dont-log-sensitive-headers-in-err 2024-09-23 07:43:55 +02:00
vabene1111
26ab7f5580 Merge pull request #3305 from ehowe/develop
Make HomeAssistant description field optional
2024-09-23 07:37:34 +02:00
Emmker
72c638ca6f Translated using Weblate (Greek)
Currently translated at 99.8% (569 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/el/
2024-09-22 21:31:53 +00:00
Georgii Bogdanov
5478b7d550 Translated using Weblate (Russian)
Currently translated at 62.9% (359 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-22 21:31:52 +00:00
Mikhail Epifanov
e6eacc48d6 update code so it also works in DEBUG=false 2024-09-17 22:25:08 +02:00
Bebbe K
0259e000e3 Translated using Weblate (Swedish)
Currently translated at 61.4% (300 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sv/
2024-09-17 11:58:35 +00:00
Eugene Howe
eb0a95f594 Make HomeAssistant description field optional 2024-09-15 10:44:30 -04:00
Muck Péter
41ee8cf66f Translated using Weblate (Hungarian)
Currently translated at 81.5% (465 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/hu/
2024-09-14 12:44:44 +00:00
Mikhail Epifanov
8c8834e6aa dont log err.headers which can contain sensitive info 2024-09-13 22:36:05 +02:00
Tomer Alcavi
145abfa344 Translated using Weblate (Hebrew)
Currently translated at 18.2% (89 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/he/
2024-09-08 12:58:37 +00:00
Jaan
f60e61e331 Translated using Weblate (Russian)
Currently translated at 62.4% (356 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-08 12:58:37 +00:00
Sergei
fd534aba95 Translated using Weblate (Russian)
Currently translated at 62.4% (356 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2024-09-08 12:58:37 +00:00
vabene1111
f23c99f5ea Merge pull request #3293 from TandoorRecipes/dependabot/pip/cryptography-43.0.1
Bump cryptography from 42.0.5 to 43.0.1
2024-09-06 07:32:00 +02:00
dependabot[bot]
1a14cc9513 Bump cryptography from 42.0.5 to 43.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.5 to 43.0.1.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.5...43.0.1)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-04 00:11:21 +00:00
S. v.d. Gevel
e98131ce7a Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-03 19:58:35 +00:00
S. v.d. Gevel
7cff47efab Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-09-03 19:58:35 +00:00
Stefan van der Gevel
1dcc3e06d4 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-02 19:31:07 +00:00
S. v.d. Gevel
9125921038 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-09-02 19:31:07 +00:00
vabene1111
eea2a2c252 Merge pull request #3287 from TandoorRecipes/dependabot/pip/pyyaml-6.0.2
Bump pyyaml from 6.0.1 to 6.0.2
2024-09-02 16:39:46 +02:00
vabene1111
9554c69a39 Merge pull request #3288 from TandoorRecipes/dependabot/pip/django-crispy-forms-2.3
Bump django-crispy-forms from 2.1 to 2.3
2024-09-02 16:39:21 +02:00
vabene1111
506ab0f0c7 Merge pull request #3290 from TandoorRecipes/dependabot/pip/pillow-10.4.0
Bump pillow from 10.3.0 to 10.4.0
2024-09-02 16:39:03 +02:00
vabene1111
3e26ca5c68 Merge pull request #3291 from TandoorRecipes/dependabot/pip/whitenoise-6.7.0
Bump whitenoise from 6.6.0 to 6.7.0
2024-09-02 16:38:51 +02:00
dependabot[bot]
3fa8a9f27e Bump whitenoise from 6.6.0 to 6.7.0
Bumps [whitenoise](https://github.com/evansd/whitenoise) from 6.6.0 to 6.7.0.
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.6.0...6.7.0)

---
updated-dependencies:
- dependency-name: whitenoise
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:14 +00:00
dependabot[bot]
0cdff07e4b Bump pillow from 10.3.0 to 10.4.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.3.0 to 10.4.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.3.0...10.4.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:11 +00:00
dependabot[bot]
8a142c3b11 Bump django-crispy-forms from 2.1 to 2.3
Bumps [django-crispy-forms](https://github.com/django-crispy-forms/django-crispy-forms) from 2.1 to 2.3.
- [Release notes](https://github.com/django-crispy-forms/django-crispy-forms/releases)
- [Changelog](https://github.com/django-crispy-forms/django-crispy-forms/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/django-crispy-forms/compare/2.1...2.3)

---
updated-dependencies:
- dependency-name: django-crispy-forms
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:05 +00:00
dependabot[bot]
20ca7151d1 Bump pyyaml from 6.0.1 to 6.0.2
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/main/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.1...6.0.2)

---
updated-dependencies:
- dependency-name: pyyaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 00:34:02 +00:00
Horst
15abe9f24b import of gourmet files
* in gourmet export as html and zip folder
* 'menus' are not imported

Note: it appears that the native format '.grmt' does not include the unit for ingredients
2024-08-30 10:05:19 +02:00
vabene1111
754b7c3376 Merge pull request #3278 from Priyanshu1035/fixtypo
Fixed the typo in the base.html file
2024-08-29 17:28:04 +02:00
Stefan van der Gevel
00b02248d3 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-28 18:49:54 +00:00
Priyanshu1035
fda302ebb6 fixedtypo 2024-08-28 23:29:41 +05:30
Stefan van der Gevel
70cd675aa1 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-28 12:58:35 +00:00
Stefan van der Gevel
960db5aaab Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-28 12:58:35 +00:00
Known Rabbit
8daf43d6e8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-27 07:58:35 +00:00
Stefan van der Gevel
114ca55b26 Translated using Weblate (Dutch)
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-27 07:58:35 +00:00
Known Rabbit
59f5219c0b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-27 07:58:35 +00:00
Stefan van der Gevel
bc465c7b2f Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-27 07:58:35 +00:00
Known Rabbit
bf1b2db415 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-26 06:47:13 +00:00
Known Rabbit
9085756fca Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-26 06:47:13 +00:00
Known Rabbit
db43bd1962 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (570 of 570 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/
2024-08-24 14:58:37 +00:00
Known Rabbit
3c13c06ce1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/
2024-08-24 14:58:37 +00:00
vabene1111
beb1823a57 Merge pull request #3268 from smilerz/source_import_fix
set URL when none provided
2024-08-23 08:06:33 +02:00
smilerz
b6fa74c601 text 2024-08-22 12:45:49 -05:00
Matjaž T
596b6c6f98 Translated using Weblate (Slovenian)
Currently translated at 15.1% (74 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2024-08-21 16:58:36 +00:00
vabene1111
1bfe5bb6a0 Merge branch 'develop' 2024-08-20 12:21:11 +02:00
vabene1111
f6f6754669 removed validators library and improved url validation 2024-08-20 11:45:23 +02:00
vabene1111
752a25b1f8 fixed comma 2024-08-18 14:41:17 +02:00
vabene1111
8e8e4bb8bb added us_cup as base unit 2024-08-18 14:26:10 +02:00
vabene1111
06dc02d6b2 Merge pull request #3260 from yuekaim/patch-1
Update unit_conversion_helper.py
2024-08-18 14:24:17 +02:00
vabene1111
540daf2a38 fixed test 2024-08-18 14:20:09 +02:00
vabene1111
9e671d93cb added guest read only permission to keyword/api/space endpoint 2024-08-18 12:59:34 +02:00
Stefan van der Gevel
269be4e31a Translated using Weblate (Dutch)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-17 12:58:35 +00:00
Stefan van der Gevel
5969edc0b8 Translated using Weblate (Dutch)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2024-08-16 11:58:37 +00:00
Stefan van der Gevel
42176f42ed Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2024-08-16 11:58:37 +00:00
cleo miao
8c8bb159ea Update unit_conversion_helper.py
added us cup as a volume measurement
2024-08-14 02:43:19 +02:00
vabene1111
b9cf29a0ec Merge pull request #3259 from TandoorRecipes/dependabot/pip/django-4.2.15
Bump django from 4.2.14 to 4.2.15
2024-08-13 13:04:44 +02:00
dependabot[bot]
5db9f33723 Bump django from 4.2.14 to 4.2.15
Bumps [django](https://github.com/django/django) from 4.2.14 to 4.2.15.
- [Commits](https://github.com/django/django/compare/4.2.14...4.2.15)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-13 11:04:28 +00:00
vabene1111
1ba09cc119 Merge pull request #3248 from TandoorRecipes/dependabot/pip/aiohttp-3.10.2
Bump aiohttp from 3.10.0 to 3.10.2
2024-08-13 13:03:29 +02:00
dependabot[bot]
02bbe3fa13 Bump aiohttp from 3.10.0 to 3.10.2
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.10.0 to 3.10.2.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.10.0...v3.10.2)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-09 16:52:46 +00:00
vabene1111
0c77ca91c1 updated translations 2024-08-01 15:04:19 +02:00
vabene1111
fbadf14b58 Merge pull request #3238 from TandoorRecipes/dependabot/pip/crispy-bootstrap4-2024.1
Bump crispy-bootstrap4 from 2022.1 to 2024.1
2024-08-01 13:58:55 +02:00
vabene1111
2558fe6c2b Merge pull request #3237 from TandoorRecipes/dependabot/pip/aiohttp-3.10.0
Bump aiohttp from 3.9.4 to 3.10.0
2024-08-01 13:58:27 +02:00
vabene1111
10fca9b5ae Merge pull request #3235 from TandoorRecipes/dependabot/pip/pytest-xdist-3.6.1
Bump pytest-xdist from 3.5.0 to 3.6.1
2024-08-01 13:58:11 +02:00
dependabot[bot]
01f338e58b Bump aiohttp from 3.9.4 to 3.10.0
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.4 to 3.10.0.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.4...v3.10.0)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 11:58:10 +00:00
vabene1111
5e998796ab Merge pull request #3236 from TandoorRecipes/dependabot/pip/django-oauth-toolkit-2.4.0
Bump django-oauth-toolkit from 2.3.0 to 2.4.0
2024-08-01 13:57:51 +02:00
vabene1111
40231f45f6 Merge pull request #3239 from TandoorRecipes/dependabot/pip/validators-0.33.0
Bump validators from 0.20.0 to 0.33.0
2024-08-01 13:57:00 +02:00
vabene1111
b19b51c275 Merge pull request #3215 from mikhail5555/enable-global-logging-and-more-connector-logging
enable logging for whole project and add more logging to connectors
2024-08-01 13:52:20 +02:00
vabene1111
854877e685 Merge pull request #3226 from jknndy/Contribute-readme
Update link in Contributing section of readme
2024-08-01 13:49:30 +02:00
vabene1111
028a8ddbda Merge pull request #3227 from smilerz/scraper-updates
Scraper updates
2024-08-01 13:48:38 +02:00
dependabot[bot]
abb81209af Bump validators from 0.20.0 to 0.33.0
Bumps [validators](https://github.com/python-validators/validators) from 0.20.0 to 0.33.0.
- [Release notes](https://github.com/python-validators/validators/releases)
- [Changelog](https://github.com/python-validators/validators/blob/master/CHANGES.md)
- [Commits](https://github.com/python-validators/validators/compare/0.20.0...0.33.0)

---
updated-dependencies:
- dependency-name: validators
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:21 +00:00
dependabot[bot]
578201c519 Bump crispy-bootstrap4 from 2022.1 to 2024.1
Bumps [crispy-bootstrap4](https://github.com/django-crispy-forms/crispy-bootstrap4) from 2022.1 to 2024.1.
- [Release notes](https://github.com/django-crispy-forms/crispy-bootstrap4/releases)
- [Changelog](https://github.com/django-crispy-forms/crispy-bootstrap4/blob/main/CHANGELOG.md)
- [Commits](https://github.com/django-crispy-forms/crispy-bootstrap4/compare/2022.1...2024.1)

---
updated-dependencies:
- dependency-name: crispy-bootstrap4
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:19 +00:00
dependabot[bot]
a5a23b366e Bump django-oauth-toolkit from 2.3.0 to 2.4.0
Bumps [django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/jazzband/django-oauth-toolkit/releases)
- [Changelog](https://github.com/jazzband/django-oauth-toolkit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jazzband/django-oauth-toolkit/compare/2.3.0...2.4.0)

---
updated-dependencies:
- dependency-name: django-oauth-toolkit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:10 +00:00
dependabot[bot]
ac57837f53 Bump pytest-xdist from 3.5.0 to 3.6.1
Bumps [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) from 3.5.0 to 3.6.1.
- [Release notes](https://github.com/pytest-dev/pytest-xdist/releases)
- [Changelog](https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-xdist/compare/v3.5.0...v3.6.1)

---
updated-dependencies:
- dependency-name: pytest-xdist
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 01:01:08 +00:00
vabene1111
5cdc8302bb Translated using Weblate (German)
Currently translated at 98.3% (480 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/
2024-07-31 13:05:41 +00:00
smilerz
b095718545 add user-agent to URL import html request 2024-07-30 14:03:12 -05:00
smilerz
0b53285b89 bump recipe scrapers to 15.0.0 2024-07-29 10:01:31 -05:00
dudu dor
d1ea4360ca Translated using Weblate (Hebrew)
Currently translated at 4.7% (23 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/he/
2024-07-28 08:38:59 +00:00
dudu dor
257372db5a Translated using Weblate (Hebrew)
Currently translated at 100.0% (569 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/he/
2024-07-28 08:38:58 +00:00
Joey
855f20f2da Update README.md 2024-07-25 16:54:17 -04:00
Adam Krivanek
4f73e57ab2 Translated using Weblate (Czech)
Currently translated at 98.2% (559 of 569 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/cs/
2024-07-16 21:58:40 +00:00
Mikhail Epifanov
1b529bba10 update variable name and change default to warning, add docs 2024-07-13 22:41:08 +02:00
vabene1111
072cd00e59 Merge pull request #3216 from TandoorRecipes/dependabot/pip/django-4.2.14
Bump django from 4.2.11 to 4.2.14
2024-07-12 17:48:07 +02:00
dependabot[bot]
4b03c1a8dd Bump django from 4.2.11 to 4.2.14
Bumps [django](https://github.com/django/django) from 4.2.11 to 4.2.14.
- [Commits](https://github.com/django/django/compare/4.2.11...4.2.14)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-10 22:10:20 +00:00
Mikhail Epifanov
f614413fb1 use self._logger everywhere 2024-07-10 11:17:06 +02:00
Mikhail Epifanov
74153d79b8 add process and thread name aswell 2024-07-10 10:56:39 +02:00
Mikhail Epifanov
edf06944e0 enable logging for whole project and add more logging to connectors 2024-07-10 10:54:41 +02:00
smilerz
a02582e9f8 rebase 2024-07-09 08:01:39 -05:00
vabene1111
c4ff29beda added missing requirement for openapi endpoint 2024-07-09 07:20:49 +02:00
vabene1111
cc839a1ae9 Merge branch 'develop' 2024-07-08 20:32:15 +02:00
vabene1111
fb821ba0ef Merge branch 'develop' 2024-04-08 07:21:09 +02:00
vabene1111
b9e806b818 Merge branch 'develop' 2024-04-04 20:57:53 +02:00
vabene1111
20e0c948c4 Merge branch 'develop' 2024-03-21 14:40:23 +01:00
vabene1111
a626bda1ab Merge branch 'develop' 2024-03-05 14:06:56 +01:00
vabene1111
21f1700d6d Merge branch 'develop'
# Conflicts:
#	cookbook/forms.py
2024-03-05 08:55:33 +01:00
vabene1111
57d7bda803 added captcha option to password reset form 2024-02-14 07:28:47 +01:00
vabene1111
a088697812 added additional rate limiting to password reset 2024-02-14 07:28:47 +01:00
vabene1111
2a15d19551 Merge branch 'develop' 2024-02-02 07:45:24 +01:00
150 changed files with 13462 additions and 5126 deletions

2
.gitignore vendored
View File

@@ -84,3 +84,5 @@ vue3/.vite
# Configs
vetur.config.js
venv/
.idea/easy-i18n.xml
cookbook/static/vue3

View File

@@ -35,6 +35,13 @@ RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-de
#Copy project and execute it.
COPY . ./
# commented for now https://github.com/TandoorRecipes/recipes/issues/3478
#HEALTHCHECK --interval=30s \
# --timeout=5s \
# --start-period=10s \
# --retries=3 \
# CMD [ "/usr/bin/wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:8080/openapi" ]
# collect information from git repositories
RUN /opt/recipes/venv/bin/python version.py
# delete git repositories to reduce image size

View File

@@ -71,7 +71,7 @@ Because of that there are several ways you can support us
- **Let us host for you** We are offering a [hosted version](https://app.tandoor.dev) where all profits support us and the development of tandoor (currently only available in germany).
## Contributing
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/#contributing-code) **BEFORE** contributing anything!
Contributions are welcome but please read [this](https://docs.tandoor.dev/contribute/guidelines/) **BEFORE** contributing anything!
## Your Feedback

14
boot.sh
View File

@@ -29,6 +29,18 @@ if [ -z "${SECRET_KEY}" ]; then
display_warning "The environment variable 'SECRET_KEY' (or 'SECRET_KEY_FILE' that points to an existing file) is not set but REQUIRED for running Tandoor!"
fi
if [ -f "${AUTH_LDAP_BIND_PASSWORD_FILE}" ]; then
export AUTH_LDAP_BIND_PASSWORD=$(cat "$AUTH_LDAP_BIND_PASSWORD_FILE")
fi
if [ -f "${EMAIL_HOST_PASSWORD_FILE}" ]; then
export EMAIL_HOST_PASSWORD=$(cat "$EMAIL_HOST_PASSWORD_FILE")
fi
if [ -f "${SOCIALACCOUNT_PROVIDERS_FILE}" ]; then
export SOCIALACCOUNT_PROVIDERS=$(cat "$SOCIALACCOUNT_PROVIDERS_FILE")
fi
echo "Waiting for database to be ready..."
@@ -83,4 +95,4 @@ if [ "$ipv6_disable" -eq 0 ]; then
exec gunicorn -b "[::]:$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
else
exec gunicorn -b ":$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
fi
fi

View File

@@ -16,15 +16,11 @@ class CookbookConfig(AppConfig):
import cookbook.signals # noqa
if not settings.DISABLE_EXTERNAL_CONNECTORS:
try:
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
handler = ConnectorManager()
post_save.connect(handler, dispatch_uid="connector_manager")
post_delete.connect(handler, dispatch_uid="connector_manager")
except Exception as e:
traceback.print_exc()
print('Failed to initialize connectors')
pass
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
handler = ConnectorManager()
post_save.connect(handler, dispatch_uid="post_save-connector_manager")
post_delete.connect(handler, dispatch_uid="post_delete-connector_manager")
# if not settings.DISABLE_TREE_FIX_STARTUP:
# # when starting up run fix_tree to:
# # a) make sure that nodes are sorted when switching between sort modes
@@ -45,4 +41,4 @@ class CookbookConfig(AppConfig):
# except Exception:
# if DEBUG:
# traceback.print_exc()
# pass # dont break startup just because fix could not run, need to investigate cases when this happens
# pass # dont break startup just because fix could not run, need to investigate cases when this happens

View File

@@ -5,6 +5,7 @@ import threading
from asyncio import Task
from dataclasses import dataclass
from enum import Enum
from logging import Logger
from types import UnionType
from typing import List, Any, Dict, Optional, Type
@@ -30,6 +31,15 @@ class Work:
actionType: ActionType
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# The way ConnectionManager works is as follows:
# 1. On init, it starts a worker & creates a queue for 'Work'
# 2. Then any time its called, it verifies the type of action (create/update/delete) and if the item is of interest, pushes the Work (non-blocking) to the queue.
@@ -38,11 +48,14 @@ class Work:
# 3.2 If work is of type REGISTERED_CLASSES, it asynchronously fires of all connectors and wait for them to finish (runtime should depend on the 'slowest' connector)
# 4. Work is marked as consumed, and next entry of the queue is consumed.
# Each 'Work' is processed in sequential by the worker, so the throughput is about [workers * the slowest connector]
class ConnectorManager:
# The Singleton class is used for ConnectorManager to have a self-reference and so Python does not garbage collect it
class ConnectorManager(metaclass=Singleton):
_logger: Logger
_queue: queue.Queue
_listening_to_classes = REGISTERED_CLASSES | ConnectorConfig
def __init__(self):
self._logger = logging.getLogger("recipes.connector")
self._queue = queue.Queue(maxsize=settings.EXTERNAL_CONNECTORS_QUEUE_SIZE)
self._worker = threading.Thread(target=self.worker, args=(0, self._queue,), daemon=True)
self._worker.start()
@@ -65,7 +78,7 @@ class ConnectorManager:
try:
self._queue.put_nowait(Work(instance, action_type))
except queue.Full:
logging.info(f"queue was full, so skipping {action_type} of type {type(instance)}")
self._logger.info(f"queue was full, so skipping {action_type} of type {type(instance)}")
return
def stop(self):
@@ -74,10 +87,12 @@ class ConnectorManager:
@staticmethod
def worker(worker_id: int, worker_queue: queue.Queue):
logger = logging.getLogger("recipes.connector.worker")
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
logging.info(f"started ConnectionManager worker {worker_id}")
logger.info(f"started ConnectionManager worker {worker_id}")
# When multiple workers are used, please make sure the cache is shared across all threads, otherwise it might lead to un-expected behavior.
_connectors_cache: Dict[int, List[Connector]] = dict()
@@ -91,6 +106,8 @@ class ConnectorManager:
if item is None:
break
logger.debug(f"received {item.instance=} with {item.actionType=}")
# If a Connector was changed/updated, refresh connector from the database for said space
refresh_connector_cache = isinstance(item.instance, ConnectorConfig)
@@ -111,7 +128,7 @@ class ConnectorManager:
try:
connector: Optional[Connector] = ConnectorManager.get_connected_for_config(config)
except BaseException:
logging.exception(f"failed to initialize {config.name}")
logger.exception(f"failed to initialize {config.name}")
continue
if connector is not None:
@@ -123,10 +140,12 @@ class ConnectorManager:
worker_queue.task_done()
continue
logger.debug(f"running {len(connectors)} connectors for {item.instance=} with {item.actionType=}")
loop.run_until_complete(run_connectors(connectors, space, item.instance, item.actionType))
worker_queue.task_done()
logging.info(f"terminating ConnectionManager worker {worker_id}")
logger.info(f"terminating ConnectionManager worker {worker_id}")
asyncio.set_event_loop(None)
loop.close()

View File

@@ -3,7 +3,7 @@ from logging import Logger
from typing import Dict, Tuple
from urllib.parse import urljoin
from aiohttp import ClientError, request
from aiohttp import request, ClientResponseError
from cookbook.connectors.connector import Connector
from cookbook.models import ShoppingListEntry, ConnectorConfig, Space
@@ -13,14 +13,17 @@ class HomeAssistant(Connector):
_config: ConnectorConfig
_logger: Logger
_required_foreign_keys = ("food", "unit", "created_by")
def __init__(self, config: ConnectorConfig):
if not config.token or not config.url or not config.todo_entity:
raise ValueError("config for HomeAssistantConnector in incomplete")
self._logger = logging.getLogger(f"recipes.connector.homeassistant.{config.name}")
if config.url[-1] != "/":
config.url += "/"
self._config = config
self._logger = logging.getLogger("connector.HomeAssistant")
async def homeassistant_api_call(self, method: str, path: str, data: Dict) -> str:
headers = {
@@ -37,18 +40,20 @@ class HomeAssistant(Connector):
item, description = _format_shopping_list_entry(shopping_list_entry)
logging.debug(f"adding {item=} to {self._config.name}")
self._logger.debug(f"adding {item=} with {description=} to {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
"item": item,
"description": description,
}
if self._config.supports_description_field:
data["description"] = description
try:
await self.homeassistant_api_call("POST", "services/todo/add_item", data)
except ClientError as err:
self._logger.warning(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}")
except ClientResponseError as err:
self._logger.warning(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
if not self._config.on_shopping_list_entry_updated_enabled:
@@ -59,14 +64,14 @@ class HomeAssistant(Connector):
if not self._config.on_shopping_list_entry_deleted_enabled:
return
if not hasattr(shopping_list_entry._state.fields_cache, "food"):
if not all(k in shopping_list_entry._state.fields_cache for k in self._required_foreign_keys):
# Sometimes the food foreign key is not loaded, and we cant load it from an async process
self._logger.debug("required property was not present in ShoppingListEntry")
return
item, _ = _format_shopping_list_entry(shopping_list_entry)
logging.debug(f"removing {item=} from {self._config.name}")
self._logger.debug(f"removing {item=} from {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
@@ -75,9 +80,9 @@ class HomeAssistant(Connector):
try:
await self.homeassistant_api_call("POST", "services/todo/remove_item", data)
except ClientError as err:
except ClientResponseError as err:
# This error will always trigger if the item is not present/found
self._logger.debug(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}")
self._logger.debug(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
async def close(self) -> None:
pass

View File

@@ -1,6 +1,8 @@
from datetime import datetime
from allauth.account.forms import ResetPasswordForm, SignupForm
from allauth.socialaccount.forms import SignupForm as SocialSignupForm
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -14,15 +16,13 @@ from .models import Comment, InviteLink, Keyword, Recipe, SearchPreference, Spac
class SelectWidget(widgets.Select):
class Media:
js = ('custom/js/form_select.js', )
js = ('custom/js/form_select.js',)
class MultiSelectWidget(widgets.SelectMultiple):
class Media:
js = ('custom/js/form_multiselect.js', )
js = ('custom/js/form_multiselect.js',)
# Yes there are some stupid browsers that still dont support this but
@@ -89,12 +89,13 @@ class ImportExportBase(forms.Form):
COOKMATE = 'COOKMATE'
REZEPTSUITEDE = 'REZEPTSUITEDE'
PDF = 'PDF'
GOURMET = 'GOURMET'
type = forms.ChoiceField(choices=((DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'),
(SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'), (PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'),
(DOMESTICA, 'Domestica'), (MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'),
(PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'),
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de')))
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de'), (GOURMET, 'Gourmet')))
class MultipleFileInput(forms.ClearableFileInput):
@@ -138,7 +139,7 @@ class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('text', )
fields = ('text',)
labels = {'text': _('Add your comment: '), }
widgets = {'text': forms.Textarea(attrs={'rows': 2, 'cols': 15}), }
@@ -160,7 +161,6 @@ class StorageForm(forms.ModelForm):
help_texts = {'url': _('Leave empty for dropbox and enter only base url for nextcloud (<code>/remote.php/webdav/</code> is added automatically)'), }
class ConnectorConfigForm(forms.ModelForm):
enabled = forms.BooleanField(
help_text="Is the connector enabled",
@@ -182,6 +182,12 @@ class ConnectorConfigForm(forms.ModelForm):
required=False,
)
supports_description_field = forms.BooleanField(
help_text="Does the connector todo entity support the description field",
initial=True,
required=False,
)
update_token = forms.CharField(
widget=forms.TextInput(attrs={'autocomplete': 'update-token', 'type': 'password'}),
required=False,
@@ -198,7 +204,7 @@ class ConnectorConfigForm(forms.ModelForm):
fields = (
'name', 'type', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
'on_shopping_list_entry_deleted_enabled', 'url', 'todo_entity',
'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'url', 'todo_entity',
)
help_texts = {
@@ -308,6 +314,18 @@ class AllAuthSignupForm(SignupForm):
pass
class AllAuthSocialSignupForm(SocialSignupForm):
terms = forms.BooleanField(label=_('Accept Terms and Privacy'))
def __init__(self, **kwargs):
super().__init__(**kwargs)
if settings.PRIVACY_URL == '' and settings.TERMS_URL == '':
self.fields.pop('terms')
def signup(self, request, user):
pass
class CustomPasswordResetForm(ResetPasswordForm):
captcha = hCaptchaField()
@@ -338,12 +356,13 @@ class SearchPreferenceForm(forms.ModelForm):
help_texts = {
'search': _('Select type method of search. Click <a href="/docs/search/">here</a> for full description of choices.'), 'lookup':
_('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'), 'unaccent':
_('Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), 'icontains':
_("Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), 'istartswith':
_("Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), 'trigram':
_("Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."), 'fulltext':
_("Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."),
_('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'), 'unaccent':
_('Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), 'icontains':
_("Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), 'istartswith':
_("Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), 'trigram':
_("Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."),
'fulltext':
_("Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."),
}
labels = {
@@ -353,5 +372,5 @@ class SearchPreferenceForm(forms.ModelForm):
widgets = {
'search': SelectWidget, 'unaccent': MultiSelectWidget, 'icontains': MultiSelectWidget, 'istartswith': MultiSelectWidget, 'trigram': MultiSelectWidget, 'fulltext':
MultiSelectWidget,
MultiSelectWidget,
}

View File

@@ -1,4 +1,12 @@
import socket
from urllib.parse import urlparse
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator
from django.db.models import Func
from ipaddress import ip_address
from recipes import settings
class Round(Func):
@@ -11,3 +19,30 @@ def str2bool(v):
return v
else:
return v.lower() in ("yes", "true", "1")
"""
validates an url that is supposed to be imported
checks that the protocol used is http(s) and that no local address is accessed
@:param url to test
@:return true if url is valid, false otherwise
"""
def validate_import_url(url):
try:
validator = URLValidator(schemes=['http', 'https'])
validator(url)
except ValidationError:
# if schema is not http or https, consider url invalid
return False
# resolve IP address of url
try:
url_ip_address = ip_address(str(socket.gethostbyname(urlparse(url).hostname)))
except (ValueError, AttributeError, TypeError, Exception) as e:
# if ip cannot be parsed, consider url invalid
return False
# validate that IP is neither private nor any other special address
return not any([url_ip_address.is_private, url_ip_address.is_reserved, url_ip_address.is_loopback, url_ip_address.is_multicast, url_ip_address.is_link_local, ])

View File

@@ -35,6 +35,20 @@ def get_filetype(name):
return '.jpeg'
def is_file_type_allowed(filename, image_only=False):
is_file_allowed = False
allowed_file_types = ['.pdf','.docx', '.xlsx']
allowed_image_types = ['.png', '.jpg', '.jpeg', '.gif']
check_list = allowed_image_types
if not image_only:
check_list += allowed_file_types
for file_type in check_list:
if filename.endswith(file_type):
is_file_allowed = True
return is_file_allowed
# TODO this whole file needs proper documentation, refactoring, and testing
# TODO also add env variable to define which images sizes should be compressed
# filetype argument can not be optional, otherwise this function will treat all images as if they were a jpeg

View File

@@ -6,7 +6,7 @@ from django.utils.dateparse import parse_duration
from django.utils.translation import gettext as _
from isodate import parse_duration as iso_parse_duration
from isodate.isoerror import ISO8601Error
from pytube import YouTube
from pytubefix import YouTube
from recipe_scrapers._utils import get_host_name, get_minutes
from cookbook.helper.automation_helper import AutomationEngine
@@ -28,7 +28,9 @@ def get_from_scraper(scrape, request):
source_url = scrape.url
except Exception:
pass
if source_url:
if source_url == "https://urlnotfound.none" or not source_url:
recipe_json['source_url'] = ''
else:
recipe_json['source_url'] = source_url
try:
keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0])
@@ -272,9 +274,8 @@ def get_from_youtube_scraper(url, request):
default_recipe_json['image'] = video.thumbnail_url
if video.description:
default_recipe_json['steps'][0]['instruction'] = automation_engine.apply_regex_replace_automation(video.description, Automation.INSTRUCTION_REPLACE)
except Exception:
pass
traceback.print_exc()
return default_recipe_json

View File

@@ -1,68 +0,0 @@
import json
from recipe_scrapers._abstract import AbstractScraper
class CooksIllustrated(AbstractScraper):
@classmethod
def host(cls, site='cooksillustrated'):
return {
'cooksillustrated': f"{site}.com",
'americastestkitchen': f"{site}.com",
'cookscountry': f"{site}.com",
}.get(site)
def title(self):
return self.schema.title()
def image(self):
return self.schema.image()
def total_time(self):
if not self.recipe:
self.get_recipe()
return self.recipe['recipeTimeNote']
def yields(self):
if not self.recipe:
self.get_recipe()
return self.recipe['yields']
def ingredients(self):
if not self.recipe:
self.get_recipe()
ingredients = []
for group in self.recipe['ingredientGroups']:
ingredients += group['fields']['recipeIngredientItems']
return [
"{} {} {}{}".format(
i['fields']['qty'] or '',
i['fields']['measurement'] or '',
i['fields']['ingredient']['fields']['title'] or '',
i['fields']['postText'] or ''
)
for i in ingredients
]
def instructions(self):
if not self.recipe:
self.get_recipe()
if self.recipe.get('headnote', False):
i = ['Note: ' + self.recipe.get('headnote', '')]
else:
i = []
return "\n".join(
i
+ [self.recipe.get('whyThisWorks', '')]
+ [
instruction['fields']['content']
for instruction in self.recipe['instructions']
]
)
def nutrients(self):
raise NotImplementedError("This should be implemented.")
def get_recipe(self):
j = json.loads(self.soup.find(type='application/json').string)
name = list(j['props']['initialState']['content']['documents'])[0]
self.recipe = j['props']['initialState']['content']['documents'][name]

View File

@@ -1,43 +0,0 @@
from json import JSONDecodeError
from bs4 import BeautifulSoup
from recipe_scrapers import SCRAPERS, get_host_name
from recipe_scrapers._factory import SchemaScraperFactory
from recipe_scrapers._schemaorg import SchemaOrg
from .cooksillustrated import CooksIllustrated
CUSTOM_SCRAPERS = {
CooksIllustrated.host(site="cooksillustrated"): CooksIllustrated,
CooksIllustrated.host(site="americastestkitchen"): CooksIllustrated,
CooksIllustrated.host(site="cookscountry"): CooksIllustrated,
}
SCRAPERS.update(CUSTOM_SCRAPERS)
def text_scraper(text, url=None):
domain = None
if url:
domain = get_host_name(url)
if domain in SCRAPERS:
scraper_class = SCRAPERS[domain]
else:
scraper_class = SchemaScraperFactory.SchemaScraper
class TextScraper(scraper_class):
def __init__(
self,
html=None,
url=None,
):
self.supported_only = False
self.meta_http_equiv = False
self.soup = BeautifulSoup(html, "html.parser")
self.url = url
self.recipe = None
try:
self.schema = SchemaOrg(html)
except (JSONDecodeError, AttributeError):
pass
return TextScraper(url=url, html=text)

View File

@@ -3,6 +3,8 @@ from gettext import gettext as _
import bleach
import markdown as md
from jinja2 import Template, TemplateSyntaxError, UndefinedError
from jinja2.exceptions import SecurityError
from jinja2.sandbox import SandboxedEnvironment
from markdown.extensions.tables import TableExtension
from cookbook.helper.mdx_attributes import MarkdownFormatExtension
@@ -89,11 +91,13 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code
return f"<scalable-number v-bind:number='{bleach.clean(str(number))}' v-bind:factor='ingredient_factor'></scalable-number>"
try:
template = Template(instructions)
instructions = template.render(ingredients=ingredients, scale=scale)
env = SandboxedEnvironment()
instructions = env.from_string(instructions).render(ingredients=ingredients, scale=scale)
except TemplateSyntaxError:
return _('Could not parse template code.') + ' Error: Template Syntax broken'
except UndefinedError:
return _('Could not parse template code.') + ' Error: Undefined Error'
except SecurityError:
return _('Could not parse template code.') + ' Error: Security Error'
return instructions

View File

@@ -20,6 +20,7 @@ CONVERSION_TABLE = {
'gallon': 0.264172,
'tbsp': 67.628,
'tsp': 202.884,
'us_cup': 4.22675,
'imperial_fluid_ounce': 35.1951,
'imperial_pint': 1.75975,
'imperial_quart': 0.879877,

View File

@@ -2,12 +2,12 @@ import re
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import (get_from_scraper, get_images_from_soup,
iso_duration_to_minutes)
from cookbook.helper.scrapers.scrapers import text_scraper
from recipe_scrapers import scrape_html
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Recipe, Step
@@ -20,7 +20,7 @@ class CookBookApp(Integration):
def get_recipe_from_file(self, file):
recipe_html = file.getvalue().decode("utf-8")
scrape = text_scraper(text=recipe_html)
scrape = scrape_html(html=recipe_html, org_url="https://cookbookapp.import", supported_only=False)
recipe_json = get_from_scraper(scrape, self.request)
images = list(dict.fromkeys(get_images_from_soup(scrape.soup, None)))
@@ -63,7 +63,7 @@ class CookBookApp(Integration):
if len(images) > 0:
try:
url = images[0]
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -1,8 +1,8 @@
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
@@ -69,7 +69,7 @@ class Cookmate(Integration):
if recipe_xml.find('imageurl') is not None:
try:
url = recipe_xml.find('imageurl').text.strip()
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -0,0 +1,211 @@
import base64
from io import BytesIO
from lxml import etree
import requests
from pathlib import Path
from bs4 import BeautifulSoup, Tag
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time, iso_duration_to_minutes
from cookbook.integration.integration import Integration
from cookbook.models import Ingredient, Recipe, Step, Keyword
from recipe_scrapers import scrape_html
class Gourmet(Integration):
def split_recipe_file(self, file):
encoding = 'utf-8'
byte_string = file.read()
text_obj = byte_string.decode(encoding, errors="ignore")
soup = BeautifulSoup(text_obj, "html.parser")
return soup.find_all("div", {"class": "recipe"})
def get_ingredients_recursive(self, step, ingredients, ingredient_parser):
if isinstance(ingredients, Tag):
for ingredient in ingredients.children:
if not isinstance(ingredient, Tag):
continue
if ingredient.name in ["li"]:
step_name = "".join(ingredient.findAll(text=True, recursive=False)).strip().rstrip(":")
step.ingredients.add(Ingredient.objects.create(
is_header=True,
note=step_name[:256],
original_text=step_name,
space=self.request.space,
))
next_ingrediets = ingredient.find("ul", {"class": "ing"})
self.get_ingredients_recursive(step, next_ingrediets, ingredient_parser)
else:
try:
amount, unit, food, note = ingredient_parser.parse(ingredient.text.strip())
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(
Ingredient.objects.create(
food=f,
unit=u,
amount=amount,
note=note,
original_text=ingredient.text.strip(),
space=self.request.space,
)
)
except ValueError:
pass
def get_recipe_from_file(self, file):
# 'file' comes is as a beautifulsoup object
source_url = None
for item in file.find_all('a'):
if item.has_attr('href'):
source_url = item.get("href")
break
name = file.find("p", {"class": "title"}).find("span", {"itemprop": "name"}).text.strip()
recipe = Recipe.objects.create(
name=name[:128],
source_url=source_url,
created_by=self.request.user,
internal=True,
space=self.request.space,
)
for category in file.find_all("span", {"itemprop": "recipeCategory"}):
keyword, created = Keyword.objects.get_or_create(name=category.text, space=self.request.space)
recipe.keywords.add(keyword)
try:
recipe.servings = parse_servings(file.find("span", {"itemprop": "recipeYield"}).text.strip())
except AttributeError:
pass
try:
prep_time = file.find("span", {"itemprop": "prepTime"}).text.strip().split()
prep_time[0] = prep_time[0].replace(',', '.')
if prep_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
prep_time_min = int(float(prep_time[0]) * 60)
elif prep_time[1].lower() in ['tag', 'tage', 'day', 'days']:
prep_time_min = int(float(prep_time[0]) * 60 * 24)
else:
prep_time_min = int(prep_time[0])
recipe.waiting_time = prep_time_min
except AttributeError:
pass
try:
cook_time = file.find("span", {"itemprop": "cookTime"}).text.strip().split()
cook_time[0] = cook_time[0].replace(',', '.')
if cook_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
cook_time_min = int(float(cook_time[0]) * 60)
elif cook_time[1].lower() in ['tag', 'tage', 'day', 'days']:
cook_time_min = int(float(cook_time[0]) * 60 * 24)
else:
cook_time_min = int(cook_time[0])
recipe.working_time = cook_time_min
except AttributeError:
pass
for cuisine in file.find_all('span', {'itemprop': 'recipeCuisine'}):
cuisine_name = cuisine.text
keyword = Keyword.objects.get_or_create(space=self.request.space, name=cuisine_name)
if len(keyword):
recipe.keywords.add(keyword[0])
for category in file.find_all('span', {'itemprop': 'recipeCategory'}):
category_name = category.text
keyword = Keyword.objects.get_or_create(space=self.request.space, name=category_name)
if len(keyword):
recipe.keywords.add(keyword[0])
step = Step.objects.create(
instruction='',
space=self.request.space,
show_ingredients_table=self.request.user.userpreference.show_step_ingredients,
)
ingredient_parser = IngredientParser(self.request, True)
ingredients = file.find("ul", {"class": "ing"})
self.get_ingredients_recursive(step, ingredients, ingredient_parser)
instructions = file.find("div", {"class": "instructions"})
if isinstance(instructions, Tag):
for instruction in instructions.children:
if not isinstance(instruction, Tag) or instruction.text == "":
continue
if instruction.name == "h3":
if step.instruction:
step.save()
recipe.steps.add(step)
step = Step.objects.create(
instruction='',
space=self.request.space,
)
step.name = instruction.text.strip()[:128]
else:
if instruction.name == "div":
for instruction_step in instruction.children:
for br in instruction_step.find_all("br"):
br.replace_with("\n")
step.instruction += instruction_step.text.strip() + ' \n\n'
notes = file.find("div", {"class": "modifications"})
if notes:
for n in notes.children:
if n.text == "":
continue
if n.name == "h3":
step.instruction += f'*{n.text.strip()}:* \n\n'
else:
for br in n.find_all("br"):
br.replace_with("\n")
step.instruction += '*' + n.text.strip() + '* \n\n'
description = ''
try:
description = file.find("div", {"id": "description"}).text.strip()
except AttributeError:
pass
if len(description) <= 512:
recipe.description = description
else:
recipe.description = description[:480] + ' ... (full description below)'
step.instruction += '*Description:* \n\n*' + description + '* \n\n'
step.save()
recipe.steps.add(step)
# import the Primary recipe image that is stored in the Zip
try:
image_path = file.find("img").get("src")
image_filename = image_path.split("\\")[1]
for f in self.import_zip.filelist:
zip_file_name = Path(f.filename).name
if image_filename == zip_file_name:
image_file = self.import_zip.read(f)
image_bytes = BytesIO(image_file)
self.import_recipe_image(recipe, image_bytes, filetype='.jpeg')
break
except Exception as e:
print(recipe.name, ': failed to import image ', str(e))
recipe.save()
return recipe
def get_files_from_recipes(self, recipes, el, cookie):
raise NotImplementedError('Method not implemented in storage integration')
def get_file_from_recipe(self, recipe):
raise NotImplementedError('Method not implemented in storage integration')

View File

@@ -153,6 +153,19 @@ class Integration:
il.total_recipes = len(new_file_list)
file_list = new_file_list
if isinstance(self, cookbook.integration.gourmet.Gourmet):
self.import_zip = import_zip
new_file_list = []
for file in file_list:
if file.file_size == 0:
next
if file.filename.startswith("index.htm"):
next
if file.filename.endswith(".htm"):
new_file_list += self.split_recipe_file(BytesIO(import_zip.read(file.filename)))
il.total_recipes = len(new_file_list)
file_list = new_file_list
for z in file_list:
try:
if not hasattr(z, 'filename') or isinstance(z, Tag):

View File

@@ -72,14 +72,14 @@ class Mealie(Integration):
)
recipe.steps.add(step)
if 'recipe_yield' in recipe_json:
if 'recipe_yield' in recipe_json and recipe_json['recipe_yield'] is not None:
recipe.servings = parse_servings(recipe_json['recipe_yield'])
recipe.servings_text = parse_servings_text(recipe_json['recipe_yield'])
if 'total_time' in recipe_json and recipe_json['total_time'] is not None:
recipe.working_time = parse_time(recipe_json['total_time'])
if 'org_url' in recipe_json:
if 'org_url' in recipe_json and recipe_json['org_url'] is not None:
recipe.source_url = recipe_json['org_url']
recipe.save()

View File

@@ -6,8 +6,8 @@ from gettext import gettext as _
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text
from cookbook.integration.integration import Integration
@@ -84,13 +84,22 @@ class Paprika(Integration):
recipe.steps.add(step)
# Paprika exports can have images in either of image_url, or photo_data.
# If a user takes an image himself, only photo_data will be set.
# If a user imports an image, both will be set. But the photo_data will be a center-cropped square resized version, so the image_url is preferred.
# Try to download image if possible
try:
if recipe_json.get("image_url", None):
url = recipe_json.get("image_url", None)
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception:
pass
# If no image downloaded, try to extract from photo_data
if not recipe.image:
if recipe_json.get("photo_data", None):
self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_json['photo_data'])), filetype='.jpeg')

View File

@@ -1,8 +1,8 @@
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
@@ -75,7 +75,7 @@ class Plantoeat(Integration):
if image_url:
try:
if validators.url(image_url, public=True):
if validate_import_url(image_url):
response = requests.get(image_url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -5,9 +5,10 @@ from io import BytesIO
from zipfile import ZipFile
import requests
import validators
from django.utils.translation import gettext as _
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
@@ -125,7 +126,7 @@ class RecetteTek(Integration):
else:
if file['originalPicture'] != '':
url = file['originalPicture']
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
if imghdr.what(BytesIO(response.content)) is not None:
self.import_recipe_image(recipe, BytesIO(response.content), filetype=get_filetype(file['originalPicture']))

View File

@@ -2,8 +2,8 @@ import json
from io import BytesIO
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time
from cookbook.integration.integration import Integration
@@ -56,7 +56,7 @@ class RecipeSage(Integration):
if len(file['image']) > 0:
try:
url = file['image'][0]
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
except Exception as e:

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-11-28 11:03+0000\n"
"Last-Translator: Mahmoud Aljouhari <mapgohary@gmail.com>\n"
"Language-Team: Arabic <http://translate.tandoor.dev/projects/tandoor/recipes-"
@@ -1946,286 +1946,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-04-12 11:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"Language-Team: Bulgarian <http://translate.tandoor.dev/projects/tandoor/"
@@ -2236,81 +2236,81 @@ msgstr "Покажи дневник"
msgid "URL Import"
msgstr "Импортиране на URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Параметърът updated_at е форматиран неправилно"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Не съществува {self.basename} с идентификатор {pk}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Не може да се слее със същия обект!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Не съществува {self.basename} с идентификатор {target}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Не може да се слее с дъщерен обект!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} беше обединен успешно с {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr "Възникна грешка при опит за сливане на {source.name} с {target.name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} беше преместен успешно в основния."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Възникна грешка при опит за преместване "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Не може да премести обект към себе си!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Не съществува {self.basename} с идентификатор {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} беше преместен успешно в родител {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} беше премахнат от списъка за пазаруване."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} беше добавен към списъка за пазаруване."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
@@ -2318,17 +2318,17 @@ msgstr ""
"Идентификатор на рецептата, част от която е стъпка. За параметър за "
"многократно повторение."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"Идентификатор на рецептата, част от която е стъпка. За параметър за "
"многократно повторение."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "Низът на заявката съответства (размито) спрямо името на обекта."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2336,7 +2336,7 @@ msgstr ""
"Низът на заявката съвпада (размито) с името на рецептата. В бъдеще също и "
"пълнотекстово търсене."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2344,69 +2344,69 @@ msgstr ""
"Идентификатор на ключовата дума, която рецептата трябва да има. За параметър "
"за многократно повторение. Еквивалентно на keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Идентификатори на ключови думи, повторете за няколко. Връща рецепти с някоя "
"от ключовите думи"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Идентификатори на ключови думи, повторете за няколко. Връща рецепти с всички "
"ключови думи."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Идентификатори на ключови думи, повторете за няколко. Изключва рецепти с "
"някоя от ключовите думи."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Идентификатори на ключови думи, повторете за няколко. Изключва рецепти с "
"всички ключови думи."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"Идентификация на храната, която рецептата трябва да има. За параметър за "
"многократно повторение."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Идентификатори на храни, повторете за няколко. Връща рецепти с някоя от "
"храните"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Идентификатори на храни, повторете за няколко. Връща рецептите с всички "
"храни."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Идентификатори на храни, повторете за няколко. Изключва рецепти с някоя от "
"храните."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Идентификатори на храни, повторете за няколко. Изключва рецепти с всички "
"храни."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "Идентификатор на единицата, която рецептата трябва да има."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
@@ -2414,50 +2414,50 @@ msgstr ""
"Оценка на рецептата трябва да има или по-висока. [0 - 5] Отрицателна "
"стойност филтрира оценка по-малка от."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"Идентификатор на книгата, в която трябва да е рецепта. За параметър за "
"многократно повторение."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
"Идентификационен № на книги, повторете за няколко. Връща рецепти с някоя от "
"книгите"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
"Идентификационен № на книги, повторете за няколко. Връща рецептите с всички "
"книги."
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Идентификационен № на книги, повторете за няколко. Изключва рецептите с "
"някоя от книгите."
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
"Идентификационен № на книги, повторете за няколко. Изключва рецептите от "
"всички книги."
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr "Ако трябва да се върнат само вътрешни рецепти. [вярно/<b>невярно</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr "Връща резултатите в произволен ред. [вярно/<b>невярно</b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
"Първо връща нови резултати в резултатите от търсенето. [вярно/<b>невярно</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
@@ -2465,7 +2465,7 @@ msgstr ""
"Филтрирайте рецепти, приготвени X пъти или повече. Отрицателните стойности "
"връщат приготвени по-малко от X пъти"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2473,7 +2473,7 @@ msgstr ""
"Филтрирайте последно приготвените рецепти на или след ГГГГ-ММ-ДД. "
"Предварително филтрира на или преди дата."
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2481,7 +2481,7 @@ msgstr ""
"Филтрирайте рецептите, създадени на или след ГГГГ-ММ-ДД. Предварително "
"филтрира на или преди дата."
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2489,7 +2489,7 @@ msgstr ""
"Филтрирайте рецептите, актуализирани на или след ГГГГ-ММ-ДД. Предварително "
"филтрира на или преди дата."
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2497,13 +2497,13 @@ msgstr ""
"Филтрирането на рецептите последно разглеждани на или след ГГГГ-ММ-ДД. "
"Предварително филтрира на или преди дата."
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Филтрирайте рецепти, които могат да се приготвят с храна в наличност. [вярно/"
"<b>невярно</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
@@ -2511,7 +2511,7 @@ msgstr ""
"Връща записа в списъка за пазаруване с първичен ключ на идентификатора. "
"Разрешени са множество стойности."
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
@@ -2525,17 +2525,17 @@ msgstr ""
"и двете, <b>скорошни</b>]<br> - скорошни включва неотметнати елементи и "
"наскоро завършени елементи."
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
"Връща записите в списъка за пазаруване, сортирани по реда на категории "
"супермаркети."
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
@@ -2547,45 +2547,45 @@ msgstr ""
"Връща записа в списъка за пазаруване с първичен ключ на идентификатора. "
"Разрешени са множество стойности."
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Няма нищо за правене."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Връзката е отказана."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "Лоша URL схема."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Не бяха намерени полезни данни."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Импортирането не е реализирано за този доставчик"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Тази функция все още не е налична в хостваната версия на tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Синхронизирането успешно!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Грешка при синхронизирането с хранилището"

View File

@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-08 23:19+0000\n"
"Last-Translator: Enric Bergadà <enric@bergada.cat>\n"
"Language-Team: Catalan <http://translate.tandoor.dev/projects/tandoor/"
@@ -2123,95 +2123,95 @@ msgstr "Mostra Logs"
msgid "URL Import"
msgstr "Importació dURL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "El paràmetre updated_at té un format incorrecte"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "No {self.basename} amb id {pk} existeix"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "No es pot fusionar amb el mateix objecte!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "No {self.basename} amb id {target} existeix"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "No es pot combinar amb l'objecte fill!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} s'ha fusionat amb {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr "Error en intentar combinar {source.name} amb {target.name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} s'ha mogut correctament a l'arrel."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Error a l'intentar moure "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "No es pot moure un objecte cap a si mateix!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "No existeix {self.basename} amb identificador {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} s'ha mogut correctament al pare {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} eliminat de la llista de la compra."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "Afegit {obj.name} a la llista de la compra."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr "ID de recepta forma part d'un pas. Per a múltiples repeteix paràmetre."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr "ID de recepta forma part d'un pas. Per a múltiples repeteix paràmetre."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "La cadena de consulta coincideix (difusa) amb el nom de l'objecte."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2219,7 +2219,7 @@ msgstr ""
"Cadena de consulta coincideix (difusa) amb el nom de la recepta. En el futur "
"també cerca text complet."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
#, fuzzy
#| msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgid ""
@@ -2229,193 +2229,193 @@ msgstr ""
"ID de la paraula clau que hauria de tenir una recepta. Per a múltiples "
"repeteix paràmetre."
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"ID d'aliments que ha de tenir una recepta. Per a múltiples repeteix "
"paràmetres."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "ID d'unitat que hauria de tenir una recepta."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"ID del llibre hauria d'haver-hi en una recepta. Per al paràmetre de "
"repetició múltiple."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Res a fer."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Connexió Refusada."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "No s'han trobat dades utilitzables."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importació no implementada en aquest proveïdor"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
"Aquesta funció encara no està disponible a la versió allotjada de tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Sincronització correcte"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Error de sincronització amb emmagatzematge"

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-01-09 12:07+0000\n"
"Last-Translator: Jan Kubošek <kuboja@outlook.cz>\n"
"Language-Team: Czech <http://translate.tandoor.dev/projects/tandoor/recipes-"
@@ -2114,282 +2114,282 @@ msgstr "Zobrazit nápovědu"
msgid "URL Import"
msgstr "Import URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parametr filter_list v nesprávném formátu"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Nelze sloučit se stejným objektem!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "Nelze sloučit se stejným objektem!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No usable data could be found."
msgstr "Požadovaná stránka nebyla nalezena."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Import není pro tohoto poskytovatele implementován!"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
#, fuzzy
@@ -2397,11 +2397,11 @@ msgstr "Import není pro tohoto poskytovatele implementován!"
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Tato funkce není dostupná v demo verzi!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synchronizace proběhla úspěšně!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Chyba synchronizace s úložištěm"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-04-12 11:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"Language-Team: Danish <http://translate.tandoor.dev/projects/tandoor/recipes-"
@@ -2224,96 +2224,96 @@ msgstr "Vis log"
msgid "URL Import"
msgstr "URL import"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parameter updated_at ikke formateret korrekt"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Ingen {self.basename} med ID {pk} eksisterer"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Kan ikke sammenflette med det samme objekt!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Ingen {self.basename} med ID {target} eksisterer"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Kan ikke sammenflette med et objekt som er et barn!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} blev sammenflettet med {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Der opstod en fejl under sammenfletningen af {source.name} med {target.name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} blev flyttet til roden."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Der skete en fejl under flytningen "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Kan ikke flytte et objekt til sig selv!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Ingen {self.basename} med ID {parent} eksisterer"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} blev flyttet til forælder {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} blev fjernet fra indkøbslisten."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} blev tilføjet til indkøbslisten."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr "ID på den opskrift som et trin er del af. For flere, gentag parameter."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr "ID på den opskrift som et trin er del af. For flere, gentag parameter."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "Søgningen matchede (fuzzy) mod objektets navn."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2321,7 +2321,7 @@ msgstr ""
"Søgningen matchede (fuzzy) mod opskriftens navn. I fremtiden også heltekst "
"søgning."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2329,64 +2329,64 @@ msgstr ""
"ID på nøgeord som opskriften skal have. For flere, gentag parameter. "
"Sammenligneligt med keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Nøgleord ID'er, gentag for flere. Returnerer opskrifter med bare et af "
"nøgleorderne"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Nøgleord ID'er, gentag for flere. Returnerer opskrifter med alle "
"nøgleorderne."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Nøgleord ID'er, gentag for flere. Ekskluderer opskrifter med bare et af "
"nøgleorderne."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Nøgleord ID'er, gentag for flere. Ekskluderer opskrifter med alle "
"nøgleorderne."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr "ID på mad en opskrift skal have. For flere, gentag parameter."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Mad ID'er, gentag for flere. Returnerer mad med bare et af de angivne mad"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Mad ID'er, gentag for flere. Returnerer opskrifter med alt det angivne mad."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Mad ID'er, gentag for flere. Eksluderer opskrifter med bare et af det "
"angivne mad."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Mad ID'er, gentag for flere. Eksluderer opskrifter med alt det angivne mad."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "ID på enhed en opskrift skal have."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
@@ -2394,42 +2394,42 @@ msgstr ""
"Bedømmelse en opskrift mindst skal have. [0 - 5] Negative værdier filtrerer "
"opskrifter med mindre end det angivne."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr "ID på bog en opskrift skal være i. For flere, gentag parameter."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
"Bog ID'er, gentag for flere. Returnerer opskrifter med bare en af bøgerne"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr "Bog ID'er, gentag for flere. Returnerer opskrifter med alle bøgerne."
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Bog ID'er, gentag for flere. Eksluderer opskrifter med bare en af bøgerne."
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr "Bog ID'er, gentag for flere. Ekskluderer opskrifter med alle bøgerne."
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr "Om kun interne opskrifter skal returneres. [true/<b>false</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr "Returnerer resultaterne i tilfældig rækkefølge. [true/<b>false</b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
"Returnerer nye resultater først i søgeresultaterne. [true/<b>false</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
@@ -2437,7 +2437,7 @@ msgstr ""
"Filtrer opskrifter tilberedt X gange eller flere. Negative værdier "
"returnerer tilberedt mindre end X gange"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2445,7 +2445,7 @@ msgstr ""
"Filtrer opskrifter sidst tilberedt på eller efter d. YYYY-MM-DD. Hvis datoen "
"starter med '-', filtrerer den i stedet på eller før dato."
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2453,7 +2453,7 @@ msgstr ""
"Filtrer opskrifter oprettet på eller efter d. YYYY-MM-DD. Hvis datoen "
"starter med '-', filtrerer den i stedet på eller før dato."
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2461,7 +2461,7 @@ msgstr ""
"Filtrer opskrifter opdateret på eller efter d. YYYY-MM-DD. Hvis datoen "
"starter med '-', filtrerer den i stedet på eller før dato."
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2469,19 +2469,19 @@ msgstr ""
"Filtrer opskrifter sidst åbnet på eller efter d. YYYY-MM-DD. Hvis datoen "
"starter med '-', filtrerer den i stedet på eller før dato."
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Filtrer opskrifter der kan laves med tilgængeligt mad. [true/<b>false</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
"Returnerer indkøbslistepunktet med primær nøgle på ID. Flere værdier tilladt."
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
@@ -2495,17 +2495,17 @@ msgstr ""
"false, both, <b>recent</b>]<br> - 'recent' har både ikke afkrydsede artikler "
"og nyligt færdiggjorte artikler."
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
"Returnerer indkøbslistepunkterne sorteret efter "
"supermarkedskategorirækkefølge."
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
@@ -2516,46 +2516,46 @@ msgid ""
msgstr ""
"Returnerer indkøbslistepunktet med primær nøgle på ID. Flere værdier tilladt."
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Ikke noget at gøre."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Forbindelse nægtet."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "Ugyldigt link."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Intet brugbart data kunne findes."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importering er ikke implementeret for denne udbyder"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
"Denne funktion er endnu ikke tilgængelig i den hostede version af Tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synkronisering var en succes!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Der skete en fejl under synkroniseringen med lageret"

View File

@@ -14,17 +14,17 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2024-05-11 00:33+0000\n"
"Last-Translator: Jakob Priesner <jakob.priesner@outlook.de>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/de/>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-09-27 13:58+0000\n"
"Last-Translator: supaeasy <crafty_renewably854@supaeasy.de>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -395,7 +395,7 @@ msgstr "Sektion"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Behebt Lebensmittel mit "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -478,7 +478,7 @@ msgstr "Essensplan"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "Bücher"
msgstr "Kochbücher"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -542,10 +542,8 @@ msgid "Instruction Replace"
msgstr "Anleitung ersetzen"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Neue Einheit"
msgstr "Nie Einheit"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
@@ -2143,7 +2141,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "Erlaubte Hosts"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2153,6 +2151,11 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" Die erlaubten Hosts sind so konfiguriert, dass sie jeden Host "
"erlauben. Das mag in einigen Fällen in Ordnung sein, sollte aber im "
"Regelfall vermieden werden. Bitte lies in der Dokumentation dazu nach.\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2206,101 +2209,101 @@ msgstr "Anzeigen"
msgid "URL Import"
msgstr "URL-Import"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Der Parameter updated_at ist falsch formatiert"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Kein {self.basename} mit der ID {pk} existiert"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Zusammenführen mit selben Objekt nicht möglich!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Kein {self.basename} mit der ID {target} existiert"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Zusammenführen mit untergeordnetem Objekt nicht möglich!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} wurde erfolgreich mit {target.name} zusammengeführt"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Beim zusammenführen von {source.name} mit {target.name} ist ein Fehler "
"aufgetreten"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} wurde erfolgreich zur Wurzel verschoben."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Fehler aufgetreten beim verschieben von "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Ein Element kann nicht in sich selbst verschoben werden!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Kein {self.basename} mit ID {parent} existiert"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
"{child.name} wurde erfolgreich zum Überelement {parent.name} verschoben"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} wurde von der Einkaufsliste entfernt."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filtern Sie Essenspläne ab Datum (einschließlich) im Format JJJJ-MM-TT."
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filtern Sie die Essenspläne nach Datum (einschließlich) im Format JJJJ-MM-TT."
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
"Filtern Sie Mahlzeitenpläne nach der MealType ID. Für mehrere "
"Wiederholungsparameter."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"ID des Rezeptes zu dem ein Schritt gehört. Kann mehrfach angegeben werden."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "Abfragezeichenfolge, die mit dem Objektnamen übereinstimmt (ungenau)."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2308,7 +2311,7 @@ msgstr ""
"Suchbegriff wird mit dem Rezeptnamen abgeglichen. In Zukunft auch "
"Volltextsuche."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2316,69 +2319,69 @@ msgstr ""
"ID des Stichwortes, das ein Rezept haben muss. Kann mehrfach angegeben "
"werden. Äquivalent zu keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte zu jedem der "
"angegebenen Stichwörter"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte mit allen "
"angegebenen Stichwörtern."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Stichwort ID. Kann mehrfach angegeben werden. Schließt Rezepte einem der "
"angegebenen Stichwörtern aus."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Stichwort IDs. Kann mehrfach angegeben werden. Schließt Rezepte mit allen "
"angegebenen Stichwörtern aus."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"ID einer Zutat, zu der Rezepte gelistet werden sollen. Kann mehrfach "
"angegeben werden."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mindestens einer "
"der Zutaten"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mit allen "
"angegebenen Zutaten."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die eine der "
"angegebenen Zutaten enthalten."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die alle "
"angegebenen Zutaten enthalten."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "ID der Einheit, die ein Rezept haben sollte."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
@@ -2386,50 +2389,50 @@ msgstr ""
"Mindestbewertung eines Rezeptes (0-5). Negative Werte filtern nach "
"Maximalbewertung."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr "Buch ID, in dem das Rezept ist. Kann mehrfach angegeben werden."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
"Buch ID. Kann mehrfach angegeben werden. Listet alle Rezepte aus den "
"angegebenen Büchern"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
"Buch ID. Kann mehrfach angegeben werden. Listet die Rezepte, die in allen "
"Büchern enthalten sind."
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Buch IDs. Kann mehrfach angegeben werden. Schließt Rezepte aus den "
"angegebenen Büchern aus."
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
"Buch IDs. Kann mehrfach angegeben werden. Schließt Rezepte aus, die in allen "
"angegebenen Büchern enthalten sind."
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr "Nur interne Rezepte sollen gelistet werden. [ja/<b>nein</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
"Die Suchergebnisse sollen in zufälliger Reihenfolge gelistet werden. [ja/"
"<b>nein</b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
"Die neuesten Suchergebnisse sollen zuerst angezeigt werden. [ja/<b>nein</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
@@ -2437,7 +2440,7 @@ msgstr ""
"Rezepte listen, die mindestens x-mal gekocht wurden. Eine negative Zahl "
"listet Rezepte, die weniger als x-mal gekocht wurden"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2446,7 +2449,7 @@ msgstr ""
"wurden. Mit vorangestelltem - , werden Rezepte am oder vor dem Datum "
"gelistet."
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2454,7 +2457,7 @@ msgstr ""
"Rezepte listen, die am angegebenen Datum oder später erstellt wurden. Wenn - "
"vorangestellt wird, wird am oder vor dem Datum gelistet."
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2462,7 +2465,7 @@ msgstr ""
"Rezepte listen, die am angegebenen Datum oder später aktualisiert wurden. "
"Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet."
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2470,13 +2473,13 @@ msgstr ""
"Rezepte listen, die am angegebenen Datum oder später zuletzt angesehen "
"wurden. Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet."
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Rezepte listen, die mit vorhandenen Zutaten gekocht werden können. [ja/"
"<b>nein</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
@@ -2484,7 +2487,7 @@ msgstr ""
"Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann "
"mehrfach angegeben werden."
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
@@ -2494,66 +2497,62 @@ msgstr ""
"<b>kürzlich</b>]<br> - kürzlich enthält nicht abgehakte "
"Einträge und kürzlich abgeschlossene Einträge."
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
"Listet die Einträge der Einkaufsliste sortiert nach Supermarktkategorie."
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr "Filter für Einträge mit dem angegebenen Rezept"
#: .\cookbook\views\api.py:1293
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
#| "values allowed."
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
"Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann "
"mehrfach angegeben werden."
"Zeigt Automationen, die dem Automationstyp entsprechen. Kann mehrfach "
"angegeben werden."
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Nichts zu tun."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr "Ungültige URL"
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Verbindung fehlgeschlagen."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "Ungültiges URL Schema."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Es konnten keine passenden Daten gefunden werden."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr "Datei überschreitet das Speicherplatzlimit"
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importieren ist für diesen Anbieter noch nicht implementiert"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Diese Funktion ist in dieser Version von Tandoor noch nicht verfügbar!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synchronisation erfolgreich!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Fehler beim Synchronisieren"
@@ -2582,10 +2581,8 @@ msgstr ""
"Monitor verwendet wird."
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "Speicherquelle"
msgstr "Backendkonfiguration für Konnektoren"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
@@ -2644,10 +2641,8 @@ msgid "Shopping List"
msgstr "Einkaufsliste"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "Speicherquelle"
msgstr "Backendkonfiguration für Konnektoren"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2743,7 +2738,7 @@ msgstr "Sie verwenden PostgreSQL %(v1)s. PostgreSQL %(v2)s wird empfohlen"
#: .\cookbook\views\views.py:313
msgid "Unable to determine PostgreSQL version."
msgstr ""
msgstr "PostgreSQL version konnte nicht erkannt werden."
#: .\cookbook\views\views.py:317
msgid ""
@@ -2755,18 +2750,14 @@ msgstr ""
"PostgreSQL-Datenbanken funktionieren."
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
"please consult the django documentation on how to reset passwords."
msgstr ""
"Die Setup-Seite kann nur für den ersten Nutzer verwendet werden. Zum "
"Zurücksetzen von Passwörtern bitte der Django-Dokumentation folgen."
"Die Setup-Seite kann nur für den ersten Nutzer verwendet "
"werden. Falls du die Superuser Logindaten vergessen "
"hast, folge bitte der Django-Dokumentation um Passwörter zurückzusetzen."
#: .\cookbook\views\views.py:369
msgid "Passwords dont match!"

View File

@@ -7,17 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2023-08-21 09:19+0000\n"
"Last-Translator: Theodoros Grammenos <teogramm@outlook.com>\n"
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/el/>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-09-23 21:58+0000\n"
"Last-Translator: Emmker <emmker@gmail.com>\n"
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/el/>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -33,7 +33,7 @@ msgstr "Όνομα"
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
msgid "Keywords"
msgstr "Λέξεις κλειδιά"
msgstr "Λέξεις Κλειδιά"
#: .\cookbook\forms.py:62
msgid "Preparation time in minutes"
@@ -98,7 +98,7 @@ msgstr ""
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "http://homeassistant.local:8123/api για παράδειγμα"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -2030,286 +2030,286 @@ msgstr "Προβολή αρχείων καταγραφής"
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1934,286 +1934,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-27 19:02+0000\n"
"Last-Translator: Axel Breiterman <axelbreiterman@gmail.com>\n"
"Language-Team: Spanish <http://translate.tandoor.dev/projects/tandoor/"
@@ -2153,282 +2153,282 @@ msgstr "Mostrar Enlaces"
msgid "URL Import"
msgstr "Importar URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parámetro filter_list formateado incorrectamente"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "¡No se puede unir con el mismo objeto!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "¡No se puede unir con el mismo objeto!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No usable data could be found."
msgstr "La página solicitada no pudo ser encontrada."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "La importación no está implementada para este proveedor"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
#, fuzzy
@@ -2436,11 +2436,11 @@ msgstr "La importación no está implementada para este proveedor"
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "¡Esta funcionalidad no está disponible en la versión demo!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "¡Sincronización exitosa!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Error de sincronización con el almacenamiento"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-10 06:12+0000\n"
"Last-Translator: Kn <kn@users.noreply.translate.tandoor.dev>\n"
"Language-Team: Finnish <http://translate.tandoor.dev/projects/tandoor/"
@@ -1939,286 +1939,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-05-28 00:57+0000\n"
"Last-Translator: tarek EL SOL <tarek.elsol@gmail.com>\n"
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/recipes-"
@@ -2258,83 +2258,83 @@ msgstr "Afficher le journal"
msgid "URL Import"
msgstr "Import URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Le paramètre «update_at» n'est pas correctement formaté"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Il nexiste aucun(e) {self.basename} avec lidentifiant {pk}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Impossible de fusionner un objet avec lui-même !"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Il nexiste aucun(e) {self.basename} avec lid {target}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Impossible de fusionner avec lobjet enfant !"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} a été fusionné avec succès avec {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Une erreur est survenue lors de la tentative de fusion de {source.name} avec "
"{target.name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} a été déplacé avec succès vers la racine."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Une erreur est survenue en essayant de déplacer "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Impossible de déplacer un objet vers lui-même !"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Il nexiste aucun(e) {self.basename} avec lid {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} a été déplacé avec succès vers le parent {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} a été supprimé(e) de la liste de courses."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} a été ajouté(e) à la liste de courses."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
@@ -2342,18 +2342,18 @@ msgstr ""
"Identifiant de la recette dont fait partie une étape. Pour plusieurs "
"paramètres de répétition."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"Identifiant de la recette dont fait partie une étape. Pour plusieurs "
"paramètres de répétition."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
"Correspondance (floue) entre la chaîne de requête et le nom de l'objet."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2361,7 +2361,7 @@ msgstr ""
"La chaîne d'interrogation correspond (de manière floue) au nom de la "
"recette. À l'avenir, la recherche en texte intégral sera également possible."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2369,69 +2369,69 @@ msgstr ""
"ID du mot-clé qu'une recette doit avoir. Pour les paramètres à répétition "
"multiple. Equivalent à keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"ID des mots-clés, répéter pour plusieurs. Retourner les recettes avec "
"n'importe quel mot-clé"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"ID des mots-clés, répéter pour plusieurs. Retourner les recettes contenant "
"tous les mots-clés."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"ID des mots-clés, répéter pour plusieurs. Exclure les recettes contenant "
"l'un des mots-clés."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"ID des mots-clés, répéter pour plusieurs. Exclure les recettes contenant "
"l'un des mots-clés."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"ID de l'aliment qu'une recette doit contenir. Pour les paramètres de "
"répétition multiples."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"ID des aliments, répéter pour plusieurs. Retourner les recettes contenant "
"l'un des aliments"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"ID des aliments, répéter pour plusieurs. Retourner les recettes avec tous "
"les aliments."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"ID des aliments, répéter pour plusieurs. Exclure les recettes contenant l'un "
"des aliments."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"ID des aliments, répéter pour plusieurs. Exclure les recettes contenant tous "
"les aliments."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "ID de l'unité qu'une recette doit avoir."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
@@ -2439,128 +2439,128 @@ msgstr ""
"Note qu'une recette devrait avoir ou être supérieure. [0 - 5] Une valeur "
"négative filtre une note inférieure à."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Rien à faire."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr "Url non valide"
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Connexion refusée."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "Mauvais schéma dURL."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Aucune information utilisable n'a été trouvée."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Limportation nest pas implémentée pour ce fournisseur"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
@@ -2568,11 +2568,11 @@ msgstr ""
"Cette fonctionnalité nest pas encore disponible dans la version hébergée de "
"Tandoor !"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synchronisation réussie !"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Erreur lors de la synchronisation avec le stockage"

View File

@@ -7,28 +7,28 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2023-11-15 08:20+0000\n"
"Last-Translator: avi meyer <avmeyer@gmail.com>\n"
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/he/>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-09-08 12:58+0000\n"
"Last-Translator: Tomer Alcavi <alcavi1991@gmail.com>\n"
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/he/>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
"Both fields are optional. If none are given the username will be displayed "
"instead"
msgstr ""
msgstr "שני השדות אופציונלים. אם שני השדות ריקים, שם המשתמש יוצג במקום."
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246
msgid "Name"
msgstr ""
msgstr "שם"
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
msgid "Keywords"
@@ -36,23 +36,23 @@ msgstr "מילות מפתח"
#: .\cookbook\forms.py:62
msgid "Preparation time in minutes"
msgstr ""
msgstr "זמן הכנה בדקות"
#: .\cookbook\forms.py:62
msgid "Waiting time (cooking/baking) in minutes"
msgstr ""
msgstr "זמן המתנה (בישול/אפייה) בדקות"
#: .\cookbook\forms.py:63 .\cookbook\forms.py:222 .\cookbook\forms.py:246
msgid "Path"
msgstr ""
msgstr "נתיב"
#: .\cookbook\forms.py:63
msgid "Storage UID"
msgstr ""
msgstr "אחסון UID"
#: .\cookbook\forms.py:93
msgid "Default"
msgstr ""
msgstr "ברירת מחדל"
#: .\cookbook\forms.py:121
msgid ""
@@ -62,21 +62,23 @@ msgstr ""
#: .\cookbook\forms.py:143
msgid "Add your comment: "
msgstr ""
msgstr "הוסף את ההערה שלך::- "
#: .\cookbook\forms.py:151
msgid "Leave empty for dropbox and enter app password for nextcloud."
msgstr ""
msgstr "השאר ריק עבור Dropbox והכנס סיסמא עבור NextCloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr ""
msgstr "השאר ריק עבור NextCloud והכנס טוקן API עבור Dropbox."
#: .\cookbook\forms.py:160
msgid ""
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
"php/webdav/</code> is added automatically)"
msgstr ""
"השאר ריק עבור dropbox וכנס רק URL בסיסי עבור nextcloud (<code>/remote.php/"
"webdav/</code> נוסף אוטומטי)"
#: .\cookbook\forms.py:188
msgid ""
@@ -86,49 +88,49 @@ msgstr ""
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "משהו דומה לhttp://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "לדוגמא http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
msgstr ""
msgstr "אחסון"
#: .\cookbook\forms.py:222
msgid "Active"
msgstr ""
msgstr "פעיל"
#: .\cookbook\forms.py:226
msgid "Search String"
msgstr ""
msgstr "מחרוזת חיפוש"
#: .\cookbook\forms.py:246
msgid "File ID"
msgstr ""
msgstr "ID של הקובץ"
#: .\cookbook\forms.py:262
msgid "Maximum number of users for this space reached."
msgstr ""
msgstr "המספר המקסימלי של משתמשים עבור מרחב זה נוצל."
#: .\cookbook\forms.py:268
msgid "Email address already taken!"
msgstr ""
msgstr "כתובת האימייל כבר בשימוש!"
#: .\cookbook\forms.py:275
msgid ""
"An email address is not required but if present the invite link will be sent "
"to the user."
msgstr ""
msgstr "כתובת אימייל לא נדרשת אבל אם קיימת, קישור השיתוף ישלח למשתמש."
#: .\cookbook\forms.py:287
msgid "Name already taken."
msgstr ""
msgstr "שם כבר בשימוש."
#: .\cookbook\forms.py:298
msgid "Accept Terms and Privacy"
msgstr ""
msgstr "הסכם לתנאים ולפרטיות"
#: .\cookbook\forms.py:332
msgid ""
@@ -147,6 +149,7 @@ msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"השתמש בהתאמה גמישה ליחידות, מילות מפתח ורכיבים בעת עריכה וייבוא מתכונים."
#: .\cookbook\forms.py:342
msgid ""
@@ -235,7 +238,7 @@ msgstr ""
#: .\cookbook\helper\permission_helper.py:237
#: .\cookbook\helper\permission_helper.py:252
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
msgstr "אינך יכול/ה לפעול על אובייקט זה כיוון שהוא לא בבעלותך!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
@@ -439,7 +442,7 @@ msgstr ""
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
msgid "Shopping"
msgstr ""
msgstr "קניות"
#: .\cookbook\models.py:752
msgid " is part of a recipe step and cannot be deleted"
@@ -524,7 +527,7 @@ msgstr ""
#: .\cookbook\models.py:1504
msgid "Food"
msgstr ""
msgstr "אוכל"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -544,7 +547,7 @@ msgstr ""
#: .\cookbook\serializer.py:1270
msgid "Hello"
msgstr ""
msgstr "שלום"
#: .\cookbook\serializer.py:1270
msgid "You have been invited by "
@@ -565,12 +568,12 @@ msgstr ""
#: .\cookbook\serializer.py:1278
msgid "The invitation is valid until "
msgstr ""
msgstr "ההזמנה תקפה עד "
#: .\cookbook\serializer.py:1280
msgid ""
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
msgstr ""
msgstr "Tandoor Recipes הוא מנהל מתכונים בקוד פתוח. ניתן למצוא אותנו ב-GitHub. "
#: .\cookbook\serializer.py:1283
msgid "Tandoor Recipes Invite"
@@ -608,11 +611,11 @@ msgstr ""
#: .\cookbook\templates\generic\delete_template.html:15
#: .\cookbook\templates\generic\edit_template.html:28
msgid "Delete"
msgstr ""
msgstr "מחיקה"
#: .\cookbook\templates\404.html:5
msgid "404 Error"
msgstr ""
msgstr "שגיאה 404"
#: .\cookbook\templates\404.html:18
msgid "The page you are looking for could not be found."
@@ -624,12 +627,12 @@ msgstr ""
#: .\cookbook\templates\404.html:35
msgid "Report a Bug"
msgstr ""
msgstr "דווח על באג"
#: .\cookbook\templates\account\email.html:6
#: .\cookbook\templates\account\email.html:17
msgid "E-mail Addresses"
msgstr ""
msgstr "כתובות אימייל"
#: .\cookbook\templates\account\email.html:12
#: .\cookbook\templates\account\password_change.html:11
@@ -639,11 +642,11 @@ msgstr ""
#: .\cookbook\templates\socialaccount\connections.html:10
#: .\cookbook\templates\user_settings.html:8
msgid "Settings"
msgstr ""
msgstr "הגדרות"
#: .\cookbook\templates\account\email.html:13
msgid "Email"
msgstr ""
msgstr "מייל"
#: .\cookbook\templates\account\email.html:19
msgid "The following e-mail addresses are associated with your account:"
@@ -651,33 +654,33 @@ msgstr ""
#: .\cookbook\templates\account\email.html:36
msgid "Verified"
msgstr ""
msgstr "מאומת"
#: .\cookbook\templates\account\email.html:38
msgid "Unverified"
msgstr ""
msgstr "לא מאומת"
#: .\cookbook\templates\account\email.html:40
msgid "Primary"
msgstr ""
msgstr "ראשי"
#: .\cookbook\templates\account\email.html:47
msgid "Make Primary"
msgstr ""
msgstr "הגדר כראשי"
#: .\cookbook\templates\account\email.html:49
msgid "Re-send Verification"
msgstr ""
msgstr "שלח אימות מחדש"
#: .\cookbook\templates\account\email.html:50
#: .\cookbook\templates\generic\delete_template.html:57
#: .\cookbook\templates\socialaccount\connections.html:44
msgid "Remove"
msgstr ""
msgstr "הסרה"
#: .\cookbook\templates\account\email.html:58
msgid "Warning:"
msgstr ""
msgstr "אזהרה:"
#: .\cookbook\templates\account\email.html:58
msgid ""
@@ -687,11 +690,11 @@ msgstr ""
#: .\cookbook\templates\account\email.html:64
msgid "Add E-mail Address"
msgstr ""
msgstr "הוספת כתובת מייל"
#: .\cookbook\templates\account\email.html:69
msgid "Add E-mail"
msgstr ""
msgstr "הוספת מייל"
#: .\cookbook\templates\account\email.html:79
msgid "Do you really want to remove the selected e-mail address?"
@@ -700,7 +703,7 @@ msgstr ""
#: .\cookbook\templates\account\email_confirm.html:6
#: .\cookbook\templates\account\email_confirm.html:10
msgid "Confirm E-mail Address"
msgstr ""
msgstr "אשר כתובת מייל"
#: .\cookbook\templates\account\email_confirm.html:16
#, python-format
@@ -714,7 +717,7 @@ msgstr ""
#: .\cookbook\templates\account\email_confirm.html:22
#: .\cookbook\templates\generic\delete_template.html:72
msgid "Confirm"
msgstr ""
msgstr "אשר"
#: .\cookbook\templates\account\email_confirm.html:29
#, python-format
@@ -727,7 +730,7 @@ msgstr ""
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
#: .\cookbook\templates\openid\login.html:8
msgid "Login"
msgstr ""
msgstr "התחבר"
#: .\cookbook\templates\account\login.html:15
#: .\cookbook\templates\account\login.html:31
@@ -739,7 +742,7 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:26
#: .\cookbook\templates\socialaccount\authentication_error.html:15
msgid "Sign In"
msgstr ""
msgstr "התחבר"
#: .\cookbook\templates\account\login.html:34
#: .\cookbook\templates\account\password_reset.html:41
@@ -747,7 +750,7 @@ msgstr ""
#: .\cookbook\templates\socialaccount\signup.html:8
#: .\cookbook\templates\socialaccount\signup.html:57
msgid "Sign Up"
msgstr ""
msgstr "הירשם"
#: .\cookbook\templates\account\login.html:38
msgid "Lost your password?"
@@ -756,7 +759,7 @@ msgstr ""
#: .\cookbook\templates\account\login.html:39
#: .\cookbook\templates\account\password_reset.html:29
msgid "Reset My Password"
msgstr ""
msgstr "איפוס סיסמא"
#: .\cookbook\templates\account\login.html:50
msgid "Social Login"
@@ -770,7 +773,7 @@ msgstr ""
#: .\cookbook\templates\account\logout.html:9
#: .\cookbook\templates\account\logout.html:18
msgid "Sign Out"
msgstr ""
msgstr "התנתק"
#: .\cookbook\templates\account\logout.html:11
msgid "Are you sure you want to sign out?"
@@ -789,7 +792,7 @@ msgstr ""
#: .\cookbook\templates\account\password_change.html:12
#: .\cookbook\templates\account\password_set.html:12
msgid "Password"
msgstr ""
msgstr "סיסמא"
#: .\cookbook\templates\account\password_change.html:22
msgid "Forgot Password?"
@@ -844,52 +847,52 @@ msgstr ""
#: .\cookbook\templates\account\password_set.html:16
#: .\cookbook\templates\account\password_set.html:21
msgid "Set Password"
msgstr ""
msgstr "קבע סיסמא"
#: .\cookbook\templates\account\signup.html:6
msgid "Register"
msgstr ""
msgstr "הירשם"
#: .\cookbook\templates\account\signup.html:12
msgid "Create an Account"
msgstr ""
msgstr "צור משתמש"
#: .\cookbook\templates\account\signup.html:42
#: .\cookbook\templates\socialaccount\signup.html:33
msgid "I accept the follwoing"
msgstr ""
msgstr "אני מקבל את התנאים הבאים"
#: .\cookbook\templates\account\signup.html:45
#: .\cookbook\templates\socialaccount\signup.html:36
msgid "Terms and Conditions"
msgstr ""
msgstr "תנאים והגבלות"
#: .\cookbook\templates\account\signup.html:48
#: .\cookbook\templates\socialaccount\signup.html:39
msgid "and"
msgstr ""
msgstr "ו"
#: .\cookbook\templates\account\signup.html:52
#: .\cookbook\templates\socialaccount\signup.html:43
msgid "Privacy Policy"
msgstr ""
msgstr "מדיניות פרטיות"
#: .\cookbook\templates\account\signup.html:65
msgid "Create User"
msgstr ""
msgstr "צור משתמש"
#: .\cookbook\templates\account\signup.html:69
msgid "Already have an account?"
msgstr ""
msgstr "יש לך חשבון?"
#: .\cookbook\templates\account\signup_closed.html:5
#: .\cookbook\templates\account\signup_closed.html:11
msgid "Sign Up Closed"
msgstr ""
msgstr "ההרשמה סגורה"
#: .\cookbook\templates\account\signup_closed.html:13
msgid "We are sorry, but the sign up is currently closed."
msgstr ""
msgstr "אנו מצטערים, אך ההרשמה כרגע סגורה."
#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:378
#: .\cookbook\templates\rest_framework\api.html:11
@@ -898,11 +901,11 @@ msgstr ""
#: .\cookbook\templates\base.html:110 .\cookbook\templates\index.html:87
msgid "Recipes"
msgstr ""
msgstr "מתכונים"
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
msgid "Foods"
msgstr ""
msgstr "מאכלים"
#: .\cookbook\templates\base.html:173 .\cookbook\views\lists.py:137
msgid "Units"
@@ -918,11 +921,11 @@ msgstr ""
#: .\cookbook\templates\base.html:211 .\cookbook\views\lists.py:186
msgid "Automations"
msgstr ""
msgstr "אוטומציות"
#: .\cookbook\templates\base.html:225 .\cookbook\views\lists.py:222
msgid "Files"
msgstr ""
msgstr "קבצים"
#: .\cookbook\templates\base.html:237
msgid "Batch Edit"
@@ -943,7 +946,7 @@ msgstr ""
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
msgstr ""
msgstr "יצא"
#: .\cookbook\templates\base.html:287
msgid "Properties"
@@ -968,7 +971,7 @@ msgstr ""
#: .\cookbook\templates\base.html:336 .\cookbook\templates\space_manage.html:15
msgid "Space Settings"
msgstr ""
msgstr "הגדרות מרחב"
#: .\cookbook\templates\base.html:340
msgid "External Connectors"
@@ -976,21 +979,21 @@ msgstr ""
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
msgstr ""
msgstr "מערכת"
#: .\cookbook\templates\base.html:347
msgid "Admin"
msgstr ""
msgstr "מנהל"
#: .\cookbook\templates\base.html:351
#: .\cookbook\templates\space_overview.html:25
msgid "Your Spaces"
msgstr ""
msgstr "המרחבים שלך"
#: .\cookbook\templates\base.html:362
#: .\cookbook\templates\space_overview.html:6
msgid "Overview"
msgstr ""
msgstr "סקירה כללית"
#: .\cookbook\templates\base.html:372
msgid "Markdown Guide"
@@ -1010,7 +1013,7 @@ msgstr ""
#: .\cookbook\templates\base.html:383
msgid "Log out"
msgstr ""
msgstr "התנתק"
#: .\cookbook\templates\base.html:406
msgid "You are using the free version of Tandor"
@@ -1068,7 +1071,7 @@ msgstr ""
#: .\cookbook\templates\batch\monitor.html:29
msgid "Show Recipes"
msgstr ""
msgstr "הראה מתכונים"
#: .\cookbook\templates\batch\monitor.html:30
msgid "Show Log"
@@ -1109,7 +1112,7 @@ msgstr ""
#: .\cookbook\templates\generic\delete_template.html:22
msgid "This cannot be undone!"
msgstr ""
msgstr "לא ניתן לבטל פעולה זו!"
#: .\cookbook\templates\generic\delete_template.html:27
msgid "Protected"
@@ -1126,7 +1129,7 @@ msgstr ""
#: .\cookbook\templates\generic\edit_template.html:6
#: .\cookbook\templates\generic\edit_template.html:14
msgid "Edit"
msgstr ""
msgstr "ערוך"
#: .\cookbook\templates\generic\edit_template.html:32
msgid "View"
@@ -1160,7 +1163,7 @@ msgstr ""
#: .\cookbook\templates\generic\table_template.html:98
msgid "next"
msgstr ""
msgstr "הבא"
#: .\cookbook\templates\history.html:20
msgid "View Log"
@@ -1173,7 +1176,7 @@ msgstr ""
#: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:90
#: .\cookbook\views\edit.py:174
msgid "Import"
msgstr ""
msgstr "יבא"
#: .\cookbook\templates\include\storage_backend_warning.html:4
msgid "Security Warning"
@@ -1354,7 +1357,7 @@ msgstr ""
#: .\cookbook\templates\no_groups_info.html:5
#: .\cookbook\templates\no_groups_info.html:12
msgid "No Permissions"
msgstr ""
msgstr "אין הרשאות"
#: .\cookbook\templates\no_groups_info.html:17
msgid "You do not have any groups and therefor cannot use this application."
@@ -1363,12 +1366,12 @@ msgstr ""
#: .\cookbook\templates\no_groups_info.html:18
#: .\cookbook\templates\no_perm_info.html:15
msgid "Please contact your administrator."
msgstr ""
msgstr "אנא פנה למנהל המערכת."
#: .\cookbook\templates\no_perm_info.html:5
#: .\cookbook\templates\no_perm_info.html:12
msgid "No Permission"
msgstr ""
msgstr "אין הרשאות"
#: .\cookbook\templates\no_perm_info.html:15
msgid ""
@@ -1378,11 +1381,11 @@ msgstr ""
#: .\cookbook\templates\offline.html:6
msgid "Offline"
msgstr ""
msgstr "לא מקוון"
#: .\cookbook\templates\offline.html:19
msgid "You are currently offline!"
msgstr ""
msgstr "אתה כרגע במצב לא מקוון!"
#: .\cookbook\templates\offline.html:20
msgid ""
@@ -1393,7 +1396,7 @@ msgstr ""
#: .\cookbook\templates\openid\login.html:27
#: .\cookbook\templates\socialaccount\authentication_error.html:27
msgid "Back"
msgstr ""
msgstr "אחורה"
#: .\cookbook\templates\property_editor.html:7
msgid "Property Editor"
@@ -1420,7 +1423,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:9
#: .\cookbook\templates\settings.html:24
msgid "Search Settings"
msgstr ""
msgstr "הגדרות חיפוש"
#: .\cookbook\templates\search_info.html:10
msgid ""
@@ -1436,7 +1439,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:19
msgid "Search Methods"
msgstr ""
msgstr "שיטות חיפוש"
#: .\cookbook\templates\search_info.html:23
msgid ""
@@ -1519,7 +1522,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:69
msgid "Search Fields"
msgstr ""
msgstr "שדות חיפוש"
#: .\cookbook\templates\search_info.html:73
msgid ""
@@ -1938,286 +1941,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-12-05 09:15+0000\n"
"Last-Translator: Ferenc <ugyes@freemail.hu>\n"
"Language-Team: Hungarian <http://translate.tandoor.dev/projects/tandoor/"
@@ -2268,81 +2268,81 @@ msgstr "Napló megjelenítése"
msgid "URL Import"
msgstr "URL importálása"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Az updated_at paraméter helytelenül van formázva"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Nem létezik {self.basename} azonosítóval {pk}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Nem egyesíthető ugyanazzal az objektummal!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Nem létezik {self.basename} azonosítóval {target}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Nem lehet egyesíteni a gyermekobjektummal!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} sikeresen egyesült a {target.name} -vel"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr "Hiba történt a {source.name} és a {target.name} egyesítése során"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} sikeresen átkerült a gyökérbe."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "Hiba történt az áthelyezés közben "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Nem lehet egy objektumot önmagába mozgatni!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Nem létezik {self.basename} azonosítóval {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} sikeresen átkerült a {parent.name} szülőhöz"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} lekerült a bevásárlólistáról."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} hozzá lett adva a bevásárlólistához."
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
@@ -2350,17 +2350,17 @@ msgstr ""
"A recept azonosítója, amelynek egy lépés része. Többszörös ismétlés esetén "
"paraméter."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"A recept azonosítója, amelynek egy lépés része. Többszörös ismétlés esetén "
"paraméter."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "A lekérdezés karakterlánca az objektum nevével összevetve (fuzzy)."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2368,7 +2368,7 @@ msgstr ""
"A lekérdezési karakterláncot a recept nevével összevetve (fuzzy). A jövőben "
"teljes szöveges keresés is."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2376,69 +2376,69 @@ msgstr ""
"A recept kulcsszavának azonosítója. Többszörös ismétlődő paraméter esetén. "
"Egyenértékű a keywords_or kulcsszavakkal"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Kulcsszó azonosítók. Többször is megadható. A megadott kulcsszavak "
"mindegyikéhez tartozó receptek listázza"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Kulcsszó azonosítók. Többször is megadható. Az összes megadott kulcsszót "
"tartalmazó receptek listázása."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Kulcsszó azonosító. Többször is megadható. Kizárja a recepteket a megadott "
"kulcsszavak egyikéből."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Kulcsszó azonosítók. Többször is megadható. Kizárja az összes megadott "
"kulcsszóval rendelkező receptet."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"Annak az összetevőnek az azonosítója, amelynek receptjeit fel kell sorolni. "
"Többször is megadható."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Összetevő azonosító. Többször is megadható. Legalább egy összetevő "
"receptjeinek listája"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Összetevő azonosító. Többször is megadható. Az összes megadott összetevőt "
"tartalmazó receptek listája."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Összetevő azonosító. Többször is megadható. Kizárja azokat a recepteket, "
"amelyek a megadott összetevők bármelyikét tartalmazzák."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Összetevő azonosító. Többször is megadható. Kizárja az összes megadott "
"összetevőt tartalmazó recepteket."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "A recepthez tartozó mértékegység azonosítója."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
@@ -2446,51 +2446,51 @@ msgstr ""
"Egy recept minimális értékelése (0-5). A negatív értékek a maximális "
"értékelés szerint szűrnek."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"A könyv azonosítója, amelyben a recept található. Többször is megadható."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
"A könyv azonosítója. Többször is megadható. A megadott könyvek összes "
"receptjének listája"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
"A könyv azonosítója. Többször is megadható. Az összes könyvben szereplő "
"recept listája."
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"A könyv azonosítói. Többször is megadható. Kizárja a megadott könyvek "
"receptjeit."
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
"A könyv azonosítói. Többször is megadható. Kizárja az összes megadott "
"könyvben szereplő receptet."
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr "Ha csak a belső recepteket kell visszaadni. [true/<b>false</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
"Az eredményeket véletlenszerű sorrendben adja vissza. [true/<b>false</b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
"Az új találatokat adja vissza először a keresési eredmények között. [true/"
"<b>false</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
@@ -2498,7 +2498,7 @@ msgstr ""
"X-szer vagy többször főzött receptek szűrése. A negatív értékek X "
"alkalomnál kevesebbet főzött recepteket jelenítik meg"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2507,7 +2507,7 @@ msgstr ""
"vagy később főztek meg utoljára. A - jelölve az adott dátumon vagy azt "
"megelőzően elkészítettek kerülnek be a receptek listájába."
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2516,7 +2516,7 @@ msgstr ""
"vagy később hoztak létre. A - jelölve az adott dátumon vagy azt megelőzően "
"hozták létre."
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2525,7 +2525,7 @@ msgstr ""
"vagy később frissültek. A - jelölve az adott dátumon vagy azt megelőzően "
"frissültek."
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2534,13 +2534,13 @@ msgstr ""
"vagy később néztek meg utoljára. A - jelölve az adott dátumon vagy azt "
"megelőzően néztek meg utoljára."
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Felsorolja azokat a recepteket, amelyeket a rendelkezésre álló összetevőkből "
"el lehet készíteni. [true/<b>false</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
@@ -2548,7 +2548,7 @@ msgstr ""
"Visszaadja az id elsődleges kulccsal rendelkező bevásárlólista-bejegyzést. "
"Több érték megengedett."
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
@@ -2562,17 +2562,17 @@ msgstr ""
"mindkettő, <b>legutóbbi</b>]<br> a legutóbbi a nem bejelölt és a nemrég "
"befejezett elemeket tartalmazza."
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
"Visszaadja a bevásárlólista bejegyzéseit szupermarket kategóriák szerinti "
"sorrendben."
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
@@ -2584,45 +2584,45 @@ msgstr ""
"Visszaadja az id elsődleges kulccsal rendelkező bevásárlólista-bejegyzést. "
"Több érték megengedett."
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Semmi feladat."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr "Érvénytelen URL"
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "Kapcsolat megtagadva."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "Rossz URL séma."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Nem sikerült használható adatokat találni."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Az importálás nincs implementálva ennél a szolgáltatónál"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Ez a funkció még nem érhető el a tandoor hosztolt verziójában!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Szinkronizálás sikeres!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Hiba szinkronizálás közben a tárolóval"

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-01-08 17:55+0000\n"
"Last-Translator: Joachim Weber <joachim.weber@gmx.de>\n"
"Language-Team: Armenian <http://translate.tandoor.dev/projects/tandoor/"
@@ -2121,282 +2121,282 @@ msgstr "Ցուցադրել օգնություն"
msgid "URL Import"
msgstr "URL ներմուծում"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "filter_list պարամետրը սխալ է ձևավորված"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Հնարավոր չէ միավորել նույն օբյեկտի հետ:"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "Հնարավոր չէ միավորել նույն օբյեկտի հետ:"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No usable data could be found."
msgstr "Պահանջվող էջը չի գտնվել:"
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Ներմուծումն այս պրովայդերի համար իրականացված չէ"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
#, fuzzy
@@ -2404,11 +2404,11 @@ msgstr "Ներմուծումն այս պրովայդերի համար իրակա
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Այս հատկությունը հասանելի չէ փորձնական տարբերակում։"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Սինքրոնիզացիան հաջողված է:"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Պահոցի հետ սինքրոնիզացիայի սխալ"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2022-10-12 08:33+0000\n"
"Last-Translator: wella <wella.design@gmail.com>\n"
"Language-Team: Indonesian <http://translate.tandoor.dev/projects/tandoor/"
@@ -1962,286 +1962,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-08-19 21:36+0000\n"
"Last-Translator: NeoID <neoid@animenord.com>\n"
"Language-Team: Norwegian Bokmål <http://translate.tandoor.dev/projects/"
@@ -2053,286 +2053,286 @@ msgstr "Vis hjelp"
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -12,17 +12,17 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2024-02-10 12:20+0000\n"
"Last-Translator: Jonan B <jonanb@pm.me>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/nl/>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-09-03 19:58+0000\n"
"Last-Translator: \"S. v.d. Gevel\" <stefan18_gw@hotmail.com>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -65,8 +65,8 @@ msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"Om dubbelingen te voorkomen worden recepten met dezelfde naam als een "
"bestaand recept genegeerd. Vink aan om alles te importeren."
"Standaard worden dubbele recepten, op basis van de naam, genegeerd. Vink "
"deze optie aan om toch alles te importeren."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
@@ -93,14 +93,17 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Toegangtokens met lange levensduur</a> voor jouw HomeAssistant "
"installatie"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "Bijvoorbeeld http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "http://homeassistant.local:8123/api bijvoorbeeld"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -303,7 +306,7 @@ msgstr "gisten"
#: .\cookbook\helper\recipe_url_import.py:316
msgid "sous-vide"
msgstr "sous-vide"
msgstr "sous-vide (vacuümgaren)"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
@@ -390,7 +393,7 @@ msgstr "Sectie"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Repareer voedingsmiddelen met "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -427,16 +430,14 @@ msgid "Other"
msgstr "Overige"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#, fuzzy
#| msgid "Fats"
msgid "Fat"
msgstr "Vetten"
msgstr "Vet"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr "g"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
@@ -452,7 +453,7 @@ msgstr "Calorieën"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "kcal"
#: .\cookbook\models.py:325
msgid ""
@@ -475,7 +476,7 @@ msgstr "Maaltijdplan"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "Boeken"
msgstr "Kookboeken"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -491,18 +492,16 @@ msgid "Nutrition"
msgstr "Voedingswaarde"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "Samenvoegen"
msgstr "Allergeen"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "Prijs"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "Doel"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -541,30 +540,24 @@ msgid "Instruction Replace"
msgstr "Vervang instructies"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Nieuwe eenheid"
msgstr "Nooit eenheid"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "Omzetten Woorden"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "Ingrediënt alias"
msgstr "Voedingsmiddelen vervangen"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Description Replace"
msgid "Unit Replace"
msgstr "Verrvang beschrijving"
msgstr "Eenheid Vervangen"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "Naam Vervangen"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -577,7 +570,7 @@ msgstr "Ingrediënt"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
msgstr "Etiket"
msgstr "Trefwoord"
#: .\cookbook\serializer.py:222
msgid "File uploads are not enabled for this Space."
@@ -637,8 +630,8 @@ msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
"Lijst van ingrediënten ID's van het toe te voegen recept, als deze niet "
"opgegeven worden worden alle ingrediënten toegevoegd."
"Lijst van ingrediënt ID's van het toe te voegen recept, als deze niet worden "
"opgegeven worden alle ingrediënten toegevoegd."
#: .\cookbook\serializer.py:1430
msgid ""
@@ -907,7 +900,7 @@ msgstr ""
#: .\cookbook\templates\account\password_reset_from_key.html:33
msgid "change password"
msgstr "Wijzig wachtwoord"
msgstr "wijzig wachtwoord"
#: .\cookbook\templates\account\password_reset_from_key.html:36
#: .\cookbook\templates\account\password_reset_from_key_done.html:19
@@ -1021,13 +1014,11 @@ msgstr "Exporteren"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "Eigenschappen"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
#, fuzzy
#| msgid "Account Connections"
msgid "Unit Conversions"
msgstr "Account verbindingen"
msgstr "Eenheid omzetten"
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
msgid "Import Recipe"
@@ -1047,10 +1038,8 @@ msgid "Space Settings"
msgstr "Ruimte Instellingen"
#: .\cookbook\templates\base.html:340
#, fuzzy
#| msgid "External Recipes"
msgid "External Connectors"
msgstr "Externe recepten"
msgstr "Externe Connectors"
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
@@ -1439,11 +1428,11 @@ msgstr "Tabellen"
#: .\cookbook\templates\markdown_info.html:153
msgid ""
"Markdown tables are hard to create by hand. It is recommended to use a table "
"editor like <a href=\"https://www.tablesgenerator.com/markdown_tables\" rel="
"\"noreferrer noopener\" target=\"_blank\">this one.</a>"
"editor like <a href=\"https://www.tablesgenerator.com/markdown_tables\" "
"rel=\"noreferrer noopener\" target=\"_blank\">this one.</a>"
msgstr ""
"Het is lastig om met de hand Markdown tabellen te maken. Het wordt "
"aangeraden om een tabel editor zoals <a href=\"https://www.tablesgenerator."
"aangeraden om een tabel 'editor' zoals <a href=\"https://www.tablesgenerator."
"com/markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">deze</a> "
"te gebruiken."
@@ -1513,10 +1502,8 @@ msgid "Back"
msgstr "Terug"
#: .\cookbook\templates\property_editor.html:7
#, fuzzy
#| msgid "Ingredient Editor"
msgid "Property Editor"
msgstr "Ingrediënten editor"
msgstr "Eigenschappen Editor"
#: .\cookbook\templates\recipe_view.html:36
msgid "Comments"
@@ -1856,7 +1843,7 @@ msgstr "Perfect voor grote databases"
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
msgid "Cookbook Setup"
msgstr "Kookboek Setup"
msgstr "Kookboek configuratie"
#: .\cookbook\templates\setup.html:14
msgid "Setup"
@@ -1973,10 +1960,8 @@ msgid "Sign in using"
msgstr "Log in met"
#: .\cookbook\templates\space_manage.html:7
#, fuzzy
#| msgid "Space Membership"
msgid "Space Management"
msgstr "Space Lidmaatschap"
msgstr "Ruimte Management"
#: .\cookbook\templates\space_manage.html:26
msgid "Space:"
@@ -2072,6 +2057,10 @@ msgid ""
"script to generate version information (done automatically in docker).\n"
" "
msgstr ""
"\n"
" Je moet <code>version.py</code> uitvoeren in je update script om "
"versie informatie te genereren (gebeurt automatisch in docker).\n"
" "
#: .\cookbook\templates\system.html:46
msgid "Media Serving"
@@ -2158,7 +2147,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "Hosts met toestemming"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2168,6 +2157,11 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" Jouw 'hosts met toestemming' zijn geconfigureerd om alle hosts "
"toestemming te geven. Dit is in niet altijd fout maar zou eigenlijk "
"voorkomen moeten worden. Raadpleeg de documentatie hiervoor.\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2178,10 +2172,8 @@ msgid "Info"
msgstr "Info"
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
#, fuzzy
#| msgid "Use fractions"
msgid "Migrations"
msgstr "Gebruik fracties"
msgstr "Migraties"
#: .\cookbook\templates\system.html:116
msgid ""
@@ -2194,93 +2186,103 @@ msgid ""
"issue.\n"
" "
msgstr ""
"\n"
" Migraties mogen nooit mislukken!\n"
" Mislukte migraties zullen er waarschijnlijk voor zorgen dat "
"grote delen van de app niet correct werken.\n"
" Als een migratie mislukt, zorg er dan voor dat de applicatie de "
"nieuwste versie is, blijft het probleem bestaan, plaats dan het "
"migratielogboek en het onderstaande overzicht in een GitHub-issue.\n"
" "
#: .\cookbook\templates\system.html:182
msgid "False"
msgstr ""
msgstr "Niet waar"
#: .\cookbook\templates\system.html:182
msgid "True"
msgstr ""
msgstr "Waar"
#: .\cookbook\templates\system.html:207
msgid "Hide"
msgstr ""
msgstr "Verberg"
#: .\cookbook\templates\system.html:210
#, fuzzy
#| msgid "Show Log"
msgid "Show"
msgstr "Toon Log"
msgstr "Toon"
#: .\cookbook\templates\url_import.html:8
msgid "URL Import"
msgstr "Importeer URL"
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parameter updatet_at is onjuist geformateerd"
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Er bestaat geen {self.basename} met id {pk}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238 .\cookbook\views\api.py:239
msgid "Cannot merge with the same object!"
msgstr "Kan niet met hetzelfde object samenvoegen!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245 .\cookbook\views\api.py:246
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Er bestaat geen {self.basename} met id {target}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250 .\cookbook\views\api.py:251
msgid "Cannot merge with child object!"
msgstr "Kan niet met kindobject samenvoegen!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288 .\cookbook\views\api.py:289
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} is succesvol samengevoegd met {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293 .\cookbook\views\api.py:294
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Er is een error opgetreden bij het samenvoegen van {source.name} met {target."
"name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349 .\cookbook\views\api.py:350
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} is succesvol verplaatst naar het hoogste niveau."
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
msgid "An error occurred attempting to move "
msgstr "Er is een error opgetreden bij het verplaatsen "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355 .\cookbook\views\api.py:356
msgid "Cannot move an object to itself!"
msgstr "Kan object niet verplaatsen naar zichzelf!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361 .\cookbook\views\api.py:362
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Er bestaat geen {self.basename} met id {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367 .\cookbook\views\api.py:368
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} is succesvol verplaatst naar {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589 .\cookbook\views\api.py:590
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} is verwijderd van het boodschappenlijstje."
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050 .\cookbook\views\api.py:595
#: .\cookbook\views\api.py:1038 .\cookbook\views\api.py:1051
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} is toegevoegd aan het boodschappenlijstje."
@@ -2288,30 +2290,29 @@ msgstr "{obj.name} is toegevoegd aan het boodschappenlijstje."
#: .\cookbook\views\api.py:743
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filter maaltijdplannen vanaf datum (inclusief) in het formaat JJJJ-MM-DD."
#: .\cookbook\views\api.py:744
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
"Filter maaltijdplannen tot nu toe (inclusief) in het formaat JJJJ-MM-DD."
#: .\cookbook\views\api.py:745
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
"ID van het recept waar de stap onderdeel van is. Herhaal parameter voor "
"meerdere."
"Filter maaltijdplannen met MealType ID. Herhaal parameter voor meerdere."
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872 .\cookbook\views\api.py:873
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
"ID van het recept waar de stap onderdeel van is. Herhaal parameter voor "
"meerdere."
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873 .\cookbook\views\api.py:874
msgid "Query string matched (fuzzy) against object name."
msgstr "Zoekterm komt overeen (fuzzy) met object naam."
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909 .\cookbook\views\api.py:910
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
@@ -2319,7 +2320,7 @@ msgstr ""
"Zoekterm komt overeen (fuzzy) met recept naam. In de toekomst wordt zoeken "
"op volledige tekst ondersteund."
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910 .\cookbook\views\api.py:911
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
@@ -2327,109 +2328,115 @@ msgstr ""
"ID van etiket dat een recept moet hebben. Herhaal parameter voor meerdere. "
"Gelijkwaardig aan keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911 .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
"Etiket ID, herhaal voor meerdere. Geeft recepten met elk geselecteerd etiket "
"weer"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912 .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Geeft recepten met alle geselecteerde "
"etiketten weer."
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913 .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Sluit recepten met één van de etiketten "
"uit."
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914 .\cookbook\views\api.py:915
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
"Etiket ID, herhaal voor meerdere. Sluit recepten met alle etiketten uit."
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915 .\cookbook\views\api.py:916
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
"ID van ingrediënt dat een recept moet hebben. Herhaal parameter voor "
"meerdere."
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916 .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Geeft recepten met elk ingrediënt weer"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917 .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Geef recepten met alle ingrediënten "
"weer."
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918 .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. sluit recepten met één van de "
"ingrediënten uit."
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919 .\cookbook\views\api.py:920
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
"Ingrediënt ID, herhaal voor meerdere. Sluit recepten met alle ingrediënten "
"uit."
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920 .\cookbook\views\api.py:921
msgid "ID of unit a recipe should have."
msgstr "ID van eenheid dat een recept moet hebben."
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921 .\cookbook\views\api.py:922
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr "Een waardering van een recept gaat van 0 tot 5."
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922 .\cookbook\views\api.py:923
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
"ID van boek dat een recept moet hebben. Herhaal parameter voor meerdere."
"ID van een kookboek dat een recept moet bevatten. Herhaal parameter voor "
"meerdere."
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923 .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr "Boek ID, herhaal voor meerdere. Geeft recepten uit alle boeken weer"
msgstr ""
"Kookboek ID, herhaal voor meerdere. Geeft recepten uit de geselecteerde "
"kookboeken weer"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924 .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr "Boek IDs, herhaal voor meerdere. Geeft recepten weer uit alle boeken."
msgstr ""
"Kookboek IDs, herhaal voor meerdere. Geeft recepten weer uit alle kookboeken."
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925 .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
"Boek IDs, herhaal voor meerdere. Sluit recepten uit elk van de boeken uit."
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit elk van de "
"geselecteerde kookboeken uit."
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926 .\cookbook\views\api.py:927
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr "Boek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
msgstr ""
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927 .\cookbook\views\api.py:928
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
"Wanneer alleen interne recepten gevonden moeten worden. [waar/<b>onwaar</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928 .\cookbook\views\api.py:929
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
"Geeft de resultaten in willekeurige volgorde weer. [waar/<b>onwaar</b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929 .\cookbook\views\api.py:930
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr "Geeft nieuwe resultaten eerst weer. [waar/<b>onwaar</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930 .\cookbook\views\api.py:931
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
@@ -2437,7 +2444,7 @@ msgstr ""
"Filter recepten X maal of meer bereid. Negatieve waarden geven minder dan X "
"keer bereide recepten weer"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931 .\cookbook\views\api.py:932
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2445,7 +2452,7 @@ msgstr ""
"Filter recepten op laatst bereid op of na JJJJ-MM-DD. Voorafgaand - filters "
"op of voor datum."
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932 .\cookbook\views\api.py:933
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2453,7 +2460,7 @@ msgstr ""
"Filter recepten aangemaakt op of na JJJJ-MM-DD. Voorafgaand - filters op of "
"voor datum."
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933 .\cookbook\views\api.py:934
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
@@ -2461,7 +2468,7 @@ msgstr ""
"Filter recepten op geüpdatet op of na JJJJ-MM-DD. Voorafgaand - filters op "
"of voor datum."
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934 .\cookbook\views\api.py:935
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
@@ -2469,13 +2476,13 @@ msgstr ""
"Filter recepten op laatst bekeken op of na JJJJ-MM-DD. Voorafgaand - filters "
"op of voor datum."
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935 .\cookbook\views\api.py:936
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
"Filter recepten die bereid kunnen worden met ingrediënten die op voorraad "
"zijn. [waar/<b>onwaar</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122 .\cookbook\views\api.py:1123
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
@@ -2484,78 +2491,71 @@ msgstr ""
"Meerdere waarden toegestaan."
#: .\cookbook\views\api.py:1126
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
#| "b>]<br> - recent includes unchecked items and recently completed items."
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
"Filter boodschappenlijstjes op aangevinkt. [waar,onwaar,beide,<b>recent</"
"Filter boodschappenlijstjes op aangevinkt. [waar, onwaar, beide,<b>recent</"
"b>]<br> - recent bevat niet aangevinkte en recent voltooide items."
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128 .\cookbook\views\api.py:1129
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
"Geeft items op boodschappenlijstjes gesorteerd per supermarktcategorie weer."
#: .\cookbook\views\api.py:1211
msgid "Filter for entries with the given recipe"
msgstr ""
msgstr "Filter op vermeldingen met het gegeven recept"
#: .\cookbook\views\api.py:1293
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
#| "values allowed."
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
"Geeft het boodschappenlijstje item met een primaire sleutel van id. "
"Vraag de automatiseringen die overeenkomen met het automatiseringstype op. "
"Meerdere waarden toegestaan."
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415 .\cookbook\views\api.py:1416
msgid "Nothing to do."
msgstr "Niks te doen."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445 .\cookbook\views\api.py:1443
msgid "Invalid Url"
msgstr "Ongeldige URL"
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449 .\cookbook\views\api.py:1447
msgid "Connection Refused."
msgstr "Verbinding geweigerd."
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451 .\cookbook\views\api.py:1449
msgid "Bad URL Schema."
msgstr "Verkeerd URL schema."
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474 .\cookbook\views\api.py:1472
msgid "No usable data could be found."
msgstr "Er is geen bruikbare data gevonden."
#: .\cookbook\views\api.py:1547
msgid "File is above space limit"
msgstr ""
msgstr "Bestand is boven de ruimte limiet"
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1564
msgid "Importing is not implemented for this provider"
msgstr "Importeren is voor deze provider niet geïmplementeerd"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
#: .\cookbook\views\new.py:82 .\cookbook\views\api.py:1648
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Deze optie is nog niet beschikbaar in de gehoste versie van Tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671 .\cookbook\views\api.py:1669
msgid "Sync successful!"
msgstr "Synchronisatie succesvol!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674 .\cookbook\views\api.py:1672
msgid "Error synchronizing with Storage"
msgstr "Er is een fout opgetreden bij het synchroniseren met Opslag"
@@ -2583,10 +2583,8 @@ msgstr ""
"tenminste een Bewaker."
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "Opslag backend"
msgstr "Connectors Configuratie backend"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
@@ -2609,14 +2607,12 @@ msgid "There was an error updating this storage backend!"
msgstr "Er is een fout opgetreden bij het updaten van deze opslag backend!"
#: .\cookbook\views\edit.py:134
#, fuzzy
#| msgid "Changes saved!"
msgid "Config saved!"
msgstr "Wijzigingen opgeslagen!"
msgstr "Configuratie opgeslagen!"
#: .\cookbook\views\edit.py:142
msgid "ConnectorConfig"
msgstr ""
msgstr "ConnectorConfiguratie"
#: .\cookbook\views\edit.py:198
msgid "Changes saved!"
@@ -2647,10 +2643,8 @@ msgid "Shopping List"
msgstr "Boodschappenlijst"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "Opslag backend"
msgstr "Connector Configuratie Backend"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2674,13 +2668,11 @@ msgstr "Stappen"
#: .\cookbook\views\lists.py:270
msgid "Property Types"
msgstr ""
msgstr "Eigenschap Types"
#: .\cookbook\views\new.py:86
#, fuzzy
#| msgid "This feature is not available in the demo version!"
msgid "This feature is not enabled by the server admin!"
msgstr "Deze optie is niet beschikbaar in de demo versie!"
msgstr "Deze optie is niet ingeschakeld door de server administrator!"
#: .\cookbook\views\new.py:123
msgid "Imported new recipe!"
@@ -2696,11 +2688,9 @@ msgid "This feature is not available in the demo version!"
msgstr "Deze optie is niet beschikbaar in de demo versie!"
#: .\cookbook\views\views.py:74
#, fuzzy
#| msgid "You have reached the maximum number of recipes for your space."
msgid ""
"You have the reached the maximum amount of spaces that can be owned by you."
msgstr "Je hebt het maximaal aantal recepten voor jouw ruimte bereikt."
msgstr "Je hebt het maximaal aantal Ruimtes die jij kan aanmaken bereikt."
#: .\cookbook\views\views.py:89
msgid ""
@@ -2738,49 +2728,37 @@ msgstr "'Fuzzy' zoeken is niet te gebruiken met deze zoekmethode!"
#, python-format
msgid "PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!"
msgstr ""
"PostgreSQL %(v)s is verouderd. Upgrade naar een volledig ondersteunde "
"versie!"
#: .\cookbook\views\views.py:309
#, python-format
msgid "You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended"
msgstr ""
msgstr "Je gebruikt PostgreSQL %(v1)s. PostgreSQL %(v2)s wordt aanbevolen"
#: .\cookbook\views\views.py:313
msgid "Unable to determine PostgreSQL version."
msgstr ""
msgstr "Kan PostgreSQL-versie niet bepalen."
#: .\cookbook\views\views.py:317
#, fuzzy
#| msgid ""
#| "\n"
#| " This application is not running with a Postgres database "
#| "backend. This is ok but not recommended as some\n"
#| " features only work with postgres databases.\n"
#| " "
msgid ""
"This application is not running with a Postgres database backend. This is ok "
"but not recommended as some features only work with postgres databases."
msgstr ""
"\n"
" Deze applicatie draait niet met een Postgres database als "
"backend. Dit is ok maar wordt niet aanbevolen omdat sommige functies \n"
" alleen werken met Postgres databases.\n"
" "
"Deze applicatie draait niet met een Postgres database als backend. Dit is ok "
"maar wordt niet aanbevolen omdat sommige functies alleen werken met Postgres "
"databases."
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
"please consult the django documentation on how to reset passwords."
msgstr ""
"De setup pagina kan alleen gebruikt worden om de eerste gebruiker aan te "
"maken! Indien je de superuser inloggegevens bent vergeten zal je de django "
"documentatie raad moeten plegen voor een methode om je wachtwoord te "
"resetten."
"maken! Indien je de superuser inloggegevens bent "
"vergeten zal je de django documentatie moeten raadplegen voor een methode om "
"je wachtwoord te resetten."
#: .\cookbook\views\views.py:369
msgid "Passwords dont match!"
@@ -2820,7 +2798,7 @@ msgstr ""
#: .\cookbook\views\views.py:451
msgid "Manage recipes, shopping list, meal plans and more."
msgstr ""
msgstr "Beheer recepten, boodschappen lijstjes, maaltijdplannen en meer."
#: .\cookbook\views\views.py:458
msgid "Plan"
@@ -2828,17 +2806,15 @@ msgstr "Plan"
#: .\cookbook\views\views.py:458
msgid "View your meal Plan"
msgstr ""
msgstr "Bekijk jouw maaltijdplan"
#: .\cookbook\views\views.py:459
msgid "View your cookbooks"
msgstr ""
msgstr "Bekijk jouw kookboeken"
#: .\cookbook\views\views.py:460
#, fuzzy
#| msgid "New Shopping List"
msgid "View your shopping lists"
msgstr "Nieuwe boodschappenlijst"
msgstr "Bekijk jouw boodschappenlijst"
#~ msgid "Default unit"
#~ msgstr "Standaard eenheid"
@@ -2946,8 +2922,8 @@ msgstr "Nieuwe boodschappenlijst"
#~ "You can use markdown to format this field. See the <a href=\"/docs/"
#~ "markdown/\">docs here</a>"
#~ msgstr ""
#~ "Je kunt markdown gebruiken om dit veld te op te maken. Bekijk de <a href="
#~ "\"/docs/markdown/\">documentatie hier</a>"
#~ "Je kunt markdown gebruiken om dit veld te op te maken. Bekijk de <a "
#~ "href=\"/docs/markdown/\">documentatie hier</a>"
#~ msgid ""
#~ "Users will see all items you add to your shopping list. They must add "

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-19 23:47+0000\n"
"Last-Translator: Tomasz Klimczak <klemensble@gmail.com>\n"
"Language-Team: Polish <http://translate.tandoor.dev/projects/tandoor/recipes-"
@@ -2108,290 +2108,290 @@ msgstr "Wyświetl pomoc"
msgid "URL Import"
msgstr "Importuj z URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "Nieprawidłowo sformatowany parametr filter_list"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Nie można scalić tego samego obiektu!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "Nie można scalić tego samego obiektu!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "Nie znaleziono żadnych przydatnych danych."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr "Plik przekracza limit miejsca"
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importowanie dla tego usługodawcy nie zostało zaimplementowane"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Ta funkcja nie jest jeszcze dostępna w hostowanej wersji tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synchronizacja powiodła się!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Błąd synchronizacji z magazynem"

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-10-07 18:02+0000\n"
"Last-Translator: Guilherme Roda <glealroda@gmail.com>\n"
"Language-Team: Portuguese <http://translate.tandoor.dev/projects/tandoor/"
@@ -1989,286 +1989,286 @@ msgstr "Mostrar Log"
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-10-09 01:54+0000\n"
"Last-Translator: Guilherme Roda <glealroda@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <http://translate.tandoor.dev/projects/"
@@ -1994,286 +1994,286 @@ msgstr "Mostrar Log"
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Nada para fazer."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Sincronização realizada com sucesso!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1934,286 +1934,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-04-27 08:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"Language-Team: Romanian <http://translate.tandoor.dev/projects/tandoor/"
@@ -2296,290 +2296,290 @@ msgstr "Afișare jurnal"
msgid "URL Import"
msgstr "Importare URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parametrul updated_at formatat incorect"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Nu există {self.basename} cu id {pk}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Nu se poate uni cu același obiect!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Nu există {self.basename} cu id {target}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "Nu se poate uni cu obiect copil!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} a fost unit cu succes cu {target.name}"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"A apărut o eroare la încercarea de a uni {source.name} cu {target.name}"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} a fost mutat cu succes la rădăcină."
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "A apărut o eroare la încercarea de a muta "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "Nu se poate muta un obiect la sine!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Nu există {self.basename} cu id {parent}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} a fost mutat cu succes la părintele {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "Nimic de făcut."
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Nu au putut fi găsite date utilizabile."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importul nu este implementat pentru acest furnizor"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
"Această funcție nu este încă disponibilă în versiunea găzduită a tandoor!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Sincronizare de succes!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Eroare la sincronizarea cu stocarea"

View File

@@ -7,18 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2023-05-01 07:55+0000\n"
"Last-Translator: axeron2036 <admin@axeron2036.ru>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-11-12 17:58+0000\n"
"Last-Translator: Владислав <vlad@kelonmyosa.ru>\n"
"Language-Team: Russian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.15\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -454,17 +454,17 @@ msgstr ""
#: .\cookbook\models.py:455 .\cookbook\templates\base.html:114
#: .\cookbook\templates\meal_plan.html:7
msgid "Meal-Plan"
msgstr ""
msgstr "План питания"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "Книги"
msgstr "Книги рецептов"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
msgid "Shopping"
msgstr ""
msgstr "Покупки"
#: .\cookbook\models.py:752
msgid " is part of a recipe step and cannot be deleted"
@@ -929,7 +929,7 @@ msgstr ""
#: .\cookbook\templates\base.html:110 .\cookbook\templates\index.html:87
msgid "Recipes"
msgstr ""
msgstr "Рецепты"
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
msgid "Foods"
@@ -1969,286 +1969,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2024-03-11 13:02+0000\n"
"Last-Translator: Kn <kn@users.noreply.translate.tandoor.dev>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-09-17 11:58+0000\n"
"Last-Translator: Bebbe K <kajolekk91@gmail.com>\n"
"Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/sv/>\n"
"Language: sv\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4.2\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -151,48 +151,61 @@ msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full description of choices."
msgstr ""
"Välj typ av sökmetod. Klicka <a href=\"/docs/search/\">här</a> för "
"fullständig beskrivning av alternativen."
#: .\cookbook\forms.py:341
msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"Använd \"fuzzy\" matchning på enheter, nyckelord och ingredienser när du "
"redigerar och importerar recept."
#: .\cookbook\forms.py:342
msgid ""
"Fields to search ignoring accents. Selecting this option can improve or "
"degrade search quality depending on language"
msgstr ""
"Fält att söka medan man ignorerar accenter. Val av detta alternativ kan "
"förbättra eller försämra sökkvaliteten beroende på språk"
#: .\cookbook\forms.py:343
msgid ""
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
"'pie' and 'piece' and 'soapie')"
msgstr ""
"Fält att söka efter delvisa matchningar. (t.ex. att söka efter 'Pie' kommer "
"att returnera 'pie' och 'piece' och 'soapie')"
#: .\cookbook\forms.py:344
msgid ""
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
"will return 'salad' and 'sandwich')"
msgstr ""
"Fält att söka för matchningar i början av ord. (t.ex. att söka efter 'sa' "
"kommer att returnera 'salad' och 'sandwich')"
#: .\cookbook\forms.py:345
msgid ""
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
"Note: this option will conflict with 'web' and 'raw' methods of search."
msgstr ""
"Fält för 'fuzzy'-sökning. (t.ex. att söka efter 'recpie' kommer att hitta "
"'recipe'.Observera: detta alternativet kommer att komma i konflikt med "
"sökmetoderna 'web' och 'raw'.)"
#: .\cookbook\forms.py:346
msgid ""
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods "
"only function with fulltext fields."
msgstr ""
"Fält för fulltextsökning. Observera: Sökmetoderna 'web', 'phrase' och 'raw' "
"fungerar endast med fulltextfält."
#: .\cookbook\forms.py:350
#, fuzzy
#| msgid "Search"
msgid "Search Method"
msgstr "Sök"
msgstr "Sök Metod"
#: .\cookbook\forms.py:350
msgid "Fuzzy Lookups"
@@ -211,22 +224,20 @@ msgid "Starts With"
msgstr "Börjar med"
#: .\cookbook\forms.py:351
#, fuzzy
#| msgid "Search"
msgid "Fuzzy Search"
msgstr "Sök"
msgstr "Fuzzy Sök"
#: .\cookbook\forms.py:351
#, fuzzy
#| msgid "Text"
msgid "Full Text"
msgstr "Text"
msgstr "Hel Text"
#: .\cookbook\helper\AllAuthCustomAdapter.py:41
msgid ""
"In order to prevent spam, the requested email was not send. Please wait a "
"few minutes and try again."
msgstr ""
"För att förhindra spam, så skickades inte den begärda e-posten. Vänta några "
"minuter och försök igen."
#: .\cookbook\helper\permission_helper.py:164
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
@@ -255,19 +266,19 @@ msgstr "Du kan inte interagera med detta objekt för att det ägs inte av dig!"
#: .\cookbook\helper\permission_helper.py:402
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
msgstr "Du har nått det maximala antalet recept för din utrymme."
#: .\cookbook\helper\permission_helper.py:414
msgid "You have more users than allowed in your space."
msgstr ""
msgstr "Du har mer användare än tillåtet för ditt utrymme."
#: .\cookbook\helper\recipe_url_import.py:310
msgid "reverse rotation"
msgstr ""
msgstr "återvänd rotering"
#: .\cookbook\helper\recipe_url_import.py:311
msgid "careful rotation"
msgstr ""
msgstr "försiktig rotering"
#: .\cookbook\helper\recipe_url_import.py:312
msgid "knead"
@@ -291,7 +302,7 @@ msgstr "sous-vide"
#: .\cookbook\helper\shopping_helper.py:150
msgid "You must supply a servings size"
msgstr ""
msgstr "Du måste ange en portionstorlek"
#: .\cookbook\helper\template_helper.py:95
#: .\cookbook\helper\template_helper.py:97
@@ -305,7 +316,7 @@ msgstr "Favorit"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Jag gjorde den här"
#: .\cookbook\integration\integration.py:209
msgid ""
@@ -319,6 +330,8 @@ msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
"Ett oväntat fel uppstod under importeringen. Se till att du har laddat upp "
"en giltig fil."
#: .\cookbook\integration\integration.py:217
msgid "The following recipes were ignored because they already existed:"
@@ -330,10 +343,8 @@ msgid "Imported %s recipes."
msgstr "Importerade %s recept."
#: .\cookbook\integration\openeats.py:28
#, fuzzy
#| msgid "Recipe Home"
msgid "Recipe source:"
msgstr "Recept Hem"
msgstr "Recept källa:"
#: .\cookbook\integration\paprika.py:49
msgid "Notes"
@@ -374,23 +385,25 @@ msgstr "Sektion"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "Korrigerar livsmedel med "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
msgstr ""
msgstr "Återuppbygger fulltextsökningens index för Recept"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Endast Postgresql-databaser använder fulltextsökning, inget index att "
"återuppbygga med"
#: .\cookbook\management\commands\rebuildindex.py:29
msgid "Recipe index rebuild complete."
msgstr ""
msgstr "Recept index återbyggning färdig."
#: .\cookbook\management\commands\rebuildindex.py:31
msgid "Recipe index rebuild failed."
msgstr ""
msgstr "Recept index återbyggning misslyckades."
#: .\cookbook\migrations\0047_auto_20200602_1133.py:14
msgid "Breakfast"
@@ -439,6 +452,8 @@ msgid ""
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
"upload."
msgstr ""
"Maximal lagringsutrymme för utrymme i MB. 0 för obegränsad, -1 för att "
"inaktivera filuppladdning."
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
#: .\cookbook\templates\settings.html:18
@@ -462,7 +477,7 @@ msgstr "Handla"
#: .\cookbook\models.py:752
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
msgstr " är en del av ett receptsteg och kan inte tas bort"
#: .\cookbook\models.py:918
msgid "Nutrition"
@@ -501,34 +516,24 @@ msgid "Food Alias"
msgstr "Alternativt namn för mat"
#: .\cookbook\models.py:1468
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Enheter"
msgstr "Enhetsalias"
#: .\cookbook\models.py:1469
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Nyckelord"
msgstr "Nyckelordsalias"
#: .\cookbook\models.py:1470
#, fuzzy
#| msgid "Description"
msgid "Description Replace"
msgstr "Beskrivning"
msgstr "Beskrivning Ersätt"
#: .\cookbook\models.py:1471
#, fuzzy
#| msgid "Instructions"
msgid "Instruction Replace"
msgstr "Instruktioner"
msgstr "Instruktioner Ersätt"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "Ny enhet"
msgstr "Aldrig Enhet"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
@@ -539,10 +544,8 @@ msgid "Food Replace"
msgstr "Ersätt mat"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Edit Recipe"
msgid "Unit Replace"
msgstr "Redigera recept"
msgstr "Ersätt Enhet"
#: .\cookbook\models.py:1476
msgid "Name Replace"
@@ -2105,280 +2108,280 @@ msgstr "Visa hjälp"
msgid "URL Import"
msgstr "URL-import"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parameter updated_at felaktigt formaterad"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "Kan inte slås samman med samma objekt!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "Kan inte slås samman med samma objekt!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No usable data could be found."
msgstr "Sidan kunde inte hittas."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "Importering är inte implementerad för denna leverantör"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
#, fuzzy
@@ -2386,11 +2389,11 @@ msgstr "Importering är inte implementerad för denna leverantör"
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Denna funktion är inte tillgänglig i demoversionen!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Synkroniseringen lyckades!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "Fel vid synkronisering med lagring"

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-03 16:38+0000\n"
"Last-Translator: Taylan TATLI <uyelik-tandoor@tatli.me>\n"
"Language-Team: Turkish <http://translate.tandoor.dev/projects/tandoor/"
@@ -1955,286 +1955,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -7,18 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2023-04-12 11:55+0000\n"
"Last-Translator: noxonad <noxonad@proton.me>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2025-01-16 18:58+0000\n"
"Last-Translator: Anton Shevtsov <ashevtsovs@gmail.com>\n"
"Language-Team: Ukrainian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.15\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.8.4\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -32,51 +32,55 @@ msgstr ""
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
msgid "Keywords"
msgstr ""
msgstr "Ключові слова"
#: .\cookbook\forms.py:62
msgid "Preparation time in minutes"
msgstr ""
msgstr "Час приготування у хвилинах"
#: .\cookbook\forms.py:62
msgid "Waiting time (cooking/baking) in minutes"
msgstr ""
msgstr "Час очікування (варіння/випічка) у хвилинах"
#: .\cookbook\forms.py:63 .\cookbook\forms.py:222 .\cookbook\forms.py:246
msgid "Path"
msgstr ""
msgstr "Шлях"
#: .\cookbook\forms.py:63
msgid "Storage UID"
msgstr ""
msgstr "UID сховища"
#: .\cookbook\forms.py:93
msgid "Default"
msgstr ""
msgstr "За замовчуванням"
#: .\cookbook\forms.py:121
msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr ""
"Щоб запобігти дублюванням, рецепти з назвами, що вже існують, "
"ігноруватимуться. Установіть цей прапорець, щоб імпортувати все."
#: .\cookbook\forms.py:143
msgid "Add your comment: "
msgstr ""
msgstr "Додайте ваш коментар: "
#: .\cookbook\forms.py:151
msgid "Leave empty for dropbox and enter app password for nextcloud."
msgstr ""
msgstr "Залиште порожнім для dropbox і введіть api ключі для nextcloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr ""
msgstr "Залиште порожнім для nextcloud і введіть api ключі для dropbox."
#: .\cookbook\forms.py:160
msgid ""
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
"php/webdav/</code> is added automatically)"
msgstr ""
"Залиште порожнім для dropbox і введіть лише базовий url для nextcloud "
"(<code>/remote.php/webdav/</code> буде додано автоматично)"
#: .\cookbook\forms.py:188
msgid ""
@@ -937,13 +941,13 @@ msgstr ""
#: .\cookbook\templates\ingredient_editor.html:7
#: .\cookbook\templates\ingredient_editor.html:13
msgid "Ingredient Editor"
msgstr ""
msgstr "Редактор Інгредієнтів"
#: .\cookbook\templates\base.html:275
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
msgstr ""
msgstr "Експорт"
#: .\cookbook\templates\base.html:287
msgid "Properties"
@@ -1936,286 +1940,286 @@ msgstr ""
msgid "URL Import"
msgstr ""
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: Hieu, 2021\n"
"Language-Team: Vietnamese (https://www.transifex.com/django-recipes/"
@@ -2025,288 +2025,288 @@ msgstr ""
msgid "URL Import"
msgstr "Nhập URL"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:744
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#: .\cookbook\views\api.py:744
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr ""
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr ""
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr ""
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr ""
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr ""
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr ""
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr ""
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr ""
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr ""
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr ""
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr ""
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr ""
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr ""
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1126
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
#: .\cookbook\views\api.py:1293
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr ""
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr ""
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No usable data could be found."
msgstr "Không thể tìm thấy trang được yêu cầu."
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "Đồng bộ thành công!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr ""

View File

@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"PO-Revision-Date: 2024-02-15 03:19+0000\n"
"Last-Translator: dalan <xzdlj@outlook.com>\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-11-04 10:29+0000\n"
"Last-Translator: Johnny Ip <ip.iohnny@gmail.com>\n"
"Language-Team: Chinese (Simplified) <http://translate.tandoor.dev/projects/"
"tandoor/recipes-backend/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.15\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -86,14 +86,16 @@ msgid ""
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
msgstr ""
"您的HomeAssistant示例的<a href=\"https://www.home-assistant.io/docs/"
"authentication/#your-account-profile\">长期访问令牌</a>"
#: .\cookbook\forms.py:193
msgid "Something like http://homeassistant.local:8123/api"
msgstr ""
msgstr "形如 http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:205
msgid "http://homeassistant.local:8123/api for example"
msgstr ""
msgstr "例如 http://homeassistant.local:8123/api"
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
msgid "Storage"
@@ -356,7 +358,7 @@ msgstr "准备时间"
#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7
msgid "Cookbook"
msgstr "菜谱"
msgstr "烹饪手册"
#: .\cookbook\integration\saffron.py:31
msgid "Section"
@@ -364,7 +366,7 @@ msgstr "部分"
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
msgid "Fixes foods with "
msgstr ""
msgstr "修复食谱中的重复字段 "
#: .\cookbook\management\commands\rebuildindex.py:14
msgid "Rebuilds full text search index on Recipe"
@@ -400,29 +402,29 @@ msgstr "其他"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
msgid "Fat"
msgstr ""
msgstr "脂肪"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "g"
msgstr ""
msgstr ""
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
msgid "Carbohydrates"
msgstr ""
msgstr "碳水化合物"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
msgid "Proteins"
msgstr ""
msgstr "蛋白质"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "Calories"
msgstr ""
msgstr "卡路里"
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
msgid "kcal"
msgstr ""
msgstr "千卡"
#: .\cookbook\models.py:325
msgid ""
@@ -443,7 +445,7 @@ msgstr "膳食计划"
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
#: .\cookbook\views\views.py:459
msgid "Books"
msgstr "书籍"
msgstr "烹饪手册"
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
#: .\cookbook\views\views.py:460
@@ -455,24 +457,20 @@ msgid " is part of a recipe step and cannot be deleted"
msgstr " 是菜谱步骤的一部分,不能删除"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Automations"
msgid "Nutrition"
msgstr "自动化"
msgstr "营养"
#: .\cookbook\models.py:918
#, fuzzy
#| msgid "Merge"
msgid "Allergen"
msgstr "合并"
msgstr "过敏原"
#: .\cookbook\models.py:919
msgid "Price"
msgstr ""
msgstr "价格"
#: .\cookbook\models.py:919
msgid "Goal"
msgstr ""
msgstr "目标"
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
msgid "Simple"
@@ -511,30 +509,24 @@ msgid "Instruction Replace"
msgstr "指示"
#: .\cookbook\models.py:1472
#, fuzzy
#| msgid "New Unit"
msgid "Never Unit"
msgstr "新单位"
msgstr "禁用单位识别"
#: .\cookbook\models.py:1473
msgid "Transpose Words"
msgstr ""
msgstr "字符串转置"
#: .\cookbook\models.py:1474
#, fuzzy
#| msgid "Food Alias"
msgid "Food Replace"
msgstr "食物别名"
msgstr "食物替换"
#: .\cookbook\models.py:1475
#, fuzzy
#| msgid "Description Replace"
msgid "Unit Replace"
msgstr "描述"
msgstr "单位替换"
#: .\cookbook\models.py:1476
msgid "Name Replace"
msgstr ""
msgstr "名称替换"
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
@@ -571,7 +563,7 @@ msgstr "您已被邀请至 "
#: .\cookbook\serializer.py:1272
msgid " to join their Tandoor Recipes space "
msgstr " 加入他们的泥炉食谱空间 "
msgstr " 加入他们的 Tandoor 食谱空间 "
#: .\cookbook\serializer.py:1274
msgid "Click the following link to activate your account: "
@@ -589,11 +581,11 @@ msgstr "邀请有效期至 "
#: .\cookbook\serializer.py:1280
msgid ""
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 "
msgstr "Tandoor 是一个开源食谱管理器。 在 GitHub 上查看 "
#: .\cookbook\serializer.py:1283
msgid "Tandoor Recipes Invite"
msgstr "泥炉食谱邀请"
msgstr "Tandoor 食谱邀请"
#: .\cookbook\serializer.py:1426
msgid "Existing shopping list to update"
@@ -979,13 +971,11 @@ msgstr "导出"
#: .\cookbook\templates\base.html:287
msgid "Properties"
msgstr ""
msgstr "属性"
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
#, fuzzy
#| msgid "Account Connections"
msgid "Unit Conversions"
msgstr "帐号连接"
msgstr "单位转换"
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
msgid "Import Recipe"
@@ -1005,10 +995,8 @@ msgid "Space Settings"
msgstr "空间设置"
#: .\cookbook\templates\base.html:340
#, fuzzy
#| msgid "External Recipes"
msgid "External Connectors"
msgstr "外部菜谱"
msgstr "外部连接器"
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
msgid "System"
@@ -1038,7 +1026,7 @@ msgstr "GitHub"
#: .\cookbook\templates\base.html:376
msgid "Translate Tandoor"
msgstr "翻译泥炉"
msgstr "翻译 Tandoor"
#: .\cookbook\templates\base.html:380
msgid "API Browser"
@@ -1050,7 +1038,7 @@ msgstr "退出"
#: .\cookbook\templates\base.html:406
msgid "You are using the free version of Tandor"
msgstr "你正在使用免费版的泥炉"
msgstr "你正在使用免费版的 Tandoor"
#: .\cookbook\templates\base.html:407
msgid "Upgrade Now"
@@ -1123,7 +1111,7 @@ msgstr "这可能需要几分钟,取决于同步的菜谱数量,请等待。
#: .\cookbook\templates\books.html:7
msgid "Recipe Books"
msgstr "菜谱书"
msgstr "烹饪手册"
#: .\cookbook\templates\export.html:7 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
@@ -1453,10 +1441,8 @@ msgid "Back"
msgstr "返回"
#: .\cookbook\templates\property_editor.html:7
#, fuzzy
#| msgid "Ingredient Editor"
msgid "Property Editor"
msgstr "食材编辑器"
msgstr "属性编辑器"
#: .\cookbook\templates\recipe_view.html:36
msgid "Comments"
@@ -1770,7 +1756,7 @@ msgstr "非常适合大型数据库"
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
msgid "Cookbook Setup"
msgstr "安装菜谱"
msgstr "安装菜谱应用"
#: .\cookbook\templates\setup.html:14
msgid "Setup"
@@ -1879,10 +1865,8 @@ msgid "Sign in using"
msgstr "登录使用"
#: .\cookbook\templates\space_manage.html:7
#, fuzzy
#| msgid "Space Membership"
msgid "Space Management"
msgstr "成员"
msgstr "空间管理"
#: .\cookbook\templates\space_manage.html:26
msgid "Space:"
@@ -1974,6 +1958,10 @@ msgid ""
"script to generate version information (done automatically in docker).\n"
" "
msgstr ""
"\n"
" 您需要在您的更新脚本中执行 <code>version.py</code> "
"生成版本信息Docker实例中会自动执行。\n"
" "
#: .\cookbook\templates\system.html:46
msgid "Media Serving"
@@ -2000,9 +1988,11 @@ msgid ""
" your installation.\n"
" "
msgstr ""
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件\n"
" 请按照 <a href=\"https://github.com/vabene1111/recipes/releases/"
"tag/0.8.1\">这里</a> 描述的步骤操作更新安装。\n"
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件\n"
" 请按照\n"
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
"1\">这里</a> 描述的步骤\n"
" 操作更新安装。\n"
" "
#: .\cookbook\templates\system.html:55 .\cookbook\templates\system.html:70
@@ -2057,7 +2047,7 @@ msgstr ""
#: .\cookbook\templates\system.html:86
msgid "Allowed Hosts"
msgstr ""
msgstr "域名白名单"
#: .\cookbook\templates\system.html:90
msgid ""
@@ -2067,6 +2057,10 @@ msgid ""
"this.\n"
" "
msgstr ""
"\n"
" 您未配置域名白名单,本实例可以通过任意域名访问,某些特殊情况下可"
"能有用,但请尽量避免这样配置,请参考文档配置 ALLOWED_HOSTS 。\n"
" "
#: .\cookbook\templates\system.html:97
msgid "Database"
@@ -2077,10 +2071,8 @@ msgid "Info"
msgstr "信息"
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
#, fuzzy
#| msgid "Use fractions"
msgid "Migrations"
msgstr "使用分数"
msgstr "数据库结构变更"
#: .\cookbook\templates\system.html:116
msgid ""
@@ -2093,323 +2085,317 @@ msgid ""
"issue.\n"
" "
msgstr ""
"\n"
" 正常情况下数据库迁移不应产生任何报错!\n"
" 数据库迁移失败很可能导致本应用的功能出错或完全不可用。\n"
" 如果您在最新版本上数据库迁移依然产生错误,"
"请将数据库迁移日志和页面下方的信息反馈至 Github Issue 中。\n"
" "
#: .\cookbook\templates\system.html:182
msgid "False"
msgstr ""
msgstr ""
#: .\cookbook\templates\system.html:182
msgid "True"
msgstr ""
msgstr ""
#: .\cookbook\templates\system.html:207
msgid "Hide"
msgstr ""
msgstr "隐藏"
#: .\cookbook\templates\system.html:210
#, fuzzy
#| msgid "Show Log"
msgid "Show"
msgstr "显示记录"
msgstr "显示"
#: .\cookbook\templates\url_import.html:8
msgid "URL Import"
msgstr "链接导入"
#: .\cookbook\views\api.py:121 .\cookbook\views\api.py:214
#: .\cookbook\views\api.py:120 .\cookbook\views\api.py:213
msgid "Parameter updated_at incorrectly formatted"
msgstr "参数 updated_at 格式不正确"
#: .\cookbook\views\api.py:235 .\cookbook\views\api.py:341
#: .\cookbook\views\api.py:234 .\cookbook\views\api.py:340
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "不存在ID是 {pk} 的 {self.basename}"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:238
msgid "Cannot merge with the same object!"
msgstr "无法与同一对象合并!"
#: .\cookbook\views\api.py:246
#: .\cookbook\views\api.py:245
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "不存在 ID 为 {target} 的 {self.basename}"
#: .\cookbook\views\api.py:251
#: .\cookbook\views\api.py:250
msgid "Cannot merge with child object!"
msgstr "无法与子对象合并!"
#: .\cookbook\views\api.py:289
#: .\cookbook\views\api.py:288
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} 已成功与 {target.name} 合并"
#: .\cookbook\views\api.py:294
#: .\cookbook\views\api.py:293
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr "视图合并 {source.name} 和 {target.name} 时出错"
#: .\cookbook\views\api.py:350
#: .\cookbook\views\api.py:349
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} 已成功移动到根目录。"
#: .\cookbook\views\api.py:353 .\cookbook\views\api.py:371
#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:370
msgid "An error occurred attempting to move "
msgstr "尝试移动时出错 "
#: .\cookbook\views\api.py:356
#: .\cookbook\views\api.py:355
msgid "Cannot move an object to itself!"
msgstr "无法将对象移动到自身!"
#: .\cookbook\views\api.py:362
#: .\cookbook\views\api.py:361
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "不存在 ID 为 {parent} 的 {self.basename}"
#: .\cookbook\views\api.py:368
#: .\cookbook\views\api.py:367
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} 成功移动到父节点 {parent.name}"
#: .\cookbook\views\api.py:590
#: .\cookbook\views\api.py:589
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} 已从购物清单中删除。"
#: .\cookbook\views\api.py:595 .\cookbook\views\api.py:1038
#: .\cookbook\views\api.py:1051
#: .\cookbook\views\api.py:594 .\cookbook\views\api.py:1037
#: .\cookbook\views\api.py:1050
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} 已添加到购物清单中。"
#: .\cookbook\views\api.py:743
#: .\cookbook\views\api.py:742
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
msgstr "指定开始日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
#: .\cookbook\views\api.py:743
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr "指定结束日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
#: .\cookbook\views\api.py:744
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgstr ""
#: .\cookbook\views\api.py:745
#, fuzzy
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
msgstr "食谱中的步骤ID。 对于多个重复参数。"
msgstr "指定 MealType ID 以过滤膳食计划,重复参数以选择多个对象。"
#: .\cookbook\views\api.py:873
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr "食谱中的步骤ID。 对于多个重复参数。"
#: .\cookbook\views\api.py:874
#: .\cookbook\views\api.py:873
msgid "Query string matched (fuzzy) against object name."
msgstr "请求参数与对象名称匹配(模糊)。"
#: .\cookbook\views\api.py:910
#: .\cookbook\views\api.py:909
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr "请求参数与食谱名称匹配(模糊)。 未来会添加全文搜索。"
#: .\cookbook\views\api.py:911
#: .\cookbook\views\api.py:910
msgid ""
"ID of keyword a recipe should have. For multiple repeat parameter. "
"Equivalent to keywords_or"
msgstr "菜谱应包含的关键字 ID。 对于多个重复参数。 相当于keywords_or"
#: .\cookbook\views\api.py:912
#: .\cookbook\views\api.py:911
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with any of the keywords"
msgstr "允许多个关键字 ID。 返回带有任一关键字的食谱"
#: .\cookbook\views\api.py:913
#: .\cookbook\views\api.py:912
msgid ""
"Keyword IDs, repeat for multiple. Return recipes with all of the keywords."
msgstr "允许多个关键字 ID。 返回带有所有关键字的食谱。"
#: .\cookbook\views\api.py:914
#: .\cookbook\views\api.py:913
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords."
msgstr "允许多个关键字 ID。 排除带有任一关键字的食谱。"
#: .\cookbook\views\api.py:915
#: .\cookbook\views\api.py:914
msgid ""
"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords."
msgstr "允许多个关键字 ID。 排除带有所有关键字的食谱。"
#: .\cookbook\views\api.py:916
#: .\cookbook\views\api.py:915
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr "食谱中食物带有ID。并可添加多个食物。"
#: .\cookbook\views\api.py:917
#: .\cookbook\views\api.py:916
msgid "Food IDs, repeat for multiple. Return recipes with any of the foods"
msgstr "食谱中食物带有ID。并可添加多个食物"
#: .\cookbook\views\api.py:918
#: .\cookbook\views\api.py:917
msgid "Food IDs, repeat for multiple. Return recipes with all of the foods."
msgstr "食谱中食物带有ID。返回包含任何食物的食谱。"
#: .\cookbook\views\api.py:919
#: .\cookbook\views\api.py:918
msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods."
msgstr "食谱中食物带有ID。排除包含任一食物的食谱。"
#: .\cookbook\views\api.py:920
#: .\cookbook\views\api.py:919
msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods."
msgstr "食谱中食物带有ID。排除包含所有食物的食谱。"
#: .\cookbook\views\api.py:921
#: .\cookbook\views\api.py:920
msgid "ID of unit a recipe should have."
msgstr "食谱应具有单一ID。"
#: .\cookbook\views\api.py:922
#: .\cookbook\views\api.py:921
msgid ""
"Rating a recipe should have or greater. [0 - 5] Negative value filters "
"rating less than."
msgstr "配方的评分范围从 0 到 5。"
#: .\cookbook\views\api.py:923
#: .\cookbook\views\api.py:922
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr "烹饪书应该在食谱中具有ID。并且可以添加多本。"
#: .\cookbook\views\api.py:924
#: .\cookbook\views\api.py:923
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
msgstr "书的ID允许多个。返回包含任一书籍的食谱"
#: .\cookbook\views\api.py:925
#: .\cookbook\views\api.py:924
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
msgstr "书的ID允许多个。返回包含所有书籍的食谱。"
#: .\cookbook\views\api.py:926
#: .\cookbook\views\api.py:925
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
msgstr "书的ID允许多个。排除包含任一书籍的食谱。"
#: .\cookbook\views\api.py:927
#: .\cookbook\views\api.py:926
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
msgstr "书的ID允许多个。排除包含所有书籍的食谱。"
#: .\cookbook\views\api.py:928
#: .\cookbook\views\api.py:927
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr "只返回内部食谱。 [true/<b>false</b>]"
#: .\cookbook\views\api.py:929
#: .\cookbook\views\api.py:928
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr "按随机排序返回结果。 [true/<b> false </b>]"
#: .\cookbook\views\api.py:930
#: .\cookbook\views\api.py:929
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr "在搜索结果中首先返回新结果。 [是/<b>否</b>]"
#: .\cookbook\views\api.py:931
#: .\cookbook\views\api.py:930
msgid ""
"Filter recipes cooked X times or more. Negative values returns cooked less "
"than X times"
msgstr "筛选烹饪 X 次或更多次的食谱。 负值返回烹饪少于 X 次"
#: .\cookbook\views\api.py:932
#: .\cookbook\views\api.py:931
msgid ""
"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
"筛选最后烹饪在 YYYY-MM-DD 当天或之后的食谱。 前置 - 在日期或日期之前筛选。"
#: .\cookbook\views\api.py:933
#: .\cookbook\views\api.py:932
msgid ""
"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr "筛选在 YYYY-MM-DD 或之后创建的食谱。 前置 - 在日期或日期之前过滤。"
#: .\cookbook\views\api.py:934
#: .\cookbook\views\api.py:933
msgid ""
"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or "
"before date."
msgstr "筛选在 YYYY-MM-DD 或之后更新的食谱。 前置 - 在日期或日期之前筛选。"
#: .\cookbook\views\api.py:935
#: .\cookbook\views\api.py:934
msgid ""
"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on "
"or before date."
msgstr ""
"筛选最后查看时间是在 YYYY-MM-DD 或之后的食谱。 前置 - 在日期或日期之前筛选。"
#: .\cookbook\views\api.py:936
#: .\cookbook\views\api.py:935
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
msgstr "筛选可以直接用手制作的食谱。 [真/<b>假</b>]"
#: .\cookbook\views\api.py:1123
#: .\cookbook\views\api.py:1122
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
#: .\cookbook\views\api.py:1126
#, fuzzy
#| msgid ""
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
#| "b>]<br> - recent includes unchecked items and recently completed items."
#: .\cookbook\views\api.py:1125
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently "
"completed items."
msgstr ""
"在选中时筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]<br> - 最近包括未"
"选中的项目和最近完成的项目。"
"勾选并筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]"
"<br> - 最近包括未选中的项目和最近完成的项目。"
#: .\cookbook\views\api.py:1129
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr "返回按超市分类排序的购物清单列表。"
#: .\cookbook\views\api.py:1211
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
msgstr "筛选包含所选食谱的对象"
#: .\cookbook\views\api.py:1293
#, fuzzy
#| msgid ""
#| "Returns the shopping list entry with a primary key of id. Multiple "
#| "values allowed."
#: .\cookbook\views\api.py:1292
msgid ""
"Return the Automations matching the automation type. Multiple values "
"allowed."
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
msgstr "返回与自动化类型相匹配的自动化条目。 允许多个值。"
#: .\cookbook\views\api.py:1416
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
msgstr "无事可做。"
#: .\cookbook\views\api.py:1443
#: .\cookbook\views\api.py:1445
msgid "Invalid Url"
msgstr "无效网址"
#: .\cookbook\views\api.py:1447
#: .\cookbook\views\api.py:1449
msgid "Connection Refused."
msgstr "连接被拒绝。"
#: .\cookbook\views\api.py:1449
#: .\cookbook\views\api.py:1451
msgid "Bad URL Schema."
msgstr "错误的 URL Schema。"
#: .\cookbook\views\api.py:1472
#: .\cookbook\views\api.py:1474
msgid "No usable data could be found."
msgstr "找不到可用的数据。"
#: .\cookbook\views\api.py:1547
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
msgstr "文件大小超出空间限值"
#: .\cookbook\views\api.py:1564 .\cookbook\views\import_export.py:114
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
msgstr "此提供程序未实现导入"
#: .\cookbook\views\api.py:1648 .\cookbook\views\data.py:30
#: .\cookbook\views\api.py:1650 .\cookbook\views\data.py:30
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
#: .\cookbook\views\new.py:82
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "此功能在泥炉的托管版本中尚不可用!"
msgstr "此功能在 Tandoor 的托管版本中尚不可用!"
#: .\cookbook\views\api.py:1669
#: .\cookbook\views\api.py:1671
msgid "Sync successful!"
msgstr "同步成功!"
#: .\cookbook\views\api.py:1672
#: .\cookbook\views\api.py:1674
msgid "Error synchronizing with Storage"
msgstr "与存储同步时出错"
@@ -2434,10 +2420,8 @@ msgid ""
msgstr "无法删除此存储后端,因为它至少在一台显示器中使用。"
#: .\cookbook\views\delete.py:135
#, fuzzy
#| msgid "Storage Backend"
msgid "Connectors Config Backend"
msgstr "存储后端"
msgstr "连接器后端配置"
#: .\cookbook\views\delete.py:157
msgid "Invite Link"
@@ -2460,14 +2444,12 @@ msgid "There was an error updating this storage backend!"
msgstr "更新此存储后端时出错!"
#: .\cookbook\views\edit.py:134
#, fuzzy
#| msgid "Changes saved!"
msgid "Config saved!"
msgstr "更改已保存!"
msgstr "配置已保存!"
#: .\cookbook\views\edit.py:142
msgid "ConnectorConfig"
msgstr ""
msgstr "连接器配置"
#: .\cookbook\views\edit.py:198
msgid "Changes saved!"
@@ -2496,10 +2478,8 @@ msgid "Shopping List"
msgstr "采购单"
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
#, fuzzy
#| msgid "Storage Backend"
msgid "Connector Config Backend"
msgstr "存储后端"
msgstr "连接器后端配置"
#: .\cookbook\views\lists.py:91
msgid "Invite Links"
@@ -2523,13 +2503,11 @@ msgstr "步骤"
#: .\cookbook\views\lists.py:270
msgid "Property Types"
msgstr ""
msgstr "属性类型"
#: .\cookbook\views\new.py:86
#, fuzzy
#| msgid "This feature is not available in the demo version!"
msgid "This feature is not enabled by the server admin!"
msgstr "此功能在演示版本中不可用!"
msgstr "此功能被服务器管理员禁用!"
#: .\cookbook\views\new.py:123
msgid "Imported new recipe!"
@@ -2545,11 +2523,9 @@ msgid "This feature is not available in the demo version!"
msgstr "此功能在演示版本中不可用!"
#: .\cookbook\views\views.py:74
#, fuzzy
#| msgid "You have reached the maximum number of recipes for your space."
msgid ""
"You have the reached the maximum amount of spaces that can be owned by you."
msgstr "你已经达到了空间的菜谱的最大数量。"
msgstr "你拥有的空间数量已经达到上限。"
#: .\cookbook\views\views.py:89
msgid ""
@@ -2582,48 +2558,32 @@ msgstr "模糊搜索与此搜索方法不兼容!"
#: .\cookbook\views\views.py:306
#, python-format
msgid "PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!"
msgstr ""
msgstr "PostgreSQL %(v)s 版本过时。请升级到支持的版本!"
#: .\cookbook\views\views.py:309
#, python-format
msgid "You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended"
msgstr ""
msgstr "您运行的 PostgreSQL 版本是 %(v1)s。推荐版本为 PostgreSQL %(v2)s"
#: .\cookbook\views\views.py:313
msgid "Unable to determine PostgreSQL version."
msgstr ""
msgstr "无法确认 PostgreSQL 版本。"
#: .\cookbook\views\views.py:317
#, fuzzy
#| msgid ""
#| "\n"
#| " This application is not running with a Postgres database "
#| "backend. This is ok but not recommended as some\n"
#| " features only work with postgres databases.\n"
#| " "
msgid ""
"This application is not running with a Postgres database backend. This is ok "
"but not recommended as some features only work with postgres databases."
msgstr ""
"\n"
" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这"
"是不推荐的,\n"
" 因为有些功能仅适用于 PostgreSQL 数据库。\n"
" "
msgstr "此应用未使用 PostgreSQL 数据库作为后端。 这是可运行的配置,但不推荐,"
"因为部分功能仅在 PostgreSQL 数据库下可用。"
#: .\cookbook\views\views.py:360
#, fuzzy
#| msgid ""
#| "The setup page can only be used to create the first user! If you have "
#| "forgotten your superuser credentials please consult the django "
#| "documentation on how to reset passwords."
msgid ""
"The setup page can only be used to create the first "
"user! If you have forgotten your superuser credentials "
"please consult the django documentation on how to reset passwords."
msgstr ""
"设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文"
"档,了解如何重置密码。"
"设置页面只能用于创建第一个用户! "
"如果您忘记了超级用户凭据,请参阅 Django 文档,了解如何重置密码。"
#: .\cookbook\views\views.py:369
msgid "Passwords dont match!"
@@ -2659,27 +2619,23 @@ msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理
#: .\cookbook\views\views.py:451
msgid "Manage recipes, shopping list, meal plans and more."
msgstr ""
msgstr "管理菜谱、购物清单、膳食计划等。"
#: .\cookbook\views\views.py:458
#, fuzzy
#| msgid "Meal-Plan"
msgid "Plan"
msgstr "膳食计划"
msgstr "计划"
#: .\cookbook\views\views.py:458
msgid "View your meal Plan"
msgstr ""
msgstr "查看您的膳食计划"
#: .\cookbook\views\views.py:459
msgid "View your cookbooks"
msgstr ""
msgstr "查看你的烹饪手册"
#: .\cookbook\views\views.py:460
#, fuzzy
#| msgid "New Shopping List"
msgid "View your shopping lists"
msgstr "购物清单"
msgstr "查看你的购物清单"
#~ msgid "Default unit"
#~ msgstr "默认单位"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.15 on 2024-09-15 10:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0218_alter_mealplan_from_date_alter_mealplan_to_date'),
]
operations = [
migrations.AddField(
model_name='connectorconfig',
name='supports_description_field',
field=models.BooleanField(default=True, help_text='Does the todo entity support the description field'),
),
]

View File

@@ -406,6 +406,7 @@ class ConnectorConfig(models.Model, PermissionModelMixin):
on_shopping_list_entry_created_enabled = models.BooleanField(default=False)
on_shopping_list_entry_updated_enabled = models.BooleanField(default=False)
on_shopping_list_entry_deleted_enabled = models.BooleanField(default=False)
supports_description_field = models.BooleanField(default=True, help_text="Does the todo entity support the description field")
url = models.URLField(blank=True, null=True)
token = models.CharField(max_length=512, blank=True, null=True)

View File

@@ -4,8 +4,8 @@ import os
from datetime import datetime
import requests
import validators
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.models import Recipe, RecipeImport, SyncLog
from cookbook.provider.provider import Provider
@@ -107,7 +107,7 @@ class Dropbox(Provider):
recipe.save()
url = recipe.link.replace('www.dropbox.', 'dl.dropboxusercontent.')
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url)
return io.BytesIO(response.content)

View File

@@ -12,21 +12,25 @@ class Local(Provider):
@staticmethod
def import_all(monitor):
if '/etc/' in monitor.path or '/root/' in monitor.path or '/mediafiles/' in monitor.path or '/usr/' in monitor.path:
return False
files = [f for f in listdir(monitor.path) if isfile(join(monitor.path, f))]
import_count = 0
for file in files:
path = monitor.path + '/' + file
if not Recipe.objects.filter(file_path__iexact=path, space=monitor.space).exists() and not RecipeImport.objects.filter(file_path=path, space=monitor.space).exists():
name = os.path.splitext(file)[0]
new_recipe = RecipeImport(
name=name,
file_path=path,
storage=monitor.storage,
space=monitor.space,
)
new_recipe.save()
import_count += 1
if file.endswith('.pdf') or file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg') or file.endswith('.gif'):
path = monitor.path + '/' + file
if not Recipe.objects.filter(file_path__iexact=path, space=monitor.space).exists() and not RecipeImport.objects.filter(file_path=path, space=monitor.space).exists():
name = os.path.splitext(file)[0]
new_recipe = RecipeImport(
name=name,
file_path=path,
storage=monitor.storage,
space=monitor.space,
)
new_recipe.save()
import_count += 1
log_entry = SyncLog(
status='SUCCESS',

View File

@@ -4,8 +4,9 @@ import tempfile
from datetime import datetime
import requests
import validators
import webdav3.client as wc
from cookbook.helper.HelperFunctions import validate_import_url
from cookbook.models import Recipe, RecipeImport, SyncLog
from cookbook.provider.provider import Provider
from requests.auth import HTTPBasicAuth
@@ -93,7 +94,7 @@ class Nextcloud(Provider):
"Content-Type": "application/json"
}
if validators.url(url, public=True):
if validate_import_url(url):
r = requests.get(
url,
headers=headers,

View File

@@ -22,6 +22,7 @@ from rest_framework.fields import IntegerField
from cookbook.helper.CustomStorageClass import CachedS3Boto3Storage
from cookbook.helper.HelperFunctions import str2bool
from cookbook.helper.image_processing import is_file_type_allowed
from cookbook.helper.permission_helper import above_space_limit
from cookbook.helper.property_helper import FoodPropertyHelper
from cookbook.helper.shopping_helper import RecipeShoppingEditor
@@ -233,12 +234,17 @@ class UserFileSerializer(serializers.ModelSerializer):
raise ValidationError(_('You have reached your file upload limit.'))
def create(self, validated_data):
if not is_file_type_allowed(validated_data['file'].name):
return None
self.check_file_limit(validated_data)
validated_data['created_by'] = self.context['request'].user
validated_data['space'] = self.context['request'].space
return super().create(validated_data)
def update(self, instance, validated_data):
if not is_file_type_allowed(validated_data['file'].name):
return None
self.check_file_limit(validated_data)
return super().update(instance, validated_data)
@@ -427,7 +433,7 @@ class ConnectorConfigConfigSerializer(SpacedModelSerializer):
fields = (
'id', 'name', 'url', 'token', 'todo_entity', 'enabled',
'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
'on_shopping_list_entry_deleted_enabled', 'created_by'
'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'created_by'
)
read_only_fields = ('created_by',)
@@ -958,6 +964,16 @@ class RecipeImageSerializer(WritableNestedModelSerializer):
image = serializers.ImageField(required=False, allow_null=True)
image_url = serializers.CharField(max_length=4096, required=False, allow_null=True)
def create(self, validated_data):
if not is_file_type_allowed(validated_data['image'].name, image_only=True):
return None
return super().create( validated_data)
def update(self, instance, validated_data):
if not is_file_type_allowed(validated_data['image'].name, image_only=True):
return None
return super().update(instance, validated_data)
class Meta:
model = Recipe
fields = ['image', 'image_url', ]

View File

@@ -1,6 +1,5 @@
{% extends "base.html" %}
{% load crispy_forms_filters %}
{% load crispy_forms_filters %}
{% load i18n %}
{% block title %}{% trans 'Register' %}{% endblock %}

View File

@@ -403,7 +403,7 @@
{% if HOSTED and request.space.max_recipes == 10 %}
<div class="bg-warning" style=" width: 100%; text-align: center!important; color: #ffffff; padding: 8px">
{% trans 'You are using the free version of Tandor' %} <a class="btn-success btn-sm"
{% trans 'You are using the free version of Tandoor' %} <a class="btn-success btn-sm"
href="https://tandoor.dev/manage">{% trans 'Upgrade Now' %}</a>
</div>
{% endif %}

View File

@@ -16,7 +16,6 @@
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
{% endif %}
<div class="form-group">
{{ form.username |as_crispy_field }}
</div>
@@ -30,7 +29,7 @@
<div class="form-group">
{{ form.terms |as_crispy_field }}
<small>
{% trans 'I accept the follwoing' %}
{% trans 'I accept the following' %}
{% if TERMS_URL != '' %}
<a href="{{ TERMS_URL }}" target="_blank"
rel="noreferrer nofollow">{% trans 'Terms and Conditions' %}</a>

View File

@@ -12,9 +12,9 @@
<h1>{% trans 'System' %}</h1>
{% blocktrans %}
Django Recipes is an open source free software application. It can be found on
<a href="https://github.com/vabene1111/recipes">GitHub</a>.
Changelogs can be found <a href="https://github.com/vabene1111/recipes/releases">here</a>.
Tandoor Recipes is an open source free software application. It can be found on
<a href="https://github.com/TandoorRecipes/recipes">GitHub</a>.
Changelogs can be found <a href="https://github.com/TandoorRecipes/recipes/releases">here</a>.
{% endblocktrans %}
<h3 class="mt-5">{% trans 'System Information' %}</h3>
@@ -82,9 +82,9 @@
{% else %}
{% trans 'Everything is fine!' %}
{% endif %}
<h4 class="mt-3">{% trans 'Allowed Hosts' %} <span
class="badge badge-{% if '*' in allowed_hosts %}warning{% else %}success{% endif %}">{% if '*' in allowed_hosts %}
class="badge badge-{% if '*' in allowed_hosts %}warning{% else %}success{% endif %}">{% if '*' in allowed_hosts %}
{% trans 'Warning' %}{% else %}{% trans 'Ok' %}{% endif %}</span></h4>
{% if debug %}
{% blocktrans %}
@@ -175,7 +175,34 @@
{#{% for orphan in orphans %}{{ orphan }}#}
{#{% endfor %}#}
{# </textarea>#}
{% if api_space_stats %}
<h4 class="mt-3">API Stats</h4>
<h6 >Space Stats</h6>
<table class="table table-bordered table-striped">
{% for r in api_space_stats %}
<tr>
{% for c in r %}
<td>
{{ c }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<h6 >Endpoint Stats</h6>
<table class="table table-bordered table-striped">
{% for r in api_stats %}
<tr>
{% for c in r %}
<td>
{{ c }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% endif %}
<h4 class="mt-3">Debug</h4>
<textarea class="form-control" rows="20">
Gunicorn Media: {{ gunicorn_media }}

View File

@@ -0,0 +1,319 @@
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
/* do not increase min-width as some may use split screens */
min-width: 800px;
color: #999;
}
h1 {
font-size: 24px;
color: black;
}
h2 {
font-size: 16px;
color: black;
}
p {
color: black;
}
a {
color: #999;
}
table {
border-collapse: collapse;
}
/******************************
* SUMMARY INFORMATION
******************************/
#environment td {
padding: 5px;
border: 1px solid #e6e6e6;
vertical-align: top;
}
#environment tr:nth-child(odd) {
background-color: #f6f6f6;
}
#environment ul {
margin: 0;
padding: 0 20px;
}
/******************************
* TEST RESULT COLORS
******************************/
span.passed,
.passed .col-result {
color: green;
}
span.skipped,
span.xfailed,
span.rerun,
.skipped .col-result,
.xfailed .col-result,
.rerun .col-result {
color: orange;
}
span.error,
span.failed,
span.xpassed,
.error .col-result,
.failed .col-result,
.xpassed .col-result {
color: red;
}
.col-links__extra {
margin-right: 3px;
}
/******************************
* RESULTS TABLE
*
* 1. Table Layout
* 2. Extra
* 3. Sorting items
*
******************************/
/*------------------
* 1. Table Layout
*------------------*/
#results-table {
border: 1px solid #e6e6e6;
color: #999;
font-size: 12px;
width: 100%;
}
#results-table th,
#results-table td {
padding: 5px;
border: 1px solid #e6e6e6;
text-align: left;
}
#results-table th {
font-weight: bold;
}
/*------------------
* 2. Extra
*------------------*/
.logwrapper {
max-height: 230px;
overflow-y: scroll;
background-color: #e6e6e6;
}
.logwrapper.expanded {
max-height: none;
}
.logwrapper.expanded .logexpander:after {
content: "collapse [-]";
}
.logwrapper .logexpander {
z-index: 1;
position: sticky;
top: 10px;
width: max-content;
border: 1px solid;
border-radius: 3px;
padding: 5px 7px;
margin: 10px 0 10px calc(100% - 80px);
cursor: pointer;
background-color: #e6e6e6;
}
.logwrapper .logexpander:after {
content: "expand [+]";
}
.logwrapper .logexpander:hover {
color: #000;
border-color: #000;
}
.logwrapper .log {
min-height: 40px;
position: relative;
top: -50px;
height: calc(100% + 50px);
border: 1px solid #e6e6e6;
color: black;
display: block;
font-family: "Courier New", Courier, monospace;
padding: 5px;
padding-right: 80px;
white-space: pre-wrap;
}
div.media {
border: 1px solid #e6e6e6;
float: right;
height: 240px;
margin: 0 5px;
overflow: hidden;
width: 320px;
}
.media-container {
display: grid;
grid-template-columns: 25px auto 25px;
align-items: center;
flex: 1 1;
overflow: hidden;
height: 200px;
}
.media-container--fullscreen {
grid-template-columns: 0px auto 0px;
}
.media-container__nav--right,
.media-container__nav--left {
text-align: center;
cursor: pointer;
}
.media-container__viewport {
cursor: pointer;
text-align: center;
height: inherit;
}
.media-container__viewport img,
.media-container__viewport video {
object-fit: cover;
width: 100%;
max-height: 100%;
}
.media__name,
.media__counter {
display: flex;
flex-direction: row;
justify-content: space-around;
flex: 0 0 25px;
align-items: center;
}
.collapsible td:not(.col-links) {
cursor: pointer;
}
.collapsible td:not(.col-links):hover::after {
color: #bbb;
font-style: italic;
cursor: pointer;
}
.col-result {
width: 130px;
}
.col-result:hover::after {
content: " (hide details)";
}
.col-result.collapsed:hover::after {
content: " (show details)";
}
#environment-header h2:hover::after {
content: " (hide details)";
color: #bbb;
font-style: italic;
cursor: pointer;
font-size: 12px;
}
#environment-header.collapsed h2:hover::after {
content: " (show details)";
color: #bbb;
font-style: italic;
cursor: pointer;
font-size: 12px;
}
/*------------------
* 3. Sorting items
*------------------*/
.sortable {
cursor: pointer;
}
.sortable.desc:after {
content: " ";
position: relative;
left: 5px;
bottom: -12.5px;
border: 10px solid #4caf50;
border-bottom: 0;
border-left-color: transparent;
border-right-color: transparent;
}
.sortable.asc:after {
content: " ";
position: relative;
left: 5px;
bottom: 12.5px;
border: 10px solid #4caf50;
border-top: 0;
border-left-color: transparent;
border-right-color: transparent;
}
.hidden, .summary__reload__button.hidden {
display: none;
}
.summary__data {
flex: 0 0 550px;
}
.summary__reload {
flex: 1 1;
display: flex;
justify-content: center;
}
.summary__reload__button {
flex: 0 0 300px;
display: flex;
color: white;
font-weight: bold;
background-color: #4caf50;
text-align: center;
justify-content: center;
align-items: center;
border-radius: 3px;
cursor: pointer;
}
.summary__reload__button:hover {
background-color: #46a049;
}
.summary__spacer {
flex: 0 0 550px;
}
.controls {
display: flex;
justify-content: space-between;
}
.filters,
.collapse {
display: flex;
align-items: center;
}
.filters button,
.collapse button {
color: #999;
border: none;
background: none;
cursor: pointer;
text-decoration: underline;
}
.filters button:hover,
.collapse button:hover {
color: #ccc;
}
.filter__label {
margin-right: 10px;
}

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="5" time="35.973" timestamp="2024-08-18T14:19:20.591136" hostname="vabene-pc"><testcase classname="cookbook.tests.api.test_api_space" name="test_list_permission[arg0]" time="27.231" /><testcase classname="cookbook.tests.api.test_api_space" name="test_list_permission[arg1]" time="27.784" /><testcase classname="cookbook.tests.api.test_api_space" name="test_list_permission[arg3]" time="28.126" /><testcase classname="cookbook.tests.api.test_api_space" name="test_list_permission[arg4]" time="28.153" /><testcase classname="cookbook.tests.api.test_api_space" name="test_list_permission[arg2]" time="28.177" /></testsuite></testsuites>

File diff suppressed because one or more lines are too long

View File

@@ -99,11 +99,23 @@ def test_add(arg, request, a1_s2, obj_1):
assert r.status_code == arg[1]
if r.status_code == 201:
assert response['name'] == 'test'
assert response['supports_description_field'] == True
r = c.get(reverse(DETAIL_URL, args={response['id']}))
assert r.status_code == 200
r = a1_s2.get(reverse(DETAIL_URL, args={response['id']}))
assert r.status_code == 404
def test_add_with_supports_description_field_false(a1_s2):
r = a1_s2.post(
reverse(LIST_URL),
{'name': 'test', 'url': 'http://localhost:8123/api', 'token': '1234', 'enabled': 'true', 'supports_description_field': 'false'},
content_type='application/json'
)
response = json.loads(r.content)
print(r.content)
assert r.status_code == 201
assert response['name'] == 'test'
assert response['supports_description_field'] == False
def test_delete(a1_s1, a1_s2, obj_1):
r = a1_s2.delete(

View File

@@ -81,7 +81,7 @@ def obj_tree_1(request, space_1):
@pytest.mark.parametrize("arg", [
['a_u', 403],
['g1_s1', 403],
['g1_s1', 200],
['u1_s1', 200],
['a1_s1', 200],
])

View File

@@ -51,7 +51,7 @@ def test_list_space(obj_1, obj_2, u1_s1, u1_s2, space_2):
['g1_s2', 403],
['u1_s2', 404],
['a1_s2', 404],
])
], ids=str)
def test_update(arg, request, obj_1):
c = request.getfixturevalue(arg[0])
r = c.patch(

View File

@@ -73,7 +73,7 @@ def recipe_1_1_s1(u1_s1, obj_1_1, space_1):
@pytest.mark.parametrize("arg", [
['a_u', 403],
['g1_s1', 403],
['g1_s1', 200],
['u1_s1', 200],
['a1_s1', 200],
])

View File

@@ -11,7 +11,7 @@ DETAIL_URL = 'api:space-detail'
@pytest.mark.parametrize("arg", [
['a_u', 403, 0],
['g1_s1', 403, 0],
['g1_s1', 200, 1],
['u1_s1', 200, 1],
['a1_s1', 200, 1],
['a2_s1', 200, 1],

View File

@@ -31,7 +31,7 @@ def test_edit_storage(storage_obj, a1_s1, a1_s2):
}
)
storage_obj.refresh_from_db()
assert r.status_code == 200
assert r.status_code == 302
r_messages = [m for m in get_messages(r.wsgi_request)]
assert not any(m.level > messages.SUCCESS for m in r_messages)
@@ -54,7 +54,7 @@ def test_edit_storage(storage_obj, a1_s1, a1_s2):
['a_u', 302],
['g1_s1', 302],
['u1_s1', 302],
['a1_s1', 200],
['a1_s1', 302],
['g1_s2', 302],
['u1_s2', 302],
['a1_s2', 404],

View File

@@ -0,0 +1,319 @@
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
/* do not increase min-width as some may use split screens */
min-width: 800px;
color: #999;
}
h1 {
font-size: 24px;
color: black;
}
h2 {
font-size: 16px;
color: black;
}
p {
color: black;
}
a {
color: #999;
}
table {
border-collapse: collapse;
}
/******************************
* SUMMARY INFORMATION
******************************/
#environment td {
padding: 5px;
border: 1px solid #e6e6e6;
vertical-align: top;
}
#environment tr:nth-child(odd) {
background-color: #f6f6f6;
}
#environment ul {
margin: 0;
padding: 0 20px;
}
/******************************
* TEST RESULT COLORS
******************************/
span.passed,
.passed .col-result {
color: green;
}
span.skipped,
span.xfailed,
span.rerun,
.skipped .col-result,
.xfailed .col-result,
.rerun .col-result {
color: orange;
}
span.error,
span.failed,
span.xpassed,
.error .col-result,
.failed .col-result,
.xpassed .col-result {
color: red;
}
.col-links__extra {
margin-right: 3px;
}
/******************************
* RESULTS TABLE
*
* 1. Table Layout
* 2. Extra
* 3. Sorting items
*
******************************/
/*------------------
* 1. Table Layout
*------------------*/
#results-table {
border: 1px solid #e6e6e6;
color: #999;
font-size: 12px;
width: 100%;
}
#results-table th,
#results-table td {
padding: 5px;
border: 1px solid #e6e6e6;
text-align: left;
}
#results-table th {
font-weight: bold;
}
/*------------------
* 2. Extra
*------------------*/
.logwrapper {
max-height: 230px;
overflow-y: scroll;
background-color: #e6e6e6;
}
.logwrapper.expanded {
max-height: none;
}
.logwrapper.expanded .logexpander:after {
content: "collapse [-]";
}
.logwrapper .logexpander {
z-index: 1;
position: sticky;
top: 10px;
width: max-content;
border: 1px solid;
border-radius: 3px;
padding: 5px 7px;
margin: 10px 0 10px calc(100% - 80px);
cursor: pointer;
background-color: #e6e6e6;
}
.logwrapper .logexpander:after {
content: "expand [+]";
}
.logwrapper .logexpander:hover {
color: #000;
border-color: #000;
}
.logwrapper .log {
min-height: 40px;
position: relative;
top: -50px;
height: calc(100% + 50px);
border: 1px solid #e6e6e6;
color: black;
display: block;
font-family: "Courier New", Courier, monospace;
padding: 5px;
padding-right: 80px;
white-space: pre-wrap;
}
div.media {
border: 1px solid #e6e6e6;
float: right;
height: 240px;
margin: 0 5px;
overflow: hidden;
width: 320px;
}
.media-container {
display: grid;
grid-template-columns: 25px auto 25px;
align-items: center;
flex: 1 1;
overflow: hidden;
height: 200px;
}
.media-container--fullscreen {
grid-template-columns: 0px auto 0px;
}
.media-container__nav--right,
.media-container__nav--left {
text-align: center;
cursor: pointer;
}
.media-container__viewport {
cursor: pointer;
text-align: center;
height: inherit;
}
.media-container__viewport img,
.media-container__viewport video {
object-fit: cover;
width: 100%;
max-height: 100%;
}
.media__name,
.media__counter {
display: flex;
flex-direction: row;
justify-content: space-around;
flex: 0 0 25px;
align-items: center;
}
.collapsible td:not(.col-links) {
cursor: pointer;
}
.collapsible td:not(.col-links):hover::after {
color: #bbb;
font-style: italic;
cursor: pointer;
}
.col-result {
width: 130px;
}
.col-result:hover::after {
content: " (hide details)";
}
.col-result.collapsed:hover::after {
content: " (show details)";
}
#environment-header h2:hover::after {
content: " (hide details)";
color: #bbb;
font-style: italic;
cursor: pointer;
font-size: 12px;
}
#environment-header.collapsed h2:hover::after {
content: " (show details)";
color: #bbb;
font-style: italic;
cursor: pointer;
font-size: 12px;
}
/*------------------
* 3. Sorting items
*------------------*/
.sortable {
cursor: pointer;
}
.sortable.desc:after {
content: " ";
position: relative;
left: 5px;
bottom: -12.5px;
border: 10px solid #4caf50;
border-bottom: 0;
border-left-color: transparent;
border-right-color: transparent;
}
.sortable.asc:after {
content: " ";
position: relative;
left: 5px;
bottom: 12.5px;
border: 10px solid #4caf50;
border-top: 0;
border-left-color: transparent;
border-right-color: transparent;
}
.hidden, .summary__reload__button.hidden {
display: none;
}
.summary__data {
flex: 0 0 550px;
}
.summary__reload {
flex: 1 1;
display: flex;
justify-content: center;
}
.summary__reload__button {
flex: 0 0 300px;
display: flex;
color: white;
font-weight: bold;
background-color: #4caf50;
text-align: center;
justify-content: center;
align-items: center;
border-radius: 3px;
cursor: pointer;
}
.summary__reload__button:hover {
background-color: #46a049;
}
.summary__spacer {
flex: 0 0 550px;
}
.controls {
display: flex;
justify-content: space-between;
}
.filters,
.collapse {
display: flex;
align-items: center;
}
.filters button,
.collapse button {
color: #999;
border: none;
background: none;
cursor: pointer;
text-decoration: underline;
}
.filters button:hover,
.collapse button:hover {
color: #ccc;
}
.filter__label {
margin-right: 10px;
}

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="1" time="30.686" timestamp="2024-08-20T11:34:55.376500" hostname="DESKTOP-RM10LP5"><testcase classname="cookbook.tests.other.test_helpers" name="test_url_validator" time="21.551" /></testsuite></testsuites>

View File

@@ -0,0 +1,770 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title id="head-title">tests.html</title>
<link href="assets\style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1 id="title">tests.html</h1>
<p>Report generated on 20-Aug-2024 at 11:35:26 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a>
v4.1.1</p>
<div id="environment-header">
<h2>Environment</h2>
</div>
<table id="environment"></table>
<!-- TEMPLATES -->
<template id="template_environment_row">
<tr>
<td></td>
<td></td>
</tr>
</template>
<template id="template_results-table__body--empty">
<tbody class="results-table-row">
<tr id="not-found-message">
<td colspan="4">No results found. Check the filters.</th>
</tr>
</template>
<template id="template_results-table__tbody">
<tbody class="results-table-row">
<tr class="collapsible">
</tr>
<tr class="extras-row">
<td class="extra" colspan="4">
<div class="extraHTML"></div>
<div class="media">
<div class="media-container">
<div class="media-container__nav--left"><</div>
<div class="media-container__viewport">
<img src="" />
<video controls>
<source src="" type="video/mp4">
</video>
</div>
<div class="media-container__nav--right">></div>
</div>
<div class="media__name"></div>
<div class="media__counter"></div>
</div>
<div class="logwrapper">
<div class="logexpander"></div>
<div class="log"></div>
</div>
</td>
</tr>
</tbody>
</template>
<!-- END TEMPLATES -->
<div class="summary">
<div class="summary__data">
<h2>Summary</h2>
<div class="additional-summary prefix">
</div>
<p class="run-count">1 test took 00:00:22.</p>
<p class="filter">(Un)check the boxes to filter the results.</p>
<div class="summary__reload">
<div class="summary__reload__button hidden" onclick="location.reload()">
<div>There are still tests running. <br />Reload this page to get the latest results!</div>
</div>
</div>
<div class="summary__spacer"></div>
<div class="controls">
<div class="filters">
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="failed" disabled/>
<span class="failed">0 Failed,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="passed" />
<span class="passed">1 Passed,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="skipped" disabled/>
<span class="skipped">0 Skipped,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xfailed" disabled/>
<span class="xfailed">0 Expected failures,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xpassed" disabled/>
<span class="xpassed">0 Unexpected passes,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="error" disabled/>
<span class="error">0 Errors,</span>
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="rerun" disabled/>
<span class="rerun">0 Reruns</span>
</div>
<div class="collapse">
<button id="show_all_details">Show all details</button>&nbsp;/&nbsp;<button id="hide_all_details">Hide all details</button>
</div>
</div>
</div>
<div class="additional-summary summary">
</div>
<div class="additional-summary postfix">
</div>
</div>
<table id="results-table">
<thead id="results-table-head">
<tr>
<th class="sortable" data-column-type="result">Result</th>
<th class="sortable" data-column-type="testId">Test</th>
<th class="sortable" data-column-type="duration">Duration</th>
<th>Links</th>
</tr>
</thead>
</table>
</body>
<footer>
<div id="data-container" data-jsonblob="{&#34;environment&#34;: {&#34;Python&#34;: &#34;3.12.5&#34;, &#34;Platform&#34;: &#34;Windows-10-10.0.19045-SP0&#34;, &#34;Packages&#34;: {&#34;pytest&#34;: &#34;8.0.0&#34;, &#34;pluggy&#34;: &#34;1.4.0&#34;}, &#34;Plugins&#34;: {&#34;Faker&#34;: &#34;23.2.1&#34;, &#34;asyncio&#34;: &#34;0.23.5&#34;, &#34;cov&#34;: &#34;5.0.0&#34;, &#34;django&#34;: &#34;4.8.0&#34;, &#34;factoryboy&#34;: &#34;2.6.0&#34;, &#34;html&#34;: &#34;4.1.1&#34;, &#34;metadata&#34;: &#34;3.1.1&#34;, &#34;xdist&#34;: &#34;3.6.1&#34;}}, &#34;tests&#34;: {&#34;cookbook/tests/other/test_helpers.py::test_url_validator&#34;: [{&#34;extras&#34;: [], &#34;result&#34;: &#34;Passed&#34;, &#34;testId&#34;: &#34;cookbook/tests/other/test_helpers.py::test_url_validator&#34;, &#34;duration&#34;: &#34;00:00:22&#34;, &#34;resultsTableRow&#34;: [&#34;&lt;td class=\&#34;col-result\&#34;&gt;Passed&lt;/td&gt;&#34;, &#34;&lt;td class=\&#34;col-testId\&#34;&gt;cookbook/tests/other/test_helpers.py::test_url_validator&lt;/td&gt;&#34;, &#34;&lt;td class=\&#34;col-duration\&#34;&gt;00:00:22&lt;/td&gt;&#34;, &#34;&lt;td class=\&#34;col-links\&#34;&gt;&lt;/td&gt;&#34;], &#34;log&#34;: &#34;[gw0] win32 -- Python 3.12.5 C:\\Users\\Benedikt.Sienz\\Documents\\Development\\Django\\recipes\\venv\\Scripts\\python.exe\n\n---------------------------- Captured stdout setup -----------------------------\nTransforming nutrition information, this might take a while on large databases\n&#34;}]}, &#34;renderCollapsed&#34;: [&#34;passed&#34;], &#34;initialSort&#34;: &#34;result&#34;, &#34;title&#34;: &#34;tests.html&#34;}"></div>
<script>
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
const { getCollapsedCategory, setCollapsedIds } = require('./storage.js')
class DataManager {
setManager(data) {
const collapsedCategories = [...getCollapsedCategory(data.renderCollapsed)]
const collapsedIds = []
const tests = Object.values(data.tests).flat().map((test, index) => {
const collapsed = collapsedCategories.includes(test.result.toLowerCase())
const id = `test_${index}`
if (collapsed) {
collapsedIds.push(id)
}
return {
...test,
id,
collapsed,
}
})
const dataBlob = { ...data, tests }
this.data = { ...dataBlob }
this.renderData = { ...dataBlob }
setCollapsedIds(collapsedIds)
}
get allData() {
return { ...this.data }
}
resetRender() {
this.renderData = { ...this.data }
}
setRender(data) {
this.renderData.tests = [...data]
}
toggleCollapsedItem(id) {
this.renderData.tests = this.renderData.tests.map((test) =>
test.id === id ? { ...test, collapsed: !test.collapsed } : test,
)
}
set allCollapsed(collapsed) {
this.renderData = { ...this.renderData, tests: [...this.renderData.tests.map((test) => (
{ ...test, collapsed }
))] }
}
get testSubset() {
return [...this.renderData.tests]
}
get environment() {
return this.renderData.environment
}
get initialSort() {
return this.data.initialSort
}
}
module.exports = {
manager: new DataManager(),
}
},{"./storage.js":8}],2:[function(require,module,exports){
const mediaViewer = require('./mediaviewer.js')
const templateEnvRow = document.getElementById('template_environment_row')
const templateResult = document.getElementById('template_results-table__tbody')
function htmlToElements(html) {
const temp = document.createElement('template')
temp.innerHTML = html
return temp.content.childNodes
}
const find = (selector, elem) => {
if (!elem) {
elem = document
}
return elem.querySelector(selector)
}
const findAll = (selector, elem) => {
if (!elem) {
elem = document
}
return [...elem.querySelectorAll(selector)]
}
const dom = {
getStaticRow: (key, value) => {
const envRow = templateEnvRow.content.cloneNode(true)
const isObj = typeof value === 'object' && value !== null
const values = isObj ? Object.keys(value).map((k) => `${k}: ${value[k]}`) : null
const valuesElement = htmlToElements(
values ? `<ul>${values.map((val) => `<li>${val}</li>`).join('')}<ul>` : `<div>${value}</div>`)[0]
const td = findAll('td', envRow)
td[0].textContent = key
td[1].appendChild(valuesElement)
return envRow
},
getResultTBody: ({ testId, id, log, extras, resultsTableRow, tableHtml, result, collapsed }) => {
const resultBody = templateResult.content.cloneNode(true)
resultBody.querySelector('tbody').classList.add(result.toLowerCase())
resultBody.querySelector('tbody').id = testId
resultBody.querySelector('.collapsible').dataset.id = id
resultsTableRow.forEach((html) => {
const t = document.createElement('template')
t.innerHTML = html
resultBody.querySelector('.collapsible').appendChild(t.content)
})
if (log) {
// Wrap lines starting with "E" with span.error to color those lines red
const wrappedLog = log.replace(/^E.*$/gm, (match) => `<span class="error">${match}</span>`)
resultBody.querySelector('.log').innerHTML = wrappedLog
} else {
resultBody.querySelector('.log').remove()
}
if (collapsed) {
resultBody.querySelector('.collapsible > td')?.classList.add('collapsed')
resultBody.querySelector('.extras-row').classList.add('hidden')
} else {
resultBody.querySelector('.collapsible > td')?.classList.remove('collapsed')
}
const media = []
extras?.forEach(({ name, format_type, content }) => {
if (['image', 'video'].includes(format_type)) {
media.push({ path: content, name, format_type })
}
if (format_type === 'html') {
resultBody.querySelector('.extraHTML').insertAdjacentHTML('beforeend', `<div>${content}</div>`)
}
})
mediaViewer.setup(resultBody, media)
// Add custom html from the pytest_html_results_table_html hook
tableHtml?.forEach((item) => {
resultBody.querySelector('td[class="extra"]').insertAdjacentHTML('beforeend', item)
})
return resultBody
},
}
module.exports = {
dom,
htmlToElements,
find,
findAll,
}
},{"./mediaviewer.js":6}],3:[function(require,module,exports){
const { manager } = require('./datamanager.js')
const { doSort } = require('./sort.js')
const storageModule = require('./storage.js')
const getFilteredSubSet = (filter) =>
manager.allData.tests.filter(({ result }) => filter.includes(result.toLowerCase()))
const doInitFilter = () => {
const currentFilter = storageModule.getVisible()
const filteredSubset = getFilteredSubSet(currentFilter)
manager.setRender(filteredSubset)
}
const doFilter = (type, show) => {
if (show) {
storageModule.showCategory(type)
} else {
storageModule.hideCategory(type)
}
const currentFilter = storageModule.getVisible()
const filteredSubset = getFilteredSubSet(currentFilter)
manager.setRender(filteredSubset)
const sortColumn = storageModule.getSort()
doSort(sortColumn, true)
}
module.exports = {
doFilter,
doInitFilter,
}
},{"./datamanager.js":1,"./sort.js":7,"./storage.js":8}],4:[function(require,module,exports){
const { redraw, bindEvents, renderStatic } = require('./main.js')
const { doInitFilter } = require('./filter.js')
const { doInitSort } = require('./sort.js')
const { manager } = require('./datamanager.js')
const data = JSON.parse(document.getElementById('data-container').dataset.jsonblob)
function init() {
manager.setManager(data)
doInitFilter()
doInitSort()
renderStatic()
redraw()
bindEvents()
}
init()
},{"./datamanager.js":1,"./filter.js":3,"./main.js":5,"./sort.js":7}],5:[function(require,module,exports){
const { dom, find, findAll } = require('./dom.js')
const { manager } = require('./datamanager.js')
const { doSort } = require('./sort.js')
const { doFilter } = require('./filter.js')
const {
getVisible,
getCollapsedIds,
setCollapsedIds,
getSort,
getSortDirection,
possibleFilters,
} = require('./storage.js')
const removeChildren = (node) => {
while (node.firstChild) {
node.removeChild(node.firstChild)
}
}
const renderStatic = () => {
const renderEnvironmentTable = () => {
const environment = manager.environment
const rows = Object.keys(environment).map((key) => dom.getStaticRow(key, environment[key]))
const table = document.getElementById('environment')
removeChildren(table)
rows.forEach((row) => table.appendChild(row))
}
renderEnvironmentTable()
}
const addItemToggleListener = (elem) => {
elem.addEventListener('click', ({ target }) => {
const id = target.parentElement.dataset.id
manager.toggleCollapsedItem(id)
const collapsedIds = getCollapsedIds()
if (collapsedIds.includes(id)) {
const updated = collapsedIds.filter((item) => item !== id)
setCollapsedIds(updated)
} else {
collapsedIds.push(id)
setCollapsedIds(collapsedIds)
}
redraw()
})
}
const renderContent = (tests) => {
const sortAttr = getSort(manager.initialSort)
const sortAsc = JSON.parse(getSortDirection())
const rows = tests.map(dom.getResultTBody)
const table = document.getElementById('results-table')
const tableHeader = document.getElementById('results-table-head')
const newTable = document.createElement('table')
newTable.id = 'results-table'
// remove all sorting classes and set the relevant
findAll('.sortable', tableHeader).forEach((elem) => elem.classList.remove('asc', 'desc'))
tableHeader.querySelector(`.sortable[data-column-type="${sortAttr}"]`)?.classList.add(sortAsc ? 'desc' : 'asc')
newTable.appendChild(tableHeader)
if (!rows.length) {
const emptyTable = document.getElementById('template_results-table__body--empty').content.cloneNode(true)
newTable.appendChild(emptyTable)
} else {
rows.forEach((row) => {
if (!!row) {
findAll('.collapsible td:not(.col-links', row).forEach(addItemToggleListener)
find('.logexpander', row).addEventListener('click',
(evt) => evt.target.parentNode.classList.toggle('expanded'),
)
newTable.appendChild(row)
}
})
}
table.replaceWith(newTable)
}
const renderDerived = () => {
const currentFilter = getVisible()
possibleFilters.forEach((result) => {
const input = document.querySelector(`input[data-test-result="${result}"]`)
input.checked = currentFilter.includes(result)
})
}
const bindEvents = () => {
const filterColumn = (evt) => {
const { target: element } = evt
const { testResult } = element.dataset
doFilter(testResult, element.checked)
const collapsedIds = getCollapsedIds()
const updated = manager.renderData.tests.map((test) => {
return {
...test,
collapsed: collapsedIds.includes(test.id),
}
})
manager.setRender(updated)
redraw()
}
const header = document.getElementById('environment-header')
header.addEventListener('click', () => {
const table = document.getElementById('environment')
table.classList.toggle('hidden')
header.classList.toggle('collapsed')
})
findAll('input[name="filter_checkbox"]').forEach((elem) => {
elem.addEventListener('click', filterColumn)
})
findAll('.sortable').forEach((elem) => {
elem.addEventListener('click', (evt) => {
const { target: element } = evt
const { columnType } = element.dataset
doSort(columnType)
redraw()
})
})
document.getElementById('show_all_details').addEventListener('click', () => {
manager.allCollapsed = false
setCollapsedIds([])
redraw()
})
document.getElementById('hide_all_details').addEventListener('click', () => {
manager.allCollapsed = true
const allIds = manager.renderData.tests.map((test) => test.id)
setCollapsedIds(allIds)
redraw()
})
}
const redraw = () => {
const { testSubset } = manager
renderContent(testSubset)
renderDerived()
}
module.exports = {
redraw,
bindEvents,
renderStatic,
}
},{"./datamanager.js":1,"./dom.js":2,"./filter.js":3,"./sort.js":7,"./storage.js":8}],6:[function(require,module,exports){
class MediaViewer {
constructor(assets) {
this.assets = assets
this.index = 0
}
nextActive() {
this.index = this.index === this.assets.length - 1 ? 0 : this.index + 1
return [this.activeFile, this.index]
}
prevActive() {
this.index = this.index === 0 ? this.assets.length - 1 : this.index -1
return [this.activeFile, this.index]
}
get currentIndex() {
return this.index
}
get activeFile() {
return this.assets[this.index]
}
}
const setup = (resultBody, assets) => {
if (!assets.length) {
resultBody.querySelector('.media').classList.add('hidden')
return
}
const mediaViewer = new MediaViewer(assets)
const container = resultBody.querySelector('.media-container')
const leftArrow = resultBody.querySelector('.media-container__nav--left')
const rightArrow = resultBody.querySelector('.media-container__nav--right')
const mediaName = resultBody.querySelector('.media__name')
const counter = resultBody.querySelector('.media__counter')
const imageEl = resultBody.querySelector('img')
const sourceEl = resultBody.querySelector('source')
const videoEl = resultBody.querySelector('video')
const setImg = (media, index) => {
if (media?.format_type === 'image') {
imageEl.src = media.path
imageEl.classList.remove('hidden')
videoEl.classList.add('hidden')
} else if (media?.format_type === 'video') {
sourceEl.src = media.path
videoEl.classList.remove('hidden')
imageEl.classList.add('hidden')
}
mediaName.innerText = media?.name
counter.innerText = `${index + 1} / ${assets.length}`
}
setImg(mediaViewer.activeFile, mediaViewer.currentIndex)
const moveLeft = () => {
const [media, index] = mediaViewer.prevActive()
setImg(media, index)
}
const doRight = () => {
const [media, index] = mediaViewer.nextActive()
setImg(media, index)
}
const openImg = () => {
window.open(mediaViewer.activeFile.path, '_blank')
}
if (assets.length === 1) {
container.classList.add('media-container--fullscreen')
} else {
leftArrow.addEventListener('click', moveLeft)
rightArrow.addEventListener('click', doRight)
}
imageEl.addEventListener('click', openImg)
}
module.exports = {
setup,
}
},{}],7:[function(require,module,exports){
const { manager } = require('./datamanager.js')
const storageModule = require('./storage.js')
const genericSort = (list, key, ascending, customOrder) => {
let sorted
if (customOrder) {
sorted = list.sort((a, b) => {
const aValue = a.result.toLowerCase()
const bValue = b.result.toLowerCase()
const aIndex = customOrder.findIndex((item) => item.toLowerCase() === aValue)
const bIndex = customOrder.findIndex((item) => item.toLowerCase() === bValue)
// Compare the indices to determine the sort order
return aIndex - bIndex
})
} else {
sorted = list.sort((a, b) => a[key] === b[key] ? 0 : a[key] > b[key] ? 1 : -1)
}
if (ascending) {
sorted.reverse()
}
return sorted
}
const durationSort = (list, ascending) => {
const parseDuration = (duration) => {
if (duration.includes(':')) {
// If it's in the format "HH:mm:ss"
const [hours, minutes, seconds] = duration.split(':').map(Number)
return (hours * 3600 + minutes * 60 + seconds) * 1000
} else {
// If it's in the format "nnn ms"
return parseInt(duration)
}
}
const sorted = list.sort((a, b) => parseDuration(a['duration']) - parseDuration(b['duration']))
if (ascending) {
sorted.reverse()
}
return sorted
}
const doInitSort = () => {
const type = storageModule.getSort(manager.initialSort)
const ascending = storageModule.getSortDirection()
const list = manager.testSubset
const initialOrder = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed', 'Skipped', 'Passed']
storageModule.setSort(type)
storageModule.setSortDirection(ascending)
if (type?.toLowerCase() === 'original') {
manager.setRender(list)
} else {
let sortedList
switch (type) {
case 'duration':
sortedList = durationSort(list, ascending)
break
case 'result':
sortedList = genericSort(list, type, ascending, initialOrder)
break
default:
sortedList = genericSort(list, type, ascending)
break
}
manager.setRender(sortedList)
}
}
const doSort = (type, skipDirection) => {
const newSortType = storageModule.getSort(manager.initialSort) !== type
const currentAsc = storageModule.getSortDirection()
let ascending
if (skipDirection) {
ascending = currentAsc
} else {
ascending = newSortType ? false : !currentAsc
}
storageModule.setSort(type)
storageModule.setSortDirection(ascending)
const list = manager.testSubset
const sortedList = type === 'duration' ? durationSort(list, ascending) : genericSort(list, type, ascending)
manager.setRender(sortedList)
}
module.exports = {
doInitSort,
doSort,
}
},{"./datamanager.js":1,"./storage.js":8}],8:[function(require,module,exports){
const possibleFilters = [
'passed',
'skipped',
'failed',
'error',
'xfailed',
'xpassed',
'rerun',
]
const getVisible = () => {
const url = new URL(window.location.href)
const settings = new URLSearchParams(url.search).get('visible')
const lower = (item) => {
const lowerItem = item.toLowerCase()
if (possibleFilters.includes(lowerItem)) {
return lowerItem
}
return null
}
return settings === null ?
possibleFilters :
[...new Set(settings?.split(',').map(lower).filter((item) => item))]
}
const hideCategory = (categoryToHide) => {
const url = new URL(window.location.href)
const visibleParams = new URLSearchParams(url.search).get('visible')
const currentVisible = visibleParams ? visibleParams.split(',') : [...possibleFilters]
const settings = [...new Set(currentVisible)].filter((f) => f !== categoryToHide).join(',')
url.searchParams.set('visible', settings)
window.history.pushState({}, null, unescape(url.href))
}
const showCategory = (categoryToShow) => {
if (typeof window === 'undefined') {
return
}
const url = new URL(window.location.href)
const currentVisible = new URLSearchParams(url.search).get('visible')?.split(',').filter(Boolean) ||
[...possibleFilters]
const settings = [...new Set([categoryToShow, ...currentVisible])]
const noFilter = possibleFilters.length === settings.length || !settings.length
noFilter ? url.searchParams.delete('visible') : url.searchParams.set('visible', settings.join(','))
window.history.pushState({}, null, unescape(url.href))
}
const getSort = (initialSort) => {
const url = new URL(window.location.href)
let sort = new URLSearchParams(url.search).get('sort')
if (!sort) {
sort = initialSort || 'result'
}
return sort
}
const setSort = (type) => {
const url = new URL(window.location.href)
url.searchParams.set('sort', type)
window.history.pushState({}, null, unescape(url.href))
}
const getCollapsedCategory = (renderCollapsed) => {
let categories
if (typeof window !== 'undefined') {
const url = new URL(window.location.href)
const collapsedItems = new URLSearchParams(url.search).get('collapsed')
switch (true) {
case !renderCollapsed && collapsedItems === null:
categories = ['passed']
break
case collapsedItems?.length === 0 || /^["']{2}$/.test(collapsedItems):
categories = []
break
case /^all$/.test(collapsedItems) || collapsedItems === null && /^all$/.test(renderCollapsed):
categories = [...possibleFilters]
break
default:
categories = collapsedItems?.split(',').map((item) => item.toLowerCase()) || renderCollapsed
break
}
} else {
categories = []
}
return categories
}
const getSortDirection = () => JSON.parse(sessionStorage.getItem('sortAsc')) || false
const setSortDirection = (ascending) => sessionStorage.setItem('sortAsc', ascending)
const getCollapsedIds = () => JSON.parse(sessionStorage.getItem('collapsedIds')) || []
const setCollapsedIds = (list) => sessionStorage.setItem('collapsedIds', JSON.stringify(list))
module.exports = {
getVisible,
hideCategory,
showCategory,
getCollapsedIds,
setCollapsedIds,
getSort,
setSort,
getSortDirection,
setSortDirection,
getCollapsedCategory,
possibleFilters,
}
},{}]},{},[4]);
</script>
</footer>
</html>

View File

@@ -0,0 +1,14 @@
from cookbook.helper.HelperFunctions import validate_import_url
def test_url_validator():
# neither local nor public urls without protocol are valid
assert not validate_import_url('localhost:8080')
assert not validate_import_url('www.google.com')
# public urls with schema and parameters are valid
assert validate_import_url('https://www.google.com')
assert validate_import_url('https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html#case-2-application-can-send-requests-to-any-external-ip-address-or-domain-name')
assert not validate_import_url('https://localhost')
assert not validate_import_url('http://127.0.0.1')

View File

@@ -273,12 +273,12 @@ def test_search_units(found_recipe, recipes, u1_s1, space_1):
('fuzzy_lookups', True), ('fuzzy_lookups', False)
],
[('unaccent', True), ('unaccent', False)]
), indirect=['user1'])
), indirect=['user1'], ids=str)
@pytest.mark.parametrize("found_recipe, param_type", [
({'unit': True}, 'unit'),
({'keyword': True}, 'keyword'),
({'food': True}, 'food'),
], indirect=['found_recipe'])
], indirect=['found_recipe'], ids=str)
def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1):
with scope(space=space_1):
list_url = f'api:{param_type}-list'
@@ -306,14 +306,14 @@ def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1):
('istartswith', True), ('istartswith', False),
],
[('unaccent', True), ('unaccent', False)]
), indirect=['user1'])
), indirect=['user1'], ids=str)
@pytest.mark.parametrize("found_recipe", [
({'name': True}),
({'description': True}),
({'instruction': True}),
({'keyword': True}),
({'food': True}),
], indirect=['found_recipe'])
], indirect=['found_recipe'], ids=str)
# user array contains: user client, expected count of search, expected count of mispelled search, search string, mispelled search string, user search preferences
def test_search_string(found_recipe, recipes, user1, space_1):
with scope(space=space_1):

View File

@@ -19,6 +19,23 @@ DATA_DIR = "cookbook/tests/other/test_data/"
# plus the test that previously existed
# plus the custom scraper that was created
# plus any specific defects discovered along the way
RECIPES = [
ALLRECIPES,
AMERICAS_TEST_KITCHEN,
CHEF_KOCH,
CHEF_KOCH2, # test for empty ingredient in ingredient_parser
COOKPAD,
COOKS_COUNTRY,
DELISH,
FOOD_NETWORK,
GIALLOZAFFERANO,
JOURNAL_DES_FEMMES,
MADAME_DESSERT, # example of json only source
MARMITON,
TASTE_OF_HOME,
THE_SPRUCE_EATS, # example of non-json recipes_scraper
TUDOGOSTOSO,
]
@pytest.mark.parametrize("arg", [
@@ -32,29 +49,7 @@ def test_import_permission(arg, request):
assert c.get(reverse(IMPORT_SOURCE_URL)).status_code == arg[1]
@pytest.mark.parametrize("arg", [
ALLRECIPES,
# test of custom scraper ATK
AMERICAS_TEST_KITCHEN,
CHEF_KOCH,
# test for empty ingredient in ingredient_parser
CHEF_KOCH2,
COOKPAD,
# test of custom scraper ATK
COOKS_COUNTRY,
DELISH,
FOOD_NETWORK,
GIALLOZAFFERANO,
JOURNAL_DES_FEMMES,
# example of recipes_scraper in with wildmode
# example of json only source
MADAME_DESSERT,
MARMITON,
TASTE_OF_HOME,
# example of non-json recipes_scraper
THE_SPRUCE_EATS, # TODO seems to be broken in recipe scrapers
TUDOGOSTOSO,
])
@pytest.mark.parametrize("arg", RECIPES, ids=[x['file'][0] for x in RECIPES])
def test_recipe_import(arg, u1_s1):
url = arg['url']
for f in list(arg['file']): # url and files get popped later

View File

@@ -12,8 +12,8 @@ from json import JSONDecodeError
from urllib.parse import unquote
from zipfile import ZipFile
import redis
import requests
import validators
from PIL import UnidentifiedImageError
from annoying.decorators import ajax_request
from annoying.functions import get_object_or_None
@@ -31,6 +31,7 @@ from django.http import FileResponse, HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
from django.utils import timezone
from django.utils.datetime_safe import date
from django.utils.translation import gettext as _
from django_scopes import scopes_disabled
from icalendar import Calendar, Event
@@ -53,17 +54,16 @@ from treebeard.exceptions import InvalidMoveToDescendant, InvalidPosition, PathO
from cookbook.forms import ImportForm
from cookbook.helper import recipe_url_import as helper
from cookbook.helper.HelperFunctions import str2bool
from cookbook.helper.HelperFunctions import str2bool, validate_import_url
from cookbook.helper.image_processing import handle_image
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.open_data_importer import OpenDataImporter
from cookbook.helper.permission_helper import (
CustomIsAdmin, CustomIsOwner, CustomIsOwnerReadOnly, CustomIsShared, CustomIsSpaceOwner, CustomIsUser, CustomRecipePermission, CustomTokenHasReadWriteScope,
CustomTokenHasScope, CustomUserPermission, IsReadOnlyDRF, above_space_limit, group_required, has_group_permission, is_space_owner, switch_user_active_space,
CustomTokenHasScope, CustomUserPermission, IsReadOnlyDRF, above_space_limit, group_required, has_group_permission, is_space_owner, switch_user_active_space, CustomIsGuest,
)
from cookbook.helper.recipe_search import RecipeSearch
from cookbook.helper.recipe_url_import import clean_dict, get_from_youtube_scraper, get_images_from_soup
from cookbook.helper.scrapers.scrapers import text_scraper
from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper
from cookbook.models import (Automation, BookmarkletImport, CookLog, CustomFilter, ExportLog, Food,
FoodInheritField, FoodProperty, ImportLog, Ingredient, InviteLink,
@@ -103,6 +103,49 @@ from recipes import settings
from recipes.settings import DRF_THROTTLE_RECIPE_URL_IMPORT, FDC_API_KEY
class LoggingMixin(object):
"""
logs request counts to redis cache total/per user/
"""
def initial(self, request, *args, **kwargs):
super(LoggingMixin, self).initial(request, *args, **kwargs)
if settings.REDIS_HOST:
try:
d = date.today().isoformat()
space = request.space
endpoint = request.resolver_match.url_name
r = redis.StrictRedis(
host=settings.REDIS_HOST,
port=settings.REDIS_PORT,
username=settings.REDIS_USERNAME,
password=settings.REDIS_PASSWORD,
db=settings.REDIS_DATABASES['STATS'],
)
pipe = r.pipeline()
# Global and daily tallies for all URLs.
pipe.incr('api:request-count')
pipe.incr(f'api:request-count:{d}')
# Use a sorted set to store the user stats, with the score representing
# the number of queries the user made total or on a given day.
pipe.zincrby(f'api:space-request-count', 1, space.pk)
pipe.zincrby(f'api:space-request-count:{d}', 1, space.pk)
# Use a sorted set to store all the endpoints with score representing
# the number of queries the endpoint received total or on a given day.
pipe.zincrby(f'api:endpoint-request-count', 1, endpoint)
pipe.zincrby(f'api:endpoint-request-count:{d}', 1, endpoint)
pipe.execute()
except:
pass
class StandardFilterMixin(ViewSetMixin):
def get_queryset(self):
@@ -186,9 +229,9 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
if query is not None and query not in ["''", '']:
if fuzzy and (settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql'):
if self.request.user.is_authenticated and any(
[self.model.__name__.lower() in x for x in self.request.user.searchpreference.unaccent.values_list('field', flat=True)]
):
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
[self.model.__name__.lower() in x for x in self.request.user.searchpreference.unaccent.values_list('field', flat=True)]
):
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
else:
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name', query))
self.queryset = self.queryset.order_by('-trigram')
@@ -372,7 +415,7 @@ class TreeMixin(MergeMixin, FuzzyFilterMixin, ExtendedRecipeMixin):
return Response(content, status=status.HTTP_400_BAD_REQUEST)
class UserViewSet(viewsets.ModelViewSet):
class UserViewSet(LoggingMixin, viewsets.ModelViewSet):
"""
list:
optional parameters
@@ -396,24 +439,24 @@ class UserViewSet(viewsets.ModelViewSet):
return queryset
class GroupViewSet(viewsets.ModelViewSet):
class GroupViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
http_method_names = ['get', ]
class SpaceViewSet(viewsets.ModelViewSet):
class SpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Space.objects
serializer_class = SpaceSerializer
permission_classes = [IsReadOnlyDRF & CustomIsUser | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
permission_classes = [IsReadOnlyDRF & CustomIsGuest | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
http_method_names = ['get', 'patch']
def get_queryset(self):
return self.queryset.filter(id=self.request.space.id)
class UserSpaceViewSet(viewsets.ModelViewSet):
class UserSpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = UserSpace.objects
serializer_class = UserSpaceSerializer
permission_classes = [(CustomIsSpaceOwner | CustomIsOwnerReadOnly) & CustomTokenHasReadWriteScope]
@@ -436,7 +479,7 @@ class UserSpaceViewSet(viewsets.ModelViewSet):
return self.queryset.filter(user=self.request.user, space=self.request.space)
class UserPreferenceViewSet(viewsets.ModelViewSet):
class UserPreferenceViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = UserPreference.objects
serializer_class = UserPreferenceSerializer
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
@@ -447,7 +490,7 @@ class UserPreferenceViewSet(viewsets.ModelViewSet):
return self.queryset.filter(user=self.request.user)
class StorageViewSet(viewsets.ModelViewSet):
class StorageViewSet(LoggingMixin, viewsets.ModelViewSet):
# TODO handle delete protect error and adjust test
queryset = Storage.objects
serializer_class = StorageSerializer
@@ -457,7 +500,7 @@ class StorageViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class ConnectorConfigConfigViewSet(viewsets.ModelViewSet):
class ConnectorConfigConfigViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ConnectorConfig.objects
serializer_class = ConnectorConfigConfigSerializer
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
@@ -466,7 +509,7 @@ class ConnectorConfigConfigViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class SyncViewSet(viewsets.ModelViewSet):
class SyncViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Sync.objects
serializer_class = SyncSerializer
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
@@ -475,7 +518,7 @@ class SyncViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class SyncLogViewSet(viewsets.ReadOnlyModelViewSet):
class SyncLogViewSet(LoggingMixin, viewsets.ReadOnlyModelViewSet):
queryset = SyncLog.objects
serializer_class = SyncLogSerializer
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
@@ -485,7 +528,7 @@ class SyncLogViewSet(viewsets.ReadOnlyModelViewSet):
return self.queryset.filter(sync__space=self.request.space)
class SupermarketViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class SupermarketViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
schema = FilterSchema()
queryset = Supermarket.objects
serializer_class = SupermarketSerializer
@@ -496,7 +539,7 @@ class SupermarketViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class SupermarketCategoryViewSet(viewsets.ModelViewSet, FuzzyFilterMixin, MergeMixin):
class SupermarketCategoryViewSet(LoggingMixin, viewsets.ModelViewSet, FuzzyFilterMixin, MergeMixin):
queryset = SupermarketCategory.objects
model = SupermarketCategory
serializer_class = SupermarketCategorySerializer
@@ -507,7 +550,7 @@ class SupermarketCategoryViewSet(viewsets.ModelViewSet, FuzzyFilterMixin, MergeM
return super().get_queryset()
class SupermarketCategoryRelationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class SupermarketCategoryRelationViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
queryset = SupermarketCategoryRelation.objects
serializer_class = SupermarketCategoryRelationSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -518,15 +561,15 @@ class SupermarketCategoryRelationViewSet(viewsets.ModelViewSet, StandardFilterMi
return super().get_queryset()
class KeywordViewSet(viewsets.ModelViewSet, TreeMixin):
class KeywordViewSet(LoggingMixin, viewsets.ModelViewSet, TreeMixin):
queryset = Keyword.objects
model = Keyword
serializer_class = KeywordSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
permission_classes = [(CustomIsGuest & IsReadOnlyDRF | CustomIsUser) & CustomTokenHasReadWriteScope]
pagination_class = DefaultPagination
class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
class UnitViewSet(LoggingMixin, viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
queryset = Unit.objects
model = Unit
serializer_class = UnitSerializer
@@ -534,7 +577,7 @@ class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
pagination_class = DefaultPagination
class FoodInheritFieldViewSet(viewsets.ReadOnlyModelViewSet):
class FoodInheritFieldViewSet(LoggingMixin, viewsets.ReadOnlyModelViewSet):
queryset = FoodInheritField.objects
serializer_class = FoodInheritFieldSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -545,11 +588,11 @@ class FoodInheritFieldViewSet(viewsets.ReadOnlyModelViewSet):
return super().get_queryset()
class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
class FoodViewSet(LoggingMixin, viewsets.ModelViewSet, TreeMixin):
queryset = Food.objects
model = Food
serializer_class = FoodSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
permission_classes = [(CustomIsGuest & IsReadOnlyDRF | CustomIsUser) & CustomTokenHasReadWriteScope]
pagination_class = DefaultPagination
def get_queryset(self):
@@ -612,8 +655,8 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
return JsonResponse(
{
'msg':
'API Key Rate Limit reached/exceeded, see https://api.data.gov/docs/rate-limits/ for more information. \
Configure your key in Tandoor using environment FDC_API_KEY variable.'
'API Key Rate Limit reached/exceeded, see https://api.data.gov/docs/rate-limits/ for more information. \
Configure your key in Tandoor using environment FDC_API_KEY variable.'
},
status=429,
json_dumps_params={'indent': 4})
@@ -682,7 +725,7 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
return Response(content, status=status.HTTP_403_FORBIDDEN)
class RecipeBookViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class RecipeBookViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
queryset = RecipeBook.objects
serializer_class = RecipeBookSerializer
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
@@ -700,7 +743,7 @@ class RecipeBookViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
class RecipeBookEntryViewSet(LoggingMixin, viewsets.ModelViewSet, viewsets.GenericViewSet):
"""
list:
optional parameters
@@ -726,7 +769,7 @@ class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
return queryset
class MealPlanViewSet(viewsets.ModelViewSet):
class MealPlanViewSet(LoggingMixin, viewsets.ModelViewSet):
"""
list:
optional parameters
@@ -764,7 +807,7 @@ class MealPlanViewSet(viewsets.ModelViewSet):
return queryset
class AutoPlanViewSet(viewsets.ViewSet):
class AutoPlanViewSet(LoggingMixin, viewsets.ViewSet):
def create(self, request):
serializer = AutoMealPlanSerializer(data=request.data)
@@ -826,7 +869,7 @@ class AutoPlanViewSet(viewsets.ViewSet):
return Response(serializer.errors, 400)
class MealTypeViewSet(viewsets.ModelViewSet):
class MealTypeViewSet(LoggingMixin, viewsets.ModelViewSet):
"""
returns list of meal types created by the
requesting user ordered by the order field.
@@ -840,7 +883,7 @@ class MealTypeViewSet(viewsets.ModelViewSet):
return queryset
class IngredientViewSet(viewsets.ModelViewSet):
class IngredientViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Ingredient.objects
serializer_class = IngredientSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -864,7 +907,7 @@ class IngredientViewSet(viewsets.ModelViewSet):
return queryset.select_related('food')
class StepViewSet(viewsets.ModelViewSet):
class StepViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Step.objects
serializer_class = StepSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -899,7 +942,7 @@ class RecipePagination(PageNumberPagination):
return Response(OrderedDict([('count', self.page.paginator.count), ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data), ]))
class RecipeViewSet(viewsets.ModelViewSet):
class RecipeViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Recipe.objects
serializer_class = RecipeSerializer
# TODO split read and write permission for meal plan guest
@@ -995,7 +1038,7 @@ class RecipeViewSet(viewsets.ModelViewSet):
elif 'image_url' in serializer.validated_data:
try:
url = serializer.validated_data['image_url']
if validators.url(url, public=True):
if validate_import_url(url):
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"})
image = File(io.BytesIO(response.content))
filetype = mimetypes.guess_extension(response.headers['content-type']) or filetype
@@ -1066,7 +1109,7 @@ class RecipeViewSet(viewsets.ModelViewSet):
return Response(self.serializer_class(qs, many=True).data)
class UnitConversionViewSet(viewsets.ModelViewSet):
class UnitConversionViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = UnitConversion.objects
serializer_class = UnitConversionSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -1083,7 +1126,7 @@ class UnitConversionViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class PropertyTypeViewSet(viewsets.ModelViewSet):
class PropertyTypeViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = PropertyType.objects
serializer_class = PropertyTypeSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -1092,7 +1135,7 @@ class PropertyTypeViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class PropertyViewSet(viewsets.ModelViewSet):
class PropertyViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Property.objects
serializer_class = PropertySerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -1101,7 +1144,7 @@ class PropertyViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
class ShoppingListRecipeViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ShoppingListRecipe.objects
serializer_class = ShoppingListRecipeSerializer
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
@@ -1112,10 +1155,10 @@ class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
Q(entries__isnull=True)
| Q(entries__created_by=self.request.user)
| Q(entries__created_by__in=list(self.request.user.get_shopping_share()))
).distinct().all()
).distinct().all()
class ShoppingListEntryViewSet(viewsets.ModelViewSet):
class ShoppingListEntryViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ShoppingListEntry.objects
serializer_class = ShoppingListEntrySerializer
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
@@ -1125,7 +1168,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
name='checked',
description=_('Filter shopping list entries on checked. [''true'', ''false'', ''both'', ''<b>recent</b>'']<br> \
- ''recent'' includes unchecked items and recently completed items.')
),
),
QueryParam(name='supermarket', description=_('Returns the shopping list entries sorted by supermarket category order.'), qtype='integer'),
]
schema = QueryParamAutoSchema()
@@ -1173,7 +1216,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
print(serializer.validated_data)
bulk_entries = ShoppingListEntry.objects.filter(
Q(created_by=self.request.user) | Q(created_by__in=list(self.request.user.get_shopping_share()))
).filter(space=request.space, id__in=serializer.validated_data['ids'])
).filter(space=request.space, id__in=serializer.validated_data['ids'])
bulk_entries.update(checked=(checked := serializer.validated_data['checked']), updated_at=timezone.now(), )
# update the onhand for food if shopping_add_onhand is True
@@ -1191,7 +1234,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
return Response(serializer.errors, 400)
class ViewLogViewSet(viewsets.ModelViewSet):
class ViewLogViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ViewLog.objects
serializer_class = ViewLogSerializer
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
@@ -1202,7 +1245,7 @@ class ViewLogViewSet(viewsets.ModelViewSet):
return self.queryset.filter(created_by=self.request.user).filter(space=self.request.space)
class CookLogViewSet(viewsets.ModelViewSet):
class CookLogViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = CookLog.objects
serializer_class = CookLogSerializer
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
@@ -1217,7 +1260,7 @@ class CookLogViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class ImportLogViewSet(viewsets.ModelViewSet):
class ImportLogViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ImportLog.objects
serializer_class = ImportLogSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -1227,7 +1270,7 @@ class ImportLogViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class ExportLogViewSet(viewsets.ModelViewSet):
class ExportLogViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = ExportLog.objects
serializer_class = ExportLogSerializer
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
@@ -1237,7 +1280,7 @@ class ExportLogViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class BookmarkletImportViewSet(viewsets.ModelViewSet):
class BookmarkletImportViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = BookmarkletImport.objects
serializer_class = BookmarkletImportSerializer
permission_classes = [CustomIsUser & CustomTokenHasScope]
@@ -1252,7 +1295,7 @@ class BookmarkletImportViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space).all()
class UserFileViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class UserFileViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
schema = FilterSchema()
queryset = UserFile.objects
serializer_class = UserFileSerializer
@@ -1264,7 +1307,7 @@ class UserFileViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class AutomationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class AutomationViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
"""
list:
optional parameters
@@ -1315,7 +1358,7 @@ class AutomationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class InviteLinkViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class InviteLinkViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
queryset = InviteLink.objects
serializer_class = InviteLinkSerializer
permission_classes = [CustomIsSpaceOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
@@ -1333,7 +1376,7 @@ class InviteLinkViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return None
class CustomFilterViewSet(viewsets.ModelViewSet, StandardFilterMixin):
class CustomFilterViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
queryset = CustomFilter.objects
serializer_class = CustomFilterSerializer
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
@@ -1344,7 +1387,7 @@ class CustomFilterViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class AccessTokenViewSet(viewsets.ModelViewSet):
class AccessTokenViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = AccessToken.objects
serializer_class = AccessTokenSerializer
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
@@ -1412,13 +1455,21 @@ class RecipeUrlImportView(APIView):
url = serializer.validated_data.get('url', None)
data = unquote(serializer.validated_data.get('data', None))
duplicate = False
if url:
# Check for existing recipes with provided url
existing_recipe = Recipe.objects.filter(source_url=url).first()
if existing_recipe:
duplicate = True
if not url and not data:
return Response({'error': True, 'msg': _('Nothing to do.')}, status=status.HTTP_400_BAD_REQUEST)
elif url and not data:
if re.match('^(https?://)?(www\\.youtube\\.com|youtu\\.be)/.+$', url):
if validators.url(url, public=True):
return Response({'recipe_json': get_from_youtube_scraper(url, request), 'recipe_images': [], }, status=status.HTTP_200_OK)
if validate_import_url(url):
return Response({'recipe_json': get_from_youtube_scraper(url, request), 'recipe_images': [], 'duplicate': duplicate}, status=status.HTTP_200_OK)
if re.match('^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url):
recipe_json = requests.get(
url.replace('/view/recipe/', '/api/recipe/').replace(re.split('/view/recipe/[0-9]+', url)[1], '') + '?share='
@@ -1427,17 +1478,20 @@ class RecipeUrlImportView(APIView):
serialized_recipe = RecipeExportSerializer(data=recipe_json, context={'request': request})
if serialized_recipe.is_valid():
recipe = serialized_recipe.save()
if validators.url(recipe_json['image'], public=True):
if validate_import_url(recipe_json['image']):
recipe.image = File(handle_image(request,
File(io.BytesIO(requests.get(recipe_json['image']).content), name='image'),
filetype=pathlib.Path(recipe_json['image']).suffix),
name=f'{uuid.uuid4()}_{recipe.pk}{pathlib.Path(recipe_json["image"]).suffix}')
recipe.save()
return Response({'link': request.build_absolute_uri(reverse('view_recipe', args={recipe.pk}))}, status=status.HTTP_201_CREATED)
return Response({'link': request.build_absolute_uri(reverse('view_recipe', args={recipe.pk})), 'duplicate': duplicate}, status=status.HTTP_201_CREATED)
else:
try:
if validators.url(url, public=True):
html = requests.get(url).content
if validate_import_url(url):
html = requests.get(
url,
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"}
).content
scrape = scrape_html(org_url=url, html=html, supported_only=False)
else:
return Response({'error': True, 'msg': _('Invalid Url')}, status=status.HTTP_400_BAD_REQUEST)
@@ -1457,16 +1511,17 @@ class RecipeUrlImportView(APIView):
data = "<script type='application/ld+json'>" + json.dumps(data_json) + "</script>"
except JSONDecodeError:
pass
scrape = text_scraper(text=data, url=url)
if not url and (found_url := scrape.schema.data.get('url', None)):
scrape = text_scraper(text=data, url=found_url)
scrape = scrape_html(html=data, org_url='https://urlnotfound.none', supported_only=False)
if not url and (found_url := scrape.schema.data.get('url', 'https://urlnotfound.none')):
scrape = scrape_html(html=data, org_url=found_url, supported_only=False)
if scrape:
return Response({
'recipe_json': helper.get_from_scraper(scrape, request),
'recipe_images': list(dict.fromkeys(get_images_from_soup(scrape.soup, url))),
'duplicate': duplicate
},
status=status.HTTP_200_OK)
status=status.HTTP_200_OK)
else:
return Response({'error': True, 'msg': _('No usable data could be found.')}, status=status.HTTP_400_BAD_REQUEST)
@@ -1677,7 +1732,7 @@ def sync_all(request):
# @schema(AutoSchema()) #TODO add proper schema
@permission_classes([CustomIsUser & CustomTokenHasReadWriteScope])
def share_link(request, pk):
if request.space.allow_sharing and has_group_permission(request.user, ('user', )):
if request.space.allow_sharing and has_group_permission(request.user, ('user',)):
recipe = get_object_or_404(Recipe, pk=pk, space=request.space)
link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space)
return JsonResponse({'pk': pk, 'share': link.uuid, 'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))})

View File

@@ -80,7 +80,7 @@ class SyncUpdate(GroupRequiredMixin, UpdateView, SpaceFormMixing):
def edit_storage(request, pk):
instance: Storage = get_object_or_404(Storage, pk=pk, space=request.space)
if not (instance.created_by == request.user or request.user.is_superuser):
if not request.user.is_superuser:
messages.add_message(request, messages.ERROR, _('You cannot edit this storage!'))
return HttpResponseRedirect(reverse('list_storage'))

View File

@@ -31,6 +31,7 @@ from cookbook.integration.recipesage import RecipeSage
from cookbook.integration.rezeptsuitede import Rezeptsuitede
from cookbook.integration.rezkonv import RezKonv
from cookbook.integration.saffron import Saffron
from cookbook.integration.gourmet import Gourmet
from cookbook.models import ExportLog, Recipe
from recipes import settings
@@ -80,6 +81,8 @@ def get_integration(request, export_type):
return Cookmate(request, export_type)
if export_type == ImportExportBase.REZEPTSUITEDE:
return Rezeptsuitede(request, export_type)
if export_type == ImportExportBase.GOURMET:
return Gourmet(request, export_type)
@group_required('user')

View File

@@ -58,10 +58,16 @@ class StorageCreate(GroupRequiredMixin, CreateView):
obj = form.save(commit=False)
obj.created_by = self.request.user
obj.space = self.request.space
obj.save()
if self.request.space.demo or settings.HOSTED:
messages.add_message(self.request, messages.ERROR, _('This feature is not yet available in the hosted version of tandoor!'))
return redirect('index')
if not self.request.user.is_superuser:
messages.add_message(self.request, messages.ERROR, _('This feature is only available for the instance administrator (superuser)'))
return redirect('index')
obj.save()
return HttpResponseRedirect(reverse('edit_storage', kwargs={'pk': obj.pk}))
def get_context_data(self, **kwargs):

View File

@@ -1,9 +1,10 @@
import os
import re
from datetime import datetime
from datetime import datetime, timedelta
from io import StringIO
from uuid import UUID
import redis
from django.apps import apps
from django.conf import settings
from django.contrib import messages
@@ -17,6 +18,7 @@ from django.http import HttpResponseRedirect, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
from django.utils import timezone
from django.utils.datetime_safe import date
from django.utils.translation import gettext as _
from django_scopes import scopes_disabled
@@ -38,7 +40,8 @@ def index(request):
return HttpResponseRedirect(reverse_lazy('view_search'))
try:
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), UserPreference.SHOPPING: reverse_lazy('view_shopping'),}
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'),
UserPreference.SHOPPING: reverse_lazy('view_shopping'), }
return HttpResponseRedirect(page_map.get(request.user.userpreference.default_page))
except UserPreference.DoesNotExist:
@@ -160,7 +163,6 @@ def recipe_view(request, pk, share=None):
return render(request, 'recipe_view.html', {'recipe': recipe, 'comments': comments, 'comment_form': comment_form, 'share': share, 'servings': servings})
@group_required('user')
def books(request):
return render(request, 'books.html', {})
@@ -344,11 +346,51 @@ def system(request):
for key in migration_info.keys():
migration_info[key]['total'] = len(migration_info[key]['unapplied_migrations']) + len(migration_info[key]['applied_migrations'])
api_stats = None
api_space_stats = None
# API endpoint logging
if settings.REDIS_HOST:
r = redis.StrictRedis(
host=settings.REDIS_HOST,
port=settings.REDIS_PORT,
password='',
username='',
db=settings.REDIS_DATABASES['STATS'],
)
api_stats = [['Endpoint', 'Total']]
api_space_stats = [['User', 'Total']]
total_stats = ['All', int(r.get('api:request-count'))]
for i in range(0, 6):
d = (date.today() - timedelta(days=i)).isoformat()
api_stats[0].append(d)
api_space_stats[0].append(d)
total_stats.append(int(r.get(f'api:request-count:{d}')) if r.get(f'api:request-count:{d}') else 0)
api_stats.append(total_stats)
for x in r.zrange('api:endpoint-request-count', 0, -1, withscores=True, desc=True):
endpoint = x[0].decode('utf-8')
endpoint_stats = [endpoint, x[1]]
for i in range(0, 6):
d = (date.today() - timedelta(days=i)).isoformat()
endpoint_stats.append(r.zscore(f'api:endpoint-request-count:{d}', endpoint))
api_stats.append(endpoint_stats)
for x in r.zrange('api:space-request-count', 0, 20, withscores=True, desc=True):
s = x[0].decode('utf-8')
space_stats = [Space.objects.get(pk=s).name, x[1]]
for i in range(0, 6):
d = (date.today() - timedelta(days=i)).isoformat()
space_stats.append(r.zscore(f'api:space-request-count:{d}', s))
api_space_stats.append(space_stats)
return render(
request, 'system.html', {
'gunicorn_media': settings.GUNICORN_MEDIA, 'debug': settings.DEBUG, 'postgres': postgres, 'postgres_version': postgres_ver, 'postgres_status': database_status,
'postgres_message': database_message, 'version_info': VERSION_INFO, 'plugins': PLUGINS, 'secret_key': secret_key, 'orphans': orphans, 'migration_info': migration_info,
'missing_migration': missing_migration, 'allowed_hosts': settings.ALLOWED_HOSTS,
'missing_migration': missing_migration, 'allowed_hosts': settings.ALLOWED_HOSTS, 'api_stats': api_stats, 'api_space_stats': api_space_stats
})

View File

@@ -1,8 +1,8 @@
Besides the normal django username and password authentication this application supports multiple
Besides the normal django username and password authentication this application supports multiple
methods of central account management and authentication.
## Allauth
[Django Allauth](https://django-allauth.readthedocs.io/en/latest/index.html) is an awesome project that
[Django Allauth](https://django-allauth.readthedocs.io/en/latest/index.html) is an awesome project that
allows you to use a [huge number](https://docs.allauth.org/en/latest/socialaccount/providers/index.html) of different
authentication providers.
@@ -11,8 +11,8 @@ They basically explain everything in their documentation, but the following is a
!!! warning "Public Providers"
If you choose Google, Github or any other publicly available service as your authentication provider anyone
with an account on that site can create an account on your installation.
A new account does not have any permission but it is still **not recommended** to give public access to
your installation.
A new account does not have any permission but it is still **not recommended** to give public access to
your installation.
Choose a provider from the [list](https://docs.allauth.org/en/latest/socialaccount/providers/index.html) and install it using the environment variable `SOCIAL_PROVIDERS` as shown
in the example below.
@@ -28,15 +28,15 @@ SOCIAL_PROVIDERS=allauth.socialaccount.providers.openid_connect,allauth.socialac
### Configuration, via environment
Depending on your authentication provider you **might need** to configure it.
This needs to be done through the settings system. To make the system flexible (allow multiple providers) and to
Depending on your authentication provider you **might need** to configure it.
This needs to be done through the settings system. To make the system flexible (allow multiple providers) and to
not require another file to be mounted into the container the configuration ins done through a single
environment variable. The downside of this approach is that the configuration needs to be put into a single line
as environment files loaded by docker compose don't support multiple lines for a single variable.
The line data needs to either be in json or as Python dictionary syntax.
Take the example configuration from the allauth docs, fill in your settings and then inline the whole object
Take the example configuration from the allauth docs, fill in your settings and then inline the whole object
(you can use a service like [www.freeformatter.com](https://www.freeformatter.com/json-formatter.html) for formatting).
Assign it to the additional `SOCIALACCOUNT_PROVIDERS` variable.
@@ -46,6 +46,13 @@ The example below is for a generic OIDC provider with PKCE enabled. Most values
SOCIALACCOUNT_PROVIDERS = "{ 'openid_connect': { 'OAUTH_PKCE_ENABLED': True, 'APPS': [ { 'provider_id': 'oidc', 'name': 'My-IDM', 'client_id': 'my_client_id', 'secret': 'my_client_secret', 'settings': { 'server_url': 'https://idm.example.com/oidc/recipes' } } ] } }"
```
Because this JSON contains sensitive data (client id and secret), you may instead choose to save the JSON in a file
and set the environment variable `SOCIALACCOUNT_PROVIDERS_FILE` to the path of the file containing the JSON.
```
SOCIALACCOUNT_PROVIDERS_FILE=/run/secrets/socialaccount_providers.txt
```
!!! success "Improvements ?"
There are most likely ways to achieve the same goal but with a cleaner or simpler system.
If you know such a way feel free to let me know.
@@ -81,7 +88,7 @@ SOCIALACCOUNT_PROVIDERS='{"openid_connect":{"APPS":[{"provider_id":"keycloak","n
You are now able to sign in using Keycloak after a restart of the service.
### Linking accounts
To link an account to an already existing normal user go to the settings page of the user and link it.
To link an account to an already existing normal user go to the settings page of the user and link it.
Here you can also unlink your account if you no longer want to use a social login method.
## LDAP
@@ -111,7 +118,7 @@ AUTH_LDAP_TLS_CACERTFILE=/etc/ssl/certs/own-ca.pem
If you just set `REMOTE_USER_AUTH=1` without any additional configuration, _anybody_ can authenticate with _any_ username!
!!! Info "Community Contributed Tutorial"
This tutorial was provided by a community member. We are not able to provide any support! Please only use, if you know what you are doing!
This tutorial was provided by a community member. We are not able to provide any support! Please only use, if you know what you are doing!
In order use external authentication (i.e. using a proxy auth like Authelia, Authentik, etc.) you will need to:

View File

@@ -1,4 +1,4 @@
This application features a very versatile import and export feature in order
This application features a very versatile import and export feature in order
to offer the best experience possible and allow you to freely choose where your data goes.
!!! WARNING "WIP"
@@ -12,7 +12,7 @@ Feel like there is an important integration missing? Just take a look at the [in
if your favorite one is missing.
!!! info "Export"
I strongly believe in everyone's right to use their data as they please and therefore want to give you
I strongly believe in everyone's right to use their data as they please and therefore want to give you
the best possible flexibility with your recipes.
That said for most of the people getting this application running with their recipes is the biggest priority.
Because of this importing as many formats as possible is prioritized over exporting.
@@ -21,50 +21,55 @@ if your favorite one is missing.
Overview of the capabilities of the different integrations.
| Integration | Import | Export | Images |
|--------------------| ------ | -- | ------ |
| Default | ✔️ | ✔️ | ✔️ |
| Nextcloud | ✔️ | ⌚ | ✔️ |
| Mealie | ✔️ | ⌚ | ✔️ |
| Chowdown | ✔️ | ⌚ | ✔️ |
| Safron | ✔️ | ✔️ | ❌ |
| Paprika | ✔️ | ⌚ | ✔️ |
| ChefTap | ✔️ | ❌ | ❌ |
| Pepperplate | ✔️ | ⌚ | ❌ |
| RecipeSage | ✔️ | ✔️ | ✔️ |
| Rezeptsuite.de | ✔️ | ❌ | ✔️ |
| Domestica | ✔️ | ⌚ | ✔️ |
| MealMaster | ✔️ | ❌ | ❌ |
| RezKonv | ✔️ | ❌ | ❌ |
| OpenEats | ✔️ | ❌ | ⌚ |
| Plantoeat | ✔️ | ❌ | |
| CookBookApp | ✔️ | ⌚ | ✔️ |
| CopyMeThat | ✔️ | ❌ | ✔️ |
| Melarecipes | ✔️ | ⌚ | ✔️ |
| Cookmate | ✔️ | ⌚ | ✔️ |
| PDF (experimental) | ⌚️ | ✔️ | ✔️ |
| ------------------ | ------ | ------ | ------ |
| Default | ✔️ | ✔️ | ✔️ |
| Nextcloud | ✔️ | ⌚ | ✔️ |
| Mealie | ✔️ | ⌚ | ✔️ |
| Chowdown | ✔️ | ⌚ | ✔️ |
| Safron | ✔️ | ✔️ | ❌ |
| Paprika | ✔️ | ⌚ | ✔️ |
| ChefTap | ✔️ | ❌ | ❌ |
| Pepperplate | ✔️ | ⌚ | ❌ |
| RecipeSage | ✔️ | ✔️ | ✔️ |
| Rezeptsuite.de | ✔️ | ❌ | ✔️ |
| Domestica | ✔️ | ⌚ | ✔️ |
| MealMaster | ✔️ | ❌ | ❌ |
| RezKonv | ✔️ | ❌ | ❌ |
| OpenEats | ✔️ | ❌ | ⌚ |
| Plantoeat | ✔️ | ❌ | ✔ |
| CookBookApp | ✔️ | ⌚ | ✔️ |
| CopyMeThat | ✔️ | ❌ | ✔️ |
| Melarecipes | ✔️ | ⌚ | ✔️ |
| Cookmate | ✔️ | ⌚ | ✔️ |
| PDF (experimental) | ⌚️ | ✔️ | ✔️ |
| Gourmet | ✔️ | ❌ | ✔️ |
✔️ = implemented, ❌ = not implemented and not possible/planned, ⌚ = not yet implemented
## Default
The default integration is the built in (and preferred) way to import and export recipes.
It is maintained with new fields added and contains all data to transfer your recipes from one installation to another.
It is also one of the few recipe formats that is actually structured in a way that allows for
easy machine readability if you want to use the data for any other purpose.
It is also one of the few recipe formats that is actually structured in a way that allows for
easy machine readability if you want to use the data for any other purpose.
## RecipeSage
Go to Settings > Export Recipe Data and select `EXPORT AS JSON-LD (BEST)`. Then simply upload the exported file
Go to Settings > Export Recipe Data and select `EXPORT AS JSON-LD (BEST)`. Then simply upload the exported file
to Tandoor.
The RecipeSage integration also allows exporting. To migrate from Tandoor to RecipeSage simply export with Recipe Sage
The RecipeSage integration also allows exporting. To migrate from Tandoor to RecipeSage simply export with Recipe Sage
selected and import the json file in RecipeSage. Images are currently not supported for exporting.
## Domestica
Go to Import/Export and select `Export Recipes`. Then simply upload the exported file
Go to Import/Export and select `Export Recipes`. Then simply upload the exported file
to Tandoor.
## Nextcloud
Importing recipes from Nextcloud cookbook is very easy and since Nextcloud Cookbook provides nice, standardized and
Importing recipes from Nextcloud cookbook is very easy and since Nextcloud Cookbook provides nice, standardized and
structured information most of your recipe is going to be intact.
Follow these steps to import your recipes
@@ -77,10 +82,9 @@ Follow these steps to import your recipes
You will get a `Recipes.zip` file. Simply upload the file and choose the Nextcloud Cookbook type.
!!! WARNING "Folder Structure"
Importing only works if the folder structure is correct. If you do not use the standard path or create the
zip file in any other way make sure the structure is as follows
```
Recipes.zip/
Importing only works if the folder structure is correct. If you do not use the standard path or create the
zip file in any other way make sure the structure is as follows
` Recipes.zip/
└── Recipes/
├── Recipe1/
│ ├── recipe.json
@@ -88,27 +92,29 @@ You will get a `Recipes.zip` file. Simply upload the file and choose the Nextclo
└── Recipe2/
├── recipe.json
└── full.jpg
```
`
## Mealie
Mealie provides structured data similar to nextcloud.
To migrate your recipes
Mealie provides structured data similar to nextcloud.
To migrate your recipes
1. Go to your Mealie settings and create a new Backup.
2. Download the backup by clicking on it and pressing download (this wasn't working for me, so I had to manually pull it from the server).
3. Upload the entire `.zip` file to the importer page and import everything.
## Chowdown
Chowdown stores all your recipes in plain text markdown files in a directory called `_recipes`.
Chowdown stores all your recipes in plain text markdown files in a directory called `_recipes`.
Images are saved in a directory called `images`.
In order to import your Chowdown recipes simply create a `.zip` file from those two folders and import them.
In order to import your Chowdown recipes simply create a `.zip` file from those two folders and import them.
The folder structure should look as follows
!!! info "_recipes"
For some reason chowdown uses `_` before the `recipes` folder. To avoid confusion the import supports both
`_recipes` and `recipes`
For some reason chowdown uses `_`before the`recipes`folder. To avoid confusion the import supports both
`\_recipes`and`recipes`
```
Recipes.zip/
@@ -123,31 +129,35 @@ Recipes.zip/
```
## Safron
Go to your safron settings page and export your recipes.
Then simply upload the entire `.zip` file to the importer.
!!! warning "Images"
Safron exports do not contain any images. They will be lost during import.
Safron exports do not contain any images. They will be lost during import.
## Paprika
A Paprika export contains a folder with a html representation of your recipes and a `.paprikarecipes` file.
The `.paprikarecipes` file is basically just a zip with gzipped contents. Simply upload the whole file and import
all your recipes.
The `.paprikarecipes` file is basically just a zip with gzipped contents. Simply upload the whole file and import
all your recipes.
## Pepperplate
Pepperplate provides a `.zip` file containing all of your recipes as `.txt` files. These files are well-structured and allow
the import of all data without losing anything.
Simply export the recipes from Pepperplate and upload the zip to Tandoor. Images are not included in the export and
Simply export the recipes from Pepperplate and upload the zip to Tandoor. Images are not included in the export and
thus cannot be imported.
## ChefTap
ChefTaps allows you to export your recipes from the app (I think). The export is a zip file containing a folder called
`cheftap_export` which in turn contains `.txt` files with your recipes.
This format is basically completely unstructured and every export looks different. This makes importing it very hard
and leads to suboptimal results. Images are also not supported as they are not included in the export (at least
and leads to suboptimal results. Images are also not supported as they are not included in the export (at least
the tests I had).
Usually the import should recognize all ingredients and put everything else into the instructions. If your import fails
@@ -156,31 +166,36 @@ or is worse than this feel free to provide me with more example data and I can t
As ChefTap cannot import these files anyway there won't be an exporter implemented in Tandoor.
## MealMaster
Meal master can be imported by uploading one or more meal master files.
The files should either be `.txt`, `.MMF` or `.MM` files.
Meal master can be imported by uploading one or more meal master files.
The files should either be `.txt`, `.MMF` or `.MM` files.
The MealMaster spec allows for many variations. Currently, only the one column format for ingredients is supported.
Second line notes to ingredients are currently also not imported as a note but simply put into the instructions.
If you have MealMaster recipes that cannot be imported feel free to raise an issue.
## RezKonv
The RezKonv format is primarily used in the german recipe manager RezKonv Suite.
The RezKonv format is primarily used in the german recipe manager RezKonv Suite.
To migrate from RezKonv Suite to Tandoor select `Export > Gesamtes Kochbuch exportieren` (the last option in the export menu).
The generated file can simply be imported into Tandoor.
As I only had limited sample data feel free to open an issue if your RezKonv export cannot be imported.
## Recipekeeper
Recipe keeper allows you to export a zip file containing recipes and images using its apps.
Recipe keeper allows you to export a zip file containing recipes and images using its apps.
This zip file can simply be imported into Tandoor.
## OpenEats
OpenEats does not provide any way to export the data using the interface. Luckily it is relatively easy to export it from the command line.
You need to run the command `python manage.py dumpdata recipe ingredient` inside of the application api container.
If you followed the default installation method you can use the following command `docker-compose -f docker-prod.yml run --rm --entrypoint 'sh' api ./manage.py dumpdata recipe ingredient`.
This command might also work `docker exec -it openeats_api_1 ./manage.py dumpdata recipe ingredient rating recipe_groups > recipe_ingredients.json`
Store the outputted json string in a `.json` file and simply import it using the importer. The file should look something like this
```json
[
{
@@ -231,30 +246,44 @@ CookBookApp can export .zip files containing .html files. Upload the entire ZIP
CopyMeThat can export .zip files containing an `.html` file as well as a folder containing all the images. Upload the entire ZIP to Tandoor to import all included recipes.
## Cookmate
Cookmate allows you to export a `.mcb` file which you can simply upload to tandoor and import all your recipes.
## RecetteTek
RecetteTek exports are `.rtk` files which can simply be uploaded to tandoor to import all your recipes.
RecetteTek exports are `.rtk` files which can simply be uploaded to tandoor to import all your recipes.
## Rezeptsuite.de
Rezeptsuite.de exports are `.xml` files which can simply be uploaded to tandoor to import all your recipes.
It appears that Reptsuite, depending on the client, might export a `.zip` file containing a `.cml` file.
If this happens just unzip the zip file and change `.cml` to `.xml` to import your recipes.
If this happens just unzip the zip file and change `.cml` to `.xml` to import your recipes.
## Melarecipes
Melarecipes provides multiple export formats but only the `MelaRecipes` format can export the complete collection.
Perform this export and open the `.melarecipes` file using your favorite archive opening program (e.g 7zip).
Perform this export and open the `.melarecipes` file using your favorite archive opening program (e.g 7zip).
Repeat this if the file contains another `.melarecipes` file until you get a list of one or many `.melarecipe` files.
Upload all `.melarecipe` files you want to import to tandoor and start the import.
## PDF
The PDF Exporter is an experimental feature that uses the puppeteer browser renderer to render each recipe and export it to PDF.
For that to work it downloads a chromium binary of about 140 MB to your server and then renders the PDF files using that.
The PDF Exporter is an experimental feature that uses the puppeteer browser renderer to render each recipe and export it to PDF.
For that to work it downloads a chromium binary of about 140 MB to your server and then renders the PDF files using that.
Since that is something some server administrators might not want there the PDF exporter is disabled by default and can be enabled with `ENABLE_PDF_EXPORT=1` in `.env`.
See [this issue](https://github.com/TandoorRecipes/recipes/pull/1211) for more discussion on this and
See [this issue](https://github.com/TandoorRecipes/recipes/pull/1211) for more discussion on this and
[this issue](https://github.com/TandoorRecipes/recipes/issues/781) for the future plans to support server side rendering.
## Gourmet
An importer for files from [Gourmet](https://github.com/thinkle/gourmet/). As the `.grmt` files appears to lack the unit for ingredients
a file with `.zip` file with `.htm` and `.jpg`is expected.
To generate the file export to 'html' in Gourmet and zip the folder generated.
The import of menues is not supported
Export is not supported due to problems with `.grmt` format.

View File

@@ -3,8 +3,7 @@
These instructions are inspired from a standard django/gunicorn/postgresql instructions ([for example](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04))
!!! warning
Be sure to use python 3.9 at least and pip related to python 3.9 at least. Depending on your distribution calling `python` or `pip` will use python2 instead of python 3.9. As of writing this documentation 3.10 is available as well.
Make sure your machine got at least 2048 MB memory, otherwise the yarn build will fail with `FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory`.
Make sure to use at least Python 3.10 (although 3.12 is preferred) or higher, and ensure that `pip` is associated with Python 3. Depending on your system configuration, using `python` or `pip` might default to Python 2. Make sure your machine has at least 2048 MB of memory; otherwise, the `yarn build` process may fail with the error: `FATAL ERROR: Reached heap limit - Allocation failed: JavaScript heap out of memory`.
## Prerequisites

View File

@@ -354,7 +354,7 @@ SOCIAL_PROVIDERS = allauth.socialaccount.providers.github, allauth.socialaccount
Allow authentication via the REMOTE-USER header (can be used for e.g. authelia).
!!! danger
Leave off if you don't know what you are doing! Enabling this without proper configuration will enable anybody
Leave off if you don't know what you are doing! Enabling this without proper configuration will enable anybody
to login with any username!
```
@@ -377,6 +377,14 @@ AUTH_LDAP_TLS_CACERTFILE=
AUTH_LDAP_START_TLS=
```
Instead of passing the LDAP password directly through the environment variable `AUTH_LDAP_BIND_PASSWORD`,
you can set the password in a file and set the environment variable `AUTH_LDAP_BIND_PASSWORD_FILE`
to the path of the file containing the ldap secret.
```
AUTH_LDAP_BIND_PASSWORD_FILE=/run/secrets/ldap_password.txt
```
### External Services
#### Email
@@ -396,6 +404,14 @@ EMAIL_USE_SSL=0
DEFAULT_FROM_EMAIL=
```
Instead of passing the email password directly through the environment variable `EMAIL_HOST_PASSWORD`,
you can set the password in a file and set the environment variable `EMAIL_HOST_PASSWORD_FILE`
to the path of the file containing the ldap secret.
```
EMAIL_HOST_PASSWORD_FILE=/run/secrets/email_password.txt
```
Optional settings (only copy the ones you need)
```
@@ -500,6 +516,18 @@ Set to `1` to enable additional query output on the search page.
SQL_DEBUG=0
```
#### Application Log Level
> default `WARNING` - options: [see Django Docs](https://docs.djangoproject.com/en/5.0/topics/logging/#loggers)
Increase or decrease the logging done by application.
Please set to `DEBUG` when making a bug report.
```
LOG_LEVEL="DEBUG"
```
#### Gunicorn Log Level
> default `info` - options: [see Gunicorn Docs](https://docs.gunicorn.org/en/stable/settings.html#loglevel)
@@ -549,7 +577,7 @@ STICKY_NAV_PREF_DEFAULT=1
> default `100` - options: `0-X`
The default for the number of spaces a user can own. By setting to 0 space creation for users will be disabled.
The default for the number of spaces a user can own. By setting to 0 space creation for users will be disabled.
Superusers can always bypass this limit.
```
@@ -574,7 +602,7 @@ TZ=Europe/Berlin
#### Default Theme
> default `0` - options `1-X` (space ID)
Tandoors appearance can be changed on a user and space level but unauthenticated users always see the tandoor default style.
Tandoors appearance can be changed on a user and space level but unauthenticated users always see the tandoor default style.
With this setting you can specify the ID of a space of which the appearance settings should be applied if a user is not logged in.
```
@@ -621,7 +649,7 @@ DRF_THROTTLE_RECIPE_URL_IMPORT=60/hour
#### Default Space Limits
You might want to limit how many resources a user might create. The following settings apply automatically to newly
created spaces. These defaults can be changed in the admin view after a space has been created.
created spaces. These defaults can be changed in the admin view after a space has been created.
If unset, all settings default to unlimited/enabled

View File

@@ -8,6 +8,7 @@ server {
# serve media files
location /media/ {
alias /media/;
add_header Content-Disposition 'attachment; filename="$args"';
}
# pass requests for dynamic content to gunicorn
location / {

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,90 +37,102 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr ""
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr ""
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -36,90 +36,102 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr ""
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr ""
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -36,90 +36,102 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr ""
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr ""
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,90 +37,102 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr ""
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr ""
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -36,90 +36,102 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr ""
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr ""
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 17:43+0200\n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -36,92 +36,104 @@ msgstr ""
msgid "You do not have the required module to view this page!"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Recipe Keyword"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Meal Plan"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Shopping"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:35
#: .\recipes\plugins\enterprise_plugin\models.py:32
msgid "Book"
msgstr ""
#: .\recipes\settings.py:461
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "start"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "center"
msgstr ""
#: .\recipes\plugins\enterprise_plugin\models.py:37
msgid "end"
msgstr ""
#: .\recipes\settings.py:478
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:462
#: .\recipes\settings.py:479
msgid "Bulgarian"
msgstr ""
#: .\recipes\settings.py:463
#: .\recipes\settings.py:480
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:464
#: .\recipes\settings.py:481
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:465
#: .\recipes\settings.py:482
msgid "Danish"
msgstr ""
#: .\recipes\settings.py:466
#: .\recipes\settings.py:483
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:467
#: .\recipes\settings.py:484
msgid "English"
msgstr "Englisch"
#: .\recipes\settings.py:468
#: .\recipes\settings.py:485
msgid "French"
msgstr ""
#: .\recipes\settings.py:469
#: .\recipes\settings.py:486
msgid "German"
msgstr "Deutsch"
#: .\recipes\settings.py:470
#: .\recipes\settings.py:487
msgid "Hungarian"
msgstr ""
#: .\recipes\settings.py:471
#: .\recipes\settings.py:488
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:472
#: .\recipes\settings.py:489
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:473
#: .\recipes\settings.py:490
msgid "Norwegian "
msgstr ""
#: .\recipes\settings.py:474
#: .\recipes\settings.py:491
#, fuzzy
#| msgid "English"
msgid "Polish"
msgstr "Englisch"
#: .\recipes\settings.py:475
#: .\recipes\settings.py:492
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:476
#: .\recipes\settings.py:493
msgid "Spanish"
msgstr ""
#: .\recipes\settings.py:477
#: .\recipes\settings.py:494
msgid "Swedish"
msgstr ""

Some files were not shown because too many files have changed in this diff Show More