Compare commits

...

134 Commits

Author SHA1 Message Date
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
54 changed files with 7549 additions and 1930 deletions

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

@@ -31,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.
@@ -39,7 +48,8 @@ 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

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,6 +13,8 @@ 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")
@@ -38,18 +40,20 @@ class HomeAssistant(Connector):
item, description = _format_shopping_list_entry(shopping_list_entry)
self._logger.debug(f"adding {item=}")
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"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:
@@ -60,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)
self._logger.debug(f"removing {item=}")
self._logger.debug(f"removing {item=} from {self._config.todo_entity}")
data = {
"entity_id": self._config.todo_entity,
@@ -76,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"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

@@ -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):
@@ -182,6 +183,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 +205,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 = {

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

@@ -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

@@ -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

@@ -84,6 +84,11 @@ 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)
@@ -91,6 +96,10 @@ class Paprika(Integration):
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

@@ -15,10 +15,10 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-31 13:05+0000\n"
"Last-Translator: vabene1111 <vabene1234@googlemail.com>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/de/>\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"
@@ -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"
@@ -2504,16 +2507,12 @@ msgid "Filter for entries with the given recipe"
msgstr "Filter für Einträge mit dem angegebenen Rezept"
#: .\cookbook\views\api.py:1292
#, 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 ""
"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:1415
msgid "Nothing to do."
@@ -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

@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+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"
"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"

View File

@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-07-28 08:38+0000\n"
"Last-Translator: dudu dor <dudpon@gmail.com>\n"
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/he/>\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 5.4.2\n"
"X-Generator: Weblate 5.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -62,15 +62,15 @@ 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 "השאר ריק עבור dropbox והכנס סיסמאת יישום עבור nextcloud."
msgstr "השאר ריק עבור Dropbox והכנס סיסמא עבור NextCloud."
#: .\cookbook\forms.py:154
msgid "Leave empty for nextcloud and enter api token for dropbox."
msgstr "השאר ריק עבור nextcloud והכנס טוקן API עבור dropbox."
msgstr "השאר ריק עבור NextCloud והכנס טוקן API עבור Dropbox."
#: .\cookbook\forms.py:160
msgid ""
@@ -149,6 +149,7 @@ msgid ""
"Use fuzzy matching on units, keywords and ingredients when editing and "
"importing recipes."
msgstr ""
"השתמש בהתאמה גמישה ליחידות, מילות מפתח ורכיבים בעת עריכה וייבוא מתכונים."
#: .\cookbook\forms.py:342
msgid ""
@@ -237,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."
@@ -441,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"
@@ -526,7 +527,7 @@ msgstr ""
#: .\cookbook\models.py:1504
msgid "Food"
msgstr ""
msgstr "אוכל"
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
msgid "Keyword"
@@ -546,7 +547,7 @@ msgstr ""
#: .\cookbook\serializer.py:1270
msgid "Hello"
msgstr ""
msgstr "שלום"
#: .\cookbook\serializer.py:1270
msgid "You have been invited by "
@@ -567,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"
@@ -610,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."
@@ -626,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
@@ -641,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:"
@@ -653,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 ""
@@ -689,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?"
@@ -702,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
@@ -716,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
@@ -729,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
@@ -741,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
@@ -749,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?"
@@ -758,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"
@@ -772,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?"
@@ -791,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?"
@@ -846,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
@@ -900,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"
@@ -920,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"
@@ -945,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"
@@ -970,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"
@@ -978,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"
@@ -1012,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"
@@ -1070,7 +1071,7 @@ msgstr ""
#: .\cookbook\templates\batch\monitor.html:29
msgid "Show Recipes"
msgstr ""
msgstr "הראה מתכונים"
#: .\cookbook\templates\batch\monitor.html:30
msgid "Show Log"
@@ -1111,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"
@@ -1128,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"
@@ -1162,7 +1163,7 @@ msgstr ""
#: .\cookbook\templates\generic\table_template.html:98
msgid "next"
msgstr ""
msgstr "הבא"
#: .\cookbook\templates\history.html:20
msgid "View Log"
@@ -1175,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"
@@ -1356,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."
@@ -1365,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 ""
@@ -1380,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 ""
@@ -1395,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"
@@ -1422,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 ""
@@ -1438,7 +1439,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:19
msgid "Search Methods"
msgstr ""
msgstr "שיטות חיפוש"
#: .\cookbook\templates\search_info.html:23
msgid ""
@@ -1521,7 +1522,7 @@ msgstr ""
#: .\cookbook\templates\search_info.html:69
msgid "Search Fields"
msgstr ""
msgstr "שדות חיפוש"
#: .\cookbook\templates\search_info.html:73
msgid ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -13,16 +13,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+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"
"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 ""
@@ -306,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"
@@ -476,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
@@ -570,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."
@@ -630,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 ""
@@ -1432,7 +1432,7 @@ msgid ""
"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."
@@ -1843,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"
@@ -2397,24 +2397,30 @@ msgstr "Een waardering van een recept gaat van 0 tot 5."
#: .\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: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: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: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: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:927 .\cookbook\views\api.py:928
msgid "If only internal recipes should be returned. [true/<b>false</b>]"

View File

@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2023-05-01 07:55+0000\n"
"Last-Translator: axeron2036 <admin@axeron2036.ru>\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"

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-03-11 13:02+0000\n"
"Last-Translator: Kn <kn@users.noreply.translate.tandoor.dev>\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"

View File

@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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"
"PO-Revision-Date: 2024-11-22 07:58+0000\n"
"Last-Translator: Oleh Hudyma <oleg.hudymaa@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.6.2\n"
#: .\cookbook\forms.py:45
msgid ""
@@ -36,47 +36,51 @@ 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 ""

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
"PO-Revision-Date: 2024-02-15 03:19+0000\n"
"Last-Translator: dalan <xzdlj@outlook.com>\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,24 +2085,28 @@ 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"
@@ -2184,17 +2180,15 @@ msgstr "{obj.name} 已添加到购物清单中。"
#: .\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 ""
msgstr "指定结束日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
#: .\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。 对于多个重复参数。"
msgstr "指定 MealType ID 以过滤膳食计划,重复参数以选择多个对象。"
#: .\cookbook\views\api.py:872
msgid "ID of recipe a step is part of. For multiple repeat parameter."
@@ -2341,17 +2335,13 @@ msgid ""
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
#: .\cookbook\views\api.py:1125
#, 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 ""
"在选中时筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]<br> - 最近包括未"
"选中的项目和最近完成的项目。"
"勾选并筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]"
"<br> - 最近包括未选中的项目和最近完成的项目。"
#: .\cookbook\views\api.py:1128
msgid "Returns the shopping list entries sorted by supermarket category order."
@@ -2359,17 +2349,13 @@ msgstr "返回按超市分类排序的购物清单列表。"
#: .\cookbook\views\api.py:1210
msgid "Filter for entries with the given recipe"
msgstr ""
msgstr "筛选包含所选食谱的对象"
#: .\cookbook\views\api.py:1292
#, 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 "返回主键为 id 的购物清单条目。 允许多个值。"
msgstr "返回与自动化类型相匹配的自动化条目。 允许多个值。"
#: .\cookbook\views\api.py:1415
msgid "Nothing to do."
@@ -2393,7 +2379,7 @@ msgstr "找不到可用的数据。"
#: .\cookbook\views\api.py:1549
msgid "File is above space limit"
msgstr ""
msgstr "文件大小超出空间限值"
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
msgid "Importing is not implemented for this provider"
@@ -2403,7 +2389,7 @@ msgstr "此提供程序未实现导入"
#: .\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:1671
msgid "Sync successful!"
@@ -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

@@ -427,7 +427,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',)

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

@@ -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

@@ -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

@@ -12,6 +12,7 @@ from json import JSONDecodeError
from urllib.parse import unquote
from zipfile import ZipFile
import redis
import requests
from PIL import UnidentifiedImageError
from annoying.decorators import ajax_request
@@ -30,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
@@ -101,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):
@@ -184,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')
@@ -370,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
@@ -394,14 +439,14 @@ 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 & CustomIsGuest | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
@@ -411,7 +456,7 @@ class SpaceViewSet(viewsets.ModelViewSet):
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]
@@ -434,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]
@@ -445,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
@@ -455,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]
@@ -464,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]
@@ -473,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]
@@ -483,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
@@ -494,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
@@ -505,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]
@@ -516,7 +561,7 @@ 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
@@ -524,7 +569,7 @@ class KeywordViewSet(viewsets.ModelViewSet, TreeMixin):
pagination_class = DefaultPagination
class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
class UnitViewSet(LoggingMixin, viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
queryset = Unit.objects
model = Unit
serializer_class = UnitSerializer
@@ -532,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]
@@ -543,7 +588,7 @@ 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
@@ -610,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})
@@ -680,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]
@@ -698,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
@@ -724,7 +769,7 @@ class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
return queryset
class MealPlanViewSet(viewsets.ModelViewSet):
class MealPlanViewSet(LoggingMixin, viewsets.ModelViewSet):
"""
list:
optional parameters
@@ -762,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)
@@ -824,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.
@@ -838,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]
@@ -862,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]
@@ -897,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
@@ -1064,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]
@@ -1081,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]
@@ -1090,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]
@@ -1099,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]
@@ -1110,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]
@@ -1123,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()
@@ -1171,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
@@ -1189,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]
@@ -1200,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]
@@ -1215,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]
@@ -1225,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]
@@ -1235,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]
@@ -1250,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
@@ -1262,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
@@ -1313,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]
@@ -1331,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]
@@ -1342,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]
@@ -1458,16 +1503,16 @@ class RecipeUrlImportView(APIView):
data = "<script type='application/ld+json'>" + json.dumps(data_json) + "</script>"
except JSONDecodeError:
pass
scrape = scrape_html(html=data, org_url=url, supported_only=False)
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(text=data, url=found_url, supported_only=False)
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))),
},
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)
@@ -1678,7 +1723,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

@@ -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

@@ -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 Python 3.10 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)
```
@@ -561,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.
```
@@ -586,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.
```
@@ -633,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

@@ -126,6 +126,14 @@ PRIVACY_URL = os.getenv('PRIVACY_URL', '')
IMPRINT_URL = os.getenv('IMPRINT_URL', '')
HOSTED = bool(int(os.getenv('HOSTED', False)))
REDIS_HOST = os.getenv('REDIS_HOST', None)
REDIS_PORT = int(os.getenv('REDIS_PORT', 6379))
REDIS_USERNAME = os.getenv('REDIS_USERNAME', None)
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', None)
REDIS_DATABASES = {
'STATS': 0
}
MESSAGE_TAGS = {messages.ERROR: 'danger'}
# Application definition

View File

@@ -1,8 +1,8 @@
Django==4.2.15
cryptography===42.0.5
Django==4.2.16
cryptography===43.0.1
django-annoying==0.10.6
django-cleanup==8.0.0
django-crispy-forms==2.1
django-crispy-forms==2.3
crispy-bootstrap4==2024.1
django-tables2==2.7.0
djangorestframework==3.15.2
@@ -11,17 +11,17 @@ django-oauth-toolkit==2.4.0
django-debug-toolbar==4.3.0
bleach==6.0.0
gunicorn==22.0.0
lxml==5.1.0
lxml==5.3.0
Markdown==3.5.1
Pillow==10.3.0
Pillow==10.4.0
psycopg2-binary==2.9.9
python-dotenv==1.0.0
requests==2.32.0
requests==2.32.3
six==1.16.0
webdavclient3==3.14.6
whitenoise==6.6.0
whitenoise==6.7.0
icalendar==5.0.11
pyyaml==6.0.1
pyyaml==6.0.2
uritemplate==4.1.1
beautifulsoup4==4.12.3
microdata==0.8.0
@@ -30,10 +30,10 @@ Jinja2==3.1.4
django-webpack-loader==3.0.1
git+https://github.com/BITSOLVER/django-js-reverse@071e304fd600107bc64bbde6f2491f1fe049ec82
django-allauth==0.61.1
recipe-scrapers==15.0.0
recipe-scrapers==15.2.1
django-scopes==2.0.0
django-treebeard==4.7
django-cors-headers==4.3.1
django-cors-headers==4.6.0
django-storages==1.14.2
boto3==1.28.75
django-prometheus==2.2.0
@@ -41,9 +41,10 @@ django-hCaptcha==0.2.0
python-ldap==3.4.4
django-auth-ldap==4.6.0
pyppeteer==2.0.0
pytube==15.0.0
aiohttp==3.10.2
pytubefix==8.5.1
aiohttp==3.10.11
inflection==0.5.1
redis==5.2.0
# Development
pytest==8.0.0
@@ -54,5 +55,5 @@ pytest-html==4.1.1
pytest-asyncio==0.23.5
pytest-xdist==3.6.1
autopep8==2.0.4
flake8==6.1.0
flake8==7.1.1
yapf==0.40.2

View File

@@ -534,5 +534,39 @@
"Transpose_Words": "Omstil ord",
"Name_Replace": "Erstat navn",
"Food_Replace": "Erstat ingrediens",
"Unit_Replace": "Erstat enhed"
"Unit_Replace": "Erstat enhed",
"Properties_Food_Unit": "Egenskaber Ingrediens Enhed",
"err_importing_recipe": "Der opstod en fejl under importeringen af opskriften!",
"Properties_Food_Amount": "Egenskaber Ingrediens Mængde",
"FDC_Search": "FDC søgning",
"Calculator": "Lommeregner",
"Undo": "Fortryd",
"NoMoreUndo": "Ingen ændringer at fortryde.",
"Input": "Input",
"Delete_All": "Slet alle",
"CustomNavLogoHelp": "Upload et billede til brug som navigationsbarrelogo.",
"ShowRecentlyCompleted": "Vis nyligt gennemførte emner",
"ShoppingBackgroundSyncWarning": "Dårligt netværk, afventer synkronisering ...",
"CustomTheme": "Personaliseret tema",
"CustomThemeHelp": "Overskriv det valgte temas stil ved at uploade en personlig CSS-fil.",
"property_type_fdc_hint": "Kun egenskabstyper med et FDC ID kan automatisk trække data fra FDC databasen",
"Property_Editor": "Egenskabsredaktør",
"us_cup": "cup (US, volumen)",
"Show_Logo_Help": "Vis Tandoor eller område-logo i navigationsbarre.",
"Nav_Text_Mode": "Navigation textmodus",
"Nav_Text_Mode_Help": "Opfører sig forskelligt for hvert tema.",
"Shopping_input_placeholder": "Fx kartoffel/100 kartofler/100g kartofler",
"CustomImageHelp": "Upload et billede for at vise dets plade i område-oversigten.",
"CustomLogoHelp": "Upload kvadratiske billeder i forskellige størrelser for at ændre logoet i browser-faneblad og installeret web-app.",
"CustomLogos": "Personlige logoer",
"Updated": "Opdateret",
"Unchanged": "Uændret",
"Error": "Fejl",
"Logo": "Logo",
"Show_Logo": "Vis logo",
"Space_Cosmetic_Settings": "Visse kosmetiske indstillinger kan ændres af område-administratorer og vil overskrive klient-indstillinger for pågældende område.",
"Enable": "Aktiver",
"created_by": "Skabt af",
"Created": "Skabt",
"DefaultPage": "Startside"
}

View File

@@ -21,7 +21,7 @@
"Calories": "Kalorien",
"Energy": "Energie",
"Nutrition": "Nährwerte",
"Keywords": "Stichwörter",
"Keywords": "Schlagwörter",
"Books": "Kochbücher",
"show_only_internal": "Nur interne Rezepte anzeigen",
"Ingredients": "Zutaten",
@@ -114,7 +114,7 @@
"Create_New_Shopping Category": "Neue Einkaufskategorie erstellen",
"Automate": "Automatisieren",
"Type": "Typ",
"and_up": "& hoch",
"and_up": "& auf",
"Unrated": "Unbewertet",
"Shopping_list": "Einkaufsliste",
"step_time_minutes": "Schritt Dauer in Minuten",
@@ -284,7 +284,7 @@
"copy_markdown_table": "Als Markdown-Tabelle kopieren",
"in_shopping": "In Einkaufsliste",
"DelayUntil": "Verzögerung bis",
"QuickEntry": "Einfach",
"QuickEntry": "Schnelleintrag",
"shopping_add_onhand": "Automatisch vorrätig",
"related_recipes": "Ähnliche Rezepte",
"today_recipes": "Rezepte des Tages",
@@ -358,9 +358,9 @@
"paste_ingredients": "Zutaten einfügen",
"Ingredient Editor": "Zutateneditor",
"Protected": "Geschützt",
"not": "nicht",
"not": "kein",
"warning_duplicate_filter": "Warnung: Wegen technischen Limitierungen können mehrere Filter der selben Kombination (und/oder/nicht) zu unerwarteten Ergebnissen führen.",
"and_down": "& Runter",
"and_down": "& ab",
"enable_expert": "Expertenmodus aktivieren",
"filter_name": "Filtername",
"shared_with": "geteilt mit",
@@ -415,7 +415,7 @@
"Invites": "Einladungen",
"Message": "Nachricht",
"Bookmarklet": "Lesezeichen",
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen.",
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittel teilen, gelten als Alternativen.",
"substitute_children": "Ersatzkinder",
"Decimals": "Nachkommastellen",
"Default_Unit": "Standardeinheit",
@@ -518,7 +518,7 @@
"show_step_ingredients_setting_help": "Fügen Sie neben den Rezeptschritten eine Zutatentabelle hinzu. Gilt zum Zeitpunkt der Erstellung. Kann in der Ansicht „Rezept bearbeiten“ überschrieben werden.",
"show_step_ingredients": "Schritt \"Zutaten\" anzeigen",
"hide_step_ingredients": "Schritt Zutaten ausblenden",
"OrderInformation": "Die Objekte sind von kleinen zu großen Zahlen geordnet.",
"OrderInformation": "Objekte werden von kleiner bis großer Anzahl geordnet.",
"show_ingredients_table": "Zeige eine Tabelle der Zutaten neben der Schrittbeschreibung",
"make_now_count": "Öfters fehlende Zutaten",
"fluid_ounce": "\"Fluid Ounce\" [fl oz] (US, Volumen)",
@@ -534,7 +534,7 @@
"Transpose_Words": "Wörter Umwandeln",
"Never_Unit": "Nie Einheit",
"Unit_Replace": "Einheit Ersetzen",
"quart": "\"Viertel\" [qt] (US, Volumen)",
"quart": "Viertel [qt] (US, Volumen)",
"imperial_quart": "Engl. \"Quart\" [imp qt] (UK, Volumen)",
"err_importing_recipe": "Es trat ein Fehler auf beim importieren des Rezepts!",
"property_type_fdc_hint": "Nur Eigenschaftstypen mit einer FDC-ID können automatisch Daten aus der FDC-Datenbank beziehen",
@@ -570,5 +570,6 @@
"DefaultPage": "Standardseite",
"Shopping_input_placeholder": "z.B. Kartoffeln/ 100 Kartoffeln/ 100 g Kartoffeln",
"Created": "Erstellt",
"Updated": "Aktualisiert"
"Updated": "Aktualisiert",
"us_cup": "Tasse (US, Volumen)"
}

View File

@@ -517,5 +517,56 @@
"imperial_gallon": "αυτοκρατορικό γαλόνι [imp gal] (Ηνωμένο Βασίλειο, όγκος)",
"imperial_tbsp": "αυτοκρατορικό κουτάλι της σούπας [imp tbsp] (Ηνωμένο Βασίλειο, όγκος)",
"Choose_Category": "Επιλογή κατηγορίας",
"Back": "Πίσω"
"Back": "Πίσω",
"Calculator": "Υπολογιστής",
"us_cup": "φλιτζάνι (ΗΠΑ, όγκος)",
"Created": "Δημιουργήθηκε",
"Logo": "Λογότυπο",
"Nav_Text_Mode_Help": "Συμπεριφέρεται διαφορετικά για κάθε θέμα.",
"Properties_Food_Amount": "Ιδιότητες Ποσότητα Φαγητού",
"show_step_ingredients": "Εμφάνιση των συστατικών του βήματος",
"make_now_count": "Το πολύ να λείπουν συστατικά",
"Error": "Σφάλμα",
"Nav_Text_Mode": "Λειτουγία κειμένου πλοήγησης",
"Input": "Εισαγογή",
"Undo": "Ανέρεση",
"NoMoreUndo": "Δεν υπάρχουν αλλαγές για ανέρεση.",
"Delete_All": "Διαγραφή όλων",
"created_by": "Δημιουργήθηκε από",
"CustomLogoHelp": "Ανεβάστε τετράγωνες εικόνες σε διαφορετικά μεγέθη για αλλαγή σε λογότυπο στην καρτέλα του προγράμματος περιήγησης και στο εγκατεστημένο Web App.",
"CustomNavLogoHelp": "Μεταφορτώστε μια εικόνα για χρήση ως λογότυπο της γραμμής πλοήγησης.",
"ShowRecentlyCompleted": "Πρόσφατα αντικείμενα που ολοκληρώθηκαν",
"ShoppingBackgroundSyncWarning": "Κακό δίκτυο, αναμονή συγχρονισμού...",
"Name_Replace": "Αντικατάσταση Ονόματος",
"Transpose_Words": "Μεταφορά λέξεων",
"err_importing_recipe": "Υπάρχει σφάλμα στην εισαγωγή της σύνταγης!",
"Properties_Food_Unit": "Ιδιότητες Μονάδα Φαγητού",
"show_step_ingredients_setting": "Εμφάνιση συστατικών δίπλα στα βήματα της συνταγής",
"show_step_ingredients_setting_help": "Προσθέστε τον πίνακα συστατικών δίπλα στα βήματα της συνταγής. Ισχύει κατά τη δημιουργία. Μπορεί να παρακαμφθεί στην προβολή επεξεργασίας συνταγής.",
"hide_step_ingredients": "Απόκρυψη των συστατικών του βήματος",
"property_type_fdc_hint": "Μόνο οι τύποι ιδιοτήτων με ταυτότητα FDC, μπορούν να τραβήξουν αυτόματα δεδομένα απο την βάση δεδομένων του FDC",
"FDC_Search": "Αναζήτηση FDC",
"StartDate": "Ημερομηνία Έναρξης",
"CustomImageHelp": "Ανεβάστε μια εικόνα για να εμφανίζεται στην επισκόπηση χώρου",
"CustomThemeHelp": "Αντικαταστήστε τα στυλ του επιλεγμένου θέματος μεταφορτώνοντας ένα προσαρμοσμένο αρχείο CSS.",
"CustomTheme": "Προσαρμοσμένο Θέμα",
"Shopping_input_placeholder": "π.χ. Πατάτα/100 Πατάτες/100 γρ Πατατες",
"Property_Editor": "Επεξεργαστής Ιδιοτήτων",
"CustomLogos": "Προσαρμοσμένα λογότυπα",
"Updated": "Επεξεργάστηκε",
"Unchanged": "Αμετάβλητο",
"Show_Logo": "Εμφάνιση λογότυπου",
"Show_Logo_Help": "Εμφάνιση λογότυπου του Tandoor ή του space στη γραμμή πλοήγησης.",
"Space_Cosmetic_Settings": "Ορισμένες ρυθμίσεις εμφάνισης μπορούν να αλλάξουν από τους διαχειριστές του χώρου και θα παρακάμψουν τις ρυθμίσεις πελάτη για αυτόν τον χώρο.",
"show_ingredients_table": "Εμφάνιση ένός πίνακα με τα συστατικά δίπλα στο κείμενο του βήματος",
"Enable": "Ενεργοποίηση",
"Alignment": "Ευθυγράμμιση",
"FDC_ID_help": "Ταυτότητα βάσης δεδομένων FDC",
"EndDate": "Ημερομηνία Λήξης",
"FDC_ID": "Ταυτότητα FDC",
"OrderInformation": "Τα αντικείμενα ταξινομούνται από μικρό σε μεγάλο αριθμό.",
"Never_Unit": "Ποτέ Μονάδα",
"DefaultPage": "Προεπιλεγμένη σελίδα",
"Food_Replace": "Αντικατάσταση Φαγητού",
"Unit_Replace": "Αντικατάσταση Μονάδας"
}

View File

@@ -24,7 +24,7 @@
"Log_Recipe_Cooking": "Registro de recetas",
"External_Recipe_Image": "Imagen externa de la receta",
"Add_to_Shopping": "Añadir a la cesta",
"Add_to_Plan": "Añadir a regimen",
"Add_to_Plan": "Añadir al plan",
"Step_start_time": "Hora de inicio",
"Sort_by_new": "Ordenar por novedades",
"Table_of_Contents": "Tabla de contenido",
@@ -34,15 +34,15 @@
"Add_nutrition_recipe": "Añadir nutricion a la canasta",
"Remove_nutrition_recipe": "Borrar nutrición de la canasta",
"Copy_template_reference": "Copiar patrón",
"Save_and_View": "Grabar y mostrar",
"Manage_Books": "Manejar libros",
"Meal_Plan": "Régimen de comida",
"Save_and_View": "Guardar y mostrar",
"Manage_Books": "Gestionar libros",
"Meal_Plan": "Plan de comidas",
"Select_Book": "Seleccionar libro",
"Select_File": "Seleccionar archivo",
"Recipe_Image": "Imagen de la receta",
"Import_finished": "Importación finalizada",
"View_Recipes": "Mostrar recetas",
"Log_Cooking": "Registrar Cocinada",
"Log_Cooking": "Registrar cocinada",
"New_Recipe": "Nueva receta",
"Url_Import": "Importar desde url",
"Reset_Search": "Resetear busqueda",
@@ -95,9 +95,9 @@
"Categories": "categorias",
"Category": "Categoría",
"Selected": "Selecionado",
"min": "minimo",
"min": "nimo",
"Servings": "Raciones",
"Waiting": "esperando",
"Waiting": "Esperando",
"Preparation": "Preparación",
"External": "Externo",
"Size": "Tamaño",
@@ -187,8 +187,8 @@
"FoodOnHand": "Ya tienes {food} comprado.",
"FoodNotOnHand": "No tienes {food} comprado.",
"Undefined": "Indefinido",
"Create_Meal_Plan_Entry": "Crear entrada del régimen de comidas",
"Edit_Meal_Plan_Entry": "Eliminar entrada del régimen de comidas",
"Create_Meal_Plan_Entry": "Crear entrada del plan de comidas",
"Edit_Meal_Plan_Entry": "Eliminar entrada del plan de comidas",
"Title": "Titulo",
"Week": "Semana",
"Month": "Mes",
@@ -374,7 +374,7 @@
"Ratings": "Calificaciones",
"Internal": "Interno",
"Units": "Unidades",
"Random Recipes": "Recetas Aleatorias",
"Random Recipes": "Recetas aleatorias",
"parameter_count": "Parámetro {count}",
"select_keyword": "Seleccionar Palabra Clave",
"add_keyword": "Añadir Palabra Clave",
@@ -505,7 +505,7 @@
"Combine_All_Steps": "Combinar todos los pasos en un solo campo.",
"imperial_pint": "Pinta imperial [imp pt] (Reino Unido, volumen)",
"Shopping_input_placeholder": "e.g. Patata/100 Patatas/100 g Patatas",
"Property_Editor": "Editor de Propiedades",
"Property_Editor": "Editor de propiedades",
"Conversion": "Conversión",
"created_by": "Creado por",
"CustomLogoHelp": "Subir imágenes cuadradas de diferentes tamaños para cambiarlas a logotipo en la pestaña del navegador y en la aplicación web instalada.",

572
vue/src/locales/hr.json Normal file
View File

@@ -0,0 +1,572 @@
{
"warning_feature_beta": "Ova značajka trenutno je u BETA (testnom) stanju. Očekujte bugove i moguće promjene koje će pokvariti značajku u budućnosti (mogućigubitak podataka koji se odnose na značajke) kada koristite ovu značajku.",
"err_fetching_resource": "Došlo je do pogreške prilikom dohvaćanja resursa!",
"err_creating_resource": "Došlo je do pogreške prilikom izrade resursa!",
"err_updating_resource": "Došlo je do pogreške prilikom ažuriranja resursa!",
"err_deleting_resource": "Došlo je do pogreške prilikom brisanja resursa!",
"err_deleting_protected_resource": "Objekt koji pokušavate izbrisati još uvijek se koristi i ne može se izbrisati.",
"err_moving_resource": "Došlo je do pogreške pri premještanju resursa!",
"err_merging_resource": "Došlo je do pogreške prilikom spajanja resursa!",
"err_importing_recipe": "Došlo je do pogreške prilikom uvoza recepta!",
"success_fetching_resource": "Resurs je uspješno dohvaćen!",
"success_creating_resource": "Resurs je uspješno kreiran!",
"success_updating_resource": "Resurs je uspješno ažuriran!",
"success_deleting_resource": "Resurs je uspješno obrisan!",
"success_moving_resource": "Resurs je uspješno premješten!",
"success_merging_resource": "Resurs je uspješno spojen!",
"file_upload_disabled": "Prijenos datoteka nije omogućen za vaš prostor.",
"recipe_property_info": "Možete dodavati i svojstva namirnici kako biste ih automatski izračunali na temelju Vašeg recepta!",
"warning_space_delete": "Možete izbrisati svoj prostor uključujući sve recepte, popise za kupovinu, planove obroka i sve ostalo što ste stvorili. Ovo se ne može poništiti! Jeste li sigurni da to želite učiniti?",
"food_inherit_info": "Polja na namirnici koja bi trebala biti naslijeđena prema zadanim postavkama.",
"step_time_minutes": "Vrijeme koraka u minutama",
"confirm_delete": "Jeste li sigurni da želite izbrisati ovaj {objekt}?",
"import_running": "Uvoz je u tijeku, molimo pričekajte!",
"all_fields_optional": "Sva polja su opcionalna i mogu se ostaviti prazna.",
"convert_internal": "Pretvori u interni recept",
"show_only_internal": "Prikaži samo interne recepte",
"show_split_screen": "Podijeljeni prikaz",
"Log_Recipe_Cooking": "Dnevnik recepata kuhanja",
"External_Recipe_Image": "Slika vanjskog recepta",
"Add_to_Shopping": "Dodaj u Kupnju",
"Add_to_Plan": "Dodaj u Plan",
"Step_start_time": "Vrijeme početka koraka",
"Sort_by_new": "Poredaj po novom",
"Table_of_Contents": "Sadržaj",
"Recipes_per_page": "Recepata po stranici",
"Show_as_header": "Prikaži kao zaglavlje",
"Hide_as_header": "Sakrij kao zaglavlje",
"Add_nutrition_recipe": "Dodajte hranjive sastojke u recept",
"Remove_nutrition_recipe": "Izbrišite hranjive sastojke iz recepta",
"Copy_template_reference": "Kopiraj referencu predloška",
"per_serving": "po porcijama",
"Save_and_View": "Spremi i pogledaj",
"Manage_Books": "Upravljaj knjigama",
"Meal_Plan": "Plan obroka",
"Select_Book": "Odaberite Knjigu",
"Select_File": "Odaberite datoteku",
"Recipe_Image": "Slika recepta",
"Import_finished": "Uvoz završen",
"View_Recipes": "Pogledajte recepte",
"Log_Cooking": "Zapis kuhanja",
"New_Recipe": "Novi Recept",
"Url_Import": "URL uvoz",
"Reset_Search": "Poništi pretragu",
"Recently_Viewed": "Nedavno pogledano",
"Load_More": "Učitaj više",
"New_Keyword": "Nova ključna riječ",
"Delete_Keyword": "Obriši ključnu riječ",
"Edit_Keyword": "Uredi ključnu riječ",
"Edit_Recipe": "Uredi Recept",
"Move_Keyword": "Premjesti ključnu riječ",
"Merge_Keyword": "Spoji ključnu riječ",
"Hide_Keywords": "Sakrij ključnu riječ",
"Hide_Recipes": "Sakrij Recepte",
"Move_Up": "Premjesti gore",
"Move_Down": "Premjesti dolje",
"Step_Name": "Naziv koraka",
"Step_Type": "Vrsta koraka",
"Make_Header": "Napravi zaglavlje",
"Make_Ingredient": "Napravi sastojak",
"Amount": "Količina",
"Enable_Amount": "Omogući količinu",
"Disable_Amount": "Onemogući količinu",
"Ingredient Editor": "Uređivač sastojaka",
"Description_Replace": "Zamijeni opis",
"Instruction_Replace": "Zamijeni uputu",
"Auto_Sort": "Automatsko sortiranje",
"Auto_Sort_Help": "Pomaknite sve sastojke na najprikladniji korak.",
"Private_Recipe": "Privatni Recept",
"Private_Recipe_Help": "Recept se prikazuje samo vama i osobama s kojima se dijeli.",
"reusable_help_text": "Treba li veza s pozivnicom biti upotrebljiva za više od jednog korisnika.",
"open_data_help_text": "Tandoor Open Data projekt pruža podatke koje je zajednica doprinijela Tandooru. Ovo se polje automatski popunjava prilikom uvoza i dopušta ažuriranja u budućnosti.",
"Open_Data_Slug": "Open Data Slug",
"Open_Data_Import": "Otvorite uvoz podataka",
"Properties_Food_Amount": "Svojstva Količina namirnice",
"Properties_Food_Unit": "Svojstva Jedinica namirnice",
"Calculator": "Kalkulator",
"FDC_ID": "FDC ID",
"FDC_Search": "FDC Pretraga",
"FDC_ID_help": "FDC ID baze podataka",
"property_type_fdc_hint": "Samo tipovi svojstva s FDC ID-om mogu automatski povući podatke iz FDC baze podataka",
"Data_Import_Info": "Unaprijedite svoj prostor uvozom popisa namirnica, jedinica i još mnogo toga koje je pripremila zajednica kako biste poboljšali svoju kolekciju recepata.",
"Update_Existing_Data": "Ažurirajte postojeće podatke",
"Use_Metric": "Koristite metričke jedinice",
"Learn_More": "Saznajte više",
"converted_unit": "Pretvorena jedinica",
"converted_amount": "Pretvorena količina",
"base_unit": "Osnovna jedinica",
"base_amount": "Osnovna Količina",
"Datatype": "Tip podataka",
"Input": "Unos",
"Undo": "Poništi",
"NoMoreUndo": "Nema promjena koje se mogu poništiti.",
"Number of Objects": "Broj objekata",
"Add_Step": "Dodaj korak",
"Keywords": "Ključne riječi",
"Books": "Knjige",
"Proteins": "Proteini",
"Fats": "Masti",
"Carbohydrates": "Ugljikohidrati",
"Calories": "Kalorije",
"Energy": "Energija",
"Nutrition": "Nutritivna vrijednost",
"Date": "Datum",
"StartDate": "Početni datum",
"EndDate": "Završni datum",
"Share": "Podijeli",
"Automation": "Automatizacija",
"Parameter": "Parametar",
"Export": "Izvoz",
"Copy": "Kopiraj",
"Rating": "Ocjena",
"Close": "Zatvori",
"Cancel": "Otkaži",
"Link": "Poveznica",
"Add": "Dodaj",
"New": "Novi",
"Note": "Bilješka",
"Alignment": "Poravnanje",
"Success": "Uspješno",
"Failure": "Neuspješno",
"Protected": "Zaštićeno",
"Ingredients": "Sastojci",
"Supermarket": "Supermarket",
"Categories": "Kategorije",
"Category": "Kategorija",
"Selected": "Odabrano",
"min": "min",
"Servings": "Porcije",
"Waiting": "Čekanje",
"Preparation": "Priprema",
"External": "Vanjski",
"Size": "Veličina",
"Files": "Datoteke",
"File": "Datoteka",
"Edit": "Uredi",
"Image": "Slika",
"Delete": "Obriši",
"Delete_All": "Obriši sve",
"Open": "Otvori",
"Ok": "Ok",
"Save": "Spremi",
"Step": "Korak",
"Search": "Pretraga",
"Import": "Uvoz",
"Print": "Ispis",
"Settings": "Postavke",
"or": "ili",
"and": "i",
"Information": "Informacije",
"Download": "Preuzimanje",
"Create": "Stvori",
"Search Settings": "Postavke pretrage",
"View": "Pogled",
"Recipes": "Recepti",
"Welcome": "Dobrodošli",
"Move": "Premjesti",
"Merge": "Spoji",
"Parent": "Roditelj",
"Copy Link": "Kopiraj vezu",
"Copy Token": "Kopiraj token",
"delete_confirmation": "Jeste li sigurni da želite izbrisati {source}?",
"move_confirmation": "Premjesti <i>{child}</i> u roditelja <i>{parent}</i>",
"merge_confirmation": "Zamijenite <i>{source}</i> s <i>{target}</i>",
"create_rule": "i stvoriti automatizaciju",
"move_selection": "Odaberite nadređenu {type} na koju želite premjestiti {source}.",
"merge_selection": "Zamijeni sva pojavljivanja {source} s odabranom {type}.",
"Root": "Korijen",
"Ignore_Shopping": "Ignoriraj Kupovinu",
"Shopping_Category": "Kategorija Kupovine",
"Shopping_Categories": "Kategorije Kupovine",
"Shopping_input_placeholder": "npr. Krumpir/100 Krumpira/100 g Krumpira",
"Edit_Food": "Uredi Namirnicu",
"Move_Food": "Premjesti namirnicu",
"New_Food": "Nova namirnica",
"Hide_Food": "Sakrij namirnicu",
"Food_Alias": "Nadimci namirnice",
"Unit_Alias": "Nadimci jadinice",
"Keyword_Alias": "Nadimci ključne riječi",
"Delete_Food": "Obriši namirnicu",
"No_ID": "ID nije pronađen, ne može se izbrisati.",
"Meal_Plan_Days": "Budući planovi obroka",
"merge_title": "Spoji {type}",
"move_title": "Premjesti {type}",
"Food": "Namirnica",
"Property": "Svojstvo",
"Property_Editor": "Urednik svojstva",
"Conversion": "Konverzija",
"Original_Text": "Izvorni tekst",
"Recipe_Book": "Knjiga recepata",
"del_confirmation_tree": "Jeste li sigurni da želite izbrisati {source} i svu njegovu djecu?",
"delete_title": "Obriši {type}",
"create_title": "Novi {type}",
"edit_title": "Uredi {type}",
"Name": "Naziv",
"Properties": "Svojstva",
"Type": "Vrsta",
"Description": "Opis",
"Recipe": "Recept",
"tree_root": "Korijen stabla",
"Icon": "Ikona",
"Unit": "Jedinica",
"Decimals": "Decimale",
"Default_Unit": "Zadana jedinica",
"No_Results": "Nema rezultata",
"New_Unit": "Nova jedinica",
"Create_New_Shopping Category": "Kreiraj novu kategoriju za kupovinu",
"Create_New_Food": "Dodaj novu namirnicu",
"Create_New_Keyword": "Dodaj novu ključnu riječ",
"Create_New_Unit": "Dodaj novu jedinicu",
"Create_New_Meal_Type": "Dodaj novu vrstu obroka",
"Create_New_Shopping_Category": "Dodaj novu kategoriju za kupovinu",
"and_up": "& gore",
"and_down": "& dolje",
"Instructions": "Upute",
"Unrated": "Bez ocjene",
"Automate": "Automatiziraj",
"Empty": "Prazno",
"Key_Ctrl": "Ctrl",
"Key_Shift": "Shift",
"Time": "Vrijeme",
"Text": "Tekst",
"Shopping_list": "Popis za kupovinu",
"Added_by": "Dodao",
"Added_on": "Dodano",
"AddToShopping": "Dodaj na popis za kupovinu",
"IngredientInShopping": "Ovaj se sastojak nalazi na vašem popisu za kupovinu.",
"NotInShopping": "{food} nije na vašem popisu za kupovinu.",
"OnHand": "Trenutno pri ruci",
"FoodOnHand": "Imate {food} pri ruci.",
"FoodNotOnHand": "Nemate {food} pri ruci.",
"Undefined": "Nedefinirano",
"Create_Meal_Plan_Entry": "Kreirajte unos plana obroka",
"Edit_Meal_Plan_Entry": "Uredi unos plana obroka",
"Title": "Naslov",
"Week": "Tjedan",
"Month": "Mjesec",
"Year": "Godina",
"created_by": "Kreirao",
"Planner": "Planer",
"Planner_Settings": "Postavke Planera",
"Period": "Razdoblje",
"Plan_Period_To_Show": "Prikaži tjedne, mjesece ili godine",
"Periods": "Periodi",
"Plan_Show_How_Many_Periods": "Koliko razdoblja prikazati",
"Starting_Day": "Početni dan u tjednu",
"Meal_Types": "Tipovi obroka",
"Meal_Type": "Tip obroka",
"New_Entry": "Novi unos",
"Clone": "Kloniraj",
"Drag_Here_To_Delete": "Povuci ovdje za brisanje",
"Meal_Type_Required": "Potreban je tip obroka",
"Title_or_Recipe_Required": "Potreban je odabir naslova ili recepta",
"Color": "Boja",
"New_Meal_Type": "Novi tip obroka",
"Use_Fractions": "Koristi razlomke",
"Use_Fractions_Help": "Automatski pretvori decimale u razlomke prilikom pregleda recepta.",
"AddFoodToShopping": "Dodaj {food} na svoj popis za kupovinu",
"RemoveFoodFromShopping": "Ukloni {food} sa svog popisa za kupovinu",
"DeleteShoppingConfirm": "Jesi li siguran da želiš ukloniti svu {food} s popisa za kupnju?",
"IgnoredFood": "{food} je postavljeno da zanemari kupovinu.",
"Add_Servings_to_Shopping": "Dodaj {servings} obroka u Kupovinu",
"Week_Numbers": "Brojevi tjedana",
"Show_Week_Numbers": "Prikaži brojeve tjedana?",
"Export_As_ICal": "Izvoz tekućeg razdoblja u iCal format",
"Export_To_ICal": "Izvoz .ics",
"Cannot_Add_Notes_To_Shopping": "Bilješke se ne mogu dodati na popis za kupovinu",
"Added_To_Shopping_List": "Dodano na popis za kupovinu",
"Shopping_List_Empty": "Popis za kupovinu trenutno je prazan, artikle možeš dodati putem kontekstnog izbornika unosa plana obroka (desni klik na karticu ili lijevi klik na ikonu izbornika)",
"Next_Period": "Slijedeće razdoblje",
"Previous_Period": "Prethodno razdoblje",
"Current_Period": "Trenutno razdoblje",
"Next_Day": "Sljedeći dan",
"Previous_Day": "Prethodni dan",
"Inherit": "Naslijedi",
"InheritFields": "Naslijedi vrijednosti polja",
"FoodInherit": "Nasljedna polja namirnice",
"ShowUncategorizedFood": "Prikaži Nedefinirano",
"GroupBy": "Grupiraj po",
"Language": "Jezik",
"Theme": "Tema",
"CustomTheme": "Prilagođena tema",
"CustomThemeHelp": "Nadjačaj stilove odabrane teme učitavanjem prilagođene CSS datoteke.",
"CustomImageHelp": "Učitaj sliku za prikaz u pregledu prostora.",
"CustomNavLogoHelp": "Učitaj sliku koju ćeš koristiti kao logotip navigacijske trake.",
"CustomLogoHelp": "Učitaj kvadratne slike u različitim veličinama da bi ih promijenio u logotip na kartici preglednika i instaliranoj web-aplikaciji.",
"CustomLogos": "Prilagođeni logotipi",
"SupermarketCategoriesOnly": "Samo kategorije supermarketa",
"MoveCategory": "Premjesti u: ",
"CountMore": "...+ još {count}",
"IgnoreThis": "Nikada nemoj automatski dodavati {food} u kupovinu",
"DelayFor": "Odgodi {hours} sati",
"Warning": "Upozorenje",
"NoCategory": "Nije odabrana kategorija.",
"InheritWarning": "{food} je postavljeno na nasljeđivanje, promjene se možda neće održati.",
"ShowDelayed": "Prikaži odgođene stavke",
"ShowRecentlyCompleted": "Prikaži nedavno dovršene stavke",
"Completed": "Završeno",
"OfflineAlert": "Nisi na mreži, popis za kupnju se možda neće sinkronizirati.",
"ShoppingBackgroundSyncWarning": "Loša mreža, čeka se sinkronizacija...",
"shopping_share": "Podijeli popis za kupovinu",
"shopping_auto_sync": "Automatska sinkronizacija",
"one_url_per_line": "Jedan URL po retku",
"mealplan_autoadd_shopping": "Automatsko dodavanje plana obroka",
"mealplan_autoexclude_onhand": "Isključite namirnice \"Pri ruci\"",
"mealplan_autoinclude_related": "Dodajte srodne recepte",
"default_delay": "Zadani sati odgode",
"plan_share_desc": "Novi unosi plana obroka automatski će se dijeliti s odabranim korisnicima.",
"shopping_share_desc": "Korisnici će vidjeti sve artikle koje dodate na svoj popis za kupnju. Moraju vas dodati da biste vidjeli stavke na njihovom popisu.",
"shopping_auto_sync_desc": "Postavljanje na 0 onemogućit će automatsku sinkronizaciju. Kada gledate popis za kupnju, popis se ažurira svakih postavljenih sekundi kako bi se sinkronizirale promjene koje je netko drugi možda napravio. Korisno kada kupujete s više ljudi, ali će koristiti mobilne podatke.",
"mealplan_autoadd_shopping_desc": "Automatski dodajte sastojke plana obroka na popis za kupnju.",
"mealplan_autoexclude_onhand_desc": "Kada dodajete plan obroka na popis za kupnju (ručno ili automatski), isključite sastojke koji su trenutno pri ruci.",
"mealplan_autoinclude_related_desc": "Kada dodajete plan obroka na popis za kupovinu (ručno ili automatski), uključite sve povezane recepte.",
"default_delay_desc": "Zadani broj sati za odgodu unosa na popis za kupovinu.",
"filter_to_supermarket": "Filtrirajte do supermarketa",
"Coming_Soon": "Dolazi uskoro",
"Auto_Planner": "Automatski planer",
"New_Cookbook": "Nova kuharica",
"Hide_Keyword": "Sakrij ključne riječi",
"Hour": "Sat",
"Hours": "Sati",
"Day": "Dan",
"Days": "Dana",
"Second": "Sekunda",
"Seconds": "Sekundi",
"Clear": "Očisti",
"Users": "Korisnici",
"Invites": "Pozivnice",
"err_move_self": "Nije moguće premjestiti stavku u samu sebe",
"nothing": "Ništa za napraviti",
"err_merge_self": "Stavka se ne može spojiti sama sa sobom",
"show_sql": "Prikaži SQL",
"filter_to_supermarket_desc": "Prema zadanim postavkama filtriraj popis za kupovinu tako da uključuje samo kategorije za odabrani supermarket.",
"CategoryName": "Naziv kategorije",
"SupermarketName": "Naziv Supermarketa",
"CategoryInstruction": "Povuci kategorije kako bi promijenio redoslijed kategorijea narudžbi koje se pojavljuju na popisu za kupnju.",
"OrderInformation": "Objekti su poredani od malog prema velikom broju.",
"shopping_recent_days_desc": "Dani nedavnih unosa na popis za kupnju za prikaz.",
"shopping_recent_days": "Nedavni dani",
"download_pdf": "Preuzmi PDF",
"download_csv": "Preuzmi CSV",
"csv_delim_help": "Razdjelnik koji se koristi za CSV izvoze.",
"csv_delim_label": "CSV Razdjelnik",
"SuccessClipboard": "Popis za kupnju kopiran je u međuspremnik",
"copy_to_clipboard": "Kopiraj u međuspremnik",
"csv_prefix_help": "Prefiks koji se dodaje prilikom kopiranja popisa u međuspremnik.",
"csv_prefix_label": "Prefiks popisa",
"copy_markdown_table": "Kopiraj kao tablicu označavanja",
"in_shopping": "Na popisu za kupovinu",
"DelayUntil": "Odgodi do",
"Pin": "Prikvači",
"Unpin": "Otkvači",
"PinnedConfirmation": "{recept} je prikvačen.",
"UnpinnedConfirmation": "{recept} je otkvačen.",
"mark_complete": "Označi kao dovršeno",
"QuickEntry": "Brzi unos",
"shopping_add_onhand_desc": "Označite namirnice \"pri ruci\" kada je označena s popisa za kupovinu.",
"shopping_add_onhand": "Auto \"pri ruci\"",
"related_recipes": "Povezani recepti",
"today_recipes": "Današnji recepti",
"sql_debug": "SQL otklanjanje pogrešaka",
"remember_search": "Zapamti Pretraživanje",
"remember_hours": "Sati za pamćenje",
"tree_select": "Koristite Odabir stabla",
"OnHand_help": "Namirnica je u zalihama i neće se automatski dodavati na popis za kupovinu. Status Pri ruci dijeli se s korisnicima koji kupuju.",
"ignore_shopping_help": "Nikada nemojte dodavati namirnicu na popis za kupovinu (npr. vodu)",
"shopping_category_help": "Supermarkete je moguće posložiti i filtrirati prema Kategoriji kupnje prema rasporedu prolaza.",
"food_recipe_help": "Povezivanje recepta ovdje će uključiti povezani recept u bilo koji drugi recept koji koristi ovu namirnicu",
"Foods": "Namirnice",
"Account": "Korisnički račun",
"Cosmetic": "Izgled",
"API": "API",
"enable_expert": "Omogući Stručni način rada",
"expert_mode": "Stručni način rada",
"simple_mode": "Jednostavan način rada",
"advanced": "Napredno",
"fields": "Polja",
"show_keywords": "Prikaži ključne riječi",
"show_foods": "Prikaži namirnice",
"show_books": "Prikaži Knjige",
"show_rating": "Prikaži Ocjene",
"show_units": "Prikaži jedinice",
"show_filters": "Prikaži filtere",
"not": "ne",
"save_filter": "Spremi Filtar",
"filter_name": "Naziv Filtra",
"left_handed": "Način rada s lijevom rukom",
"left_handed_help": "Optimizirat će korisničko sučelje za korištenje lijevom rukom.",
"show_step_ingredients_setting": "Prikaži sastojke uz korake recepta",
"show_step_ingredients_setting_help": "Dodajte tablicu sa sastojcima pokraj koraka recepta. Primjenjuje se u trenutku stvaranja. Može se nadjačati u prikazu za uređivanje recepta.",
"show_step_ingredients": "Prikaži sastojke Koraka",
"hide_step_ingredients": "Sakrij sastojke Koraka",
"Custom Filter": "Prilagođeni filtar",
"shared_with": "Podijeljeno sa",
"sort_by": "Poredaj po",
"asc": "Uzlazno",
"desc": "Silazno",
"date_viewed": "Zadnje pregledano",
"last_cooked": "Zadnje kuhano",
"times_cooked": "Puta kuhano",
"date_created": "Datum kreiranja",
"show_sortby": "Prikaži Poredaj po",
"search_rank": "Rang pretraživanja",
"make_now": "Napravi sada",
"Created": "Stvoreno",
"Updated": "Ažurirano",
"Unchanged": "Nepromijenjeno",
"Error": "Greška",
"make_now_count": "Nedostaje najviše sastojaka",
"recipe_filter": "Filtar recepta",
"book_filter_help": "Uključite recepte iz filtra recepata uz one ručno dodijeljene.",
"review_shopping": "Pregledajte unose za kupovinu prije spremanja",
"view_recipe": "Pogledajte recept",
"copy_to_new": "Kopiraj u novi recept",
"recipe_name": "Naziv recepta",
"paste_ingredients_placeholder": "Ovdje zalijepite popis sastojaka...",
"paste_ingredients": "Zalijepi sastojke",
"ingredient_list": "Popis sastojaka",
"explain": "Objasni",
"filter": "Filtar",
"Website": "Web stranica",
"App": "Aplikacija",
"Message": "Poruka",
"Bookmarklet": "Knjižna oznaka",
"Sticky_Nav": "Ljepljiva navigacija",
"Sticky_Nav_Help": "Uvijek prikaži navigacijski izbornik na vrhu zaslona.",
"Logo": "Logotip",
"Show_Logo": "Prikaži logotip",
"Show_Logo_Help": "Prikaži Tandoor ili mjesto za logotip u navigacijskoj traci.",
"Nav_Color": "Boja navigacije",
"Nav_Text_Mode": "Tekstualni način navigacije",
"Nav_Text_Mode_Help": "Ponaša se drugačije za svaku temu.",
"Nav_Color_Help": "Promjeni boje navigacije.",
"Space_Cosmetic_Settings": "Neke kozmetičke postavke mogu promijeniti administratori prostora i one će poništiti postavke klijenta za taj prostor.",
"Use_Kj": "Koristi kJ umjesto kcal",
"Comments_setting": "Prikaži komentare",
"click_image_import": "Kliknite sliku koju želite uvesti za ovaj recept",
"no_more_images_found": "Na web stranici nisu pronađene dodatne slike.",
"import_duplicates": "Kako bi spriječili duplikate, recepti s istim nazivom kao i postojeći zanemaruju se. Označite ovaj okvir za uvoz svega.",
"paste_json": "Ovdje zalijepite json ili html izvor za učitavanje recepta.",
"Click_To_Edit": "Klikni za uređivanje",
"search_no_recipes": "Nisam mogao pronaći nijedan recept!",
"search_import_help_text": "Uvezi recept s vanjske web stranice ili aplikacije.",
"search_create_help_text": "Stvorite novi recept izravno u Tandooru.",
"warning_duplicate_filter": "Upozorenje: zbog tehničkih ograničenja korištenje više filtara iste kombinacije (i/ili/ne) moglo bi dovesti do neočekivanih rezultata.",
"reset_children": "Poništi nasljeđivanje djeteta",
"reset_children_help": "Prebriši sve potomke vrijednostima iz naslijeđenih polja. Naslijeđena polja djece bit će postavljena na Naslijediti polja osim ako nije postavljeno Naslijeđena polja djece.",
"reset_food_inheritance": "Poništi nasljeđivanje",
"reset_food_inheritance_info": "Ponovno postavi sve namirnice na zadana naslijeđena polja i njihove nadređene vrijednosti.",
"substitute_help": "Zamjene se uzimaju u obzir pri traženju recepata koji se mogu napraviti s dostupnim sastojcima.",
"substitute_siblings_help": "Sve namirnice koje dijele roditeljsku namirnicu smatraju se zamjenama.",
"substitute_children_help": "Sve namirnice koje su potomci ove hrane smatraju se zamjenama.",
"substitute_siblings": "Istovrijedne zamjene",
"substitute_children": "Zamjenska djeca",
"SubstituteOnHand": "Imate zamjenu pri ruci.",
"ChildInheritFields": "Djeca nasljeđuju polja",
"ChildInheritFields_help": "Djeca će prema zadanim postavkama naslijediti ova polja.",
"InheritFields_help": "Vrijednosti ovih polja bit će naslijeđene od nadređenog (Iznimka: prazne kategorije kupnje se ne nasljeđuju)",
"show_ingredients_table": "Prikaži tablicu sastojaka pored teksta koraka",
"show_ingredient_overview": "Prikaži popis svih sastojaka na početku recepta.",
"Ingredient Overview": "Pregled sastojaka",
"last_viewed": "Zadnje pregledano",
"created_on": "Kreirano",
"updatedon": "Ažurirano dana",
"Imported_From": "Uvezeno iz",
"advanced_search_settings": "Postavke naprednog pretraživanja",
"nothing_planned_today": "Nemate ništa planirano za danas!",
"no_pinned_recipes": "Nemaš prikvačenih recepata!",
"Planned": "Planirano",
"Pinned": "Prikvačeno",
"Imported": "Uvezeno",
"Quick actions": "Brze akcije",
"Ratings": "Ocjene",
"Internal": "Interni",
"Units": "Jedinice",
"Manage_Emails": "Upravljanje e-poštom",
"Change_Password": "Promjena lozinke",
"Social_Authentication": "Autentifikacija putem društvenih mreža",
"Random Recipes": "Nasumični Recepti",
"parameter_count": "Parametar {count}",
"select_keyword": "Odaberite ključnu riječ",
"add_keyword": "Dodaj ključnu riječ",
"select_file": "Odaberi datoteku",
"select_recipe": "Odaberi Recept",
"select_unit": "Odaberi jedinicu",
"select_food": "Odaberi namirnicu",
"remove_selection": "Poništi odabir",
"empty_list": "Popis je prazan.",
"Select": "Odaberi",
"Supermarkets": "Supermarketi",
"User": "Korisnik",
"Username": "Korisničko ime",
"First_name": "Ime",
"Last_name": "Prezime",
"Keyword": "Ključna riječ",
"Advanced": "Napredno",
"Page": "Stranica",
"DefaultPage": "Zadana stranica",
"Single": "Jedna",
"Multiple": "Više",
"Reset": "Ponovo postavi",
"Disabled": "Onemogućeno",
"Disable": "Onemogući",
"Enable": "Omogući",
"Options": "Mogućnosti",
"Create Food": "Kreiraj namirnicu",
"create_food_desc": "Kreiraj namirnicu i povežite je s ovim receptom.",
"additional_options": "Dodatne mogućnosti",
"Importer_Help": "Više informacija i pomoć o ovom uvozniku:",
"Documentation": "Dokumentacija",
"Select_App_To_Import": "Odaberite aplikaciju iz koje želite uvesti",
"Import_Supported": "Uvoz podržan",
"Export_Supported": "Izvoz podržan",
"Import_Not_Yet_Supported": "Uvoz još nije podržan",
"Export_Not_Yet_Supported": "Izvoz još nije podržan",
"Import_Result_Info": "Uvezeno je {imported} od {total} recepata",
"Recipes_In_Import": "Recepti u vašoj datoteci za uvoz",
"Toggle": "Prebaci",
"total": "ukupno",
"Import_Error": "Došlo je do pogreške tijekom uvoza. Molimo proširite pojedinosti na dnu stranice kako bi vidjeli grešku.",
"Warning_Delete_Supermarket_Category": "Brisanje kategorije supermarketa također će izbrisati sve odnose na namirnice. Jeste li sigurni?",
"New_Supermarket": "Stvorite novi supermarket",
"New_Supermarket_Category": "Stvorite novu kategoriju supermarketa",
"Are_You_Sure": "Jesi li siguran?",
"Valid Until": "Vrijedi do",
"Split_All_Steps": "Podijeli sve retke u zasebne korake.",
"Combine_All_Steps": "Kombinir sve korake u jedno polje.",
"Plural": "Množina",
"plural_short": "množina",
"g": "gram [g] (metrički, težina)",
"kg": "kilogram [kg] (metrički, težina)",
"ounce": "unca [oz] (težina)",
"pound": "funta (težina)",
"ml": "mililitar [ml] (metrički, volumen)",
"l": "litra [l] (metrički, volumen)",
"fluid_ounce": "tekuća unca [fl oz] (SAD, volumen)",
"us_cup": "šalica (SAD, volumen)",
"pint": "pinta [pt] (SAD, volumen)",
"quart": "kvart [qt] (SAD, volumen)",
"gallon": "galon [gal] (SAD, volumen)",
"tbsp": "žlica [žlica] (SAD, volumen)",
"tsp": "žličica [žličica] (SAD, volumen)",
"imperial_fluid_ounce": "imperijalna tekuća unca [imp fl oz] (UK, volumen)",
"imperial_pint": "carska pinta [imp pt] (UK, volumen)",
"imperial_quart": "imperijalni kvart [imp qt] (UK, volumen)",
"imperial_gallon": "imperijalni gal [imp gal] (UK, volumen)",
"imperial_tbsp": "imperijalna žlica [imp tbsp] (UK, volumen)",
"imperial_tsp": "imperijalna čajna žličica [imp tsp] (UK, volumen)",
"Choose_Category": "Odaberi kategoriju",
"Back": "Nazad",
"Use_Plural_Unit_Always": "Uvijek koristi oblik množine za jedinicu",
"Use_Plural_Unit_Simple": "Uvijek koristi dinamički oblik množine za jedinicu",
"Use_Plural_Food_Always": "Uvijek koristi oblik množine za namirnice",
"Use_Plural_Food_Simple": "Dinamički koristi oblik množine za namirnicu",
"plural_usage_info": "Koristite oblik množine za jedinice i namirnice unutar ovog prostora.",
"Create Recipe": "Kreiraj recept",
"Import Recipe": "Uvezi recept",
"Never_Unit": "Nikad Jedinica",
"Transpose_Words": "Transponiraj riječi",
"Name_Replace": "Zamjena imena",
"Food_Replace": "Zamjena namirnica",
"Unit_Replace": "Zamjena jedinice"
}

View File

@@ -8,11 +8,11 @@
"err_moving_resource": "Hiba történt egy erőforrás áthelyezésekor!",
"err_merging_resource": "Hiba történt egy erőforrás egyesítésekor!",
"success_fetching_resource": "Sikeresen lekérdezett erőforrást!",
"success_creating_resource": "",
"success_updating_resource": "",
"success_deleting_resource": "",
"success_moving_resource": "",
"success_merging_resource": "",
"success_creating_resource": "Sikeresen létrehoztam egy erőforrást!",
"success_updating_resource": "Sikeresen frissítettem egy erőforrást!",
"success_deleting_resource": "Sikeresen töröltem egy erőforrást!",
"success_moving_resource": "Sikeresen áthelyeztem egy erőforrást!",
"success_merging_resource": "Sikeresen egyesítettem egy erőforrást!",
"file_upload_disabled": "A fájlfeltöltés nincs engedélyezve az Ön teréhez.",
"step_time_minutes": "Lépés időtartama percben",
"confirm_delete": "Biztos, hogy törölni akarja ezt a {object}?",

View File

@@ -2,12 +2,12 @@
"err_fetching_resource": "Si è verificato un errore durante il recupero di una risorsa!",
"err_creating_resource": "Si è verificato un errore durante la creazione di una risorsa!",
"err_updating_resource": "Si è verificato un errore durante l'aggiornamento di una risorsa!",
"err_deleting_resource": "Si è verificato un errore durante la cancellazione di una risorsa!",
"err_deleting_resource": "Si è verificato un errore durante l'eliminazione di una risorsa!",
"success_fetching_resource": "Risorsa recuperata con successo!",
"success_creating_resource": "Risorsa creata con successo!",
"success_updating_resource": "Risorsa aggiornata con successo!",
"success_deleting_resource": "Risorsa eliminata con successo!",
"import_running": "Importazione in corso, attendere prego!",
"import_running": "Importazione in corso, attendere!",
"all_fields_optional": "Tutti i campi sono opzionali e possono essere lasciati vuoti.",
"convert_internal": "Converti come ricetta interna",
"show_only_internal": "Mostra solo ricette interne",
@@ -15,29 +15,29 @@
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
"External_Recipe_Image": "Immagine ricetta esterna",
"Add_to_Shopping": "Aggiunti agli acquisti",
"Add_to_Plan": "Aggiungi a Piano",
"Step_start_time": "Ora di inizio dello Step",
"Add_to_Plan": "Aggiungi a piano",
"Step_start_time": "Ora di inizio dello step",
"Sort_by_new": "Prima i nuovi",
"Recipes_per_page": "Ricette per pagina",
"Manage_Books": "Gestisci Libri",
"Manage_Books": "Gestisci libri",
"Meal_Plan": "Piano alimentare",
"Select_Book": "Seleziona Libro",
"Select_Book": "Seleziona libro",
"Recipe_Image": "Immagine ricetta",
"Import_finished": "Importazione completata",
"View_Recipes": "Mostra ricette",
"Log_Cooking": "Registro ricette cucinate",
"New_Recipe": "Nuova Ricetta",
"New_Recipe": "Nuova ricetta",
"Url_Import": "Importa da URL",
"Reset_Search": "Ripristina Ricerca",
"Reset_Search": "Ripristina ricerca",
"Recently_Viewed": "Visualizzato di recente",
"Load_More": "Carica di più",
"Load_More": "Carica altro",
"New_Keyword": "Nuova parola chiave",
"Delete_Keyword": "Elimina parola chiave",
"Edit_Keyword": "Modifica parola chiave",
"Move_Keyword": "Sposta parola chiave",
"Merge_Keyword": "Unisci parola chiave",
"Hide_Keywords": "Nascondi parola chiave",
"Hide_Recipes": "Nascondi Ricette",
"Hide_Recipes": "Nascondi ricette",
"Keywords": "Parole chiave",
"Books": "Libri",
"Proteins": "Proteine",
@@ -53,7 +53,7 @@
"Rating": "Valutazione",
"Close": "Chiudi",
"Cancel": "Annulla",
"Link": "Link",
"Link": "Collegamento",
"Add": "Aggiungi",
"New": "Nuovo",
"Success": "Riuscito",
@@ -96,15 +96,15 @@
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
"move_selection": "Scegli un primario {type} dove spostare {source}.",
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
"merge_selection": "Sostituisci tutte le occorrenze di {source} con {type} selezionato.",
"Root": "Radice",
"Ignore_Shopping": "Ignora spesa",
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
"Description": "Descrizione",
"Icon": "Icona",
"Unit": "Unità di misura",
"Unit": "Unità",
"No_ID": "ID non trovato, non è possibile eliminare.",
"Recipe_Book": "Libro di Ricette",
"Recipe_Book": "Libro di ricette",
"create_title": "Nuovo {type}",
"edit_title": "Modifica {type}",
"Name": "Nome",
@@ -122,10 +122,10 @@
"merge_title": "Unisci {type}",
"Key_Shift": "Maiusc",
"del_confirmation_tree": "Sei sicuro di voler eliminare {source} e tutti gli elementi dipendenti?",
"Disable_Amount": "Disabilita Quantità",
"Disable_Amount": "Disabilita quantità",
"Key_Ctrl": "Ctrl",
"No_Results": "Nessun risultato",
"Create_New_Shopping Category": "Crea nuova categoria della spesa",
"Create_New_Shopping Category": "Crea nuova categoria di spesa",
"Create_New_Keyword": "Aggiungi nuova parola chiave",
"and_up": "& Su",
"step_time_minutes": "Tempo dello step in minuti",
@@ -133,23 +133,23 @@
"Show_as_header": "Mostra come intestazione",
"Hide_as_header": "Nascondi come intestazione",
"Copy_template_reference": "Copia riferimento template",
"Save_and_View": "Salva & Mostra",
"Save_and_View": "Salva e mostra",
"Text": "Testo",
"Edit_Recipe": "Modifica Ricetta",
"Move_Up": "Sposta Sopra",
"Move_Down": "Sposta Sotto",
"Step_Name": "Nome dello Step",
"Step_Type": "Tipo di Step",
"Enable_Amount": "Abilita Quantità",
"Add_Step": "Aggiungi Step",
"Edit_Recipe": "Modifica ricetta",
"Move_Up": "Sposta sopra",
"Move_Down": "Sposta sotto",
"Step_Name": "Nome dello step",
"Step_Type": "Tipo di step",
"Enable_Amount": "Abilita quantità",
"Add_Step": "Aggiungi step",
"Note": "Nota",
"Create_New_Food": "Aggiungi nuovo alimento",
"Make_Header": "Crea Intestazione",
"Make_Ingredient": "Crea Ingrediente",
"Make_Header": "Crea intestazione",
"Make_Ingredient": "Crea ingrediente",
"Create_New_Unit": "Aggiungi nuova unità",
"Instructions": "Istruzioni",
"Time": "Tempo",
"Shopping_Category": "Categoria Spesa",
"Shopping_Category": "Categoria di spesa",
"Meal_Plan_Days": "Piani alimentari futuri",
"tree_root": "Radice dell'albero",
"Automation": "Automazione",
@@ -158,11 +158,11 @@
"Automate": "Automatizza",
"create_rule": "e crea automazione",
"Empty": "Vuoto",
"Food_Alias": "Alias Alimento",
"Unit_Alias": "Alias Unità",
"Keyword_Alias": "Alias Parola Chiave",
"Food_Alias": "Alias alimento",
"Unit_Alias": "Alias unità",
"Keyword_Alias": "Alias parola chiave",
"Table_of_Contents": "Indice dei contenuti",
"warning_feature_beta": "Questa funzione è attualmente in BETA (non è completa). Potrebbero verificarsi delle anomalie e modifiche che in futuro potrebbero bloccare la funzionalità stessa o rimuove i dati correlati ad essa.",
"warning_feature_beta": "Questa funzione è attualmente in BETA (fase di test). Potrebbero verificarsi delle anomalie e modifiche che in futuro potrebbero bloccare la funzionalità stessa o rimuove i dati correlati ad essa.",
"Shopping_list": "Lista della spesa",
"Title": "Titolo",
"Create_New_Meal_Type": "Aggiungi nuovo tipo di pasto",
@@ -188,7 +188,7 @@
"New_Meal_Type": "Nuovo tipo di pasto",
"Select_File": "Seleziona file",
"Image": "Immagine",
"Export_As_ICal": "Esporta il periodo attuale in formato .iCal",
"Export_As_ICal": "Esporta il periodo attuale in formato iCal",
"Week_Numbers": "Numeri della settimana",
"Show_Week_Numbers": "Mostra numeri della settimana?",
"file_upload_disabled": "Il caricamento dei file non è abilitato in questa istanza.",
@@ -202,12 +202,12 @@
"Previous_Day": "Giorno precedente",
"Add_nutrition_recipe": "Aggiungi nutrienti alla ricetta",
"Remove_nutrition_recipe": "Elimina nutrienti dalla ricetta",
"Coming_Soon": "In-Arrivo",
"Coming_Soon": "In arrivo",
"Auto_Planner": "Pianificazione automatica",
"New_Cookbook": "Nuovo libro di ricette",
"Hide_Keyword": "Nascondi parole chiave",
"Clear": "Pulisci",
"Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (clicca con il tasto destro sulla scheda o clicca con il tasto sinistro sull'icona del menù)",
"Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (fai clic con il tasto destro sulla scheda o fai clic con il tasto sinistro sull'icona del menù)",
"success_moving_resource": "Risorsa spostata con successo!",
"Shopping_Categories": "Categorie di spesa",
"IngredientInShopping": "Questo ingrediente è nella tua lista della spesa.",
@@ -236,7 +236,7 @@
"Completed": "Completato",
"shopping_share": "Condividi lista della spesa",
"shopping_auto_sync": "Sincronizzazione automatica",
"err_move_self": "Non è possibile muovere un elemento in sé stesso",
"err_move_self": "Non è possibile spostare un elemento in sé stesso",
"nothing": "Nulla da fare",
"show_sql": "Mostra SQL",
"Search Settings": "Impostazioni di ricerca",
@@ -256,8 +256,8 @@
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
"Language": "Lingua",
"Theme": "Tema",
"SupermarketCategoriesOnly": "Solo categorie supermercati",
"CountMore": "...più +{count}",
"SupermarketCategoriesOnly": "Solo categorie di supermercati",
"CountMore": "...+{count} in più",
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
@@ -277,7 +277,7 @@
"Copy Token": "Copia token",
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
"default_delay": "Ore di ritardo predefinite",
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa. Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
"filter_to_supermarket": "Filtra per supermercato",
@@ -322,20 +322,20 @@
"Custom Filter": "Filtro personalizzato",
"shared_with": "Condiviso con",
"sort_by": "Ordina per",
"Ingredient Overview": "Panoramica Ingredienti",
"Ingredient Overview": "Panoramica ingredienti",
"show_units": "Mostra unità di misura",
"select_unit": "Seleziona unità di misura",
"Ingredient Editor": "Editor Ingredienti",
"Ingredient Editor": "Editor degli ingredienti",
"Private_Recipe": "Ricetta privata",
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e a chi l'hai condivisa.",
"Protected": "Protetto",
"Copy Link": "Copia link",
"Copy Link": "Copia collegamento",
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
"and_down": "& Giù",
"OnHand": "Attualmente disponibili",
"New_Entry": "Nuova voce",
"Use_Fractions": "Usa frazioni",
"FoodInherit": "Campi ereditabili dagli Alimenti",
"FoodInherit": "Campi ereditabili dagli alimenti",
"one_url_per_line": "Un indirizzo per riga",
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
@@ -353,10 +353,10 @@
"Use_Plural_Food_Always": "Usa sempre il plurale per gli alimenti",
"Use_Plural_Food_Simple": "Usa dinamicamente il plurale per gli alimenti",
"plural_usage_info": "Usa il plurale per le unità di misura e gli alimenti messi qui.",
"reusable_help_text": "Il link di invito dovrebbe essere usabile per più di un utente.",
"reusable_help_text": "Il collegamento di invito dovrebbe essere usabile per più di un utente.",
"empty_list": "La lista è vuota.",
"no_pinned_recipes": "Non hai ricette fissate!",
"recipe_name": "Nome Ricetta",
"recipe_name": "Nome ricetta",
"advanced_search_settings": "Impostazioni avanzate di ricerca",
"search_no_recipes": "Non sono state trovate ricette!",
"SubstituteOnHand": "Hai un sostituto disponibile.",
@@ -371,7 +371,7 @@
"add_keyword": "Aggiungi parola chiave",
"Export_Not_Yet_Supported": "Esportazione non ancora supportata",
"Import_Result_Info": "{imported} di {total} ricette sono state importate",
"Recipes_In_Import": "Rocette nel tuo file di importazione",
"Recipes_In_Import": "Ricette nel tuo file di importazione",
"Toggle": "Attiva/Disattiva",
"Import_Not_Yet_Supported": "Importazione non ancora supportata",
"Are_You_Sure": "Sei sicuro?",
@@ -382,11 +382,11 @@
"Select_App_To_Import": "Seleziona una App da cui importare",
"Import_Supported": "Importazione supportata",
"paste_ingredients": "Incolla ingredienti",
"shopping_auto_sync_desc": "La sincronizzazione automatica verrà disabilitata se impostato a 0. Quando si visualizza una lista della spesa, la lista viene aggiornata ogni tot secondi impostati per sincronizzare le modifiche che qualcun altro potrebbe aver fatto. Utile per gli acquisti condivisi con più persone, ma potrebbe utilizzare un po' di dati mobili.",
"shopping_auto_sync_desc": "La sincronizzazione automatica sarà disabilitata se impostato a 0. Quando si visualizza una lista della spesa, la lista viene aggiornata ogni tot secondi impostati per sincronizzare le modifiche che qualcun altro potrebbe aver fatto. Utile per gli acquisti condivisi con più persone, ma potrebbe utilizzare un po' di dati mobili.",
"CategoryInstruction": "Trascina le categorie per cambiare l'ordine in cui appaiono nella lista della spesa.",
"show_sortby": "Mostra Ordina per",
"Page": "Pagina",
"Auto_Sort": "Ordinamento Automatico",
"Auto_Sort": "Ordinamento automatico",
"date_created": "Data di creazione",
"times_cooked": "Cucinato N volte",
"recipe_filter": "Filtro ricette",
@@ -403,10 +403,10 @@
"Nav_Color_Help": "Cambia il colore di navigazione.",
"Use_Kj": "Usa kJ invece di kcal",
"Comments_setting": "Mostra commenti",
"click_image_import": "Clicca sull'immagine che vuoi importare per questa ricetta",
"click_image_import": "Fai clic sull'immagine che vuoi importare per questa ricetta",
"no_more_images_found": "Non sono state trovate altre immagini sul sito web.",
"Click_To_Edit": "Clicca per modificare",
"search_import_help_text": "Importa una ricetta da un sito web o da una applicazione.",
"Click_To_Edit": "Fai clic per modificare",
"search_import_help_text": "Importa una ricetta da un sito web o da un'applicazione.",
"Bookmarklet": "Segnalibro",
"paste_json": "Incolla qui il codice sorgente html o json per caricare la ricetta.",
"Imported_From": "Importato da",
@@ -414,7 +414,7 @@
"Imported": "Importato",
"Quick actions": "Azioni rapide",
"Internal": "Interno",
"ingredient_list": "Lista Ingredienti",
"ingredient_list": "Lista ingredienti",
"show_ingredient_overview": "Mostra la lista degli ingredienti all'inizio della ricetta.",
"Change_Password": "Cambia password",
"Social_Authentication": "Autenticazione social",
@@ -443,7 +443,7 @@
"Split_All_Steps": "Divide tutte le righe in step separati.",
"Combine_All_Steps": "Combina tutti gli step in un singolo campo.",
"Select": "Seleziona",
"OnHand_help": "Gli alimenti sono nell'inventario e non verranno automaticamente aggiunti alla lista della spesa. Lo stato di disponibilità è condiviso con gli utenti di spesa.",
"OnHand_help": "Gli alimenti sono nell'inventario e non saranno automaticamente aggiunti alla lista della spesa. Lo stato di disponibilità è condiviso con gli utenti di spesa.",
"Unpin": "Non fissare",
"PinnedConfirmation": "{recipe} è stata fissata.",
"UnpinnedConfirmation": "{recipe} non è più fissata.",
@@ -467,11 +467,108 @@
"make_now": "Fai ora",
"Amount": "Quantità",
"show_step_ingredients_setting": "Mostra gli ingredienti vicino ai passaggi della ricetta",
"substitute_siblings_help": "Tutti gli alimenti che condividono un genitore di questo alimento sono considerati sostituti",
"reset_children": "Reimposta l'eredità degli eredi",
"substitute_siblings": "Sostituire prodotti eredi",
"ChildInheritFields": "Gli eredi ereditano i valori",
"substitute_siblings_help": "Tutti gli alimenti che condividono un genitore di questo alimento sono considerati sostituti.",
"reset_children": "Ripristina l'eredità degli eredi",
"substitute_siblings": "Sostituisci relativi",
"ChildInheritFields": "Figli ereditano i campi",
"recipe_property_info": "Puoi anche aggiungere proprietà ai cibi per calcolarli automaticamente in base alla tua ricetta!",
"err_importing_recipe": "Si è verificato un errore durante l'importazione della ricetta!",
"per_serving": "per porzioni"
"per_serving": "per porzioni",
"open_data_help_text": "Il progetto Tandoor Open Data presenta i dati forniti dalla comunità per Tandoor. Questo campo viene riempito automaticamente al momento dell'importazione e consente aggiornamenti in futuro.",
"Open_Data_Import": "Importazione Open Data",
"imperial_fluid_ounce": "oncia liquida imperiale [imp fl oz] (UK, volume)",
"imperial_pint": "pinta imperiale [imp pt] (UK, volume)",
"imperial_gallon": "gallone imperiale [imp gal] (UK, volume)",
"imperial_tbsp": "cucchiaio da tavola imperiale [imp tbsp] (UK, volume)",
"Create Recipe": "Crea ricetta",
"Properties": "Proprietà",
"Created": "Creata",
"imperial_quart": "quarto imperiale [imp qt] (UK, volume)",
"us_cup": "tazza (US, volume)",
"Data_Import_Info": "Arricchisci la tua istanza importando un elenco di alimenti, unità e altro ancora, curato dalla comunità, per migliorare la tua raccolta di ricette.",
"CustomLogoHelp": "Carica immagini quadrate di diverse dimensioni da trasformare in logo nella scheda del browser e nell'applicazione web installata.",
"show_step_ingredients_setting_help": "Aggiungi la tabella degli ingredienti accanto ai passaggi della ricetta. Si applica al momento della creazione. Può essere sovrascritto nella vista di modifica della ricetta.",
"Show_Logo_Help": "Mostra il logo di Tandoor o dell'istanza nella barra di navigazione.",
"Space_Cosmetic_Settings": "Alcune impostazioni cosmetiche possono essere modificate dagli amministratori dell'istanza e sovrascriveranno le impostazioni client per quell'istanza.",
"reset_food_inheritance": "Ripristina ereditarietà",
"Update_Existing_Data": "Aggiorna i dati esistenti",
"converted_amount": "Quantità convertita",
"ounce": "oncia [oz] (peso)",
"fluid_ounce": "oncia liquida [fl oz] (US, volume)",
"gallon": "gallone [gal] (US, volume)",
"Use_Metric": "Usa unità metriche",
"Undo": "Annulla",
"NoMoreUndo": "Nessuna modifica da annullare.",
"show_step_ingredients": "Mostra ingredienti dello step",
"hide_step_ingredients": "Nascondi gli ingredienti dello step",
"Logo": "Logo",
"Show_Logo": "Mostra logo",
"substitute_help": "Quando si cercano ricette che possono essere realizzate con ingredienti a disposizione, si prendono in considerazione anche i sostituti.",
"pound": "libbra (peso)",
"ml": "millilitro [ml] (metrico, volume)",
"kg": "chilogrammo [kg] (metrico, peso)",
"g": "grammo [g] (metrico, peso)",
"Back": "Indietro",
"Properties_Food_Amount": "Proprietà Quantità alimento",
"Properties_Food_Unit": "Proprietà Unità alimento",
"total": "totale",
"Welcome": "Benvenuto",
"CustomTheme": "Tema personalizzato",
"CustomThemeHelp": "Sostituisci gli stili del tema selezionato caricando un file CSS personalizzato.",
"CustomImageHelp": "Carica un'immagine da mostrare nella panoramica dell'istanza.",
"Shopping_input_placeholder": "ad es. patata/100 patate/100 g patate",
"Property": "Proprietà",
"Property_Editor": "Editor delle proprietà",
"Conversion": "Conversione",
"created_by": "Creato da",
"CustomNavLogoHelp": "Carica un'immagine da utilizzare come logo della barra di navigazione.",
"CustomLogos": "Loghi personalizzati",
"ShowRecentlyCompleted": "Mostra gli elementi completati di recente",
"ShoppingBackgroundSyncWarning": "Rete scadente, in attesa di sincronizzazione...",
"OrderInformation": "Gli oggetti sono ordinati dal numero più piccolo al più grande.",
"Updated": "Aggiornata",
"Unchanged": "Non modificata",
"Error": "Errore",
"Nav_Text_Mode_Help": "Si comporta in modo diverso per ogni tema.",
"Number of Objects": "Numero di oggetti",
"StartDate": "Data d'inizio",
"EndDate": "Data di fine",
"Datatype": "Tipo di dato",
"substitute_children_help": "Tutti gli alimenti derivati da questo alimento sono considerati sostituti.",
"Enable": "Abilita",
"Transpose_Words": "Trasponi parole",
"imperial_tsp": "cucchiaio da tè imperiale [imp tsp] (UK, volume)",
"Choose_Category": "Scegli categoria",
"Import Recipe": "Importa ricetta",
"Food_Replace": "Sostituisci alimento",
"Name_Replace": "Sostituisci nome",
"Unit_Replace": "Sostituisci unità",
"Alignment": "Allineamento",
"Learn_More": "Scopri altro",
"converted_unit": "Unità convertita",
"base_unit": "Unità base",
"base_amount": "Quantità base",
"Calculator": "Calcolatore",
"Delete_All": "Elimina tutti",
"DefaultPage": "Pagina predefinita",
"tsp": "cucchiaio da tè [tsp] (US, volume)",
"l": "litro [l] (metrico, volume)",
"pint": "pinta [pt] (US, volume)",
"quart": "quarto [qt] (US, volume)",
"tbsp": "cucchiaio da tavola [tbsp] (US, volume)",
"reset_children_help": "Sovrascrivi tutti i figli con valori da campi ereditati. I campi ereditati dei figli saranno impostati su Eredita i campi a meno che Figli ereditano i campi non sia impostato.",
"reset_food_inheritance_info": "Ripristina tutti gli alimenti ai campi ereditati predefiniti e ai rispettivi valori padre.",
"substitute_children": "Sostituisci figli",
"Input": "Immissione",
"show_ingredients_table": "Visualizza una tabella degli ingredienti accanto al testo dello step",
"Open_Data_Slug": "Open Data Slug",
"make_now_count": "Per lo più ingredienti mancanti",
"Nav_Text_Mode": "Modalità di navigazione testo",
"FDC_ID": "FDC ID",
"FDC_ID_help": "ID database FDC",
"ChildInheritFields_help": "In modo predefinito, i figli erediteranno questi campi.",
"InheritFields_help": "I valori di questi campi saranno ereditati dal genitore (eccezione: le categorie di acquisto vuote non vengono ereditate)",
"Never_Unit": "Mai unità",
"FDC_Search": "Ricerca FDC",
"property_type_fdc_hint": "Solo le proprietà con un ID FDC possono essere aggiornate automaticamente dal database FDC"
}

572
vue/src/locales/lv.json Normal file
View File

@@ -0,0 +1,572 @@
{
"warning_feature_beta": "Šī funkcionalitāte šobrīd ir BETA (testēšanā). To izmantojot ir iespējamas kļūdas gan šobrīd, gan nākotnē (iespējams ar funkcionalitāti saistīto datu zudums).",
"err_fetching_resource": "Ir notikusi kļūda datu saņemšanas laikā!",
"err_creating_resource": "Ir notikusi kļūda izveidojot resursu!",
"err_updating_resource": "Ir notikusi kļūda mainot resursu!",
"err_deleting_resource": "Ir notikusi kļūda dzēšot resursu!",
"err_deleting_protected_resource": "Objekts, kuru Jūs mēģinat dzēst, vēlarvien tiek izmantots un to nevar izdzēst.",
"err_moving_resource": "Notika kļūda pārvietojot resursu!",
"err_merging_resource": "Notika kļūda apvienojot resursu!",
"err_importing_recipe": "Notika kļūda importējot recepti!",
"success_fetching_resource": "Resurss veiksmīgi saņemts!",
"success_creating_resource": "Resurss veiksmīgi izveidots!",
"success_updating_resource": "Resurss veiksmīgi labots!",
"success_deleting_resource": "Resurss veiksmīgi izdzēsts!",
"success_moving_resource": "Resurss veiksmīgi pārvietots!",
"success_merging_resource": "Resurss veiksmīgi apvienots!",
"file_upload_disabled": "Failu ielāde šajā vietnē nav iespējota.",
"recipe_property_info": "",
"warning_space_delete": "",
"food_inherit_info": "",
"step_time_minutes": "",
"confirm_delete": "",
"import_running": "",
"all_fields_optional": "",
"convert_internal": "",
"show_only_internal": "",
"show_split_screen": "",
"Log_Recipe_Cooking": "",
"External_Recipe_Image": "",
"Add_to_Shopping": "",
"Add_to_Plan": "",
"Step_start_time": "",
"Sort_by_new": "",
"Table_of_Contents": "",
"Recipes_per_page": "",
"Show_as_header": "",
"Hide_as_header": "",
"Add_nutrition_recipe": "",
"Remove_nutrition_recipe": "",
"Copy_template_reference": "",
"per_serving": "",
"Save_and_View": "",
"Manage_Books": "",
"Meal_Plan": "",
"Select_Book": "",
"Select_File": "",
"Recipe_Image": "",
"Import_finished": "",
"View_Recipes": "",
"Log_Cooking": "",
"New_Recipe": "",
"Url_Import": "",
"Reset_Search": "",
"Recently_Viewed": "",
"Load_More": "",
"New_Keyword": "",
"Delete_Keyword": "",
"Edit_Keyword": "",
"Edit_Recipe": "",
"Move_Keyword": "",
"Merge_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Move_Up": "",
"Move_Down": "",
"Step_Name": "",
"Step_Type": "",
"Make_Header": "",
"Make_Ingredient": "",
"Amount": "",
"Enable_Amount": "",
"Disable_Amount": "",
"Ingredient Editor": "",
"Description_Replace": "",
"Instruction_Replace": "",
"Auto_Sort": "",
"Auto_Sort_Help": "",
"Private_Recipe": "",
"Private_Recipe_Help": "",
"reusable_help_text": "",
"open_data_help_text": "",
"Open_Data_Slug": "",
"Open_Data_Import": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Calculator": "",
"FDC_ID": "",
"FDC_Search": "",
"FDC_ID_help": "",
"property_type_fdc_hint": "",
"Data_Import_Info": "",
"Update_Existing_Data": "",
"Use_Metric": "",
"Learn_More": "",
"converted_unit": "",
"converted_amount": "",
"base_unit": "",
"base_amount": "",
"Datatype": "",
"Input": "",
"Undo": "",
"NoMoreUndo": "",
"Number of Objects": "",
"Add_Step": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"StartDate": "",
"EndDate": "",
"Share": "",
"Automation": "",
"Parameter": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Cancel": "",
"Link": "",
"Add": "",
"New": "",
"Note": "",
"Alignment": "",
"Success": "",
"Failure": "",
"Protected": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Delete_All": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Welcome": "",
"Move": "",
"Merge": "",
"Parent": "",
"Copy Link": "",
"Copy Token": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Shopping_input_placeholder": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Property": "",
"Property_Editor": "",
"Conversion": "",
"Original_Text": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"edit_title": "",
"Name": "",
"Properties": "",
"Type": "",
"Description": "",
"Recipe": "",
"tree_root": "",
"Icon": "",
"Unit": "",
"Decimals": "",
"Default_Unit": "",
"No_Results": "",
"New_Unit": "",
"Create_New_Shopping Category": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Unit": "",
"Create_New_Meal_Type": "",
"Create_New_Shopping_Category": "",
"and_up": "",
"and_down": "",
"Instructions": "",
"Unrated": "",
"Automate": "",
"Empty": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Time": "",
"Text": "",
"Shopping_list": "",
"Added_by": "",
"Added_on": "",
"AddToShopping": "",
"IngredientInShopping": "",
"NotInShopping": "",
"OnHand": "",
"FoodOnHand": "",
"FoodNotOnHand": "",
"Undefined": "",
"Create_Meal_Plan_Entry": "",
"Edit_Meal_Plan_Entry": "",
"Title": "",
"Week": "",
"Month": "",
"Year": "",
"created_by": "",
"Planner": "",
"Planner_Settings": "",
"Period": "",
"Plan_Period_To_Show": "",
"Periods": "",
"Plan_Show_How_Many_Periods": "",
"Starting_Day": "",
"Meal_Types": "",
"Meal_Type": "",
"New_Entry": "",
"Clone": "",
"Drag_Here_To_Delete": "",
"Meal_Type_Required": "",
"Title_or_Recipe_Required": "",
"Color": "",
"New_Meal_Type": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",
"AddFoodToShopping": "",
"RemoveFoodFromShopping": "",
"DeleteShoppingConfirm": "",
"IgnoredFood": "",
"Add_Servings_to_Shopping": "",
"Week_Numbers": "",
"Show_Week_Numbers": "",
"Export_As_ICal": "",
"Export_To_ICal": "",
"Cannot_Add_Notes_To_Shopping": "",
"Added_To_Shopping_List": "",
"Shopping_List_Empty": "",
"Next_Period": "",
"Previous_Period": "",
"Current_Period": "",
"Next_Day": "",
"Previous_Day": "",
"Inherit": "",
"InheritFields": "",
"FoodInherit": "",
"ShowUncategorizedFood": "",
"GroupBy": "",
"Language": "",
"Theme": "",
"CustomTheme": "",
"CustomThemeHelp": "",
"CustomImageHelp": "",
"CustomNavLogoHelp": "",
"CustomLogoHelp": "",
"CustomLogos": "",
"SupermarketCategoriesOnly": "",
"MoveCategory": "",
"CountMore": "",
"IgnoreThis": "",
"DelayFor": "",
"Warning": "",
"NoCategory": "",
"InheritWarning": "",
"ShowDelayed": "",
"ShowRecentlyCompleted": "",
"Completed": "",
"OfflineAlert": "",
"ShoppingBackgroundSyncWarning": "",
"shopping_share": "",
"shopping_auto_sync": "",
"one_url_per_line": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoinclude_related": "",
"default_delay": "",
"plan_share_desc": "",
"shopping_share_desc": "",
"shopping_auto_sync_desc": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related_desc": "",
"default_delay_desc": "",
"filter_to_supermarket": "",
"Coming_Soon": "",
"Auto_Planner": "",
"New_Cookbook": "",
"Hide_Keyword": "",
"Hour": "",
"Hours": "",
"Day": "",
"Days": "",
"Second": "",
"Seconds": "",
"Clear": "",
"Users": "",
"Invites": "",
"err_move_self": "",
"nothing": "",
"err_merge_self": "",
"show_sql": "",
"filter_to_supermarket_desc": "",
"CategoryName": "",
"SupermarketName": "",
"CategoryInstruction": "",
"OrderInformation": "",
"shopping_recent_days_desc": "",
"shopping_recent_days": "",
"download_pdf": "",
"download_csv": "",
"csv_delim_help": "",
"csv_delim_label": "",
"SuccessClipboard": "",
"copy_to_clipboard": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"copy_markdown_table": "",
"in_shopping": "",
"DelayUntil": "",
"Pin": "",
"Unpin": "",
"PinnedConfirmation": "",
"UnpinnedConfirmation": "",
"mark_complete": "",
"QuickEntry": "",
"shopping_add_onhand_desc": "",
"shopping_add_onhand": "",
"related_recipes": "",
"today_recipes": "",
"sql_debug": "",
"remember_search": "",
"remember_hours": "",
"tree_select": "",
"OnHand_help": "",
"ignore_shopping_help": "",
"shopping_category_help": "",
"food_recipe_help": "",
"Foods": "",
"Account": "",
"Cosmetic": "",
"API": "",
"enable_expert": "",
"expert_mode": "",
"simple_mode": "",
"advanced": "",
"fields": "",
"show_keywords": "",
"show_foods": "",
"show_books": "",
"show_rating": "",
"show_units": "",
"show_filters": "",
"not": "",
"save_filter": "",
"filter_name": "",
"left_handed": "",
"left_handed_help": "",
"show_step_ingredients_setting": "",
"show_step_ingredients_setting_help": "",
"show_step_ingredients": "",
"hide_step_ingredients": "",
"Custom Filter": "",
"shared_with": "",
"sort_by": "",
"asc": "",
"desc": "",
"date_viewed": "",
"last_cooked": "",
"times_cooked": "",
"date_created": "",
"show_sortby": "",
"search_rank": "",
"make_now": "",
"Created": "",
"Updated": "",
"Unchanged": "",
"Error": "",
"make_now_count": "",
"recipe_filter": "",
"book_filter_help": "",
"review_shopping": "",
"view_recipe": "",
"copy_to_new": "",
"recipe_name": "",
"paste_ingredients_placeholder": "",
"paste_ingredients": "",
"ingredient_list": "",
"explain": "",
"filter": "",
"Website": "",
"App": "",
"Message": "",
"Bookmarklet": "",
"Sticky_Nav": "",
"Sticky_Nav_Help": "",
"Logo": "",
"Show_Logo": "",
"Show_Logo_Help": "",
"Nav_Color": "",
"Nav_Text_Mode": "",
"Nav_Text_Mode_Help": "",
"Nav_Color_Help": "",
"Space_Cosmetic_Settings": "",
"Use_Kj": "",
"Comments_setting": "",
"click_image_import": "",
"no_more_images_found": "",
"import_duplicates": "",
"paste_json": "",
"Click_To_Edit": "",
"search_no_recipes": "",
"search_import_help_text": "",
"search_create_help_text": "",
"warning_duplicate_filter": "",
"reset_children": "",
"reset_children_help": "",
"reset_food_inheritance": "",
"reset_food_inheritance_info": "",
"substitute_help": "",
"substitute_siblings_help": "",
"substitute_children_help": "",
"substitute_siblings": "",
"substitute_children": "",
"SubstituteOnHand": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"InheritFields_help": "",
"show_ingredients_table": "",
"show_ingredient_overview": "",
"Ingredient Overview": "",
"last_viewed": "",
"created_on": "",
"updatedon": "",
"Imported_From": "",
"advanced_search_settings": "",
"nothing_planned_today": "",
"no_pinned_recipes": "",
"Planned": "",
"Pinned": "",
"Imported": "",
"Quick actions": "",
"Ratings": "",
"Internal": "",
"Units": "",
"Manage_Emails": "",
"Change_Password": "",
"Social_Authentication": "",
"Random Recipes": "",
"parameter_count": "",
"select_keyword": "",
"add_keyword": "",
"select_file": "",
"select_recipe": "",
"select_unit": "",
"select_food": "",
"remove_selection": "",
"empty_list": "",
"Select": "",
"Supermarkets": "",
"User": "",
"Username": "",
"First_name": "",
"Last_name": "",
"Keyword": "",
"Advanced": "",
"Page": "",
"DefaultPage": "",
"Single": "",
"Multiple": "",
"Reset": "",
"Disabled": "",
"Disable": "",
"Enable": "",
"Options": "",
"Create Food": "",
"create_food_desc": "",
"additional_options": "",
"Importer_Help": "",
"Documentation": "",
"Select_App_To_Import": "",
"Import_Supported": "",
"Export_Supported": "",
"Import_Not_Yet_Supported": "",
"Export_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Recipes_In_Import": "",
"Toggle": "",
"total": "",
"Import_Error": "",
"Warning_Delete_Supermarket_Category": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"Are_You_Sure": "",
"Valid Until": "",
"Split_All_Steps": "",
"Combine_All_Steps": "",
"Plural": "",
"plural_short": "",
"g": "",
"kg": "",
"ounce": "",
"pound": "",
"ml": "",
"l": "",
"fluid_ounce": "",
"us_cup": "",
"pint": "",
"quart": "",
"gallon": "",
"tbsp": "",
"tsp": "",
"imperial_fluid_ounce": "",
"imperial_pint": "",
"imperial_quart": "",
"imperial_gallon": "",
"imperial_tbsp": "",
"imperial_tsp": "",
"Choose_Category": "",
"Back": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"plural_usage_info": "",
"Create Recipe": "",
"Import Recipe": "",
"Never_Unit": "",
"Transpose_Words": "",
"Name_Replace": "",
"Food_Replace": "",
"Unit_Replace": ""
}

View File

@@ -2,17 +2,17 @@
"import_running": "Er wordt geïmporteerd, even geduld!",
"all_fields_optional": "Alle velden zijn optioneel en kunnen leeg gelaten worden.",
"convert_internal": "Zet om naar intern recept",
"Log_Recipe_Cooking": "Bereiding loggen",
"Log_Recipe_Cooking": "Bereiding registreren",
"External_Recipe_Image": "Externe Afbeelding Recept",
"Add_to_Book": "Voeg toe aan Boek",
"Add_to_Shopping": "Voeg toe aan Boodschappen",
"Add_to_Plan": "Voeg toe aan Plan",
"Step_start_time": "Starttijd stap",
"Select_Book": "Selecteer boek",
"Select_Book": "Selecteer kookboek",
"Recipe_Image": "Afbeelding Recept",
"Import_finished": "Importeren gereed",
"View_Recipes": "Bekijk Recepten",
"Log_Cooking": "Log Bereiding",
"Log_Cooking": "Registreer bereiding",
"Proteins": "Eiwitten",
"Fats": "Vetten",
"Carbohydrates": "Koolhydraten",
@@ -39,7 +39,7 @@
"Print": "Afdrukken",
"Information": "Informatie",
"Keywords": "Trefwoorden",
"Books": "Boeken",
"Books": "Kookboeken",
"show_only_internal": "Toon alleen interne recepten",
"New_Recipe": "Nieuw Recept",
"Url_Import": "Importeer URL",
@@ -76,8 +76,8 @@
"Delete": "Verwijder",
"Ok": "Ok",
"Load_More": "Laad meer",
"Manage_Books": "Beheer boeken",
"Create": "Voeg toe",
"Manage_Books": "Beheer kookboeken",
"Create": "Aanmaken",
"Failure": "Storing",
"View": "Bekijk",
"Recipes": "Recepten",
@@ -172,7 +172,7 @@
"Week": "Week",
"Month": "Maand",
"Color": "Kleur",
"New_Meal_Type": "Nieuw Maaltype",
"New_Meal_Type": "Nieuw maaltijd type",
"Image": "Afbeelding",
"Planner_Settings": "Planner instellingen",
"Period": "Periode",
@@ -180,11 +180,11 @@
"Periods": "Periodes",
"Plan_Show_How_Many_Periods": "Hoeveel perioden tonen",
"Starting_Day": "Eerste dag van de week",
"Meal_Types": "Maaltypes",
"Meal_Type": "Maaltype",
"Meal_Types": "Maaltijd types",
"Meal_Type": "Maaltijd type",
"Clone": "Kloon",
"Drag_Here_To_Delete": "Sleep hierheen om te verwijderen",
"Meal_Type_Required": "Maaltype is verplicht",
"Meal_Type_Required": "Maaltijd type is verplicht",
"Title_or_Recipe_Required": "Titel of recept selectie is verplicht",
"Select_File": "Selecteer Bestand",
"Year": "Jaar",
@@ -293,7 +293,7 @@
"fields": "Velden",
"show_keywords": "Toon Trefwoorden",
"show_foods": "Toon ingrediënten",
"show_books": "Toon boeken",
"show_books": "Toon kookboeken",
"show_rating": "Toon waardering",
"show_units": "Toon eenheden",
"show_filters": "Toon filters",
@@ -431,14 +431,14 @@
"Second": "Seconde",
"Seconds": "Seconden",
"Account": "Account",
"Cosmetic": "Cosmetisch",
"Cosmetic": "Weergave",
"Message": "Bericht",
"Sticky_Nav": "Navigatie altijd zichbaar",
"Sticky_Nav_Help": "Geef navigatiemenu altijd bovenin weer.",
"Nav_Color": "Navigatiekleur",
"Nav_Color_Help": "Verander de navigatiekleur.",
"Use_Kj": "kJ gebruiken in plaats van kcal",
"Comments_setting": "Commentaar weergeven",
"Comments_setting": "Opmerkingen weergeven",
"Change_Password": "Wachtwoord veranderen",
"Social_Authentication": "Authenticeren met sociale media-account",
"First_name": "Voornaam",
@@ -452,7 +452,7 @@
"Private_Recipe": "Privé Recept",
"Copy Link": "Kopieer Link",
"Decimals": "Decimalen",
"Use_Fractions": "Gebruik Kommagetallen",
"Use_Fractions": "Gebruik breuken",
"Theme": "Thema",
"Hour": "Uur",
"Users": "Gebruikers",
@@ -523,7 +523,7 @@
"Back": "Terug",
"err_importing_recipe": "Bij het importeren van het recept is een fout opgetreden!",
"CustomLogoHelp": "Upload vierkante afbeeldingen in verschillende groottes om het logo in het browser tabblad en geïnstalleerde web apps aan te passen.",
"DefaultPage": "Standaard Pagina",
"DefaultPage": "Startpagina",
"hide_step_ingredients": "Verberg Stap Ingrediënten",
"CustomTheme": "Aangepast Thema",
"CustomThemeHelp": "Overschrijf de stijl van het thema door een aangepast CSS bestand te uploaden.",
@@ -549,15 +549,15 @@
"ShowRecentlyCompleted": "Toon recent voltooide items",
"ShoppingBackgroundSyncWarning": "Slecht netwerk, wachten met synchroniseren…",
"OrderInformation": "Objecten worden van kleine naar grote nummers gesorteerd.",
"Show_Logo": "Toon Logo",
"Show_Logo_Help": "Toon Tandoor of ruimte logo in navigatie balk.",
"Show_Logo": "Toon logo",
"Show_Logo_Help": "Toon het Tandoor of 'Ruimte' logo in de navigatie balk.",
"Created": "Gemaakt",
"Updated": "Geüpdate",
"Unchanged": "Ongewijzigd",
"Error": "Fout",
"Logo": "Logo",
"Nav_Text_Mode": "Navigatie Tekst Mode",
"Space_Cosmetic_Settings": "Sommige cosmetische instellingen kunnen worden gewijzigd door de administrator van de Ruimte en zullen de persoonlijk instellingen voor die Ruimte overschrijven.",
"Nav_Text_Mode": "Navigatie tekstkleur",
"Space_Cosmetic_Settings": "Sommige weergave instellingen kunnen worden geforceerd door de administrator van de 'Ruimte' en zullen de persoonlijke instellingen voor die 'Ruimte' overschrijven.",
"Nav_Text_Mode_Help": "Beinvloed het uiterlijk voor ieder thema anders.",
"show_ingredients_table": "Toon een tabel van de ingrediënten naast de stap tekst",
"Alignment": "Afstemming",
@@ -571,5 +571,6 @@
"Name_Replace": "Naam Vervangen",
"Food_Replace": "Voedingsmiddelen Vervangen",
"Never_Unit": "Nooit Eenheid",
"Transpose_Words": "Omzetten Woorden"
"Transpose_Words": "Omzetten Woorden",
"us_cup": "kopje (US, eenheid)"
}

View File

@@ -1,5 +1,5 @@
{
"warning_feature_beta": "Данный функционал находится в стадии BETA (тестируется). Возможны баги и серьезные изменения функционала в будущем.",
"warning_feature_beta": "Данный функционал находится в стадии бета-тестирования. Возможны баги и серьезные изменения функционала в будущем.",
"err_fetching_resource": "Ошибка при загрузке продукта!",
"err_creating_resource": "Ошибка при создании продукта!",
"err_updating_resource": "Ошибка при редактировании продукта!",
@@ -312,7 +312,7 @@
"recipe_name": "Название рецепта",
"view_recipe": "Посмотреть рецепт",
"times_cooked": "Время готовки",
"last_cooked": "Последнее приготовленое",
"last_cooked": "Последнее приготовленное",
"date_viewed": "Последний просмотренный",
"Internal": "Внутренний",
"Imported_From": "Импортировано из",
@@ -346,5 +346,132 @@
"food_inherit_info": "Поля для продуктов питания, которые должны наследоваться по умолчанию.",
"warning_space_delete": "Вы можете удалить свое пространство, включая все рецепты, списки покупок, планы питания и все остальное, что вы создали. Этого нельзя отменить! Вы уверены, что хотите это сделать?",
"Description_Replace": "Изменить описание",
"err_importing_recipe": "Произошла ошибка при импортировании рецепта!"
"err_importing_recipe": "Произошла ошибка при импортировании рецепта!",
"related_recipes": "Похожие рецепты",
"Auto_Sort_Help": "Переместить все ингредиенты на наиболее подходящий шаг.",
"reusable_help_text": "Должна ли ссылка приглашения быть доступна для использования более чем одним пользователем?",
"asc": "По увеличению",
"desc": "По убыванию",
"show_sortby": "Показать сортировку по",
"Calculator": "Калькулятор",
"Private_Recipe_Help": "Рецепт виден только вам и людям, с которыми им поделились.",
"Private_Recipe": "Приватный Рецепт",
"Auto_Sort": "Автоматическая сортировка",
"Amount": "Количество",
"per_serving": "за порцию",
"Instruction_Replace": "Изменить Инструкцию",
"recipe_property_info": "Вы также можете добавить свойства к продуктам, чтобы автоматически рассчитывать их на основе вашего рецепта!",
"open_data_help_text": "Проект Tandoor Open Data предоставляет предоставленные сообществом данные для Tandoor. Это поле заполняется автоматически при импорте и допускает обновления в будущем.",
"Open_Data_Import": "Открыть импорт данных",
"property_type_fdc_hint": "Только типы свойств с FDC ID могут автоматически получать данные из базы данных FDC",
"Pin": "Закрепить",
"Import Recipe": "Импортировать рецепт",
"Create Recipe": "Создать рецепт",
"Manage_Emails": "Управление электронной почтой",
"Change_Password": "Изменить пароль",
"API": "API",
"Disable": "Отключить",
"Enable": "Включить",
"Disabled": "Отключено",
"Foods": "Продукты",
"Nav_Color": "Цвет навигации",
"Ingredient Overview": "Обзор ингредиентов",
"Export_Not_Yet_Supported": "Экспорт пока не поддерживается",
"Last_name": "Фамилия",
"Default_Unit": "Единица измерения по умолчанию",
"Decimals": "Десятки",
"Hours": "Часы",
"Day": "День",
"Days": "Дни",
"Hour": "Час",
"download_csv": "Скачать CSV",
"Cosmetic": "Косметические",
"Account": "Аккаунт",
"Import_Supported": "Импорт поддерживается",
"g": "грамм [г] (метрическая единица, вес)",
"sql_debug": "Отладка SQL",
"Import_Result_Info": "{imported} из {total} рецептов были импортированы",
"total": "всего",
"Copy Token": "Копировать токен",
"SupermarketName": "Название супермаркета",
"Plural": "Множественное",
"plural_short": "множественное",
"in_shopping": "В списке покупок",
"App": "Приложение",
"Message": "Сообщение",
"Export_Supported": "Экспорт поддерживается",
"Import_Not_Yet_Supported": "Импорт пока не поддерживается",
"filter_to_supermarket_desc": "По умолчанию список покупок фильтруется таким образом, чтобы в него включались только категории для выбранного супермаркета.",
"Toggle": "Переключить",
"OrderInformation": "Объекты упорядочены от меньшего к большему.",
"Website": "Веб-сайт",
"Welcome": "Добро пожаловать",
"SuccessClipboard": "Список покупок скопирован в буфер обмена",
"First_name": "Имя",
"Create Food": "Создать продукт",
"UnpinnedConfirmation": "{recipe} откреплен.",
"show_ingredient_overview": "Отобразить список всех ингредиентов в начале рецепта.",
"Username": "Имя пользователя",
"Undo": "Отменить",
"NoMoreUndo": "Нет изменений, которые можно было бы отменить.",
"Delete_All": "Удалить всё",
"Input": "Ввод",
"Copy Link": "Копировать ссылку",
"Shopping_input_placeholder": "Например: Картофель/100 Картофелин/100 г Картофеля",
"created_by": "Создано",
"Use_Fractions": "Использовать дроби",
"Language": "Язык",
"Theme": "Тема",
"ShowRecentlyCompleted": "Показать недавно завершенные элементы",
"ShoppingBackgroundSyncWarning": "Плохая сеть, ожидание синхронизации...",
"Seconds": "Секунды",
"Users": "Пользователи",
"Invites": "Приглашения",
"CategoryName": "Название категории",
"CategoryInstruction": "Перетаскивайте категории, чтобы изменить порядок отображения категорий в списке покупок.",
"shopping_recent_days": "Недавние дни",
"download_pdf": "Скачать PDF",
"csv_delim_help": "Разделитель, используемый для экспорта в формате CSV.",
"csv_delim_label": "Разделитель CSV",
"copy_to_clipboard": "Копировать в буфер обмена",
"copy_markdown_table": "Копировать как таблицу Markdown",
"Unpin": "Открепить",
"PinnedConfirmation": "{recipe} закреплен.",
"QuickEntry": "Быстрый вход",
"today_recipes": "Сегодняшние рецепты",
"Created": "Создано",
"Updated": "Обновлено",
"Error": "Ошибка",
"filter": "Фильтр",
"Logo": "Логотип",
"Show_Logo": "Показать логотип",
"Comments_setting": "Показать комментарии",
"Click_To_Edit": "Нажмите, чтобы изменить",
"search_no_recipes": "Не удалось найти ни одного рецепта!",
"search_import_help_text": "Импортировать рецепт с внешнего веб-сайта или приложения.",
"search_create_help_text": "Создать новый рецепт непосредственно в Tandoor.",
"New_Supermarket_Category": "Создать новую категорию супермаркетов",
"Datatype": "Тип данных",
"kg": "килограмм [кг] (метрическая единица, вес)",
"ounce": "унция [oz] (вес)",
"pound": "фунт (вес)",
"Original_Text": "Исходный текст",
"Properties": "Свойства",
"Property": "Свойство",
"StartDate": "Дата начала",
"EndDate": "Дата окончания",
"Second": "Секунда",
"DefaultPage": "Начальная страница",
"ml": "миллилитр [мл] (метрическая единица, объём)",
"l": "литр [л] (метрическая единица, объем)",
"Choose_Category": "Выбрать категорию",
"Back": "Назад",
"Use_Plural_Unit_Always": "Всегда используйте форму множественного числа для обозначения единицы измерения",
"CustomImageHelp": "Загрузите изображение, которое будет отображаться в обзоре пространства.",
"CustomNavLogoHelp": "Загрузите изображение, которое будет использоваться в качестве логотипа панели навигации.",
"CustomLogos": "Пользовательские логотипы",
"plan_share_desc": "Выбранным пользователям будет автоматически предоставлен доступ к новым записям в Плане Питания.",
"CustomTheme": "Пользовательская тема",
"CustomThemeHelp": "Измените стили выбранной темы, загрузив собственный CSS-файл.",
"Learn_More": "Узнать больше"
}

View File

@@ -16,7 +16,7 @@
"convert_internal": "Pretvori v interni recept",
"show_only_internal": "Prikaži samo interne recepte",
"show_split_screen": "Deljen pogled",
"Log_Recipe_Cooking": "Logiraj recept za kuhanje",
"Log_Recipe_Cooking": "Beleži kuharski recept",
"External_Recipe_Image": "Zunanja slika recepta",
"Add_to_Shopping": "Dodaj v nakupovalni listek",
"Add_to_Plan": "Dodaj v načrt",
@@ -84,7 +84,7 @@
"Success": "Uspešno",
"Failure": "Napaka",
"Ingredients": "Sestavine",
"Supermarket": "Supermarket",
"Supermarket": "Trgovina",
"Categories": "Kategorije",
"Category": "Kategorija",
"Selected": "Izbrano",
@@ -100,7 +100,7 @@
"Image": "Slika",
"Delete": "Izbriši",
"Open": "Odpri",
"Ok": "Odpri",
"Ok": "V redu",
"Save": "Shrani",
"Step": "Korak",
"Search": "Iskanje",
@@ -123,8 +123,8 @@
"merge_confirmation": "Zamenjaj <i>{source}</i> z/s <i>{target}</i>",
"create_rule": "in ustvari avtomatizacijo",
"move_selection": "Izberi starša {type} za premik v {source}.",
"merge_selection": "Zamenjaj vse dogodge {source} z izbranim {type}.",
"Root": "",
"merge_selection": "Zamenjaj vse dogodke {source} z izbranim {type}.",
"Root": "Koren",
"Ignore_Shopping": "Prezri nakup",
"Shopping_Category": "Kategorija nakupa",
"Edit_Food": "Uredi hrano",
@@ -149,7 +149,7 @@
"Type": "Tip",
"Description": "Opis",
"Recipe": "Recept",
"tree_root": "",
"tree_root": "Koren drevesa",
"Icon": "Ikona",
"Unit": "Enota",
"No_Results": "Ni rezultatov",
@@ -244,7 +244,7 @@
"Warning": "Opozorilo",
"NoCategory": "Nobena kategorija ni izbrana.",
"InheritWarning": "{food} je nastavljena na dedovanje, spremembe morda ne bodo trajale.",
"ShowDelayed": "Prikaži zamaknjene elemente",
"ShowDelayed": "Pokaži odložene elemente",
"Completed": "Končano",
"shopping_share": "Deli nakupovalni listek",
"shopping_auto_sync": "Avtomatska sinhronizacija",
@@ -285,13 +285,13 @@
"remember_search": "Zapomni si iskanje",
"remember_hours": "Ure, ki si jih zapomni",
"tree_select": "Uporabi drevesno označbo",
"Plural": "",
"plural_short": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"plural_usage_info": "",
"Plural": "Množina",
"plural_short": "množina",
"Use_Plural_Unit_Always": "Za enoto vedno uporabite množinsko obliko",
"Use_Plural_Unit_Simple": "Uporabite množinsko obliko za dinamično enoto",
"Use_Plural_Food_Always": "Za hrano vedno uporabljajte množinsko obliko",
"Use_Plural_Food_Simple": "Uporabite množinsko obliko za dinamično hrano",
"plural_usage_info": "Uporabite množinsko obliko za enote in hrano v tem prostoru.",
"err_deleting_protected_resource": "Predmet, ki ga želite izbrisati, je še vedno v uporabi in ga ni mogoče izbrisati.",
"Private_Recipe": "Zasebni Recept",
"Private_Recipe_Help": "Recept je prikazan samo vam in osebam, s katerimi ga delite.",
@@ -316,5 +316,259 @@
"converted_amount": "Pretvorjena Količina",
"base_unit": "Osnovna Enota",
"base_amount": "Osnovna Količina",
"Amount": "Količina"
"Amount": "Količina",
"err_importing_recipe": "Pri uvozu recepta je prišlo do napake!",
"Properties_Food_Amount": "Lastnosti Količina hrane",
"Properties_Food_Unit": "Lastnosti Hrana Enota",
"Calculator": "Kalkulator",
"FDC_ID": "FDC ID",
"show_rating": "Prikaži oceno",
"New_Entry": "Nov vnos",
"ignore_shopping_help": "Na nakupovalni seznam nikoli ne dodajajte hrane (npr. vode)",
"CustomTheme": "Tema po meri",
"CustomLogoHelp": "Naložite kvadratne slike v različnih velikostih, da jih spremenite v logotip v zavihku brskalnika in nameščeni spletni aplikaciji.",
"OnHand_help": "Hrana je v zalogi in ne bo samodejno dodana na nakupovalni seznam. Stanje na roki se deli z nakupovalnimi uporabniki.",
"CustomThemeHelp": "Preglasite sloge izbrane teme z nalaganjem datoteke CSS po meri.",
"ShoppingBackgroundSyncWarning": "Slabo omrežje, čakanje na sinhronizacijo ...",
"Unpin": "Odpni",
"PinnedConfirmation": "{recept} je bil pripet.",
"show_step_ingredients_setting_help": "Dodajte tabelo s sestavinami poleg korakov recepta. Velja v času ustvarjanja. Lahko se preglasi v pogledu za urejanje recepta.",
"Copy Token": "Kopiraj žeton",
"simple_mode": "Preprost način",
"show_books": "Prikaži knjige",
"sort_by": "Razvrsti po",
"date_viewed": "Nazadnje ogledano",
"StartDate": "Začetni datum",
"EndDate": "Končni datum",
"advanced": "Napredno",
"Decimals": "Decimalke",
"default_delay_desc": "Privzeto število ur za zakasnitev vnosa na nakupovalni seznam.",
"enable_expert": "Omogoči strokovni način",
"expert_mode": "Strokovni način",
"fields": "Polja",
"API": "API",
"show_keywords": "Prikaži ključne besede",
"show_foods": "Prikaži živila",
"show_units": "Prikaži enote",
"show_filters": "Prikaži filtre",
"date_created": "Datum ustvarjanja",
"filter_to_supermarket": "Razvrsti po trgovini",
"Users": "Uporabniki",
"Copy Link": "Kopiraj povezavo",
"Create_New_Shopping_Category": "Dodajte novo nakupovalno kategorijo",
"and_down": "& dol",
"Property": "Lastnost",
"Conversion": "Pogovor",
"Original_Text": "Izvirni tekst",
"created_by": "Ustvaril",
"Properties": "Lastnosti",
"Default_Unit": "Privzeta enota",
"Added_on": "Dodano",
"Day": "Dan",
"Days": "Dnevi",
"Second": "Sekunda",
"Seconds": "Sekunde",
"IgnoredFood": "{food} je nastavljen da prezre nakup.",
"Invites": "Povabila",
"UnpinnedConfirmation": "{recept} je bil odpet.",
"shopping_add_onhand_desc": "Označite hrano 'Pri roki', ko je označena na nakupovalnem seznamu.",
"Input": "Vnos",
"Undo": "Razveljavi",
"Property_Editor": "Urejevalnik lastnosti",
"not": "ne",
"save_filter": "Shrani filter",
"filter_name": "Ime filtra",
"show_step_ingredients_setting": "Prikažite sestavine poleg korakov recepta",
"show_step_ingredients": "Prikaži sestavine po korakih",
"Account": "Račun",
"food_recipe_help": "Če tukaj povežete recept, boste povezani recept vključili v vse druge recepte, ki uporabljajo to živilo",
"Foods": "Živila",
"Shopping_input_placeholder": "na primer: krompir/100 kromiprjev/100 g krompirja",
"Use_Fractions": "Uporabi ulomke",
"Use_Fractions_Help": "Samodejno pretvori decimalke v ulomke, ko si ogledujete recept.",
"Add_Servings_to_Shopping": "Dodaj {servings} obrokov v Nakupovanje",
"Language": "Jezik",
"Theme": "Tema",
"ShowRecentlyCompleted": "Prikaži nedavno dokončane elemente",
"one_url_per_line": "En URL na vrstico",
"plan_share_desc": "Novi vnosi v načrt obrokov bodo samodejno deljeni z izbranimi uporabniki.",
"Hour": "Ura",
"Hours": "Ure",
"OrderInformation": "Predmeti so razvrščeni od majhnega do velikega števila.",
"shopping_category_help": "Supermarkete je mogoče naročiti in filtrirati po nakupovalni kategoriji glede na razporeditev hodnikov.",
"Cosmetic": "Videz",
"hide_step_ingredients": "Skrij sestavine po korakih",
"Custom Filter": "Filter po meri",
"shared_with": "Deljeno s/z",
"asc": "Naraščajoče",
"desc": "Padajoče",
"last_cooked": "Nazadnje skuhano",
"times_cooked": "Število kuhanj",
"FDC_Search": "FDC iskanje",
"property_type_fdc_hint": "Samo lastniške vrste z ID-jem FDC lahko samodejno črpajo podatke iz baze podatkov FDC",
"Alignment": "Poravnava",
"Protected": "Zaščiteno",
"FDC_ID_help": "FDC ID v bazi",
"Datatype": "Vrsta podatkov",
"Number of Objects": "Število predmetov",
"CustomImageHelp": "Naložite sliko za prikaz v pregledu prostora.",
"CustomNavLogoHelp": "Naložite sliko, ki jo želite uporabiti kot logotip navigacijske vrstice.",
"CustomLogos": "Logotipi po meri",
"NoMoreUndo": "Ni sprememb, ki bi jih bilo mogoče razveljaviti.",
"Delete_All": "Izbriši vse",
"Welcome": "Dobrodošli",
"last_viewed": "Nazadnje ogledano",
"Pinned": "Pripeto",
"Username": "Uporabniško ime",
"Page": "Stran",
"Last_name": "Priimek",
"Random Recipes": "Naključni recepti",
"Multiple": "Več",
"select_food": "Izberi živilo",
"Advanced": "Napredno",
"Import_Result_Info": "Uvoženih je bilo {imported} od {total} receptov",
"Import_Error": "Med uvozom je prišlo do napake. Za ogled razširite podrobnosti na dnu strani.",
"Nav_Color_Help": "Spremenite barvo navigacije.",
"search_no_recipes": "Ni bilo mogoče najti nobenega recepta!",
"search_import_help_text": "Uvozite recept z zunanjega spletnega mesta ali aplikacije.",
"Export_Not_Yet_Supported": "Izvoz še ni podprt",
"Create Food": "Ustvari živilo",
"book_filter_help": "Vključi recepte iz filtra receptov poleg ročno dodeljenih.",
"substitute_siblings_help": "Vsa živila, ki imajo istega starša kot ta živila, se štejejo za nadomestke.",
"paste_ingredients_placeholder": "Tukaj prilepite seznam sestavin...",
"empty_list": "Seznam je prazen.",
"Importer_Help": "Več informacij in pomoč o tem uvozniku:",
"us_cup": "skodelica (US, volumen)",
"Sticky_Nav_Help": "Vedno prikaži navigacijski meni na vrhu zaslona.",
"Space_Cosmetic_Settings": "Nekatere kozmetične nastavitve lahko spremenijo skrbniki prostora in bodo preglasile nastavitve odjemalca za ta prostor.",
"reset_children_help": "Prepiši vse podrejene z vrednostmi iz podedovanih polj. Podedovana polja otrok bodo nastavljena na Podeduj polja, razen če je nastavljena možnost Podedovana polja.",
"parameter_count": "Parameter {count}",
"Reset": "Ponastavi",
"Recipes_In_Import": "Recepti v vaši uvozni datoteki",
"Split_All_Steps": "Vse vrstice razdelite na ločene korake.",
"Combine_All_Steps": "Združite vse korake v eno polje.",
"l": "liter [l] (metrično, volumen)",
"ml": "mililiter [ml] (metrično, volumen)",
"gallon": "galona [gal] (US, volumen)",
"quart": "četrtina [qt] (US, volumen)",
"imperial_pint": "imperialnih pol litra [imp pt] (UK, volumen)",
"Choose_Category": "Izberi kategorijo",
"Create Recipe": "Ustvari recept",
"Food_Replace": "Zamenjava živila",
"recipe_filter": "Filter receptov",
"select_keyword": "Izberite ključno besedo",
"reset_food_inheritance": "Ponastavi dedovanje",
"search_create_help_text": "Ustvarite nov recept neposredno v Tandoorju.",
"Manage_Emails": "Upravljanje e-poštnih sporočil",
"Disabled": "Onemogočeno",
"Disable": "Onemogoči",
"substitute_siblings": "Nadomestni sorodniki",
"Message": "Sporočilo",
"click_image_import": "Kliknite sliko, ki jo želite uvoziti za ta recept",
"show_ingredient_overview": "Prikažite seznam vseh sestavin na začetku recepta.",
"import_duplicates": "Da bi preprečili dvojnike, so recepti z enakim imenom kot obstoječi recepti prezrti. Potrdite to polje, če želite uvoziti vse.",
"paste_json": "Tukaj prilepite vir json ali html, da naložite recept.",
"Click_To_Edit": "Kliknite za urejanje",
"no_more_images_found": "Na spletnem mestu ni dodatnih slik.",
"substitute_children_help": "Vsa živila, ki so podrejena tej hrani, se štejejo za nadomestke.",
"SubstituteOnHand": "Pri roki imate nadomestek.",
"ChildInheritFields": "Otroci podedujejo polja",
"ChildInheritFields_help": "Otroci bodo privzeto podedovali ta polja.",
"create_food_desc": "Ustvarite živilo in jo povežite s tem receptom.",
"additional_options": "Dodatne možnosti",
"Toggle": "Preklopi",
"total": "skupaj",
"make_now_count": "Vsaj manjkajoče sestavine",
"Change_Password": "Spremeni geslo",
"Social_Authentication": "Socialna avtentikacija",
"add_keyword": "Dodaj ključno besedo",
"select_unit": "Izberi enoto",
"remove_selection": "Prekliči izbiro",
"Supermarkets": "Trgovine",
"User": "Uporabnik",
"First_name": "Ime",
"ounce": "unča [oz] (teža)",
"imperial_quart": "imperialna četrtina [imp qt] (UK, volumen)",
"imperial_fluid_ounce": "imperialna tekoča unča [imp fl oz] (UK, volumen)",
"Import Recipe": "Uvozi recept",
"Never_Unit": "Enota nikoli",
"reset_children": "Ponastavi podrejeno dedovanje",
"copy_to_new": "Kopiraj v nov recept",
"reset_food_inheritance_info": "Ponastavite vsa živila na privzeta podedovana polja in njihove nadrejene vrednosti.",
"show_sortby": "Pokaži Razvrsti po",
"search_rank": "Položaj iskanja",
"make_now": "Naredi zdaj",
"Created": "Ustvarjeno",
"Updated": "Posodobljeno",
"Unchanged": "Nespremenjeno",
"Error": "Napaka",
"review_shopping": "Pred shranjevanjem preglejte nakupovalne vnose",
"view_recipe": "Oglejte si recept",
"recipe_name": "Ime recepta",
"paste_ingredients": "Prilepi sestavine",
"ingredient_list": "Seznam sestavin",
"explain": "Pojasnilo",
"filter": "Filter",
"Website": "Spletna stran",
"App": "Aplikacija",
"Bookmarklet": "Zaznamek",
"Sticky_Nav": "Fiksna navigacija",
"Logo": "Logotip",
"Show_Logo": "Prikaži logotip",
"Show_Logo_Help": "Prikaži logotip Tandoor ali vesolje v navigacijski vrstici.",
"Nav_Color": "Barva navigacije",
"Nav_Text_Mode": "Navigacijski besedilni način",
"Nav_Text_Mode_Help": "Za vsako temo se obnaša drugače.",
"Use_Kj": "Uporabite kJ namesto kcal",
"Comments_setting": "Prikaži komentarje",
"warning_duplicate_filter": "Opozorilo: Zaradi tehničnih omejitev lahko uporaba več filtrov iste kombinacije (in/ali/ne) prinese nepričakovane rezultate.",
"InheritFields_help": "Vrednosti teh polj bodo podedovane od nadrejenega (Izjema: prazne nakupovalne kategorije niso podedovane)",
"show_ingredients_table": "Prikažite tabelo sestavin poleg besedila koraka",
"Ingredient Overview": "Pregled sestavin",
"created_on": "Ustvarjeno",
"updatedon": "Posodobljeno",
"Imported_From": "Uvoženo od",
"advanced_search_settings": "Nastavitve naprednega iskanja",
"nothing_planned_today": "Za danes nimate nič v načrtu!",
"no_pinned_recipes": "Nimate pripetih receptov!",
"Planned": "Načrtovano",
"Imported": "Uvoženo",
"Quick actions": "Hitra dejanja",
"Ratings": "Ocene",
"Internal": "Notranji",
"Units": "Enote",
"select_file": "Izberi datoteko",
"select_recipe": "Izberi recept",
"Select": "Izberi",
"Keyword": "Ključna beseda",
"Single": "Ena",
"substitute_help": "Nadomestki se upoštevajo pri iskanju receptov, ki jih je mogoče pripraviti s priročnimi sestavinami.",
"substitute_children": "Nadomestni otroci",
"DefaultPage": "Privzeta stran",
"Enable": "Omogoči",
"Options": "Možnosti",
"Documentation": "Dokumentacija",
"Select_App_To_Import": "Izberite aplikacijo, iz katere želite uvoziti",
"Import_Supported": "Uvoz podprt",
"Export_Supported": "Izvoz podprt",
"Import_Not_Yet_Supported": "Uvoz še ni podprt",
"imperial_tsp": "imperialna čajna žlica [imp tsp] (UK, volumen)",
"Back": "Nazaj",
"Transpose_Words": "Prenesite besede",
"Unit_Replace": "Zamenjava enote",
"Warning_Delete_Supermarket_Category": "Z brisanjem kategorije trgovine boste izbrisali tudi vse povezave z živili. Ste prepričani?",
"New_Supermarket": "Ustvari novo trgovino",
"New_Supermarket_Category": "Ustvari novo kategorijo trgovin",
"Are_You_Sure": "Ste prepričani?",
"Valid Until": "Velja do",
"g": "gram [g] (metrično, teža)",
"kg": "kilogram [g] (metrično, teža)",
"pound": "funt (teža)",
"fluid_ounce": "tekoča unča [fl oz] (US, volumen)",
"pint": "pol litra [pt] (US, volumen)",
"tbsp": "jedilna žlica [tbsp] (US, volumen)",
"tsp": "čajna žlica [tsp] (US, volumen)",
"imperial_gallon": "imperialna galona [imp gal] (UK, volumen)",
"imperial_tbsp": "imperialna jedilna žlica [imp tbsp] (UK, volumen)",
"Name_Replace": "Zamenjaj ime"
}

View File

@@ -13,14 +13,14 @@
"show_only_internal": "仅显示内部食谱",
"Log_Recipe_Cooking": "食谱烹饪记录",
"External_Recipe_Image": "外部食谱图像",
"Add_to_Shopping": "添加到购物",
"Add_to_Shopping": "加入购物清单",
"Add_to_Plan": "添加到计划",
"Step_start_time": "步骤开始时间",
"Sort_by_new": "按新旧排序",
"Recipes_per_page": "每页食谱数量",
"Manage_Books": "管理书籍",
"Manage_Books": "烹饪手册管理",
"Meal_Plan": "用餐计划",
"Select_Book": "选择书籍",
"Select_Book": "选择烹饪手册",
"Recipe_Image": "食谱图像",
"Import_finished": "导入完成",
"View_Recipes": "查看食谱",
@@ -31,7 +31,7 @@
"Recently_Viewed": "最近浏览",
"Load_More": "加载更多",
"Keywords": "关键词",
"Books": "书籍",
"Books": "烹饪手册",
"Proteins": "蛋白质",
"Fats": "脂肪",
"Carbohydrates": "碳水化合物",
@@ -198,7 +198,7 @@
"Week_Numbers": "周数",
"Show_Week_Numbers": "显示周数?",
"Coming_Soon": "即将到来",
"New_Cookbook": "新烹饪",
"New_Cookbook": "新烹饪手册",
"Hide_Keyword": "隐藏关键词",
"Export_To_ICal": "导出 .ics",
"Added_To_Shopping_List": "添加到购物清单",
@@ -296,7 +296,7 @@
"Default_Unit": "默认单位",
"Seconds": "秒",
"and_down": "& Down",
"ignore_shopping_help": "请不要将食物添加到购物列表中(例如水)",
"ignore_shopping_help": "请不要将食物添加到购物清单中(例如水)",
"Use_Fractions_Help": "查看食谱时自动将小数转换为分数。",
"Foods": "食物",
"Use_Fractions": "使用分数",
@@ -323,7 +323,7 @@
"Invites": "邀请",
"warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个筛选器可能会产生意想不到的结果。",
"Account": "账户",
"Cosmetic": "化妆品",
"Cosmetic": "外观",
"API": "API",
"enable_expert": "启用专家模式",
"expert_mode": "专家模式",
@@ -331,7 +331,7 @@
"fields": "字段",
"show_keywords": "显示关键字",
"show_foods": "显示食物",
"show_books": "显示书籍",
"show_books": "显示烹饪手册",
"show_units": "显示单位",
"show_filters": "显示筛选器",
"filter_name": "筛选器名称",
@@ -346,7 +346,7 @@
"Click_To_Edit": "点击编辑",
"search_no_recipes": "找不到任何食谱!",
"search_import_help_text": "从外部网站或应用程序导入食谱。",
"search_create_help_text": "直接在泥炉中创建新食谱。",
"search_create_help_text": "直接在 Tandoor 中创建新食谱。",
"reset_children": "重置子继承",
"reset_food_inheritance": "重置继承",
"reset_food_inheritance_info": "将所有食物重置为默认继承字段及其父值。",
@@ -479,7 +479,7 @@
"Auto_Sort_Help": "将所有食材移动到最恰当的步骤。",
"Create Recipe": "创建食谱",
"Import Recipe": "导入食谱",
"recipe_property_info": "您也可以为食物添加属性,以便根据食谱自动计算!",
"recipe_property_info": "您也可以为食物添加属性,以便根据您的食谱自动计算它们",
"per_serving": "每份",
"converted_amount": "换算量",
"Open_Data_Import": "开放数据导入",
@@ -558,5 +558,16 @@
"CustomImageHelp": "上传图片以在空间概览中显示。",
"CustomNavLogoHelp": "上传图像以用作导航栏徽标。",
"CustomLogoHelp": "上传不同尺寸的方形图像以更改为浏览器选项卡和安装的网络应用程序中的徽标。",
"CustomLogos": "自定义徽标"
"CustomLogos": "自定义徽标",
"us_cup": "量杯(美式容量单位)",
"Created": "已创建",
"Shopping_input_placeholder": "例:土豆 / 100 土豆 / 100 g 土豆",
"created_by": "创建者",
"Updated": "已更新",
"Unchanged": "未更改",
"Error": "错误",
"DefaultPage": "默认页面",
"Transpose_Words": "字符串转置",
"Calculator": "计算器",
"Never_Unit": "禁用单位识别"
}

View File

@@ -23,68 +23,68 @@
"Select_Book": "選擇書籍",
"Recipe_Image": "食譜圖片",
"Import_finished": "匯入完成",
"View_Recipes": "",
"Log_Cooking": "",
"New_Recipe": "",
"Url_Import": "",
"Reset_Search": "",
"Recently_Viewed": "",
"Load_More": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"Share": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Link": "",
"Add": "",
"New": "",
"Success": "",
"Failure": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Cancel": "",
"Delete": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Plural": "",
"plural_short": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"plural_usage_info": "",
"View_Recipes": "查看食譜",
"Log_Cooking": "記錄烹飪",
"New_Recipe": "新食譜",
"Url_Import": "網址匯入",
"Reset_Search": "重置搜尋",
"Recently_Viewed": "最近瀏覽",
"Load_More": "載入更多",
"Keywords": "關鍵字",
"Books": "書籍",
"Proteins": "蛋白質",
"Fats": "脂肪",
"Carbohydrates": "碳水化合物",
"Calories": "卡路里",
"Energy": "能量",
"Nutrition": "營養",
"Date": "日期",
"Share": "分享",
"Export": "匯出",
"Copy": "複製",
"Rating": "評分",
"Close": "關閉",
"Link": "連結",
"Add": "新增",
"New": "新的",
"Success": "成功",
"Failure": "失敗",
"Ingredients": "食材",
"Supermarket": "超市",
"Categories": "分類",
"Category": "類別",
"Selected": "已選擇",
"min": "分鐘",
"Servings": "份量",
"Waiting": "等待",
"Preparation": "準備",
"External": "外部",
"Size": "大小",
"Files": "檔案",
"File": "檔案",
"Edit": "編輯",
"Cancel": "取消",
"Delete": "刪除",
"Open": "打開",
"Ok": "確定",
"Save": "儲存",
"Step": "步驟",
"Search": "搜尋",
"Import": "匯入",
"Print": "列印",
"Settings": "設定",
"or": "",
"and": "",
"Information": "資訊",
"Download": "下載",
"Create": "建立",
"Plural": "複數",
"plural_short": "複數簡寫",
"Use_Plural_Unit_Always": "總是使用複數單位",
"Use_Plural_Unit_Simple": "簡單使用複數單位",
"Use_Plural_Food_Always": "總是使用複數食物",
"Use_Plural_Food_Simple": "簡單使用複數食物",
"plural_usage_info": "在此空間內使用複數形式表示單位和食物。",
"Table_of_Contents": "目錄",
"Select_File": "選擇檔案",
"file_upload_disabled": "您的空間未啟用檔案上傳功能。",
@@ -107,5 +107,466 @@
"Hide_as_header": "隱藏為標題",
"err_importing_recipe": "匯入食譜時發生錯誤!",
"recipe_property_info": "您也可以為食材添加屬性,以便根據您的食譜自動計算它們!",
"Show_as_header": "顯示為標題"
"Show_as_header": "顯示為標題",
"Key_Ctrl": "Ctrl 鍵",
"Recipe": "食譜",
"Icon": "圖標",
"Image": "圖片",
"Import_Result_Info": "匯入結果信息",
"Unit": "單位",
"Merge": "合併",
"Hide_Recipes": "隱藏食譜",
"Recipes": "食譜",
"Move": "移動",
"search_create_help_text": "直接在 Tandoor 中創建新食譜。",
"ShowDelayed": "顯示延遲",
"and_up": "及以上",
"mealplan_autoadd_shopping_desc": "自動將膳食計劃食材添加到購物清單中。",
"Shopping_list": "購物清單",
"Meal_Type": "餐類型",
"Foods": "食物",
"left_handed_help": "將使用左手模式優化界面顯示。",
"Pin": "釘住",
"us_cup": "美制杯",
"Create Recipe": "創建食譜",
"Import Recipe": "匯入食譜",
"Create_New_Food": "創建新食物",
"Week_Numbers": "週數",
"Coming_Soon": "即將推出",
"Auto_Planner": "自動計劃",
"copy_to_clipboard": "複製到剪貼板",
"Merge_Keyword": "合併關鍵字",
"converted_unit": "轉換單位",
"converted_amount": "轉換數量",
"Bookmarklet": "書籤小工具",
"ignore_shopping_help": "忽略購物幫助",
"Meal_Plan_Days": "餐計劃天數",
"del_confirmation_tree": "你確定要刪除 {source} 及其所有子項嗎?",
"Empty": "空",
"Make_Header": "設為標題",
"review_shopping": "審查購物",
"shopping_category_help": "超市可以按購物分類進行篩選使其與商店的內部佈局相匹配。",
"plan_share_desc": "新的膳食計劃條目將自動與選定的用戶共享。",
"food_recipe_help": "食物食譜幫助",
"show_step_ingredients_setting_help": "在食譜步驟旁邊添加成分表。在創建時應用。可以在編輯配方視圖中覆蓋。",
"show_step_ingredients": "顯示步驟食材",
"hide_step_ingredients": "隱藏步驟食材",
"sort_by": "排序依據",
"search_rank": "搜索排名",
"make_now": "立即製作",
"New_Keyword": "新關鍵字",
"Delete_Keyword": "刪除關鍵字",
"Open_Data_Import": "開放數據匯入",
"Properties_Food_Unit": "食物單位屬性",
"property_type_fdc_hint": "屬性類型 FDC 提示",
"Data_Import_Info": "通過導入社區精選的食物、單位等列表來增強您的空間,以提升您的食譜收藏。",
"Update_Existing_Data": "更新現有數據",
"Use_Metric": "使用公制",
"Learn_More": "了解更多",
"base_unit": "基礎單位",
"Shopping_Category": "購物分類",
"Unit_Alias": "單位別名",
"Keyword_Alias": "關鍵字別名",
"Delete_Food": "刪除食物",
"No_ID": "未找到標識,不能刪除。",
"merge_title": "合併標題",
"move_title": "移動標題",
"Property": "屬性",
"Property_Editor": "屬性編輯器",
"Conversion": "轉換",
"Original_Text": "原始文本",
"FoodNotOnHand": "你還沒有 {food}。",
"Recipe_Book": "食譜書",
"delete_title": "刪除標題",
"create_title": "創建標題",
"Properties": "屬性",
"Type": "類型",
"Create_New_Unit": "創建新單位",
"Create_New_Meal_Type": "創建新餐類型",
"and_down": "及以下",
"Automate": "自動化",
"Time": "時間",
"Text": "文本",
"OnHand": "手頭有",
"FoodOnHand": "你手上有 {food}。",
"Undefined": "未定義",
"Create_Meal_Plan_Entry": "創建餐計劃條目",
"Title": "標題",
"Color": "顏色",
"New_Meal_Type": "新餐類型",
"IgnoredFood": "已忽略購買 {food}。",
"Show_Week_Numbers": "顯示周數?",
"Export_To_ICal": "匯出到 iCal",
"Cannot_Add_Notes_To_Shopping": "無法添加備註到購物",
"Added_To_Shopping_List": "已添加到購物清單",
"Shopping_List_Empty": "購物清單空",
"Next_Period": "下一期間",
"Previous_Period": "上一期間",
"InheritFields": "繼承字段",
"FoodInherit": "食物繼承",
"ShowUncategorizedFood": "顯示未分類食物",
"GroupBy": "分組依據",
"Language": "語言",
"Theme": "主題",
"SupermarketCategoriesOnly": "僅超市分類",
"MoveCategory": "移動分類 ",
"IgnoreThis": "忽略這個",
"DelayFor": "延遲",
"Warning": "警告",
"NoCategory": "未選擇分類。",
"InheritWarning": "{food} 設置為繼承, 更改可能無法保存。",
"ShowRecentlyCompleted": "顯示最近完成",
"Completed": "已完成",
"ShoppingBackgroundSyncWarning": "網絡狀況不佳,正在等待進行同步……",
"shopping_auto_sync": "購物自動同步",
"one_url_per_line": "每行一個網址",
"mealplan_autoadd_shopping": "餐計劃自動添加購物",
"mealplan_autoexclude_onhand": "餐計劃自動排除手頭有的",
"mealplan_autoinclude_related": "餐計劃自動包含相關",
"default_delay": "默認延遲",
"shopping_share_desc": "用戶將看到您添加到購物清單中的所有商品。他們必須添加你才能看到他們清單上的內容。",
"shopping_auto_sync_desc": "設置為0將禁用自動同步。當查看購物列表時該列表每隔一秒更新一次以同步其他人可能做出的更改。在多人購物時很有用但會使用移動數據。",
"mealplan_autoinclude_related_desc": "將膳食計劃(手動或自動)添加到購物清單時,包括所有相關食譜。",
"default_delay_desc": "延遲購物清單條目的默認小時數。",
"filter_to_supermarket": "篩選到超市",
"New_Cookbook": "新食譜書",
"Hide_Keyword": "隱藏關鍵字",
"Hour": "小時",
"Hours": "小時",
"Second": "秒",
"Seconds": "秒",
"Clear": "清除",
"Users": "用戶",
"Invites": "邀請",
"err_move_self": "錯誤移動自己",
"nothing": "無",
"filter_to_supermarket_desc": "默認情況下,過濾購物清單只包括所選超市的類別。",
"SupermarketName": "超市名稱",
"CategoryInstruction": "拖動類別可更改出現在購物清單中的訂單類別。",
"OrderInformation": "對象按照從小到大的順序排列。",
"shopping_recent_days_desc": "顯示最近幾天的購物清單列表。",
"shopping_recent_days": "購物最近天數",
"download_pdf": "下載 PDF",
"csv_delim_help": "用於 CSV 導出的分隔符。",
"SuccessClipboard": "成功複製到剪貼板",
"csv_prefix_help": "將清單複製到剪貼板時要添加的前綴。",
"csv_prefix_label": "CSV 前綴標籤",
"copy_markdown_table": "複製 Markdown 表格",
"in_shopping": "在購物中",
"DelayUntil": "延遲到",
"Unpin": "取消釘住",
"PinnedConfirmation": "{recipe} 已固定。",
"UnpinnedConfirmation": "{recipe} 已取消固定。",
"QuickEntry": "快速輸入",
"shopping_add_onhand_desc": "在核對購物清單時,將食物標記為“入手”。",
"shopping_add_onhand": "購物添加手頭有的",
"related_recipes": "相關食譜",
"today_recipes": "今天的食譜",
"sql_debug": "SQL 調試",
"remember_search": "記住搜索",
"remember_hours": "記住小時",
"OnHand_help": "食物在庫存中時,不會自動添加到購物清單中。 並且現有狀態會與購物用戶共享。",
"Account": "賬戶",
"Cosmetic": "外觀",
"API": "API",
"enable_expert": "啟用專家模式",
"simple_mode": "簡單模式",
"advanced": "高級",
"show_keywords": "顯示關鍵字",
"show_units": "顯示單位",
"show_filters": "顯示篩選器",
"filter_name": "篩選器名稱",
"left_handed": "左撇子",
"show_step_ingredients_setting": "顯示步驟食材設置",
"Custom Filter": "自定義篩選器",
"shared_with": "共享給",
"show_sortby": "顯示排序依據",
"Created": "創建",
"Updated": "更新",
"Unchanged": "未更改",
"Error": "錯誤",
"view_recipe": "查看食譜",
"copy_to_new": "複製到新",
"recipe_name": "食譜名稱",
"paste_ingredients_placeholder": "在此處粘貼食材表...",
"explain": "解釋",
"Website": "網站",
"Sticky_Nav": "固定導航",
"Show_Logo": "顯示標誌",
"Show_Logo_Help": "在導航欄中顯示 Tandoor 或空間徽標。",
"Nav_Text_Mode": "導航文本模式",
"Nav_Text_Mode_Help": "每個主題的行為都不同。",
"Space_Cosmetic_Settings": "空間管理員可以更改某些裝飾設置,並將覆蓋該空間的客戶端設置。",
"paste_json": "在此處粘貼 json 或 html 源代碼以加載食譜。",
"Click_To_Edit": "點擊編輯",
"search_no_recipes": "找不到任何食譜!",
"substitute_children_help": "所有與這種食物相同子級的食物都被視作替代品。",
"show_ingredients_table": "顯示食材表",
"Internal": "內部",
"Units": "單位",
"Manage_Emails": "管理電子郵件",
"Change_Password": "更改密碼",
"Supermarkets": "超市",
"Reset": "重置",
"Are_You_Sure": "你確定嗎?",
"Valid Until": "有效期至",
"Split_All_Steps": "將所有行拆分為單獨的步驟。",
"Combine_All_Steps": "將所有步驟合併到一個字段中。",
"imperial_tsp": "英制茶匙",
"not": "不是",
"save_filter": "保存篩選器",
"substitute_help": "搜索可以用現有食材製作的食譜時,會考慮替代品。",
"ChildInheritFields": "子項繼承字段",
"ChildInheritFields_help": "默認情況下,子項將繼承這些字段。",
"created_on": "創建於",
"updatedon": "更新於",
"Imported_From": "匯入自",
"advanced_search_settings": "高級搜索設置",
"nothing_planned_today": "你今天沒有任何計劃!",
"select_keyword": "選擇關鍵字",
"Advanced": "高級",
"Options": "選項",
"Create Food": "創建食物",
"Parameter": "參數",
"Export_Supported": "支持匯出",
"Toggle": "切換",
"asc": "升序",
"times_cooked": "烹飪次數",
"Import_Error": "導入時發生錯誤。 請跳轉至頁面底部的詳細信息進行查看。",
"Protected": "受保護",
"Ingredient Editor": "食材編輯器",
"move_selection": "選擇要將 {source} 移動到的父級 {type}。",
"merge_selection": "將所有出現的 {source} 替換為 {type}。",
"Copy Link": "複製連結",
"Added_by": "添加者",
"Added_on": "添加於",
"AddToShopping": "添加到購物",
"IngredientInShopping": "此食材已在購物清單中。",
"NotInShopping": "購物清單中沒有 {food}。",
"show_sql": "顯示 SQL",
"App": "應用程式",
"Message": "消息",
"book_filter_help": "除手動選擇的食譜外,還包括篩選中的食譜。",
"ingredient_list": "食材清單",
"New_Entry": "新條目",
"Drag_Here_To_Delete": "拖到這裡刪除",
"Add_Servings_to_Shopping": "添加份量到購物",
"Export_As_ICal": "匯出為 iCal",
"Inherit": "繼承",
"Nav_Color": "導航顏色",
"CategoryName": "分類名稱",
"substitute_siblings_help": "所有與這種食物相同父級的食物都被視作替代品。",
"mark_complete": "標記完成",
"Search Settings": "搜尋設定",
"Nav_Color_Help": "改變導航欄顏色。",
"date_created": "創建日期",
"Auto_Sort": "自動排序",
"Auto_Sort_Help": "將所有食材移動到最恰當的步驟。",
"reusable_help_text": "邀請鏈接是否可用於多個用戶。",
"csv_delim_label": "CSV 分隔符標籤",
"Ignore_Shopping": "忽略購物",
"edit_title": "編輯標題",
"Name": "名稱",
"Clone": "克隆",
"shopping_share": "購物分享",
"Day": "天",
"desc": "降序",
"date_viewed": "查看日期",
"last_cooked": "最後烹飪",
"Description_Replace": "描述替換",
"Instruction_Replace": "指示替換",
"create_rule": "創建規則",
"Decimals": "小數",
"DeleteShoppingConfirm": "確定要移除購物清單中所有 {food} 嗎?",
"Current_Period": "當前期間",
"Next_Day": "下一天",
"Previous_Day": "前一天",
"recipe_filter": "食譜篩選器",
"Week": "週",
"OfflineAlert": "您處於離線狀態,購物清單可能無法同步。",
"Planner": "計劃者",
"Meal_Types": "餐類型",
"err_merge_self": "錯誤合併自己",
"show_foods": "顯示食物",
"show_books": "顯示書籍",
"show_rating": "顯示評分",
"Sticky_Nav_Help": "始終在屏幕頂部顯示導航菜單。",
"Logo": "標誌",
"Private_Recipe": "私人食譜",
"Private_Recipe_Help": "食譜只有你和共享的人會顯示。",
"Period": "期間",
"Use_Kj": "使用千焦",
"Title_or_Recipe_Required": "需要標題或食譜",
"Comments_setting": "評論設置",
"click_image_import": "點擊圖片匯入",
"select_unit": "選擇單位",
"select_food": "選擇食物",
"import_duplicates": "為防止食譜與現有食譜同名,將被忽略。 選中此框以導入所有內容。",
"Use_Fractions": "使用分數",
"search_import_help_text": "從外部網站或應用程序導入食譜。",
"expert_mode": "專家模式",
"Create_New_Shopping_Category": "創建新購物分類",
"Use_Fractions_Help": "查看食譜時自動將小數轉換為分數。",
"warning_duplicate_filter": "警告:由於技術限制,使用相同組合(和/或/不)的多個篩選器可能會產生意想不到的結果。",
"reset_children": "重置子項",
"Username": "用戶名",
"Step_Name": "步驟名稱",
"Move_Down": "下移",
"Step_Type": "步驟類型",
"Make_Ingredient": "設為食材",
"reset_children_help": "用繼承字段中的值覆蓋所有子項。 繼承的子字段將設置為繼承,除非它們已設置為繼承。",
"no_more_images_found": "沒有在網站上找到其他圖片。",
"download_csv": "下載 CSV",
"reset_food_inheritance_info": "將所有食物重置為默認繼承字段及其父值。",
"substitute_siblings": "替代兄弟項",
"substitute_children": "替代子項",
"SubstituteOnHand": "你手頭有一個替代品。",
"InheritFields_help": "繼承字段幫助",
"Note": "備註",
"Alignment": "對齊",
"merge_confirmation": "將 <i>{source}</i> 替換為 <i>{target}</i>",
"Shopping_Categories": "購物分類",
"Food_Alias": "食物別名",
"Food": "食物",
"Warning_Delete_Supermarket_Category": "刪除超市類別也會刪除與食品的所有關係。 你確定嗎?",
"New_Supermarket": "新超市",
"open_data_help_text": "Tandoor開放數據項目為Tandoor提供社區貢獻的數據。該字段在導入時會自動填充並可以之後更新。",
"Open_Data_Slug": "開放數據標籤",
"Amount": "數量",
"make_now_count": "立即製作次數",
"paste_ingredients": "粘貼食材",
"Pinned": "釘住",
"Imported": "匯入",
"Quick actions": "快速操作",
"tsp": "茶匙",
"imperial_fluid_ounce": "英制液盎司",
"imperial_pint": "英制品脫",
"imperial_quart": "英制夸脫",
"imperial_gallon": "英制加侖",
"imperial_tbsp": "英制湯匙",
"Transpose_Words": "轉置單詞",
"Name_Replace": "名稱替換",
"Food_Replace": "食物替換",
"Never_Unit": "從不使用單位",
"Unit_Replace": "單位替換",
"StartDate": "開始日期",
"EndDate": "結束日期",
"Parent": "父項",
"View": "查看",
"Welcome": "歡迎",
"Copy Token": "複製令牌",
"last_viewed": "最後查看",
"Select": "選擇",
"Input": "輸入",
"Undo": "撤銷",
"NoMoreUndo": "沒有可撤消的更改。",
"Delete_All": "刪除全部",
"delete_confirmation": "你確定要刪除 {source} 嗎?",
"move_confirmation": "移動 <i>{child}</i> 到 <i>{parent}</i>",
"Root": "根目錄",
"Move_Food": "移動食物",
"New_Food": "新食物",
"Edit_Meal_Plan_Entry": "編輯餐計劃條目",
"Month": "月",
"Year": "年",
"created_by": "創建者",
"Planner_Settings": "計劃者設定",
"Plan_Period_To_Show": "顯示計劃期間",
"Periods": "期間",
"Plan_Show_How_Many_Periods": "顯示多少期間",
"Starting_Day": "開始日",
"Meal_Type_Required": "需要餐類型",
"AddFoodToShopping": "添加食物到購物",
"RemoveFoodFromShopping": "從購物中移除食物",
"Days": "天",
"g": "克",
"kg": "千克",
"ounce": "盎司",
"pound": "磅",
"ml": "毫升",
"Shopping_input_placeholder": "購物輸入佔位符",
"Hide_Food": "隱藏食物",
"tree_root": "樹根",
"Default_Unit": "默認單位",
"New_Unit": "新單位",
"Create_New_Shopping Category": "創建新購物分類",
"Create_New_Keyword": "創建新關鍵字",
"Instructions": "指示",
"Unrated": "未評分",
"Key_Shift": "Shift 鍵",
"mealplan_autoexclude_onhand_desc": "將膳食計劃添加到購物清單時(手動或自動),排除當前手頭上的食材。",
"reset_food_inheritance": "重置食物繼承",
"show_ingredient_overview": "在開始時顯示食譜中所有食材的列表。",
"Ingredient Overview": "食材概覽",
"no_pinned_recipes": "你沒有固定的食譜!",
"Planned": "計劃",
"Ratings": "評分",
"Social_Authentication": "社交認證",
"Random Recipes": "隨機食譜",
"parameter_count": "參數計數",
"add_keyword": "添加關鍵字",
"select_file": "選擇文件",
"select_recipe": "選擇食譜",
"remove_selection": "移除選擇",
"empty_list": "列表為空。",
"User": "用戶",
"First_name": "名字",
"Last_name": "姓氏",
"Keyword": "關鍵字",
"Page": "頁面",
"Single": "單一",
"Multiple": "多個",
"New_Supermarket_Category": "新超市分類",
"FDC_Search": "FDC 搜尋",
"Edit_Food": "編輯食物",
"filter": "篩選",
"FDC_ID": "FDC ID",
"FDC_ID_help": "FDC ID 幫助",
"base_amount": "基礎數量",
"Edit_Keyword": "編輯關鍵字",
"Edit_Recipe": "編輯食譜",
"Move_Keyword": "移動關鍵字",
"Hide_Keywords": "隱藏關鍵字",
"Move_Up": "上移",
"Enable_Amount": "啟用數量",
"Disable_Amount": "禁用數量",
"Properties_Food_Amount": "食物數量屬性",
"l": "升",
"fluid_ounce": "液盎司",
"pint": "品脫",
"quart": "夸脫",
"gallon": "加侖",
"tbsp": "湯匙",
"Choose_Category": "選擇分類",
"Back": "返回",
"Import_Supported": "支持匯入",
"DefaultPage": "默認頁面",
"Disabled": "禁用",
"Disable": "禁用",
"Enable": "啟用",
"create_food_desc": "創建食物並將其鏈接到此食譜。",
"additional_options": "附加選項",
"Importer_Help": "有關此進口商的更多信息和幫助:",
"Documentation": "文檔",
"Select_App_To_Import": "選擇應用程式匯入",
"Import_Not_Yet_Supported": "匯入尚不支持",
"Export_Not_Yet_Supported": "匯出尚不支持",
"Recipes_In_Import": "匯入中的食譜",
"total": "總計",
"tree_select": "樹選擇",
"CustomTheme": "自定義主題",
"CustomThemeHelp": "通過上傳自定義 CSS 文件覆蓋所選主題的樣式。",
"CustomImageHelp": "上傳圖片以在空間概覽中顯示。",
"CustomNavLogoHelp": "上傳圖像以用作導航欄徽標。",
"CustomLogoHelp": "上傳不同尺寸的方形圖像以更改為瀏覽器選項卡和安裝的網絡應用程序中的徽標。",
"CustomLogos": "自定義標誌",
"CountMore": "計數更多",
"Description": "描述",
"Calculator": "計算器",
"Datatype": "數據類型",
"Number of Objects": "對象數量",
"Add_Step": "添加步驟",
"Automation": "自動化",
"No_Results": "無結果",
"fields": "字段"
}

View File

@@ -22,4 +22,5 @@ export const INTEGRATIONS = [
{id: 'REZKONV', name: "Rezkonv", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezkonv'},
{id: 'SAFRON', name: "Safron", import: true, export: true, help_url: 'https://docs.tandoor.dev/features/import_export/#safron'},
{id: 'REZEPTSUITEDE', name: "Rezeptsuite.de", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezeptsuitede'},
{id: 'GOURMET', name: "Gourmet", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#gourmet'},
]

View File

@@ -5185,9 +5185,9 @@ electron-to-chromium@^1.4.477:
integrity sha512-VTq6vjk3kCfG2qdzQRd/i9dIyVVm0dbtZIgFzrLgfB73mXDQT2HPKVRc1EoZcAVUv9XhXAu08DWqJuababdGGg==
elliptic@^6.5.3, elliptic@^6.5.4:
version "6.5.4"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
version "6.6.0"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210"
integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"