Compare commits

...

264 Commits
1.0.8 ... 1.1.2

Author SHA1 Message Date
vabene1111
edde8c8b8f Merge branch 'develop' 2022-03-04 15:54:16 +01:00
vabene1111
c950e6dabb Merge pull request #1625 from TandoorRecipes/dependabot/pip/recipe-scrapers-13.19.0
Bump recipe-scrapers from 13.18.0 to 13.19.0
2022-03-04 14:29:18 +01:00
vabene1111
e27a64f52c Merge pull request #1623 from gloriousDan/develop
Improve recipe import for non schema.org recipes
2022-03-04 14:28:34 +01:00
vabene1111
f02b6f29db Merge pull request #1620 from ratheile/ratheile-patch-boot-nonstandard-ports
Update boot.sh
2022-03-04 14:27:31 +01:00
dependabot[bot]
a3ba516587 Bump recipe-scrapers from 13.18.0 to 13.19.0
Bumps [recipe-scrapers](https://github.com/hhursev/recipe-scrapers) from 13.18.0 to 13.19.0.
- [Release notes](https://github.com/hhursev/recipe-scrapers/releases)
- [Commits](https://github.com/hhursev/recipe-scrapers/compare/13.18.0...13.19.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-04 13:27:30 +00:00
vabene1111
a15f5895f5 Merge pull request #1622 from MaxJa4/fix/ldap_dockerfile
Added ldap as runtime dependency to Dockerfile
2022-03-04 14:27:01 +01:00
vabene1111
c6e36b802c Merge pull request #1617 from smilerz/fix_sqlite_search
remove unaccent from sqlite search
2022-03-04 14:26:32 +01:00
vabene1111
f91ca28638 Merge pull request #1611 from smilerz/missing_preptime
missing prepTime assignment
2022-03-04 14:26:21 +01:00
Daniel Schulz
cfcf354d59 Improve recipe import for non schema.org recipes 2022-03-03 23:47:50 +01:00
MaxJa4
6813077113 Added ldap as runtime dependency to Dockerfile 2022-03-03 22:27:41 +01:00
Raffael Theiler
581ee762b6 Update boot.sh
Add port to pg_isready to allow non-standard ports.
2022-03-03 19:27:51 +01:00
smilerz
08c1a8f2ab fix loading children in treeselect 2022-03-02 14:56:33 -06:00
smilerz
ba25e463ad added uritemplate requirement back 2022-03-02 10:13:40 -06:00
smilerz
f2211da9bb remove unaccent from sqlite search 2022-03-02 09:42:10 -06:00
vabene1111
030d977a8c Merge branch 'develop' 2022-03-02 13:11:57 +01:00
vabene1111
8d3419952c movbed pg password check 2022-03-02 13:11:52 +01:00
vabene1111
8010ee3dca logical fix 2022-03-02 12:22:54 +01:00
vabene1111
0f3d82a5e6 fixing boot script 2022-03-02 12:22:12 +01:00
vabene1111
5e67e735db Merge branch 'beta' into develop 2022-03-02 12:17:40 +01:00
vabene1111
f9f6ca05a4 Merge pull request #1612 from smilerz/mealplan_modal_shopping
trigger shopping modal
2022-03-02 09:43:46 +01:00
vabene1111
d7379d8ab6 testing with setuptools_rust 2022-03-02 09:39:54 +01:00
vabene1111
51f44e4926 testing with py dev 2022-03-02 09:37:11 +01:00
vabene1111
447a16dcd5 re enabled disabled architectures 2022-03-02 09:28:28 +01:00
vabene1111
f15922ceb5 testing cryptography builds with rustc 2022-03-02 09:25:29 +01:00
vabene1111
a5cc218b56 Merge branch 'develop' into beta 2022-03-02 09:24:09 +01:00
vabene1111
640d7305c7 Merge branch 'master' into develop 2022-03-02 09:24:02 +01:00
vabene1111
fdf98932e2 exchanged deprecated vars 2022-03-02 09:20:35 +01:00
vabene1111
29e44e7101 dont build arm v7 2022-03-02 08:38:42 +01:00
smilerz
2993c7e688 trigger shopping modal 2022-03-01 17:17:35 -06:00
smilerz
d6db3fe65b missing prepTime assignment 2022-03-01 16:31:18 -06:00
vabene1111
36099b80ab docker dont pip install cryptography
dont install cryptography wheel in alpine docker build as py-cryptography already takes care of this.
2022-03-01 19:50:31 +01:00
vabene1111
9a795a7f60 docker dont pip install cryptography
dont install cryptography wheel in alpine docker build as py-cryptography already takes care of this.
2022-03-01 19:50:17 +01:00
vabene1111
7ef67cdadd Merge branch 'develop' 2022-03-01 16:37:03 +01:00
vabene1111
55539c83c9 fixed supermarket category creation 2022-03-01 16:26:36 +01:00
vabene1111
c5df241ec3 Merge pull request #1597 from MaxJa4/improvement/multiselect_localization
Multiselect controls are now fully localized in RecipeEditView
2022-03-01 15:55:35 +01:00
vabene1111
8ea882e5b3 Merge branch 'develop' into improvement/multiselect_localization 2022-03-01 15:55:27 +01:00
vabene1111
aaecd479ad Merge pull request #1594 from MaxJa4/improvement/minor_translation_fixes
Added a few more strings to be localized and fixed one ui alignment
2022-03-01 15:54:48 +01:00
vabene1111
65432895ba Merge branch 'develop' into improvement/minor_translation_fixes 2022-03-01 15:54:44 +01:00
vabene1111
b730acc06a Merge pull request #1596 from MaxJa4/improvement/select_amount
Auto selects amount of ingredient when adding new ingredient.
2022-03-01 15:52:10 +01:00
vabene1111
6b430abe3a Merge pull request #1591 from MaxJa4/improvement/ux_improv
Optimized advanced search settings UX
2022-03-01 15:51:11 +01:00
MaxJa4
cebd47a639 Fixed json format after merge 2022-02-28 21:21:06 +01:00
MaxJa4
1e3a6fadf0 More localization of recipe search and view 2022-02-28 21:19:00 +01:00
MaxJa4
47723673d0 Multiselect controls are now fully localized in RecipeEditView 2022-02-28 20:28:41 +01:00
MaxJa4
429d381f63 Auto selects amount of ingredient when adding new ingredient. 2022-02-28 19:43:37 +01:00
MaxJa4
b393d026f7 Added a few more strings to be localized and fixed one ui alignment 2022-02-27 22:40:03 +01:00
MaxJa4
09804de809 Optimized advanced search settings UX 2022-02-27 21:53:22 +01:00
vabene1111
9ecb087cd6 Merge branch 'develop' into beta 2022-02-27 12:37:26 +01:00
vabene1111
089e634d69 fixed mobile emoji select 2022-02-27 11:39:24 +01:00
vabene1111
028ee4a861 fixed file filter regex for importers 2022-02-27 11:37:12 +01:00
vabene1111
561c2106ce fixed nextcloud import first item 2022-02-27 11:27:23 +01:00
vabene1111
429607e1fe fixed shoppoing v2 list container size 2022-02-27 11:07:06 +01:00
vabene1111
802242f54e Merge pull request #1586 from smilerz/genericmodal_translations
fix translations in helper libraries models.js and utils.js
2022-02-27 09:50:37 +01:00
vabene1111
cd58b6681b Merge pull request #1588 from TandoorRecipes/dependabot/npm_and_yarn/vue/url-parse-1.5.10
Bump url-parse from 1.5.7 to 1.5.10 in /vue
2022-02-26 17:37:00 +01:00
dependabot[bot]
c7f5975c22 Bump url-parse from 1.5.7 to 1.5.10 in /vue
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.7 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.7...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-26 09:30:47 +00:00
vabene1111
03e32dba90 Merge pull request #1587 from TandoorRecipes/dependabot/npm_and_yarn/vue/prismjs-1.27.0
Bump prismjs from 1.25.0 to 1.27.0 in /vue
2022-02-26 10:30:09 +01:00
dependabot[bot]
739c2ecc53 Bump prismjs from 1.25.0 to 1.27.0 in /vue
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.25.0 to 1.27.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.25.0...v1.27.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-26 02:26:31 +00:00
smilerz
56c553c35d load language_code to new shopping list 2022-02-25 13:52:56 -06:00
smilerz
dae49ec5f3 fix translations in helper libraries models.js and utils.js 2022-02-25 13:16:34 -06:00
vabene1111
90d477a0fd small change to be able to retain large texts 2022-02-25 16:19:49 +01:00
vabene1111
fc6268b7ff Merge pull request #1564 from smilerz/retain_original_ingredient_text
retain original text when parsing ingredients
2022-02-25 16:17:44 +01:00
vabene1111
425a38f030 Merge pull request #1584 from smilerz/fix_duplicate_entry
return distinct shopping entries
2022-02-25 16:15:41 +01:00
vabene1111
d94e0523b0 Merge pull request #1582 from MaxJa4/fix/member_count
[PR cleanup] Add translations as in #1580
2022-02-25 15:52:09 +01:00
vabene1111
e824c9bff2 improved rezkonv parser 2022-02-25 15:51:37 +01:00
vabene1111
38ad246dc1 Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2022-02-25 15:51:28 +01:00
vabene1111
1bde4e81b7 fixed duplicate returns from tree manager get or create 2022-02-25 15:42:33 +01:00
smilerz
18e53aa03f return distinct shopping entries 2022-02-25 07:59:20 -06:00
vabene1111
e0b9b9caa2 Merge pull request #1583 from TandoorRecipes/expanded-contributors
Update CONTRIBUTERS.md
2022-02-25 14:49:08 +01:00
smilerz
25db5946bf Update CONTRIBUTERS.md 2022-02-25 07:47:36 -06:00
Maximilian Jannack
715e301a4d Revert "Revert "Added some translations in meal plan, recipe search and recipe switcher.""
This reverts commit 391c45b8be.
2022-02-25 10:43:34 +01:00
vabene1111
581f950e33 Merge pull request #1578 from smilerz/remove_stale_requirements
remove stale requirements
2022-02-25 08:01:24 +01:00
vabene1111
97eadfc39a Merge pull request #1577 from smilerz/email_confrm_ignores_ScriptName
fix bad redirect after email confirmation when using script_name
2022-02-25 08:00:47 +01:00
vabene1111
f7a3e2371a Merge pull request #1581 from MaxJa4/fix/member_count
Fix member count in space settings
2022-02-25 07:58:10 +01:00
MaxJa4
391c45b8be Revert "Added some translations in meal plan, recipe search and recipe switcher."
This reverts commit b2fa1db4f9.
2022-02-24 20:53:52 +01:00
MaxJa4
95b63d882b Fixed member count in space settings. 2022-02-24 19:31:42 +01:00
MaxJa4
b2fa1db4f9 Added some translations in meal plan, recipe search and recipe switcher. 2022-02-24 19:19:25 +01:00
smilerz
3b0b756a30 remove stale requirements 2022-02-24 09:58:14 -06:00
smilerz
896be70a77 fix bad redirect after email confirmation when using script_name 2022-02-24 09:03:29 -06:00
vabene1111
bedbc255b3 Merge pull request #1574 from smilerz/export_from_filter
fix serializer using food name instead of supermarket name
2022-02-24 07:50:18 +01:00
smilerz
c8dcca8630 fix recipe search in export form (converted to change safe genericAPI) 2022-02-23 17:24:06 -06:00
Kaibu
05305c46ca shopping list mobile detail fix 2022-02-23 23:23:37 +01:00
Kaibu
6d5195f0d3 improved cookbook detail loading 2022-02-23 22:44:37 +01:00
smilerz
abeeac838b fix serializer using food name instead of supermarket name 2022-02-23 14:31:43 -06:00
vabene1111
f2c543ac15 Merge pull request #1572 from smilerz/export_from_filter
Export from filter
2022-02-23 17:59:19 +01:00
smilerz
081edfd2d6 fix errors on Tandoor recipe import 2022-02-22 16:33:09 -06:00
smilerz
f9a4521ca1 redirect export using djangoResolveUrl 2022-02-22 16:00:55 -06:00
smilerz
a7d66fa850 export recipes from saved filter 2022-02-22 15:18:39 -06:00
vabene1111
b9597a3333 fixed keyword names including labels during import 2022-02-22 21:21:25 +01:00
vabene1111
5424702dff Merge pull request #1570 from smilerz/trigram_fullltext_fix
fix combined fulltext search and trigram generating error
2022-02-22 21:17:35 +01:00
smilerz
9b5a9b87e9 fix combined fulltext search and trigram generating error 2022-02-22 11:28:30 -06:00
smilerz
e52054e732 retain original text when parsing ingredients 2022-02-21 09:47:27 -06:00
vabene1111
c1605454dd only show create/import on search when not loading 2022-02-19 09:37:57 +01:00
vabene1111
b19ff3dca4 added import/create buttons to empty search 2022-02-19 09:16:54 +01:00
vabene1111
8361f4f692 Merge branch 'feature/custom_filters' into develop
# Conflicts:
#	cookbook/helper/recipe_search.py
2022-02-19 08:54:14 +01:00
vabene1111
1b6863683f rename to prevent shadowing 2022-02-19 08:53:25 +01:00
vabene1111
7fa5c2d987 changed defaults for multiple kw/book/food filters 2022-02-19 08:51:11 +01:00
smilerz
3b08b1406f filters are automatically shared when part of shared book 2022-02-19 08:51:11 +01:00
smilerz
6dddcadf41 calculate child/sibling subsitutes correctly 2022-02-19 08:50:55 +01:00
vabene1111
a843f94ea1 Merge pull request #1560 from TandoorRecipes/dependabot/npm_and_yarn/vue/url-parse-1.5.7
Bump url-parse from 1.5.3 to 1.5.7 in /vue
2022-02-19 08:42:55 +01:00
dependabot[bot]
c1297285f3 Bump url-parse from 1.5.3 to 1.5.7 in /vue
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.7.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.7)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-19 07:39:44 +00:00
vabene1111
43252a941b Merge pull request #1558 from smilerz/better_get_minutes
handle fractions and decimals in get_minutes() during import
2022-02-19 08:39:00 +01:00
smilerz
3e2fb6f814 Update recipe_url_import.py 2022-02-18 16:31:48 -06:00
smilerz
8e28247f17 handle fractions and decimals in get_minutes() during import 2022-02-18 15:31:55 -06:00
smilerz
f082a2f2cc filters are automatically shared when part of shared book 2022-02-18 11:33:04 -06:00
smilerz
cc1aed948a calculate child/sibling subsitutes correctly 2022-02-18 11:25:31 -06:00
vabene1111
e081d823ed fix book share permission 2022-02-18 17:52:32 +01:00
vabene1111
3cbc96b8b7 Merge pull request #1471 from TandoorRecipes/feature/custom_filters
Feature/custom filters
2022-02-18 17:30:29 +01:00
vabene1111
d6fa02cc9e Merge branch 'develop' into feature/custom_filters 2022-02-18 17:25:15 +01:00
vabene1111
d28cf681a3 Merge pull request #1555 from MaxJa4/improvement/startup_error_page
Added 502 error page for system startup
2022-02-18 17:03:37 +01:00
Maxi
21df09d0ba Added 502 error page for system startup 2022-02-18 16:35:27 +01:00
smilerz
2b5aec5d0a resolved loading custom filter when not in expert mode 2022-02-18 09:08:36 -06:00
vabene1111
9021bcd222 Merge pull request #1554 from MaxJa4/patch-1
[Docs] Add syntax highlighting for nginx subpath example
2022-02-18 13:46:08 +01:00
MaxJa4
e691eaf72f Update docker.md 2022-02-18 13:25:20 +01:00
MaxJa4
9e7a908136 Add syntax highlighting for nginx subpath example 2022-02-18 13:23:51 +01:00
smilerz
6b5a099ba0 removed case insensitive get_or_create for units 2022-02-17 12:49:41 -06:00
smilerz
1c18c8faac fix expert mode 2022-02-17 10:59:53 -06:00
smilerz
f1fa5e32bf fix case insensitive get_or_create 2022-02-17 10:50:38 -06:00
smilerz
d49818ae6a change default trigram threshold 2022-02-17 10:27:15 -06:00
smilerz
1b7f97dc64 case insensitive get_or_create 2022-02-17 10:23:31 -06:00
vabene1111
26a5c665de fixed instructions rendering next to ingredients on small devices 2022-02-17 15:30:08 +01:00
vabene1111
6a73ac0a33 fixed editor leave warning 2022-02-17 15:20:42 +01:00
vabene1111
7e5019eed3 fixed share write permission for meal plan 2022-02-17 14:57:28 +01:00
vabene1111
f23b566689 changed feature request template 2022-02-17 14:53:40 +01:00
vabene1111
e9431b5ff2 changed warning stylin 2022-02-17 14:53:27 +01:00
vabene1111
a54d08c9e2 Merge branch 'develop' into feature/custom_filters 2022-02-17 14:23:47 +01:00
vabene1111
d342e12363 show warning for multiple identical filter 2022-02-17 14:23:35 +01:00
vabene1111
a7aa458a85 Merge pull request #1548 from FHantke/develop
fix file path checks
2022-02-17 13:31:04 +01:00
florian hantke
d135c755c8 fix file path checks 2022-02-17 13:26:35 +01:00
vabene1111
3292c596ff Merge branch 'develop' into feature/custom_filters
# Conflicts:
#	vue/src/components/MealPlanEditModal.vue
#	vue/src/locales/en.json
2022-02-17 10:57:35 +01:00
vabene1111
caeaab22ce Merge pull request #1543 from smilerz/feature/copy-to-new-recipe
copy to new recipe
2022-02-17 10:56:03 +01:00
vabene1111
4fa5b28328 Merge branch 'develop' into feature/copy-to-new-recipe 2022-02-17 10:55:59 +01:00
vabene1111
f916e38da8 Merge pull request #1539 from smilerz/auto_add_shopping_fix
fix duplicate shopping recipes when auto-add enabled
2022-02-17 10:55:06 +01:00
vabene1111
f77b45725b Merge pull request #1538 from smilerz/feature/paste_ingredients
paste list of ingredients
2022-02-17 10:54:25 +01:00
vabene1111
8aedb80140 Merge pull request #1535 from MaxJa4/improvement/check_nginx_config
Added existence check for Nginx config file and mandatory parameters
2022-02-17 10:52:58 +01:00
smilerz
a76c4365ea mealplan showing on search when filtered instead of vice versa 2022-02-16 16:49:36 -06:00
smilerz
21c6f819a0 start counting at zero 2022-02-16 14:19:58 -06:00
smilerz
5f3d5afc37 typo 2022-02-16 14:18:23 -06:00
smilerz
57dec86b06 handle empty ingredient list when pasting 2022-02-16 14:17:41 -06:00
smilerz
d68a89a32c catch empty lines in paste_ingredients 2022-02-16 14:07:56 -06:00
smilerz
8b94bf1333 retain order of pasted ingredients 2022-02-16 13:22:53 -06:00
MaxJa4
539578c965 Add check for SECRET_KEY and POSTGRES_PASSWORD 2022-02-16 18:57:25 +01:00
MaxJa4
124a8687f1 Merge branch 'TandoorRecipes:develop' into improvement/check_nginx_config 2022-02-16 18:16:01 +01:00
smilerz
42a6f8457a remove console messages 2022-02-16 10:58:05 -06:00
smilerz
4c9ddee55c restrict get_or_create to name & space 2022-02-16 10:50:01 -06:00
vabene1111
de1efcb81e Merge pull request #1540 from TandoorRecipes/dependabot/npm_and_yarn/vue/follow-redirects-1.14.8
Bump follow-redirects from 1.14.7 to 1.14.8 in /vue
2022-02-16 17:04:46 +01:00
smilerz
501f56ffd5 copy to new recipe 2022-02-16 09:16:51 -06:00
smilerz
ad6d99800e include note from ingredient API 2022-02-16 08:35:04 -06:00
smilerz
bd973ec3a9 always sort count attributes to end 2022-02-15 16:19:41 -06:00
smilerz
b5c6c7cf2b sort cooked date fix 2022-02-15 12:00:59 -06:00
smilerz
f9ae48e23c fix Vue cookedon sort 2022-02-15 09:14:27 -06:00
smilerz
4e8bbefc17 minor cleanup 2022-02-15 06:42:57 -06:00
dependabot[bot]
90b4ecb599 Bump follow-redirects from 1.14.7 to 1.14.8 in /vue
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 02:38:12 +00:00
smilerz
57658e76f5 fix duplicate shopping recipes when auto-add enabled 2022-02-14 17:47:17 -06:00
smilerz
19708dbc64 paste list of ingredients 2022-02-14 17:28:16 -06:00
smilerz
444e0c1918 include new filters in ResetSearch() 2022-02-14 15:35:56 -06:00
smilerz
8fa00b50b1 added update_at filter 2022-02-14 15:13:34 -06:00
MaxJa4
b9f16c3f66 Inverted truth check for GUNICORN_MEDIA 2022-02-14 16:45:37 +01:00
MaxJa4
c90de725b0 Only show warning if not using gunicorn 2022-02-14 16:16:45 +01:00
MaxJa4
c0b43987dd Added extistence check for nginx config file. 2022-02-14 16:13:16 +01:00
smilerz
c2fa86e388 fixed typo 2022-02-13 14:35:38 -06:00
smilerz
3b8be24630 merge RecipeSearch with upstream 2022-02-13 14:15:01 -06:00
smilerz
e72f6e4ac4 Merge remote-tracking branch 'upstream/feature/custom_filters' into feature/custom_filters 2022-02-13 14:14:28 -06:00
smilerz
ef81700c05 add created filter, viewed filter and viewed sort 2022-02-13 14:07:43 -06:00
smilerz
bf54680178 more recipe search tests 2022-02-13 13:53:07 -06:00
vabene1111
3db55cd82b added sub path nginx example 2022-02-11 14:16:22 +01:00
vabene1111
f4bfcdab2e improved on explain and some tweaks 2022-02-11 14:15:46 +01:00
vabene1111
f320651cf8 Merge branch 'develop' into feature/custom_filters 2022-02-11 09:31:59 +01:00
vabene1111
3e9de4c392 compiled translations 2022-02-11 09:31:37 +01:00
vabene1111
1e9f7af017 updated translations and django version 2022-02-11 09:29:28 +01:00
vabene1111
cd99b9dc34 Merge pull request #849 from cschmatzler/develop
Allow specifying port through TANDOOR_PORT environment variable
2022-02-11 09:17:46 +01:00
vabene1111
b182a9962c Merge branch 'develop' into develop 2022-02-11 09:17:31 +01:00
vabene1111
9b5cc3deaa Merge pull request #1496 from poggenpower/develop
K8s deployment: Small fix for dupplicate entries.
2022-02-11 09:05:36 +01:00
vabene1111
7e7c7a3841 Merge pull request #1499 from xMAC94x/update_base_image
Update the baseimage of dockerfile as alpine 3.12 has some security v…
2022-02-11 09:04:29 +01:00
vabene1111
6ae1365505 Merge pull request #1512 from smilerz/additional_fixes
various fixes
2022-02-11 09:01:56 +01:00
vabene1111
dd2f27cfd4 Merge pull request #1513 from MaxJa4/improvement/ping_db
Ping DB instead of trying migration
2022-02-11 08:59:51 +01:00
vabene1111
1a38b54e4f Merge pull request #1520 from smilerz/LDAP-debug-logging
enable logging for LDAP
2022-02-11 08:59:04 +01:00
vabene1111
fffb0e0d07 Merge pull request #1525 from TandoorRecipes/revert-1516-patch-2
Revert "Update de.json"
2022-02-11 08:54:31 +01:00
vabene1111
de505dc8cc Revert "Update de.json" 2022-02-11 08:53:37 +01:00
vabene1111
9a735b75dc Merge pull request #1516 from hyperbit00/patch-2
Update de.json
2022-02-11 08:53:31 +01:00
smilerz
f933226c5d enable logging for LDAP 2022-02-09 16:19:51 -06:00
smilerz
baa2aa51da more recipe search tests 2022-02-09 16:18:45 -06:00
vabene1111
32a8cc9a69 proof of concept for recipe search explain 2022-02-09 18:44:29 +01:00
smilerz
c2961eede4 stub out receip search tests 2022-02-08 20:23:49 -06:00
Marion Kämpfer
13ed297fb9 Translated using Weblate (French)
Currently translated at 95.9% (286 of 298 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2022-02-09 01:31:35 +00:00
Jesse
4c259e6b9c Translated using Weblate (Dutch)
Currently translated at 95.2% (541 of 568 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2022-02-09 01:31:35 +00:00
Marion Kämpfer
faf51d0455 Translated using Weblate (French)
Currently translated at 94.7% (538 of 568 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/
2022-02-09 01:31:35 +00:00
hyperbit00
ed1585caed Update de.json
typo
2022-02-08 23:00:57 +01:00
hyperbit00
3917521ed6 Update de.json
typo in ressource
2022-02-08 22:56:33 +01:00
smilerz
924ffc473b fix recipe sharing 2022-02-08 14:59:54 -06:00
smilerz
0e258a49fb reload book recipes when adding filter 2022-02-08 12:30:11 -06:00
MaxJa4
a1063ce922 Merge branch 'improvement/ping_db' of https://github.com/MaxJa4/recipes into improvement/ping_db 2022-02-08 19:00:56 +01:00
MaxJa4
2471bb21f6 Fixed dep. position and used smaller package 2022-02-08 19:00:54 +01:00
smilerz
b3a830c319 fix missing pill when loading CustomFilter 2022-02-08 11:41:57 -06:00
MaxJa4
45942dfa7f Fixed indentation 2022-02-08 18:20:19 +01:00
MaxJa4
cb755a47bc Remove wrong code comment 2022-02-08 18:19:32 +01:00
MaxJa4
a35aa953b4 Ping DB instead of trying migration 2022-02-08 18:15:04 +01:00
smilerz
62adc5a91f make +/- search fields not clickable 2022-02-08 09:57:23 -06:00
smilerz
dc71260baa Merge branch 'additional_fixes' into feature/custom_filters 2022-02-08 09:05:07 -06:00
smilerz
88b3ba1427 various fixes 2022-02-08 08:13:16 -06:00
smilerz
93b7e5790d merge clashing commits 2022-02-07 18:11:38 -06:00
smilerz
286c6344ec Merge branch 'feature/custom_filters' into feature/custom_filtersv2 2022-02-07 17:47:53 -06:00
smilerz
1be5889923 tests for makenow filter 2022-02-07 17:46:04 -06:00
Marcel Märtens
542b656bea fix python-ldap bugs according to https://github.com/TandoorRecipes/recipes/pull/1499\#issuecomment-1031627178 2022-02-07 19:21:35 +01:00
vabene1111
4c5994ee7f Merge branch 'develop' into feature/custom_filters
# Conflicts:
#	cookbook/serializer.py
#	cookbook/views/api.py
#	vue/src/utils/openapi/api.ts
2022-02-07 18:56:19 +01:00
vabene1111
f1bbe16606 Merge pull request #1498 from MaxJa4/improvement/retry_migrations
Moved DB-waiting from docker-level to container-level
2022-02-07 18:42:41 +01:00
MaxJa4
d28a2f81a2 Remove always-restart so the container doesn't boot-loop on error 2022-02-07 18:14:03 +01:00
MaxJa4
855f1e4ee7 Remove always-restart so the container doesn't boot-loop on error 2022-02-07 18:13:58 +01:00
MaxJa4
b53a9a1c07 Remove always-restart so the container doesn't boot-loop on error 2022-02-07 18:13:50 +01:00
MaxJa4
20cc4b93a9 Add max amount of retries for web container boot 2022-02-07 18:13:19 +01:00
smilerz
d6af318c21 tests for single food reset inherit and additional inheritted fields 2022-02-07 09:16:48 -06:00
Marcel Märtens
bd8633c630 Update the baseimage of dockerfile as alpine 3.12 has some security vunerabilities.
According to:
https://artifacthub.io/packages/helm/truecharts/recipes?modal=security-report&image=tccr.io%2Ftruecharts%2Frecipes%3Av1.0.5%40sha256%3Ac74923879e7d2bf5bff4d1e953a100307462ad191a79908165f3364b97446833
There are at least 4 Chritical ones with a total of 47.
So updating the base should prob be a good thing and help here.
2022-02-06 23:57:40 +01:00
MaxJa4
fd5de4e47c Included error code in log message 2022-02-06 19:22:46 +01:00
MaxJa4
bb131ef16a Improved wording of log message upon retry 2022-02-06 19:12:52 +01:00
MaxJa4
773d2eff37 Moved db-waiting from docker-level to container-level 2022-02-06 18:54:42 +01:00
thl@deb030
9f9cc766c6 Small fix for dupplicate entries. 2022-02-06 17:42:04 +01:00
Chris Scoggins
ab52bd1a07 fix makenow/fulltext search duplicate results 2022-02-04 08:40:20 -06:00
Chris Scoggins
f9244a93a5 fix MakeNow filter 2022-02-03 17:19:38 -06:00
Chris Scoggins
6ef25b604b add food substitutions 2022-02-03 15:04:46 -06:00
Chris Scoggins
5e3f94fcf7 fix after rebase 2022-02-03 12:21:35 -06:00
Chris Scoggins
dcad389010 food edit modal - reset children inheritance 2022-02-03 12:15:04 -06:00
Chris Scoggins
a0508684d9 cleaned up console messages 2022-02-03 12:14:43 -06:00
Chris Scoggins
9ffae0da7b rebuild openapi 2022-02-03 12:14:42 -06:00
Chris Scoggins
04c4182b24 WIP 2022-02-03 12:14:42 -06:00
Chris Scoggins
583aee204e fix view recipes in Model View 2022-02-03 12:14:18 -06:00
Chris Scoggins
e05fd02c65 recipecoontextmenu 2022-02-03 12:14:17 -06:00
Chris Scoggins
c45bf3a994 WIP 2022-02-03 12:14:17 -06:00
Chris Scoggins
203ff1a6ec WIP 2022-02-03 12:14:04 -06:00
Chris Scoggins
07d5ead128 load RecipeFilter cookbook entries 2022-02-03 12:14:04 -06:00
Chris Scoggins
c042ab08c7 fix after rebase 2022-02-03 12:13:36 -06:00
Chris Scoggins
598f53f3d4 removeMissingItem disabled 2022-02-03 12:13:35 -06:00
Chris Scoggins
ec2cbc9b1b Fix after rebase 2022-02-03 12:13:16 -06:00
Chris Scoggins
fcb8e520b7 WIP 2022-02-03 12:11:32 -06:00
Chris Scoggins
5959914932 makenow filter 2022-02-03 12:11:32 -06:00
Chris Scoggins
ebb0b3a5ea sort by menu 2022-02-03 12:10:00 -06:00
Chris Scoggins
a72fc46d40 improved interaction between saved filter and filter fields 2022-02-03 12:10:00 -06:00
Chris Scoggins
8d78d15e21 implement sort order via API 2022-02-03 12:09:32 -06:00
Chris Scoggins
890e9e7242 created CustomFilter model and api 2022-02-03 12:09:14 -06:00
Chris Scoggins
492febe626 add saveSearch() 2022-02-03 12:08:10 -06:00
Chris Scoggins
d0549bcb6d complex book filters 2022-02-03 12:07:51 -06:00
Chris Scoggins
5e36bd0c27 complex food filters 2022-02-03 12:07:51 -06:00
Chris Scoggins
28d3d8a1e0 complex keyword filters 2022-02-03 12:07:50 -06:00
Chris Scoggins
bb226a221e WIP 2022-02-03 12:07:14 -06:00
smilerz
0ac369423c WIP 2022-02-03 12:07:13 -06:00
smilerz
a6a136c892 fix multiselect 2022-02-03 12:07:13 -06:00
smilerz
97224fa6a0 expert search settings 2022-02-03 12:06:57 -06:00
smilerz
5210bb6fbf added expert search settings 2022-02-03 12:06:30 -06:00
smilerz
918577a9a0 refactored cookies 2022-02-03 12:06:30 -06:00
smilerz
0e89723eab Squashed commit of the following:
commit ba1f10cd3a
Merge: 4e0cc34d4 ef4ce62f5
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Tue Jan 18 07:59:32 2022 +0100

    Merge branch 'develop' into facet-fix

commit 4e0cc34d41
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 17:18:43 2022 -0600

    better fix for counting facets

commit ef4ce62f5b
Author: Kaibu <notkaibu@gmail.com>
Date:   Mon Jan 17 23:48:57 2022 +0100

    custom class selection for lookupinput comp

commit b990462bdb
Merge: c60141940 5e34c6ddf
Author: Kaibu <notkaibu@gmail.com>
Date:   Mon Jan 17 23:48:12 2022 +0100

    Merge branch 'develop' of https://github.com/vabene1111/recipes into develop

commit 5e34c6ddf0
Merge: 532d32c19 d8d76ae9e
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 23:29:49 2022 +0100

    Merge pull request #1353 from smilerz/supermarket-category

    fix missing label on first supermarket category

commit d8d76ae9e0
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 16:12:54 2022 -0600

    fix missing label supermarket category

commit c60141940d
Author: Kaibu <notkaibu@gmail.com>
Date:   Mon Jan 17 23:02:42 2022 +0100

    shopping list ux improvements

commit 532d32c194
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 22:41:38 2022 +0100

    fixed shopping user save setting would not work

commit 54721a0a62
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 22:37:14 2022 +0100

    also added space to bot

commit c27933548d
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 22:28:02 2022 +0100

    fixed order of delete

commit d04e9518cb
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 22:13:36 2022 +0100

    fixed telegram shopping bot

commit b9065f7052
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 22:03:57 2022 +0100

    added space deletion feature

commit c8c29e1b5a
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 21:14:22 2022 +0100

    fixed performance issue

commit 5724ef9511
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 14:02:58 2022 -0600

    fix boolean directive

commit 2595a26fb4
Merge: e1c7305c0 437296415
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 20:26:02 2022 +0100

    Merge pull request #1351 from MaxJa4/patch-1

    Add hint about trailing slashes for subpath setups

commit e1c7305c07
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 20:22:37 2022 +0100

    switcher basically working again

commit 418c38423f
Merge: 90b6f9ad0 cc5be844d
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 20:15:01 2022 +0100

    Merge pull request #1352 from smilerz/fix-search

    force list params to list

commit cc5be844d5
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 13:13:26 2022 -0600

    force list params to list

commit 90b6f9ad06
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 19:54:16 2022 +0100

    fixed sub recipe issue

commit 437296415e
Author: MaxJa4 <74194322+MaxJa4@users.noreply.github.com>
Date:   Mon Jan 17 18:43:14 2022 +0100

    Update .env.template

commit a8c885bd21
Author: MaxJa4 <74194322+MaxJa4@users.noreply.github.com>
Date:   Mon Jan 17 18:41:41 2022 +0100

    Remove newline at the end

commit a539d14aad
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 18:15:23 2022 +0100

    wip switcher

commit 2b0541bd74
Author: MaxJa4 <74194322+MaxJa4@users.noreply.github.com>
Date:   Mon Jan 17 18:05:39 2022 +0100

    Add hint about trailing slashes for subpath setups

    Add hint about trailing slashes for subpath setups due to recent issue on Discord.

commit 3f53a924e1
Merge: d23158839 0ed9100fb
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 18:01:47 2022 +0100

    Merge branch 'develop' of https://github.com/vabene1111/recipes into develop

commit 0ed9100fb1
Merge: d2b796ddd 85ecac3a1
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 17:59:19 2022 +0100

    Merge pull request #1350 from TandoorRecipes/patch-empty-recipe_list

    Update recipe_search.py

commit d23158839b
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 17:58:09 2022 +0100

    Revert "temporarily disable recipe switcher"

    This reverts commit d2b796ddd2.

commit d2b796ddd2
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 17:58:04 2022 +0100

    temporarily disable recipe switcher

commit 8b1e80efeb
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 17:51:29 2022 +0100

    wip

commit 85ecac3a17
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 10:10:38 2022 -0600

    Update recipe_search.py

commit e0b8d6fcc3
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 17:00:08 2022 +0100

    added exception catch to nextcloud importer

    to handle empty folders in sync

commit edd47873f7
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 16:51:04 2022 +0100

    fixed signup button and autofocus on user input fields

commit c14dd04261
Merge: a37672812 769365d62
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 16:50:36 2022 +0100

    Merge pull request #1348 from smilerz/fuzzy_search

    Fuzzy search

commit 769365d624
Merge: ddb9e70d3 30421d067
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 09:46:33 2022 -0600

    Merge branch 'fuzzy_search' of github.com:smilerz/recipes into fuzzy_search

commit ddb9e70d31
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 09:46:26 2022 -0600

    fix url_import

commit a376728120
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 16:29:29 2022 +0100

    fixed keyword creation in exporter #1213

commit 306f90aa98
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 16:27:10 2022 +0100

    recipe editor decimal fixes

commit a19ad706ce
Merge: 4af6de742 8f3044dbe
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 16:22:18 2022 +0100

    Merge branch 'develop' of https://github.com/vabene1111/recipes into develop

commit 4af6de7425
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 16:22:11 2022 +0100

    Revert "Merge pull request #1280 from MarcusWolschon/feature1275_readable_export_file_names"

    This reverts commit c4f40b9639, reversing
    changes made to 93b868bc69.

commit 8f3044dbee
Merge: 7c5ffdaef 51620a34d
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 16:04:40 2022 +0100

    Merge pull request #1316 from tomtjes/docs-swag-example

    add swag config example

commit 7c5ffdaef4
Merge: d3b71e40c 30421d067
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:51:54 2022 +0100

    Merge pull request #1347 from smilerz/fuzzy_search

    Fuzzy search

commit 30421d067e
Merge: dde350c8a d3b71e40c
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:51:23 2022 +0100

    Merge branch 'develop' into fuzzy_search

commit d3b71e40c7
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 15:43:35 2022 +0100

    cleand up context menu code

commit 1a84a8fe80
Merge: 16cb99f91 934eeee5c
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:39:11 2022 +0100

    Merge pull request #1289 from MarcusWolschon/features/1093_recipe_link_in_plan

commit 16cb99f915
Merge: a451f722a f07690d7e
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:37:48 2022 +0100

    Merge pull request #1317 from mheiland/patch-1

    Example for third-party authentication

commit a451f722a1
Merge: f12196d1c 99b3ed846
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:35:43 2022 +0100

    Merge pull request #1327 from tomtjes/docs-faq-amendments

    FAQ amendments

commit dde350c8af
Author: smilerz <smilerz@gmail.com>
Date:   Mon Jan 17 08:35:19 2022 -0600

    prettier cleanup

commit f12196d1c6
Merge: d4242a244 b3e971fe0
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Mon Jan 17 15:20:45 2022 +0100

    Merge pull request #1343 from MatthiasLohr/feature/db-url-path

    Allow to specify an actual path using DATABASE_URL

commit d4242a244d
Merge: 0c603e366 8a7c4e11c
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 15:16:37 2022 +0100

    Merge branch 'master' into develop

commit 8a7c4e11c9
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Mon Jan 17 15:16:13 2022 +0100

    fixed invite link counting

commit 745bb58c7e
Author: vabene1111 <vabene1234@googlemail.com>
Date:   Sun Jan 9 18:25:38 2022 +0100

    fixed valid filter on invite link counter

commit b3e971fe09
Author: Matthias Lohr <mail@mlohr.com>
Date:   Mon Jan 17 11:21:36 2022 +0100

    allow to specify an actual path using DATABASE_URL

commit 0c603e3665
Author: Oliver Cervera <olivercervera@yahoo.it>
Date:   Sun Jan 16 15:21:49 2022 +0000

    Translated using Weblate (Italian)

    Currently translated at 84.1% (239 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/

commit fed9cfeeb7
Author: Oliver Cervera <olivercervera@yahoo.it>
Date:   Sun Jan 16 15:44:28 2022 +0000

    Translated using Weblate (Italian)

    Currently translated at 96.6% (492 of 509 strings)

    Translation: Tandoor/Recipes Backend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/

commit 5a65fd2231
Merge: c2a763fa4 24e42496a
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Sun Jan 16 17:29:35 2022 +0100

    Merge pull request #1331 from TandoorRecipes/dependabot/npm_and_yarn/vue/follow-redirects-1.14.7

    Bump follow-redirects from 1.14.6 to 1.14.7 in /vue

commit c2a763fa4c
Author: SMunos <smunos@synos.ovh>
Date:   Fri Jan 14 23:19:21 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (284 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 528767a835
Author: Josselin du PLESSIS <josse@du-plessis.fr>
Date:   Fri Jan 14 23:20:10 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (284 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 9b182f6076
Author: 糖多 <1365143958@qq.com>
Date:   Sat Jan 15 06:09:40 2022 +0000

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 32.0% (91 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/

commit 968b710b49
Author: 糖多 <1365143958@qq.com>
Date:   Sat Jan 15 06:19:48 2022 +0000

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 28.6% (146 of 509 strings)

    Translation: Tandoor/Recipes Backend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/

commit f11e07d347
Author: Josselin du PLESSIS <josse@du-plessis.fr>
Date:   Fri Jan 14 23:23:05 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (509 of 509 strings)

    Translation: Tandoor/Recipes Backend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/

commit 24e42496a7
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Jan 16 01:02:54 2022 +0000

    Bump follow-redirects from 1.14.6 to 1.14.7 in /vue

    Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.6 to 1.14.7.
    - [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
    - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.6...v1.14.7)

    ---
    updated-dependencies:
    - dependency-name: follow-redirects
      dependency-type: indirect
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit 9da496cb6d
Merge: 8cebc98d3 9221533ae
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Sat Jan 15 21:46:04 2022 +0100

    Merge pull request #1323 from MaxJa4/patch-1

    Added Apache2 in the bug report template

commit 99b3ed8464
Author: tomtjes <nesiofnqwe@mailbox.org>
Date:   Sat Jan 15 13:58:40 2022 -0500

    add FAQ for PWA

commit 281535e756
Author: tomtjes <nesiofnqwe@mailbox.org>
Date:   Sat Jan 15 13:57:20 2022 -0500

    phrase FAQ as questions

commit 9221533ae7
Author: MaxJa4 <74194322+MaxJa4@users.noreply.github.com>
Date:   Sat Jan 15 12:56:01 2022 +0100

    Added Apache2 in the bug report template

    Added Apache2 as selectable option in the bug report template

commit f07690d7e3
Author: mheiland <15824364+mheiland@users.noreply.github.com>
Date:   Sat Jan 15 00:24:56 2022 +0100

    Example for third-party authentication

    Providing an example to integrate Keycloak as IAM for Tandoor. Hinting that both SOCIAL* variables are required.

commit 8cebc98d3b
Author: SMunos <smunos@synos.ovh>
Date:   Fri Jan 14 23:18:38 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (284 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 965d2c05e7
Author: FrenchAnon <qdskyhwfeu@email.ucms.edu.pk>
Date:   Fri Jan 14 23:17:50 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (284 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 17ad01ae8c
Author: Josselin du PLESSIS <josse@du-plessis.fr>
Date:   Fri Jan 14 22:42:42 2022 +0000

    Translated using Weblate (French)

    Currently translated at 100.0% (284 of 284 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 51620a34d9
Author: tomtjes <nesiofnqwe@mailbox.org>
Date:   Fri Jan 14 15:10:22 2022 -0500

    add swag config example

commit 91fcb1b822
Author: Tomasz Klimczak <klemensble@gmail.com>
Date:   Thu Jan 6 12:50:29 2022 +0000

    Translated using Weblate (Polish)

    Currently translated at 80.9% (225 of 278 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/

commit 01d5ab92c5
Author: Tiago Rascazzi <t.d77@hotmail.com>
Date:   Thu Jan 6 16:30:49 2022 +0000

    Translated using Weblate (French)

    Currently translated at 72.6% (202 of 278 strings)

    Translation: Tandoor/Recipes Frontend
    Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/

commit 79c8d26e8c
Merge: 9486b08e2 0e1153ce3
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Fri Jan 14 17:18:30 2022 +0100

    Merge pull request #1311 from smilerz/patch-2

    fix bug creating food with create form

commit 9486b08e20
Merge: d36033a8b ffa91863d
Author: vabene1111 <vabene1111@users.noreply.github.com>
Date:   Fri Jan 14 16:57:10 2022 +0100

    Merge pull request #1309 from MaxJa4/develop

    Disabled old issue templates and added new ones with new GitHub issues format

commit 934eeee5c4
Author: Marcus Wolschon <Marcus@Wolschon.biz>
Date:   Fri Jan 14 13:56:46 2022 +0100

commit 2927333bf1
Author: Marcus Wolschon <Marcus@Wolschon.biz>
Date:   Fri Jan 14 13:52:42 2022 +0100

commit 0e1153ce3a
Author: smilerz <smilerz@gmail.com>
Date:   Thu Jan 13 17:40:26 2022 -0600

    deleted extraneous emit

commit b3f05b0bfd
Author: smilerz <smilerz@gmail.com>
Date:   Thu Jan 13 16:50:15 2022 -0600

    fix bug creating food with create form

commit ffa91863dd
Author: Maximilian Jannack <maxijannack@t-online.de>
Date:   Thu Jan 13 21:26:15 2022 +0100

    Added config.yml for FAQ link

commit cf2d33daad
Author: Maximilian Jannack <maxijannack@t-online.de>
Date:   Thu Jan 13 21:17:08 2022 +0100

    Disabled old issue templates and added new ones with new GitHub issues format

commit 8f08ba7114
Author: Marcus Wolschon <Marcus@Wolschon.biz>
Date:   Wed Jan 12 16:15:55 2022 +0100

commit 8a4f35e592
Author: Marcus Wolschon <Marcus@Wolschon.biz>
Date:   Wed Jan 12 11:37:08 2022 +0100
2022-02-03 12:05:33 -06:00
smilerz
1fe027b313 WIP 2022-02-03 12:04:11 -06:00
smilerz
cdb7c7854d initial TreeSearch component 2022-02-03 12:04:11 -06:00
smilerz
ab68a60480 WIP 2022-02-03 12:04:10 -06:00
vabene1111
559fee0ffe Merge branch 'develop' into beta 2022-01-23 12:51:07 +01:00
vabene1111
e15fec9845 Merge branch 'develop' into beta 2022-01-18 22:51:51 +01:00
vabene1111
2073158e1f Merge branch 'develop' into beta 2022-01-18 16:18:19 +01:00
vabene1111
7e2ee0300c Merge branch 'develop' into beta 2022-01-18 07:57:17 +01:00
vabene1111
79f6e27959 Merge branch 'develop' into beta 2022-01-17 17:00:16 +01:00
vabene1111
450923c0a4 Merge branch 'develop' into beta 2021-12-23 15:55:42 +01:00
vabene1111
7537c1a908 Merge branch 'develop' into beta 2021-11-15 08:41:15 +01:00
vabene1111
6cfd1a495e Merge branch 'develop' into beta 2021-10-29 14:56:41 +02:00
vabene1111
17d4619c31 Merge branch 'develop' into beta 2021-10-29 11:49:17 +02:00
vabene1111
2c05e7e282 Merge branch 'develop' into beta 2021-10-26 14:53:31 +02:00
vabene1111
928be086e4 Merge branch 'develop' into beta 2021-10-14 09:03:26 +02:00
vabene1111
e3c86e8685 Merge branch 'develop' into beta 2021-10-11 16:30:28 +02:00
Christoph Schmatzler
e5607aff90 Add TANDOOR_PORT to .env.template 2021-09-02 16:08:39 +02:00
Christoph Schmatzler
a47d9d00fd Allow specifying port through TANDOOR_PORT environment variable 2021-09-01 19:46:55 +02:00
144 changed files with 7578 additions and 4833 deletions

View File

@@ -3,6 +3,9 @@
DEBUG=0
SQL_DEBUG=0
# HTTP port to bind to
# TANDOOR_PORT=8080
# hosts the application can run under e.g. recipes.mydomain.com,cooking.mydomain.com,...
ALLOWED_HOSTS=*

View File

@@ -29,11 +29,3 @@ body:
attributes:
label: "Additional context"
description: "Add any other context or screenshots about the feature request here."
- type: checkboxes
attributes:
label: "Contribute"
description: "Are you willing and able to help develop this feature?"
options:
- label: "Yes"
- label: "Partly"
- label: "No"

View File

@@ -35,8 +35,8 @@ jobs:
publish: true
imageName: vabene1111/recipes
tag: beta
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:

View File

@@ -39,5 +39,5 @@ jobs:
publish: true
imageName: vabene1111/recipes
tag: latest
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}

View File

@@ -41,8 +41,8 @@ jobs:
publish: true
imageName: vabene1111/recipes
tag: ${{ steps.get_version.outputs.VERSION }}
dockerHubUser: ${{ secrets.DOCKER_USERNAME }}
dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }}
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:

View File

@@ -6,11 +6,17 @@ Please have a look at the [list of pull requests](https://github.com/vabene1111/
a complete list of contributions.
Below are some of the larger contributions made yet.
- @tourn provided the serving feature and **several** other improvements!
- @l0c4lh057 provided a much improved ingredient text parser in [#277](https://github.com/vabene1111/recipes/pull/277)
- @sebimarkgraf added nutritional information [#199](https://github.com/vabene1111/recipes/pull/199)
- @cazier added reverse proxy authentication [#88](https://github.com/vabene1111/recipes/pull/88)
- [vabene1111]
- [Kaibu]
- [smilerz]
- [MaxJa4] Docker builds and other improvements
- [tourn] provided the serving feature and **several** other improvements!
- [l0c4lh057] provided a much improved ingredient text parser in [#277](https://github.com/vabene1111/recipes/pull/277)
- [sebimarkgraf] added nutritional information [#199](https://github.com/vabene1111/recipes/pull/199)
- [cazier] added reverse proxy authentication [#88](https://github.com/vabene1111/recipes/pull/88)
- [murphy83] added support for IPv6 #1490
- [TheHaf] added custom serving size component #1411
- [lostlont] added LDAP support #960
## Translations
@@ -30,6 +36,7 @@ Below are some of the larger contributions made yet.
### German
[eTaurus](https://www.transifex.com/user/profile/eTaurus/)
[l0c4lh057](https://www.transifex.com/user/profile/l0c4lh057/)
[hyperbit00]
### Hungarian
[igazka](https://www.transifex.com/user/profile/igazka/)
@@ -60,4 +67,4 @@ Below are some of the larger contributions made yet.
### Vietnamese
[vuongtrunghieu](https://www.transifex.com/user/profile/vuongtrunghieu/)
[vuongtrunghieu](https://www.transifex.com/user/profile/vuongtrunghieu/)

View File

@@ -1,7 +1,7 @@
FROM python:3.9-alpine3.12
FROM python:3.10-alpine3.15
#Install all dependencies.
RUN apk add --no-cache postgresql-libs gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography openldap
#Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1
@@ -15,10 +15,12 @@ WORKDIR /opt/recipes
COPY requirements.txt ./
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev libressl-dev libffi-dev cargo openssl-dev openldap-dev && \
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev libressl-dev libffi-dev cargo openssl-dev openldap-dev python3-dev && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \
venv/bin/pip install wheel==0.36.2 && \
venv/bin/pip install wheel==0.37.1 && \
venv/bin/pip install setuptools_rust==1.1.2 && \
venv/bin/pip install -r requirements.txt --no-cache-dir &&\
apk --purge del .build-deps

58
boot.sh
View File

@@ -1,12 +1,66 @@
#!/bin/sh
source venv/bin/activate
echo "Updating database"
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf
display_warning() {
echo "[WARNING]"
echo -e "$1"
}
echo "Checking configuration..."
# Nginx config file must exist if gunicorn is not active
if [ ! -f "$NGINX_CONF_FILE" ] && [ $GUNICORN_MEDIA -eq 0 ]; then
display_warning "Nginx configuration file could not be found at the default location!\nPath: ${NGINX_CONF_FILE}"
fi
# SECRET_KEY must be set in .env file
if [ -z "${SECRET_KEY}" ]; then
display_warning "The environment variable 'SECRET_KEY' is not set but REQUIRED for running Tandoor!"
fi
echo "Waiting for database to be ready..."
attempt=0
max_attempts=20
if [ "${DB_ENGINE}" != 'django.db.backends.sqlite3' ]; then
# POSTGRES_PASSWORD must be set in .env file
if [ -z "${POSTGRES_PASSWORD}" ]; then
display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!"
fi
while pg_isready --host=${POSTGRES_HOST} --port=${POSTGRES_PORT} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do
sleep 5
done
fi
if [ $attempt -gt $max_attempts ]; then
echo -e "\nDatabase not reachable. Maximum attempts exceeded."
echo "Please check logs above - misconfiguration is very likely."
echo "Make sure the DB container is up and POSTGRES_HOST is set properly."
echo "Shutting down container."
exit 1 # exit with error to make the container stop
fi
echo "Database is ready"
echo "Migrating database"
python manage.py migrate
echo "Generating static files"
python manage.py collectstatic_js_reverse
python manage.py collectstatic --noinput
echo "Done"
chmod -R 755 /opt/recipes/mediafiles
exec gunicorn -b :8080 --access-logfile - --error-logfile - --log-level INFO recipes.wsgi
exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi

View File

@@ -179,6 +179,7 @@ class ImportForm(ImportExportBase):
class ExportForm(ImportExportBase):
recipes = forms.ModelMultipleChoiceField(widget=MultiSelectWidget, queryset=Recipe.objects.none(), required=False)
all = forms.BooleanField(required=False)
custom_filter = forms.IntegerField(required=False)
def __init__(self, *args, **kwargs):
space = kwargs.pop('space')

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,10 @@
import random
import re
from html import unescape
from unicodedata import decomposition
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 recipe_scrapers._utils import get_minutes
@@ -26,9 +28,14 @@ def get_from_scraper(scrape, request):
recipe_json['name'] = ''
try:
description = scrape.schema.data.get("description") or ''
description = scrape.description() or None
except Exception:
description = ''
description = None
if not description:
try:
description = scrape.schema.data.get("description") or ''
except Exception:
description = ''
recipe_json['description'] = parse_description(description)
@@ -49,20 +56,26 @@ def get_from_scraper(scrape, request):
recipe_json['servings'] = max(servings, 1)
try:
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("prepTime")) or 0
recipe_json['prepTime'] = get_minutes(scrape.prep_time()) or 0
except Exception:
recipe_json['prepTime'] = 0
try:
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("prepTime")) or 0
except Exception:
recipe_json['prepTime'] = 0
try:
recipe_json['cookTime'] = get_minutes(scrape.schema.data.get("cookTime")) or 0
recipe_json['cookTime'] = get_minutes(scrape.cook_time()) or 0
except Exception:
recipe_json['cookTime'] = 0
try:
recipe_json['cookTime'] = get_minutes(scrape.schema.data.get("cookTime")) or 0
except Exception:
recipe_json['cookTime'] = 0
if recipe_json['cookTime'] + recipe_json['prepTime'] == 0:
try:
recipe_json['prepTime'] = get_minutes(scrape.total_time()) or 0
except Exception:
try:
get_minutes(scrape.schema.data.get("totalTime")) or 0
recipe_json['prepTime'] = get_minutes(scrape.schema.data.get("totalTime")) or 0
except Exception:
pass
@@ -83,15 +96,23 @@ def get_from_scraper(scrape, request):
except Exception:
pass
try:
if scrape.schema.data.get('recipeCategory'):
keywords += listify_keywords(scrape.schema.data.get("recipeCategory"))
if scrape.category():
keywords += listify_keywords(scrape.category())
except Exception:
pass
try:
if scrape.schema.data.get('recipeCategory'):
keywords += listify_keywords(scrape.schema.data.get("recipeCategory"))
except Exception:
pass
try:
if scrape.schema.data.get('recipeCuisine'):
keywords += listify_keywords(scrape.schema.data.get("recipeCuisine"))
if scrape.cuisine():
keywords += listify_keywords(scrape.cuisine())
except Exception:
pass
try:
if scrape.schema.data.get('recipeCuisine'):
keywords += listify_keywords(scrape.schema.data.get("recipeCuisine"))
except Exception:
pass
try:
recipe_json['keywords'] = parse_keywords(list(set(map(str.casefold, keywords))), request.space)
except AttributeError:
@@ -116,7 +137,7 @@ def get_from_scraper(scrape, request):
'id': random.randrange(10000, 99999)
},
'note': note,
'original': x
'original_text': x
}
)
except Exception:
@@ -132,7 +153,7 @@ def get_from_scraper(scrape, request):
'id': random.randrange(10000, 99999)
},
'note': '',
'original': x
'original_text': x
}
)
recipe_json['recipeIngredient'] = ingredients
@@ -144,9 +165,9 @@ def get_from_scraper(scrape, request):
except Exception:
recipe_json['recipeInstructions'] = ""
if scrape.url:
recipe_json['url'] = scrape.url
recipe_json['recipeInstructions'] += "\n\nImported from " + scrape.url
if scrape.canonical_url():
recipe_json['url'] = scrape.canonical_url()
recipe_json['recipeInstructions'] += "\n\n" + _("Imported from") + ": " + scrape.canonical_url()
return recipe_json
@@ -198,7 +219,7 @@ def parse_ingredients(ingredients):
'id': random.randrange(10000, 99999)
},
'note': note,
'original': x
'original_text': x
}
)
except Exception:
@@ -214,7 +235,7 @@ def parse_ingredients(ingredients):
'id': random.randrange(10000, 99999)
},
'note': '',
'original': x
'original_text': x
}
)
@@ -332,7 +353,7 @@ def parse_keywords(keyword_json, space):
kw = normalize_string(kw)
if len(kw) != 0:
if k := Keyword.objects.filter(name=kw, space=space).first():
keywords.append({'id': str(k.id), 'text': str(k)})
keywords.append({'id': str(k.id), 'text': str(k.name)})
else:
keywords.append({'id': random.randrange(1111111, 9999999, 1), 'text': kw})

View File

@@ -35,7 +35,7 @@ def shopping_helper(qs, request):
qs = qs.filter(Q(checked=False) | Q(completed_at__gte=week_ago))
supermarket_order = ['checked'] + supermarket_order
return qs.order_by(*supermarket_order).select_related('unit', 'food', 'ingredient', 'created_by', 'list_recipe', 'list_recipe__mealplan', 'list_recipe__recipe')
return qs.distinct().order_by(*supermarket_order).select_related('unit', 'food', 'ingredient', 'created_by', 'list_recipe', 'list_recipe__mealplan', 'list_recipe__recipe')
class RecipeShoppingEditor():
@@ -65,9 +65,13 @@ class RecipeShoppingEditor():
except (ValueError, TypeError):
self.servings = getattr(self._shopping_list_recipe, 'servings', None) or getattr(self.mealplan, 'servings', None) or getattr(self.recipe, 'servings', None)
@property
def _recipe_servings(self):
return getattr(self.recipe, 'servings', None) or getattr(getattr(self.mealplan, 'recipe', None), 'servings', None) or getattr(getattr(self._shopping_list_recipe, 'recipe', None), 'servings', None)
@property
def _servings_factor(self):
return self.servings / self.recipe.servings
return Decimal(self.servings)/Decimal(self._recipe_servings)
@property
def _shared_users(self):

View File

@@ -1,11 +1,14 @@
from gettext import gettext as _
import bleach
import markdown as md
from bleach_allowlist import markdown_attrs, markdown_tags
from jinja2 import Template, TemplateSyntaxError, UndefinedError
from markdown.extensions.tables import TableExtension
from cookbook.helper.mdx_attributes import MarkdownFormatExtension
from cookbook.helper.mdx_urlize import UrlizeExtension
from jinja2 import Template, TemplateSyntaxError, UndefinedError
from gettext import gettext as _
from markdown.extensions.tables import TableExtension
class IngredientObject(object):
amount = ""

View File

@@ -2,14 +2,14 @@ import re
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class ChefTap(Integration):
def import_file_name_filter(self, zip_info_object):
print("testing", zip_info_object.filename)
return re.match(r'^cheftap_export/([A-Za-z\d\w\s-])+.txt$', zip_info_object.filename) or re.match(r'^([A-Za-z\d\w\s-])+.txt$', zip_info_object.filename)
return re.match(r'^cheftap_export/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.txt$', zip_info_object.filename) or re.match(r'^([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.txt$', zip_info_object.filename)
def get_recipe_from_file(self, file):
source_url = ''
@@ -45,11 +45,11 @@ class ChefTap(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -5,14 +5,14 @@ from zipfile import ZipFile
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class Chowdown(Integration):
def import_file_name_filter(self, zip_info_object):
print("testing", zip_info_object.filename)
return re.match(r'^(_)*recipes/([A-Za-z\d\s-])+.md$', zip_info_object.filename)
return re.match(r'^(_)*recipes/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.md$', zip_info_object.filename)
def get_recipe_from_file(self, file):
ingredient_mode = False
@@ -60,12 +60,13 @@ class Chowdown(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, space=self.request.space,
))
if len(ingredient.strip()) > 0:
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
))
recipe.steps.add(step)
for f in self.files:

View File

@@ -2,6 +2,7 @@ import base64
import gzip
import json
import re
from gettext import gettext as _
from io import BytesIO
import requests
@@ -11,8 +12,7 @@ from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_html_import import get_recipe_from_source
from cookbook.helper.recipe_url_import import iso_duration_to_minutes
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from gettext import gettext as _
from cookbook.models import Ingredient, Keyword, Recipe, Step
class CookBookApp(Integration):
@@ -51,11 +51,11 @@ class CookBookApp(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in recipe_json['recipeIngredient']:
f = ingredient_parser.get_food(ingredient['ingredient']['text'])
u = ingredient_parser.get_unit(ingredient['unit']['text'])
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=ingredient['amount'], note=ingredient['note'], space=self.request.space,
))
f = ingredient_parser.get_food(ingredient['ingredient']['text'])
u = ingredient_parser.get_unit(ingredient['unit']['text'])
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=ingredient['amount'], note=ingredient['note'], space=self.request.space,
))
if len(images) > 0:
try:

View File

@@ -4,11 +4,12 @@ from zipfile import ZipFile
from bs4 import BeautifulSoup
from django.utils.translation import gettext as _
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_html_import import get_recipe_from_source
from cookbook.helper.recipe_url_import import iso_duration_to_minutes, parse_servings
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
from recipes.settings import DEBUG
@@ -41,11 +42,11 @@ class CopyMeThat(Integration):
for ingredient in file.find_all("li", {"class": "recipeIngredient"}):
if ingredient.text == "":
continue
amount, unit, ingredient, note = ingredient_parser.parse(ingredient.text.strip())
f = ingredient_parser.get_food(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient.text.strip(), space=self.request.space,
))
for s in file.find_all("li", {"class": "instruction"}):
@@ -60,7 +61,7 @@ class CopyMeThat(Integration):
try:
if file.find("a", {"id": "original_link"}).text != '':
step.instruction += "\n\nImported from: " + file.find("a", {"id": "original_link"}).text
step.instruction += "\n\n" + _("Imported from") + ": " + file.find("a", {"id": "original_link"}).text
step.save()
except AttributeError:
pass

View File

@@ -4,7 +4,7 @@ from io import BytesIO
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class Domestica(Integration):
@@ -37,11 +37,11 @@ class Domestica(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in file['ingredients'].split('\n'):
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -172,7 +172,7 @@ class Integration:
traceback.print_exc()
self.handle_exception(e, log=il, message=f'-------------------- \nERROR \n{e}\n--------------------\n')
import_zip.close()
elif '.json' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name']:
elif '.json' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name'] or '.rk' in f['name']:
data_list = self.split_recipe_file(f['file'])
il.total_recipes += len(data_list)
for d in data_list:

View File

@@ -6,13 +6,13 @@ from zipfile import ZipFile
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class Mealie(Integration):
def import_file_name_filter(self, zip_info_object):
return re.match(r'^recipes/([A-Za-z\d-])+/([A-Za-z\d-])+.json$', zip_info_object.filename)
return re.match(r'^recipes/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+/([A-Za-z\d\s\-_()\[\]\u00C0-\u017F])+.json$', zip_info_object.filename)
def get_recipe_from_file(self, file):
recipe_json = json.loads(file.getvalue().decode("utf-8"))
@@ -45,12 +45,14 @@ class Mealie(Integration):
u = ingredient_parser.get_unit(ingredient['unit'])
amount = ingredient['quantity']
note = ingredient['note']
original_text = None
else:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient['note'])
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient['note'])
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
original_text = ingredient['note']
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=original_text, space=self.request.space,
))
except Exception:
pass
@@ -60,7 +62,8 @@ class Mealie(Integration):
if '.zip' in f['name']:
import_zip = ZipFile(f['file'])
try:
self.import_recipe_image(recipe, BytesIO(import_zip.read(f'recipes/{recipe_json["slug"]}/images/min-original.webp')), filetype=get_filetype(f'recipes/{recipe_json["slug"]}/images/original'))
self.import_recipe_image(recipe, BytesIO(import_zip.read(f'recipes/{recipe_json["slug"]}/images/min-original.webp')),
filetype=get_filetype(f'recipes/{recipe_json["slug"]}/images/original'))
except Exception:
pass

View File

@@ -2,7 +2,7 @@ import re
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class MealMaster(Integration):
@@ -45,11 +45,11 @@ class MealMaster(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -7,7 +7,7 @@ from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import iso_duration_to_minutes
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class NextcloudCookbook(Integration):
@@ -57,11 +57,11 @@ class NextcloudCookbook(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in recipe_json['recipeIngredient']:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -2,7 +2,7 @@ import json
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class OpenEats(Integration):

View File

@@ -2,12 +2,12 @@ import base64
import gzip
import json
import re
from gettext import gettext as _
from io import BytesIO
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from gettext import gettext as _
from cookbook.models import Ingredient, Keyword, Recipe, Step
class Paprika(Integration):
@@ -70,11 +70,11 @@ class Paprika(Integration):
try:
for ingredient in recipe_json['ingredients'].split('\n'):
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
except AttributeError:
pass

View File

@@ -1,6 +1,6 @@
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class Pepperplate(Integration):
@@ -41,11 +41,11 @@ class Pepperplate(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -4,7 +4,7 @@ import requests
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class Plantoeat(Integration):
@@ -56,11 +56,11 @@ class Plantoeat(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -1,14 +1,16 @@
import re
import imghdr
import json
import requests
import re
from io import BytesIO
from zipfile import ZipFile
import imghdr
import requests
from django.utils.translation import gettext as _
from cookbook.helper.image_processing import get_filetype
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class RecetteTek(Integration):
@@ -48,7 +50,7 @@ class RecetteTek(Integration):
# Append the original import url to the step (if it exists)
try:
if file['url'] != '':
step.instruction += '\n\nImported from: ' + file['url']
step.instruction += '\n\n' + _('Imported from') + ': ' + file['url']
step.save()
except Exception as e:
print(recipe.name, ': failed to import source url ', str(e))
@@ -58,11 +60,11 @@ class RecetteTek(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in file['ingredients'].split('\n'):
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
amount, unit, food, note = ingredient_parser.parse(food)
f = ingredient_parser.get_food(ingredient)
u = ingredient_parser.get_unit(unit)
step.ingredients.add(Ingredient.objects.create(
food=f, unit=u, amount=amount, note=note, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
except Exception as e:
print(recipe.name, ': failed to parse recipe ingredients ', str(e))

View File

@@ -1,12 +1,14 @@
import re
from bs4 import BeautifulSoup
from io import BytesIO
from zipfile import ZipFile
from bs4 import BeautifulSoup
from django.utils.translation import gettext as _
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.recipe_url_import import parse_servings, iso_duration_to_minutes
from cookbook.helper.recipe_url_import import iso_duration_to_minutes, parse_servings
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class RecipeKeeper(Integration):
@@ -45,11 +47,11 @@ class RecipeKeeper(Integration):
for ingredient in file.find("div", {"itemprop": "recipeIngredients"}).findChildren("p"):
if ingredient.text == "":
continue
amount, unit, ingredient, note = ingredient_parser.parse(ingredient.text.strip())
f = ingredient_parser.get_food(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
for s in file.find("div", {"itemprop": "recipeDirections"}).find_all("p"):
@@ -58,7 +60,7 @@ class RecipeKeeper(Integration):
step.instruction += s.text + ' \n'
if file.find("span", {"itemprop": "recipeSource"}).text != '':
step.instruction += "\n\nImported from: " + file.find("span", {"itemprop": "recipeSource"}).text
step.instruction += "\n\n" + _("Imported from") + ": " + file.find("span", {"itemprop": "recipeSource"}).text
step.save()
recipe.steps.add(step)

View File

@@ -5,7 +5,7 @@ import requests
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class RecipeSage(Integration):
@@ -31,7 +31,7 @@ class RecipeSage(Integration):
except Exception as e:
print('failed to parse yield or time ', str(e))
ingredient_parser = IngredientParser(self.request,True)
ingredient_parser = IngredientParser(self.request, True)
ingredients_added = False
for s in file['recipeInstructions']:
step = Step.objects.create(
@@ -41,11 +41,11 @@ class RecipeSage(Integration):
ingredients_added = True
for ingredient in file['recipeIngredient']:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)

View File

@@ -1,6 +1,6 @@
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient, Keyword
from cookbook.models import Ingredient, Keyword, Recipe, Step
class RezKonv(Integration):
@@ -44,11 +44,11 @@ class RezKonv(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
if len(ingredient.strip()) > 0:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)
@@ -60,9 +60,14 @@ class RezKonv(Integration):
def split_recipe_file(self, file):
recipe_list = []
current_recipe = ''
encoding_list = ['windows-1250', 'latin-1'] #TODO build algorithm to try trough encodings and fail if none work, use for all importers
encoding = 'windows-1250'
for fl in file.readlines():
line = fl.decode("windows-1250")
try:
line = fl.decode(encoding)
except UnicodeDecodeError:
encoding = 'latin-1'
line = fl.decode(encoding)
if line.startswith('=====') and 'rezkonv' in line.lower():
if current_recipe != '':
recipe_list.append(current_recipe)

View File

@@ -2,7 +2,7 @@ from django.utils.translation import gettext as _
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.integration.integration import Integration
from cookbook.models import Recipe, Step, Ingredient
from cookbook.models import Ingredient, Recipe, Step
class Saffron(Integration):
@@ -47,11 +47,11 @@ class Saffron(Integration):
ingredient_parser = IngredientParser(self.request, True)
for ingredient in ingredients:
amount, unit, ingredient, note = ingredient_parser.parse(ingredient)
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(ingredient)
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, space=self.request.space,
food=f, unit=u, amount=amount, note=note, original_text=ingredient, space=self.request.space,
))
recipe.steps.add(step)
@@ -76,7 +76,7 @@ class Saffron(Integration):
for i in s.ingredients.all():
recipeIngredient.append(f'{float(i.amount)} {i.unit} {i.food}')
data += "Ingredients: \n"
for ingredient in recipeIngredient:
data += ingredient+"\n"
@@ -91,10 +91,10 @@ class Saffron(Integration):
files = []
for r in recipes:
filename, data = self.get_file_from_recipe(r)
files.append([ filename, data ])
files.append([filename, data])
el.exported_recipes += 1
el.msg += self.get_recipe_processed_msg(r)
el.save()
return files
return files

View File

@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: Miguel Canteras <mcanteras@gmail.com>, 2021\n"
"Language-Team: Catalan (https://www.transifex.com/django-recipes/"
@@ -309,7 +309,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -367,7 +367,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -522,42 +522,38 @@ msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
"No pots interaccionar amb aquest objecte ja que no és de la teva propietat!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgid "You must supply a servings size"
msgstr "Has de proporcionar com a mínim una recepta o un títol."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, fuzzy, python-format
#| msgid "Imported new recipe!"
msgid "Imported %s recipes."
@@ -580,7 +576,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -609,7 +604,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -671,101 +666,80 @@ msgstr "Gran"
msgid "New"
msgstr "Nova"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Text"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Temps"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID d'Arxiu"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recepta"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Food"
msgid "Food Alias"
msgstr "Menjar"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Unitats"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Paraules clau"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1132,8 +1106,8 @@ msgstr "Edició per lots"
msgid "History"
msgstr "Historial"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1228,7 +1202,6 @@ msgstr "El camí ha de tenir el format següent"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1275,7 +1248,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Llibres de Receptes"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Exporta Receptes"
@@ -1399,19 +1372,12 @@ msgstr "Importar Receptes"
msgid "Import"
msgstr "Importar"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Registre de Receptes de Cuina"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recepta"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Tots els camps són opcionals i es poden deixar buits."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Valoració"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Tanca"
@@ -1520,7 +1486,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "o bé deixant una línia en blanc entremig."
#: .\cookbook\templates\markdown_info.html:59
@@ -1543,8 +1511,12 @@ msgid "Lists"
msgstr "Llistes"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Les llistes es poden ordenar o desordenades. És <b> important deixar una "
@@ -1821,7 +1793,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1846,7 +1818,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1876,7 +1848,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2159,7 +2131,9 @@ msgid "Finished"
msgstr "Acabat"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
"Estàs fora de línia, és possible que la llista de compra no es sincronitzi."
@@ -2458,6 +2432,16 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Text"
#: .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID d'Arxiu"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Introduïu l'URL del lloc web"
@@ -2646,180 +2630,181 @@ msgstr "Problemes de GitHub"
msgid "Recipe Markup Specification"
msgstr "Especificació de marcatge de receptes"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "El paràmetre filter_list té un format incorrecte"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "Sincronització correcte"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Error de sincronització amb emmagatzematge"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
"El lloc sol·licitat proporcionava dades malformades i no es pot llegir."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "No s'ha pogut trobar la pàgina sol·licitada."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
@@ -2827,28 +2812,28 @@ msgstr ""
"El lloc sol·licitat no proporciona cap format de dades reconegut des don "
"importar la recepta."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "No s'ha pogut trobar la pàgina sol·licitada."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2909,20 +2894,16 @@ msgstr "Canvis desats!"
msgid "Error saving changes!"
msgstr "Error al desar canvis!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Importa Registre"
@@ -3045,7 +3026,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3055,44 +3036,56 @@ msgstr ""
"Si heu oblidat les vostres credencials de superusuari, consulteu la "
"documentació de django sobre com restablir les contrasenyes."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "Les contrasenyes no coincideixen!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "L'usuari s'ha creat, si us plau inicieu la sessió!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "S'ha proporcionat un enllaç d'invitació mal format."
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
#, fuzzy
#| msgid "You are not logged in and therefore cannot view this page!"
msgid "You are already member of a space and therefore cannot join this one."
msgstr "No heu iniciat la sessió i, per tant, no podeu veure aquesta pàgina."
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "L'enllaç d'invitació no és vàlid o ja s'ha utilitzat."
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
msgstr ""
#~ msgid "Time"
#~ msgstr "Temps"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Registre de Receptes de Cuina"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Tots els camps són opcionals i es poden deixar buits."
#~ msgid "Rating"
#~ msgstr "Valoració"
#~ msgid "New Unit"
#~ msgstr "Nova Unitat"

View File

@@ -14,11 +14,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2022-02-06 21:31+0000\n"
"Last-Translator: David Laukamp <dlkmp@live.de>\n"
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/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"
@@ -113,7 +113,8 @@ msgstr "Nährwerte in Joule statt Kalorien anzeigen"
#: .\cookbook\forms.py:79
msgid "Users with whom newly created meal plans should be shared by default."
msgstr "Nutzer, mit denen neue Essenspläne standardmäßig geteilt werden sollen."
msgstr ""
"Nutzer, mit denen neue Essenspläne standardmäßig geteilt werden sollen."
#: .\cookbook\forms.py:80
msgid "Users with whom to share shopping lists."
@@ -292,9 +293,13 @@ msgstr ""
"A. führen niedrigere Werte zum ignorieren von mehr Tippfehlern)."
#: .\cookbook\forms.py:445
#, fuzzy
#| msgid ""
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
#| "for full desciption of choices."
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
"Suchmethode auswählen. Klicke <a href=\"/docs/search/\">hier</a> für eine "
"Auflistung der Optionen."
@@ -365,7 +370,9 @@ msgid "Partial Match"
msgstr "Teilweise Übereinstimmung"
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
#, fuzzy
#| msgid "Starts Wtih"
msgid "Starts With"
msgstr "Beginnt mit"
#: .\cookbook\forms.py:465
@@ -526,16 +533,14 @@ msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
"Du kannst mit diesem Objekt nicht interagieren, da es dir nicht gehört!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr "Es muss die Abfrage oder der Hash_Key angeben werden"
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr "Mindestens ein Rezept oder ein Essensplan müssen angegeben werden"
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must supply a created_by"
msgid "You must supply a servings size"
msgstr "Die Angabe der Verfassers ist notwendig"
#: .\cookbook\helper\template_helper.py:61
@@ -543,7 +548,7 @@ msgstr "Die Angabe der Verfassers ist notwendig"
msgid "Could not parse template code."
msgstr "Konnte den Template code nicht verarbeiten."
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
@@ -551,7 +556,7 @@ msgstr ""
"Importer erwartet eine .zip Datei. Hast du den richtigen Importer-Typ für "
"deine Daten ausgewählt?"
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
@@ -559,11 +564,11 @@ msgstr ""
"Ein unerwarteter Fehler trat beim Importieren auf. Bitte stelle sicher, dass "
"die hochgeladene Datei gültig ist."
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr "Die folgenden Rezepte wurden ignoriert da sie bereits existieren:"
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr "%s Rezepte importiert."
@@ -581,7 +586,6 @@ msgid "Source"
msgstr "Quelle"
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -610,7 +614,9 @@ msgid "Rebuilds full text search index on Recipe"
msgstr "Generiert den Index für die Rezept-Volltextsuche neu"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
#, fuzzy
#| msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Nur PostgreSQL Datenbanken verwenden Volltextsuche, kein Index muss neu "
"generiert werden"
@@ -676,94 +682,75 @@ msgstr "Groß"
msgid "New"
msgstr "Neu"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr " ist Teil eines Rezepts und kann nicht gelöscht werden"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Text"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Zeit"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "Datei"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Rezept"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr "Einfach"
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr "Satz"
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr "Web"
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr "Rohdaten"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr "Lebensmittel Alias"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr "Einheiten Alias"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr "Stichwort Alias"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr "Ein Benutzername ist notwendig"
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr "Datei-Uploads sind in diesem Space nicht aktiviert."
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr "Du hast Dein Datei-Uploadlimit erreicht."
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr "Bestehende Einkaufliste, die aktualisiert werden soll"
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
"Menge des Lebensmittels, welches der Einkaufsliste hinzugefügt werden soll"
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr "ID der Einheit, die für die Einkaufsliste verwendet werden soll"
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1125,8 +1112,8 @@ msgstr "Massenbearbeitung"
msgid "History"
msgstr "Verlauf"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1219,7 +1206,6 @@ msgstr "Der Pfad muss folgendes Format haben"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1262,7 +1248,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Rezeptbuch"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Rezepte exportieren"
@@ -1390,19 +1376,12 @@ msgstr "Rezepte importieren"
msgid "Import"
msgstr "Importieren"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Kochen protokollieren"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Rezept"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Alle Felder sind optional und können leer gelassen werden."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Bewertung"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Schließen"
@@ -1511,7 +1490,9 @@ msgstr "Zeilenumbrüche entstehen durch zwei Leerzeichen am ende einer Zeile"
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "oder durch eine leere Zeile dazwischen."
#: .\cookbook\templates\markdown_info.html:59
@@ -1534,8 +1515,12 @@ msgid "Lists"
msgstr "Listen"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Liste können sortiert oder unsortiert sein. Es ist <b>wichtig das eine leere "
@@ -1832,10 +1817,19 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:29
#, fuzzy
#| msgid ""
#| " \n"
#| " Simple searches ignore punctuation and common words such as "
#| "'the', 'a', 'and'. And will treat seperate words as required.\n"
#| " Searching for 'apple or flour' will return any recipe that "
#| "includes both 'apple' and 'flour' anywhere in the fields that have been "
#| "selected for a full text search.\n"
#| " "
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1867,13 +1861,30 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:39
#, fuzzy
#| msgid ""
#| " \n"
#| " Web searches simulate functionality found on many web search "
#| "sites supporting special syntax.\n"
#| " Placing quotes around several words will convert those words "
#| "into a phrase.\n"
#| " 'or' is recongized as searching for the word (or phrase) "
#| "immediately before 'or' OR the word (or phrase) directly after.\n"
#| " '-' is recognized as searching for recipes that do not "
#| "include the word (or phrase) that comes immediately after. \n"
#| " For example searching for 'apple pie' or cherry -butter will "
#| "return any recipe that includes the phrase 'apple pie' or the word "
#| "'cherry' \n"
#| " in any field included in the full text search but exclude any "
#| "recipe that has the word 'butter' in any field included.\n"
#| " "
msgid ""
" \n"
" Web searches simulate functionality found on many web search "
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1913,6 +1924,19 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:59
#, fuzzy
#| msgid ""
#| " \n"
#| " Another approach to searching that also requires Postgresql "
#| "is fuzzy search or trigram similarity. A trigram is a group of three "
#| "consecutive characters.\n"
#| " For example searching for 'apple' will create x trigrams "
#| "'app', 'ppl', 'ple' and will create a score of how closely words match "
#| "the generated trigrams.\n"
#| " One benefit of searching trigams is that a search for "
#| "'sandwich' will find mispelled words such as 'sandwhich' that would be "
#| "missed by other methods.\n"
#| " "
msgid ""
" \n"
" Another approach to searching that also requires Postgresql is "
@@ -1922,7 +1946,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2241,7 +2265,9 @@ msgid "Finished"
msgstr "Erledigt"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "Du bist offline, die Einkaufsliste wird ggf. nicht synchronisiert."
#: .\cookbook\templates\shopping_list.html:318
@@ -2535,6 +2561,14 @@ msgstr "URL"
msgid "App"
msgstr "Anwendung"
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Text"
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "Datei"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Webseite-URL eingeben"
@@ -2709,208 +2743,211 @@ msgstr "GitHub-Issues"
msgid "Recipe Markup Specification"
msgstr "Rezept-Markup-Spezifikation"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr "Der Parameter updated_at ist falsch formatiert"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Kein {self.basename} mit der ID {pk} existiert"
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr "Zusammenführen mit selben Objekt nicht möglich!"
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Kein {self.basename} mit der ID {target} existiert"
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr "Zusammenführen mit untergeordnetem Objekt nicht möglich!"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} wurde erfolgreich mit {target.name} zusammengeführt"
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Beim zusammenführen von {source.name} mit {target.name} ist ein Fehler "
"aufgetreten"
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} wurde erfolgreich zur Wurzel verschoben."
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr "Fehler aufgetreten beim verschieben von "
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr "Ein Element kann nicht in sich selbst verschoben werden!"
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Kein {self.basename} mit ID {parent} existiert"
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
"{child.name} wurde erfolgreich zum Überelement {parent.name} verschoben"
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} wurde von der Einkaufsliste entfernt."
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt."
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr "ID der Einheit, die ein Rezept haben sollte."
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr "Bewertung, die ein Rezept haben sollte. [ 0 - 5]"
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Diese Funktion ist in dieser Version von Tandoor noch nicht verfügbar!"
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "Synchronisation erfolgreich!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Fehler beim Synchronisieren"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr "Nichts zu tun."
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
"Die angefragte Seite hat ungültige Daten zurückgegeben oder die Daten "
"konnten nicht verarbeitet werden."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "Die angefragte Seite konnte nicht gefunden werden."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr ""
"Die angefragte Seite stellt keine bekannten Datenformate zur Verfügung."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr "Verbindung fehlgeschlagen."
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Es konnten keine nutzbaren Daten gefunden werden."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr "Ich konnte nichts zu tun finden."
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr "Du hast die maximale Anzahl an Rezepten für Deinen Space erreicht."
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr "Du hast mehr Benutzer in Deinem Space als erlaubt."
@@ -2971,11 +3008,11 @@ msgstr "Änderungen gespeichert!"
msgid "Error saving changes!"
msgstr "Fehler beim Speichern der Daten!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr "Importieren ist für diesen Anbieter noch nicht implementiert"
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
@@ -2983,10 +3020,6 @@ msgstr ""
"Der PDF-Exporter ist in dieser Instanz nicht aktiviert, da er sich noch in "
"einem experimentellen Zustand befindet."
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr "Exportieren ist für diesen Anbieter noch nicht implementiert"
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Importverlauf"
@@ -3116,7 +3149,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr "Die \"Ungenaue\" Suche ist mit diesem Suchtyp nicht kompatibel!"
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3125,33 +3158,33 @@ msgstr ""
"Die Setup-Seite kann nur für den ersten Nutzer verwendet werden. Zum "
"Zurücksetzen von Passwörtern bitte der Django-Dokumentation folgen."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "Passwörter stimmen nicht überein!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "Benutzer wurde erstellt, bitte einloggen!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "Fehlerhafter Einladungslink angegeben!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
"Du bist bereits Mitglied eines Space, daher kannst du diesem Space nicht "
"beitreten."
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr "Space erfolgreich beigetreten."
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "Einladungslink ungültig oder bereits genutzt!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
@@ -3159,7 +3192,7 @@ msgstr ""
"Das melden von Links ist in dieser Instanz nicht aktiviert. Bitte "
"kontaktieren sie den Seitenadministrator um Probleme zu melden."
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
@@ -3167,6 +3200,24 @@ msgstr ""
"Dieser Link wurde deaktiviert! Bitte kontaktieren sie den "
"Seitenadministrator für weitere Informationen."
#~ msgid "You must supply a recipe or mealplan"
#~ msgstr "Mindestens ein Rezept oder ein Essensplan müssen angegeben werden"
#~ msgid "Time"
#~ msgstr "Zeit"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Kochen protokollieren"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Alle Felder sind optional und können leer gelassen werden."
#~ msgid "Rating"
#~ msgstr "Bewertung"
#~ msgid "Exporting is not implemented for this provider"
#~ msgstr "Exportieren ist für diesen Anbieter noch nicht implementiert"
#, python-brace-format
#~ msgid "No {self.basename} with id {child} exists"
#~ msgstr "Kein {self.basename} mit ID {child} existiert"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -260,7 +260,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -316,7 +316,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -458,16 +458,12 @@ msgstr ""
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
msgid "You must supply a servings size"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
@@ -475,23 +471,23 @@ msgstr ""
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr ""
@@ -509,7 +505,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -538,7 +533,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -600,93 +595,74 @@ msgstr ""
msgid "New"
msgstr ""
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\models.py:586
msgid "Time"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr ""
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1031,8 +1007,8 @@ msgstr ""
msgid "History"
msgstr ""
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1121,7 +1097,6 @@ msgstr ""
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1162,7 +1137,7 @@ msgstr ""
msgid "Recipe Books"
msgstr ""
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr ""
@@ -1280,19 +1255,12 @@ msgstr ""
msgid "Import"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr ""
@@ -1383,7 +1351,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr ""
#: .\cookbook\templates\markdown_info.html:59
@@ -1407,7 +1375,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:85
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
@@ -1669,7 +1637,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1694,7 +1662,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1724,7 +1692,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -1983,7 +1951,7 @@ msgid "Finished"
msgstr ""
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
#: .\cookbook\templates\shopping_list.html:318
@@ -2241,6 +2209,14 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr ""
@@ -2403,202 +2379,203 @@ msgstr ""
msgid "Recipe Markup Specification"
msgstr ""
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr ""
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr ""
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr ""
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2656,20 +2633,16 @@ msgstr ""
msgid "Error saving changes!"
msgstr ""
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr ""
@@ -2786,44 +2759,44 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 ""
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr ""
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr ""
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr ""
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr ""
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."

View File

@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: Miguel Canteras <mcanteras@gmail.com>, 2021\n"
"Language-Team: Spanish (https://www.transifex.com/django-recipes/"
@@ -316,7 +316,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -374,7 +374,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -528,26 +528,22 @@ msgstr "¡No tienes los permisos necesarios para ver esta página!"
msgid "You cannot interact with this object as it is not owned by you!"
msgstr "¡No puede interactuar con este objeto ya que no es de tu propiedad!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgid "You must supply a servings size"
msgstr "Debe proporcionar al menos una receta o un título."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
@@ -555,17 +551,17 @@ msgstr ""
"El importador esperaba un fichero.zip. ¿Has escogido el tipo de importador "
"correcto para tus datos?"
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, fuzzy, python-format
#| msgid "Imported new recipe!"
msgid "Imported %s recipes."
@@ -588,7 +584,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -617,7 +612,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -679,101 +674,80 @@ msgstr "Grande"
msgid "New"
msgstr "Nuevo"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Texto"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Tiempo"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID de Fichero"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Receta"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Food"
msgid "Food Alias"
msgstr "Comida"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Unidades"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Palabras clave"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1147,8 +1121,8 @@ msgstr "Edición Masiva"
msgid "History"
msgstr "Historial"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1243,7 +1217,6 @@ msgstr "La ruta debe tener el siguiente formato"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1290,7 +1263,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Libros de recetas"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Exportar recetas"
@@ -1417,19 +1390,12 @@ msgstr "Importar recetas"
msgid "Import"
msgstr "Importar"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Registrar receta cocinada"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Receta"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Todos los campos son opcionales y pueden dejarse vacíos."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Calificación"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Cerrar"
@@ -1540,7 +1506,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "o dejando una línea en blanco entre ellos."
#: .\cookbook\templates\markdown_info.html:59
@@ -1563,8 +1531,12 @@ msgid "Lists"
msgstr "Listas"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Las listas pueden ser ordenadas o no ordenadas. <b>¡Es importante dejar una "
@@ -1852,7 +1824,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1877,7 +1849,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1907,7 +1879,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2192,7 +2164,9 @@ msgid "Finished"
msgstr "Completada"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "Estás desconectado, la lista de la compra no se sincronizará."
#: .\cookbook\templates\shopping_list.html:318
@@ -2505,6 +2479,16 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Texto"
#: .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID de Fichero"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Introduce la URL del sitio web"
@@ -2693,185 +2677,186 @@ msgstr "Propuestas de GitHub"
msgid "Recipe Markup Specification"
msgstr "Especificación de anotaciones de la receta"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parámetro filter_list formateado incorrectamente"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr "¡No se puede unir con el mismo objeto!"
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
#, fuzzy
#| msgid "Cannot merge with the same object!"
msgid "Cannot merge with child object!"
msgstr "¡No se puede unir con el mismo objeto!"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
#, fuzzy
#| msgid "This feature is not available in the demo version!"
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "¡Esta funcionalidad no está disponible en la versión demo!"
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "¡Sincronización exitosa!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Error de sincronización con el almacenamiento"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
"El sitio solicitado proporcionó datos con formato incorrecto y no se puede "
"leer."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "La página solicitada no pudo ser encontrada."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
@@ -2879,28 +2864,28 @@ msgstr ""
"El sitio solicitado no proporciona ningún formato de datos reconocido para "
"importar la receta."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "La página solicitada no pudo ser encontrada."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2960,20 +2945,16 @@ msgstr "¡Cambios guardados!"
msgid "Error saving changes!"
msgstr "¡Error al guardar los cambios!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr "La importación no está implementada para este proveedor"
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr "La exportación no está implementada para este proveedor"
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Importar registro"
@@ -3096,7 +3077,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3106,44 +3087,59 @@ msgstr ""
"usuario. Si has olvidado tus credenciales de superusuario, por favor "
"consulta la documentación de django sobre cómo restablecer las contraseñas."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "¡Las contraseñas no coinciden!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "El usuario ha sido creado, ¡inicie sesión!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "¡Se proporcionó un enlace de invitación con formato incorrecto!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
#, fuzzy
#| msgid "You are not logged in and therefore cannot view this page!"
msgid "You are already member of a space and therefore cannot join this one."
msgstr "¡No ha iniciado sesión y por lo tanto no puede ver esta página!"
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "¡El enlace de invitación no es válido o ya se ha utilizado!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
msgstr ""
#~ msgid "Time"
#~ msgstr "Tiempo"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Registrar receta cocinada"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Todos los campos son opcionales y pueden dejarse vacíos."
#~ msgid "Rating"
#~ msgstr "Calificación"
#~ msgid "Exporting is not implemented for this provider"
#~ msgstr "La exportación no está implementada para este proveedor"
#~ msgid "New Unit"
#~ msgstr "Nueva Unidad"

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: igazka <igazka100@gmail.com>, 2020\n"
"Language-Team: Hungarian (Hungary) (https://www.transifex.com/django-recipes/"
@@ -271,7 +271,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -327,7 +327,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -471,16 +471,12 @@ msgstr ""
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
msgid "You must supply a servings size"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
@@ -488,23 +484,23 @@ msgstr ""
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr ""
@@ -522,7 +518,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -551,7 +546,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -613,99 +608,78 @@ msgstr ""
msgid "New"
msgstr ""
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Szöveg"
#: .\cookbook\models.py:586
msgid "Time"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "Fájl ID:"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "New Food"
msgid "Food Alias"
msgstr "Új Étel"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Kulcsszavak"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1054,8 +1028,8 @@ msgstr ""
msgid "History"
msgstr ""
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1144,7 +1118,6 @@ msgstr ""
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1185,7 +1158,7 @@ msgstr ""
msgid "Recipe Books"
msgstr ""
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr ""
@@ -1303,19 +1276,12 @@ msgstr ""
msgid "Import"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr ""
@@ -1406,7 +1372,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr ""
#: .\cookbook\templates\markdown_info.html:59
@@ -1430,7 +1396,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:85
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
@@ -1692,7 +1658,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1717,7 +1683,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1747,7 +1713,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2006,7 +1972,7 @@ msgid "Finished"
msgstr ""
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
#: .\cookbook\templates\shopping_list.html:318
@@ -2264,6 +2230,16 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Szöveg"
#: .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "Fájl ID:"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr ""
@@ -2428,202 +2404,203 @@ msgstr ""
msgid "Recipe Markup Specification"
msgstr ""
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr ""
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr ""
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr ""
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2681,20 +2658,16 @@ msgstr ""
msgid "Error saving changes!"
msgstr ""
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr ""
@@ -2811,44 +2784,44 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 ""
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr ""
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr ""
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr ""
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr ""
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2022-01-17 07:56+0000\n"
"Last-Translator: Oliver Cervera <olivercervera@yahoo.it>\n"
"Language-Team: Italian <http://translate.tandoor.dev/projects/tandoor/"
@@ -297,9 +297,13 @@ msgid ""
msgstr ""
#: .\cookbook\forms.py:445
#, fuzzy
#| msgid ""
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
#| "for full desciption of choices."
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
"Seleziona il metodo di ricerca. Clicca <a href=\"/docs/search/\">qui</a> "
"per avere maggiori informazioni."
@@ -357,7 +361,9 @@ msgid "Partial Match"
msgstr "Corrispondenza parziale"
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
#, fuzzy
#| msgid "Starts Wtih"
msgid "Starts With"
msgstr "Inizia con"
#: .\cookbook\forms.py:465
@@ -509,26 +515,22 @@ msgstr "Non hai i permessi necessari per visualizzare questa pagina!"
msgid "You cannot interact with this object as it is not owned by you!"
msgstr "Non puoi interagire con questo oggetto perché non ne hai i diritti!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgid "You must supply a servings size"
msgstr "Devi fornire almeno una ricetta o un titolo."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr "Impossibile elaborare il codice del template."
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
@@ -536,7 +538,7 @@ msgstr ""
"La procedura di import necessita di un file .zip. Hai scelto il tipo di "
"importazione corretta per i tuoi dati?"
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
@@ -544,11 +546,11 @@ msgstr ""
"Un errore imprevisto si è verificato durante l'importazione. Assicurati di "
"aver caricato un file valido."
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr "Le seguenti ricette sono state ignorate perché già esistenti:"
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr "Importate %s ricette."
@@ -566,7 +568,6 @@ msgid "Source"
msgstr "Fonte"
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -595,7 +596,9 @@ msgid "Rebuilds full text search index on Recipe"
msgstr "Ricostruisce l'indice di ricerca full text per la ricetta"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
#, fuzzy
#| msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Solo i database Postgres usano l'indice di ricerca full text, non ci sono "
"indici da ricostruire"
@@ -661,93 +664,74 @@ msgstr "Grande"
msgid "New"
msgstr "Nuovo"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr " è parte dello step di una ricetta e non può essere eliminato"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Testo"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Tempo"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "File"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Ricetta"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr "Semplice"
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr "Frase"
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr "Web"
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr "Raw"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr "Alias Alimento"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr "Alias Unità"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr "Alias Parola Chiave"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr "Il caricamento dei file non è abilitato in questa istanza."
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr "Hai raggiungo il limite per il caricamento dei file."
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1109,8 +1093,8 @@ msgstr "Modifica in blocco"
msgid "History"
msgstr "Cronologia"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1203,7 +1187,6 @@ msgstr "Il percorso deve essere nel formato seguente"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1246,7 +1229,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Libri di Ricette"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Esporta Ricette"
@@ -1370,19 +1353,12 @@ msgstr "Importa Ricette"
msgid "Import"
msgstr "Importa"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Aggiungi al registro delle ricette cucinate"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Ricetta"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Tutti i campi sono opzionali e possono essere lasciati vuoti."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Valutazione"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Chiudi"
@@ -1492,7 +1468,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "o lasciando una riga vuota in mezzo."
#: .\cookbook\templates\markdown_info.html:59
@@ -1515,8 +1493,12 @@ msgid "Lists"
msgstr "Liste"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Le liste possono essere ordinate o no. È <b>importante lasciare una riga "
@@ -1805,7 +1787,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1830,7 +1812,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1860,7 +1842,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2137,7 +2119,9 @@ msgid "Finished"
msgstr "Completato"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "Sei offline: la lista della spesa potrebbe non sincronizzarsi."
#: .\cookbook\templates\shopping_list.html:318
@@ -2423,6 +2407,14 @@ msgstr "URL"
msgid "App"
msgstr "App"
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Testo"
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "File"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Inserisci l'indirizzo del sito web"
@@ -2596,181 +2588,182 @@ msgstr "Issues (Problemi aperti) su GitHub"
msgid "Recipe Markup Specification"
msgstr "Specifica di Markup della ricetta"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr "Il parametro updated_at non è formattato correttamente"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Non esiste nessun {self.basename} con id {pk}"
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr "Non è possibile unirlo con lo stesso oggetto!"
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Non esiste nessun {self.basename} con id {target}"
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr "Non è possibile unirlo con un oggetto secondario!"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} è stato unito con successo a {target.name}"
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Si è verificato un errore durante l'unione di {source.name} con {target.name}"
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} è stato spostato con successo alla radice."
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr "Si è verificato un errore durante lo spostamento "
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr "Non è possibile muovere un oggetto a sé stesso!"
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Non esiste nessun {self.basename} con id {parent}"
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} è stato spostato con successo al primario {parent.name}"
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
"Questa funzione non è ancora disponibile nella versione hostata di Tandor!"
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "Sincronizzazione completata con successo!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Errore di sincronizzazione con questo backend"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr "Nulla da fare."
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
"Il sito richiesto ha fornito dati in formato non corretto e non può essere "
"letto."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "La pagina richiesta non è stata trovata."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
@@ -2778,26 +2771,28 @@ msgstr ""
"Il sito richiesto non fornisce un formato di dati riconosciuto da cui "
"importare la ricetta."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Nessuna informazione utilizzabile è stata trovata."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr "Non è stato trovato nulla da fare."
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr "Hai raggiunto il numero massimo di ricette nella tua istanza."
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr "Hai più utenti di quanti permessi nella tua istanza."
@@ -2860,20 +2855,16 @@ msgstr "Modifiche salvate!"
msgid "Error saving changes!"
msgstr "Si è verificato un errore durante il salvataggio delle modifiche!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr "Questo provider non permette l'importazione"
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr "Questo provider non permette l'esportazione"
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Registro importazioni"
@@ -3002,7 +2993,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr "La ricerca Fuzzy non è compatibile con questo metodo di ricerca!"
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3012,32 +3003,32 @@ msgstr ""
"utente! Se hai dimenticato le credenziali del tuo super utente controlla la "
"documentazione di Django per resettare le password."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "Le password non combaciano!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "L'utente è stato creato e ora può essere usato per il login!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "È stato fornito un link di invito non valido!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
"Sei già membro di una istanza e quindi non puoi entrare in quest'altra."
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr "Sei entrato a far parte di questa istanza."
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "Il link di invito non è valido o è stato già usato!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
@@ -3045,7 +3036,7 @@ msgstr ""
"La segnalazione dei link di condivisione non è abilitata per questa istanza. "
"Notifica l'amministratore per segnalare i problemi."
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
@@ -3053,6 +3044,21 @@ msgstr ""
"Il link per la condivisione delle ricette è stato disabilitato! Per maggiori "
"informazioni contatta l'amministratore."
#~ msgid "Time"
#~ msgstr "Tempo"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Aggiungi al registro delle ricette cucinate"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Tutti i campi sono opzionali e possono essere lasciati vuoti."
#~ msgid "Rating"
#~ msgstr "Valutazione"
#~ msgid "Exporting is not implemented for this provider"
#~ msgstr "Questo provider non permette l'esportazione"
#, python-brace-format
#~ msgid "No {self.basename} with id {child} exists"
#~ msgstr "Non esiste nessun {self.basename} con id {child}"

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: vabene1111 <vabene1234@googlemail.com>, 2021\n"
"Language-Team: Latvian (https://www.transifex.com/django-recipes/"
@@ -302,7 +302,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -360,7 +360,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -512,42 +512,38 @@ msgstr "Jums nav nepieciešamo atļauju, lai apskatītu šo lapu!"
msgid "You cannot interact with this object as it is not owned by you!"
msgstr "Jūs nevarat mainīt šo objektu, jo tas nepieder jums!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgid "You must supply a servings size"
msgstr "Jums jānorāda vismaz recepte vai nosaukums."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, fuzzy, python-format
#| msgid "Imported new recipe!"
msgid "Imported %s recipes."
@@ -570,7 +566,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -599,7 +594,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -661,101 +656,80 @@ msgstr "Liels"
msgid "New"
msgstr "Jauns"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Teskts"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Laiks"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "Faila ID"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recepte"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Food"
msgid "Food Alias"
msgstr "Ēdiens"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Vienības"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Atslēgvārdi"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1122,8 +1096,8 @@ msgstr "Rediģēt vairākus"
msgid "History"
msgstr "Vēsture"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1217,7 +1191,6 @@ msgstr "Ceļam jābūt šādā formātā"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1264,7 +1237,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Recepšu grāmatas"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Eksportēt receptes"
@@ -1391,19 +1364,12 @@ msgstr "Importēt receptes"
msgid "Import"
msgstr "Importēt"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Saglabāt recepšu pagatavošanu žurnālā"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recepte"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Visi lauki nav obligāti, un tos var atstāt tukšus."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Vērtējums"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Aizvērt"
@@ -1517,7 +1483,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "vai atstājot tukšu rindu starp tekstu."
#: .\cookbook\templates\markdown_info.html:59
@@ -1540,8 +1508,12 @@ msgid "Lists"
msgstr "Saraksti"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Saraksti var tikt numurēti vai nenumurēti. Ir <b>svarīgi atstāt tukšu rindu "
@@ -1817,7 +1789,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1842,7 +1814,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1872,7 +1844,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2155,7 +2127,9 @@ msgid "Finished"
msgstr "Pabeigts"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "Jūs esat bezsaistē. Iepirkumu saraksts netiek sinhronizēts."
#: .\cookbook\templates\shopping_list.html:318
@@ -2457,6 +2431,16 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Teskts"
#: .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "Faila ID"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Ievadiet vietnes URL"
@@ -2645,179 +2629,180 @@ msgstr "GitHub Issues"
msgid "Recipe Markup Specification"
msgstr "Recepšu Markup specifikācija"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
#, fuzzy
#| msgid "Parameter filter_list incorrectly formatted"
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parametrs filter_list ir nepareizi formatēts"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "Sinhronizācija ir veiksmīga!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Sinhronizējot ar krātuvi, radās kļūda"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr "Pieprasītā vietne sniedza nepareizus datus, kurus nevar nolasīt."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "Pieprasīto lapu nevarēja atrast."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
@@ -2825,28 +2810,28 @@ msgstr ""
"Pieprasītajā vietnē nav norādīts atzīts datu formāts, no kura varētu "
"importēt recepti."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "The requested page could not be found."
msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Pieprasīto lapu nevarēja atrast."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2907,20 +2892,16 @@ msgstr "Izmaiņas saglabātas!"
msgid "Error saving changes!"
msgstr "Saglabājot izmaiņas, radās kļūda!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Importēšanas žurnāls"
@@ -3041,7 +3022,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3051,44 +3032,56 @@ msgstr ""
"aizmirsis sava superlietotāja informāciju, lūdzu, skatiet Django "
"dokumentāciju par paroļu atiestatīšanu."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "Paroles nesakrīt!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "Lietotājs ir izveidots, lūdzu, piesakieties!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "Nepareiza uzaicinājuma saite!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
#, fuzzy
#| msgid "You are not logged in and therefore cannot view this page!"
msgid "You are already member of a space and therefore cannot join this one."
msgstr "Jūs neesat pieteicies un tāpēc nevarat skatīt šo lapu!"
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "Uzaicinājuma saite nav derīga vai jau izmantota!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
msgstr ""
#~ msgid "Time"
#~ msgstr "Laiks"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Saglabāt recepšu pagatavošanu žurnālā"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Visi lauki nav obligāti, un tos var atstāt tukšus."
#~ msgid "Rating"
#~ msgstr "Vērtējums"
#~ msgid "New Unit"
#~ msgstr "Jaunā vienība"

View File

@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"PO-Revision-Date: 2021-11-14 14:06+0000\n"
"Last-Translator: Job Putters <me@ixbitz.com>\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2022-02-09 01:31+0000\n"
"Last-Translator: Jesse <jesse.kamps@pm.me>\n"
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/recipes-"
"backend/nl/>\n"
"Language: nl\n"
@@ -22,7 +22,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 4.8\n"
"X-Generator: Weblate 4.10.1\n"
#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34
#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28
@@ -110,20 +110,14 @@ msgid "Display nutritional energy amounts in joules instead of calories"
msgstr "Geef energiewaardes weer in joules in plaats van calorieën"
#: .\cookbook\forms.py:79
#, fuzzy
#| msgid ""
#| "Users with whom newly created meal plan/shopping list entries should be "
#| "shared by default."
msgid "Users with whom newly created meal plans should be shared by default."
msgstr ""
"Gebruikers waarmee een nieuw maaltijdplan/boodschappenlijst standaard "
"gedeeld moeten worden."
"Gebruikers waarmee een nieuwe maaltijdplannen standaard gedeeld moeten "
"worden."
#: .\cookbook\forms.py:80
#, fuzzy
#| msgid "Try the new shopping list"
msgid "Users with whom to share shopping lists."
msgstr "Probeer de nieuwe boodschappenlijst"
msgstr "Gebruikers waarmee boodschappenlijsten gedeeld moeten worden."
#: .\cookbook\forms.py:82
msgid "Show recently viewed recipes on search page."
@@ -156,11 +150,11 @@ msgstr "Zet de navbar vast aan de bovenkant van de pagina."
#: .\cookbook\forms.py:90 .\cookbook\forms.py:496
msgid "Automatically add meal plan ingredients to shopping list."
msgstr ""
msgstr "Zet maaltijdplan ingrediënten automatisch op boodschappenlijst."
#: .\cookbook\forms.py:91
msgid "Exclude ingredients that are on hand."
msgstr ""
msgstr "Sluit ingrediënten die op voorraad zijn uit."
#: .\cookbook\forms.py:108
msgid ""
@@ -297,9 +291,13 @@ msgstr ""
"(lage waarden betekenen bijvoorbeeld dat meer typefouten genegeerd worden)."
#: .\cookbook\forms.py:445
#, fuzzy
#| msgid ""
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
#| "for full desciption of choices."
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
"Selecteer zoekmethode. Klik <a href=\"/docs/search/\">hier</a> voor een "
"beschrijving van de keuzes."
@@ -370,7 +368,9 @@ msgid "Partial Match"
msgstr "Gedeeltelijke overeenkomst"
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
#, fuzzy
#| msgid "Starts Wtih"
msgid "Starts With"
msgstr "Begint met"
#: .\cookbook\forms.py:465
@@ -386,82 +386,87 @@ msgid ""
"Users will see all items you add to your shopping list. They must add you "
"to see items on their list."
msgstr ""
"Gebruikers zien alle items die je op je boodschappenlijst zet. Ze moeten "
"jou toevoegen om items op hun lijst te zien."
#: .\cookbook\forms.py:497
msgid ""
"When adding a meal plan to the shopping list (manually or automatically), "
"include all related recipes."
msgstr ""
"Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of "
"automatisch), neem dan alle recepten op."
#: .\cookbook\forms.py:498
msgid ""
"When adding a meal plan to the shopping list (manually or automatically), "
"exclude ingredients that are on hand."
msgstr ""
"Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of "
"automatisch), sluit ingrediënten die op voorraad zijn dan uit."
#: .\cookbook\forms.py:499
msgid "Default number of hours to delay a shopping list entry."
msgstr ""
msgstr "Standaard aantal uren om een boodschappenlijst item te vertragen."
#: .\cookbook\forms.py:500
msgid "Filter shopping list to only include supermarket categories."
msgstr ""
msgstr "Filter boodschappenlijst om alleen supermarktcategorieën te bevatten."
#: .\cookbook\forms.py:501
msgid "Days of recent shopping list entries to display."
msgstr ""
msgstr "Dagen van recente boodschappenlijst items weer te geven."
#: .\cookbook\forms.py:502
msgid "Mark food 'On Hand' when checked off shopping list."
msgstr ""
"Markeer eten 'Op voorraad' wanneer het van het boodschappenlijstje is "
"afgevinkt."
#: .\cookbook\forms.py:503
msgid "Delimiter to use for CSV exports."
msgstr ""
msgstr "Scheidingsteken te gebruiken voor CSV exports."
#: .\cookbook\forms.py:504
msgid "Prefix to add when copying list to the clipboard."
msgstr ""
"Toe te voegen Voorvoegsel bij het kopiëren van een lijst naar het klembord."
#: .\cookbook\forms.py:508
#, fuzzy
#| msgid "New Shopping List"
msgid "Share Shopping List"
msgstr "Nieuwe boodschappenlijst"
msgstr "Deel boodschappenlijst"
#: .\cookbook\forms.py:509
msgid "Autosync"
msgstr ""
msgstr "Autosync"
#: .\cookbook\forms.py:510
msgid "Auto Add Meal Plan"
msgstr ""
msgstr "Voeg maaltijdplan automatisch toe"
#: .\cookbook\forms.py:511
msgid "Exclude On Hand"
msgstr ""
msgstr "Sluit op voorraad uit"
#: .\cookbook\forms.py:512
msgid "Include Related"
msgstr ""
msgstr "Neem gerelateerde op"
#: .\cookbook\forms.py:513
msgid "Default Delay Hours"
msgstr ""
msgstr "Standaard vertraging in uren"
#: .\cookbook\forms.py:514
#, fuzzy
#| msgid "Select Supermarket"
msgid "Filter to Supermarket"
msgstr "Selecteer supermarkt"
msgstr "Filter op supermarkt"
#: .\cookbook\forms.py:515
msgid "Recent Days"
msgstr ""
msgstr "Afgelopen dagen"
#: .\cookbook\forms.py:516
msgid "CSV Delimiter"
msgstr ""
msgstr "CSV scheidingsteken"
#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322
msgid "List Prefix"
@@ -469,27 +474,23 @@ msgstr "Lijst voorvoegsel"
#: .\cookbook\forms.py:518
msgid "Auto On Hand"
msgstr ""
msgstr "Auto op voorraad"
#: .\cookbook\forms.py:528
msgid "Reset Food Inheritance"
msgstr ""
msgstr "Herstel Ingrediënt overname"
#: .\cookbook\forms.py:529
msgid "Reset all food to inherit the fields configured."
msgstr ""
msgstr "Herstel alle ingrediënten om de geconfigureerde velden over te nemen."
#: .\cookbook\forms.py:541
#, fuzzy
#| msgid "Food that should be replaced."
msgid "Fields on food that should be inherited by default."
msgstr "Te vervangen Ingrediënt."
msgstr "Velden van ingrediënten die standaard overgenomen moeten worden."
#: .\cookbook\forms.py:542
#, fuzzy
#| msgid "Show recently viewed recipes on search page."
msgid "Show recipe counts on search filters"
msgstr "Geef recent bekeken recepten op de zoekpagina weer."
msgstr "Toon recepten teller bij zoekfilters"
#: .\cookbook\helper\AllAuthCustomAdapter.py:36
msgid ""
@@ -523,33 +524,29 @@ msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
"Interactie met dit object is niet mogelijk omdat je niet de eigenaar bent!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
msgstr "Er moet een queryset of hash_key opgegeven worden"
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgstr "Je moet minimaal één recept of titel te specificeren."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#| msgid "You must supply a created_by"
msgid "You must supply a servings size"
msgstr "Je moet een created_by aanleveren"
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr "Sjablooncode kon niet verwerkt worden."
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
"De importtool verwachtte een .zip bestand. Heb je het juiste type gekozen?"
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
@@ -557,11 +554,11 @@ msgstr ""
"Er is een onverwachte fout opgetreden tijdens het importeren. Controleer of "
"u een geldig bestand hebt geüpload."
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr "De volgende recepten zijn genegeerd omdat ze al bestonden:"
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr "%s recepten geïmporteerd."
@@ -579,7 +576,6 @@ msgid "Source"
msgstr "Bron"
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -608,7 +604,9 @@ msgid "Rebuilds full text search index on Recipe"
msgstr "Herbouwt de volledige tekst zoekindex van Recept"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
#, fuzzy
#| msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
"Alleen Postgress databases gebruiken volledige tekst zoekmethoden, geen "
"index aanwezig om te herbouwen"
@@ -674,93 +672,76 @@ msgstr "Groot"
msgid "New"
msgstr "Nieuw"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr " is deel van een receptstap en kan niet verwijderd worden"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Tekst"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Tijd"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "Bestand"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recept"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr "Simpel"
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr "Zin"
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr "Web"
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr "Rauw"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr "Ingrediënt alias"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr "Eenheid alias"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr "Etiket alias"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
msgstr "Een gebruiker is verplicht"
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr "Bestandsuploads zijn niet ingeschakeld voor deze Ruimte."
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr "U heeft de uploadlimiet bereikt."
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
msgstr "Bestaande boodschappenlijst is bijgewerkt"
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
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."
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1121,8 +1102,8 @@ msgstr "Batchbewerking"
msgid "History"
msgstr "Geschiedenis"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1215,7 +1196,6 @@ msgstr "Het pad dient het volgende format te hebben"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1258,7 +1238,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Kookboeken"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Recepten exporteren"
@@ -1383,19 +1363,12 @@ msgstr "Recepten importeren"
msgid "Import"
msgstr "Importeer"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "logboek recept koken"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Recept"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Alle velden zijn optioneel en mogen leeg gelaten worden."
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Beoordeling"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Sluiten"
@@ -1507,7 +1480,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "of door een witregel te gebruiken."
#: .\cookbook\templates\markdown_info.html:59
@@ -1530,8 +1505,12 @@ msgid "Lists"
msgstr "Lijsten"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"Lijsten zijn geordend en ongeordend mogelijk. Het is <b>belangrijk om een "
@@ -1827,10 +1806,19 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:29
#, fuzzy
#| msgid ""
#| " \n"
#| " Simple searches ignore punctuation and common words such as "
#| "'the', 'a', 'and'. And will treat seperate words as required.\n"
#| " Searching for 'apple or flour' will return any recipe that "
#| "includes both 'apple' and 'flour' anywhere in the fields that have been "
#| "selected for a full text search.\n"
#| " "
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1863,13 +1851,30 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:39
#, fuzzy
#| msgid ""
#| " \n"
#| " Web searches simulate functionality found on many web search "
#| "sites supporting special syntax.\n"
#| " Placing quotes around several words will convert those words "
#| "into a phrase.\n"
#| " 'or' is recongized as searching for the word (or phrase) "
#| "immediately before 'or' OR the word (or phrase) directly after.\n"
#| " '-' is recognized as searching for recipes that do not "
#| "include the word (or phrase) that comes immediately after. \n"
#| " For example searching for 'apple pie' or cherry -butter will "
#| "return any recipe that includes the phrase 'apple pie' or the word "
#| "'cherry' \n"
#| " in any field included in the full text search but exclude any "
#| "recipe that has the word 'butter' in any field included.\n"
#| " "
msgid ""
" \n"
" Web searches simulate functionality found on many web search "
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1908,6 +1913,19 @@ msgstr ""
" "
#: .\cookbook\templates\search_info.html:59
#, fuzzy
#| msgid ""
#| " \n"
#| " Another approach to searching that also requires Postgresql "
#| "is fuzzy search or trigram similarity. A trigram is a group of three "
#| "consecutive characters.\n"
#| " For example searching for 'apple' will create x trigrams "
#| "'app', 'ppl', 'ple' and will create a score of how closely words match "
#| "the generated trigrams.\n"
#| " One benefit of searching trigams is that a search for "
#| "'sandwich' will find mispelled words such as 'sandwhich' that would be "
#| "missed by other methods.\n"
#| " "
msgid ""
" \n"
" Another approach to searching that also requires Postgresql is "
@@ -1917,7 +1935,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2245,7 +2263,9 @@ msgid "Finished"
msgstr "Afgerond"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "Je bent offline, de boodschappenlijst synchroniseert mogelijk niet."
#: .\cookbook\templates\shopping_list.html:318
@@ -2541,6 +2561,14 @@ msgstr "URL"
msgid "App"
msgstr "App"
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Tekst"
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "Bestand"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "Vul website URL in"
@@ -2716,181 +2744,182 @@ msgstr "GitHub issues"
msgid "Recipe Markup Specification"
msgstr "Recept opmaak specificatie"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr "Parameter updatet_at is onjuist geformateerd"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr "Er bestaat geen {self.basename} met id {pk}"
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr "Kan niet met hetzelfde object samenvoegen!"
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr "Er bestaat geen {self.basename} met id {target}"
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr "Kan niet met kindobject samenvoegen!"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} is succesvol samengevoegd met {target.name}"
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
"Er is een error opgetreden bij het samenvoegen van {source.name} met {target."
"name}"
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} is succesvol verplaatst naar het hoogste niveau."
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr "Er is een error opgetreden bij het verplaatsen "
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr "Kan object niet verplaatsen naar zichzelf!"
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr "Er bestaat geen {self.basename} met id {parent}"
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} is succesvol verplaatst naar {parent.name}"
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr "Deze optie is nog niet beschikbaar in de gehoste versie van Tandoor!"
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "Synchronisatie succesvol!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "Er is een fout opgetreden bij het synchroniseren met Opslag"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr "Niks te doen."
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
"De opgevraagde site heeft misvormde data verstrekt en kan niet gelezen "
"worden."
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "De opgevraagde pagina kon niet gevonden worden."
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
@@ -2898,26 +2927,28 @@ msgstr ""
"De opgevraagde site biedt geen bekend gegevensformaat aan om het recept van "
"te importeren."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "Er is geen bruikbare data gevonden."
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr "Ik kon niks vinden om te doen."
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr "Je hebt het maximaal aantal recepten voor jouw ruimte bereikt."
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr "Je hebt meer gebruikers dan toegestaan in jouw ruimte."
@@ -2977,20 +3008,16 @@ msgstr "Wijzigingen opgeslagen!"
msgid "Error saving changes!"
msgstr "Fout bij het opslaan van de wijzigingen!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr "Importeren is voor deze provider niet geïmplementeerd"
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr "Exporteren is voor deze provider niet geïmplementeerd"
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "Import logboek"
@@ -3117,7 +3144,7 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr "'Fuzzy' zoeken is niet te gebruiken met deze zoekmethode!"
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 "
@@ -3128,31 +3155,31 @@ msgstr ""
"documentatie raad moeten plegen voor een methode om je wachtwoord te "
"resetten."
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "Wachtwoorden komen niet overeen!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "Gebruiker is gecreëerd, Log in alstublieft!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "Onjuiste uitnodigingslink opgegeven!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr "Je bent al lid van een ruimte en kan daardoor niet toetreden tot deze."
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr "Succesvol toegetreden tot ruimte."
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "De uitnodigingslink is niet valide of al gebruikt!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
@@ -3160,7 +3187,7 @@ msgstr ""
"Het rapporteren van gedeelde links is niet geactiveerd voor deze instantie. "
"Rapporteer problemen bij de beheerder van de pagina."
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
@@ -3168,6 +3195,24 @@ msgstr ""
"Links voor het delen van recepten zijn gedeactiveerd. Neem contact op met de "
"paginabeheerder voor aanvullende informatie."
#~ msgid "You must supply a recipe or mealplan"
#~ msgstr "Je moet een recept of maaltijdplan aanleveren"
#~ msgid "Time"
#~ msgstr "Tijd"
#~ msgid "Log Recipe Cooking"
#~ msgstr "logboek recept koken"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Alle velden zijn optioneel en mogen leeg gelaten worden."
#~ msgid "Rating"
#~ msgstr "Beoordeling"
#~ msgid "Exporting is not implemented for this provider"
#~ msgstr "Exporteren is voor deze provider niet geïmplementeerd"
#, python-brace-format
#~ msgid "No {self.basename} with id {child} exists"
#~ msgstr "Er bestaat geen {self.basename} met id {child}"

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2021-11-12 20:06+0000\n"
"Last-Translator: Henrique Silva <hds@mailbox.org>\n"
"Language-Team: Portuguese <http://translate.tandoor.dev/projects/tandoor/"
@@ -294,9 +294,13 @@ msgstr ""
"ignorados)."
#: .\cookbook\forms.py:445
#, fuzzy
#| msgid ""
#| "Select type method of search. Click <a href=\"/docs/search/\">here</a> "
#| "for full desciption of choices."
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
"Selecionar o método de pesquisa. Uma descrição completa das opções pode ser "
"encontrada <a href=\"/docs/search/\">aqui</a>."
@@ -360,7 +364,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -512,42 +516,38 @@ msgstr "Sem permissões para aceder a esta página!"
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must provide at least a recipe or a title."
msgid "You must supply a recipe or mealplan"
msgid "You must supply a servings size"
msgstr "É necessário inserir uma receita ou um título."
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
#: .\cookbook\helper\template_helper.py:63
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, fuzzy, python-format
#| msgid "Import Recipes"
msgid "Imported %s recipes."
@@ -568,7 +568,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -597,7 +596,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -659,101 +658,80 @@ msgstr "Grande"
msgid "New"
msgstr "Novo"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Texto"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "Tempo"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID the ficheiro"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Receita"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "New Food"
msgid "Food Alias"
msgstr "Novo Prato"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Units"
msgid "Unit Alias"
msgstr "Unidades"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
#, fuzzy
#| msgid "Keywords"
msgid "Keyword Alias"
msgstr "Palavras-chave"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1110,8 +1088,8 @@ msgstr "Editor em massa"
msgid "History"
msgstr "Histórico"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1202,7 +1180,6 @@ msgstr "O caminho deve estar no seguinte formato"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1249,7 +1226,7 @@ msgstr ""
msgid "Recipe Books"
msgstr "Livros de Receitas"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "Exportar Receitas"
@@ -1372,19 +1349,12 @@ msgstr "Importar Receitas"
msgid "Import"
msgstr "Importar"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "Registro Receita Cooking"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "Receita"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "Todos os campos são opcionais e podem ser deixados vazios. "
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "Classificação "
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "Fechar"
@@ -1485,7 +1455,9 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "ou deixando uma linha em branco no meio."
#: .\cookbook\templates\markdown_info.html:59
@@ -1508,8 +1480,12 @@ msgid "Lists"
msgstr "Listas"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
"As listas podem ser ordenadas ou não ordenadas. É <b>importante deixar uma "
@@ -1783,7 +1759,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1808,7 +1784,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1838,7 +1814,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2115,7 +2091,7 @@ msgid "Finished"
msgstr ""
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
#: .\cookbook\templates\shopping_list.html:318
@@ -2377,6 +2353,16 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "Texto"
#: .\cookbook\templates\url_import.html:46
#, fuzzy
#| msgid "File ID"
msgid "File"
msgstr "ID the ficheiro"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr ""
@@ -2555,202 +2541,203 @@ msgstr ""
msgid "Recipe Markup Specification"
msgstr ""
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr ""
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr ""
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr "Esta página não contém uma receita que eu consiga entender."
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2808,20 +2795,16 @@ msgstr ""
msgid "Error saving changes!"
msgstr ""
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr ""
@@ -2940,51 +2923,63 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 ""
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr ""
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr ""
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr ""
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
#, fuzzy
#| msgid "You are not logged in and therefore cannot view this page!"
msgid "You are already member of a space and therefore cannot join this one."
msgstr "Autenticação necessária para aceder a esta página!"
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr ""
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
msgstr ""
#~ msgid "Time"
#~ msgstr "Tempo"
#~ msgid "Log Recipe Cooking"
#~ msgstr "Registro Receita Cooking"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "Todos os campos são opcionais e podem ser deixados vazios. "
#~ msgid "Rating"
#~ msgstr "Classificação "
#~ msgid "New Unit"
#~ msgstr "Nova Unidade"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -260,7 +260,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -316,7 +316,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -458,16 +458,12 @@ msgstr ""
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
msgid "You must supply a servings size"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
@@ -475,23 +471,23 @@ msgstr ""
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr ""
@@ -509,7 +505,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -538,7 +533,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -600,93 +595,74 @@ msgstr ""
msgid "New"
msgstr ""
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\models.py:586
msgid "Time"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr ""
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1031,8 +1007,8 @@ msgstr ""
msgid "History"
msgstr ""
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1121,7 +1097,6 @@ msgstr ""
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1162,7 +1137,7 @@ msgstr ""
msgid "Recipe Books"
msgstr ""
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr ""
@@ -1280,19 +1255,12 @@ msgstr ""
msgid "Import"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr ""
@@ -1383,7 +1351,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr ""
#: .\cookbook\templates\markdown_info.html:59
@@ -1407,7 +1375,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:85
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
@@ -1669,7 +1637,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1694,7 +1662,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1724,7 +1692,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -1983,7 +1951,7 @@ msgid "Finished"
msgstr ""
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
#: .\cookbook\templates\shopping_list.html:318
@@ -2241,6 +2209,14 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr ""
@@ -2403,202 +2379,203 @@ msgstr ""
msgid "Recipe Markup Specification"
msgstr ""
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr ""
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr ""
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr ""
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2656,20 +2633,16 @@ msgstr ""
msgid "Error saving changes!"
msgstr ""
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr ""
@@ -2786,44 +2759,44 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 ""
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr ""
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr ""
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr ""
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr ""
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2020-06-02 19:28+0000\n"
"Last-Translator: Emre S, 2020\n"
"Language-Team: Turkish (https://www.transifex.com/django-recipes/"
@@ -275,7 +275,7 @@ msgstr ""
#: .\cookbook\forms.py:445
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
"full description of choices."
msgstr ""
#: .\cookbook\forms.py:446
@@ -331,7 +331,7 @@ msgid "Partial Match"
msgstr ""
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
msgid "Starts With"
msgstr ""
#: .\cookbook\forms.py:465
@@ -475,16 +475,12 @@ msgstr ""
msgid "You cannot interact with this object as it is not owned by you!"
msgstr ""
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr ""
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
msgid "You must supply a servings size"
msgstr ""
#: .\cookbook\helper\template_helper.py:61
@@ -492,23 +488,23 @@ msgstr ""
msgid "Could not parse template code."
msgstr ""
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr ""
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr ""
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr ""
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr ""
@@ -526,7 +522,6 @@ msgid "Source"
msgstr ""
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -555,7 +550,7 @@ msgid "Rebuilds full text search index on Recipe"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr ""
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -617,93 +612,74 @@ msgstr ""
msgid "New"
msgstr ""
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\models.py:586
msgid "Time"
msgstr ""
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr ""
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr ""
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr ""
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr ""
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr ""
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr ""
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr ""
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr ""
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr ""
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr ""
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr ""
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr ""
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr ""
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr ""
@@ -1048,8 +1024,8 @@ msgstr ""
msgid "History"
msgstr ""
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1138,7 +1114,6 @@ msgstr ""
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1179,7 +1154,7 @@ msgstr ""
msgid "Recipe Books"
msgstr ""
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr ""
@@ -1297,19 +1272,12 @@ msgstr ""
msgid "Import"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr ""
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr ""
@@ -1400,7 +1368,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr ""
#: .\cookbook\templates\markdown_info.html:59
@@ -1424,7 +1392,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:85
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr ""
@@ -1686,7 +1654,7 @@ msgstr ""
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
@@ -1711,7 +1679,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1741,7 +1709,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -2000,7 +1968,7 @@ msgid "Finished"
msgstr ""
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr ""
#: .\cookbook\templates\shopping_list.html:318
@@ -2258,6 +2226,14 @@ msgstr ""
msgid "App"
msgstr ""
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr ""
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr ""
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr ""
@@ -2420,202 +2396,203 @@ msgstr ""
msgid "Recipe Markup Specification"
msgstr ""
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr ""
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr ""
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr ""
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr ""
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr ""
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr ""
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr ""
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr ""
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr ""
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr ""
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr ""
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr ""
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr ""
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr ""
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr ""
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr ""
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr ""
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
msgid "No usable data could be found."
msgstr ""
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr ""
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr ""
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr ""
@@ -2673,20 +2650,16 @@ msgstr ""
msgid "Error saving changes!"
msgstr ""
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr ""
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr ""
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr ""
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr ""
@@ -2803,44 +2776,44 @@ msgstr ""
msgid "Fuzzy search is not compatible with this search method!"
msgstr ""
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 ""
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr ""
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr ""
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr ""
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr ""
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr ""
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr ""
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr ""
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: 2022-01-22 03:30+0000\n"
"Last-Translator: 糖多 <1365143958@qq.com>\n"
"Language-Team: Chinese (Simplified) <http://translate.tandoor.dev/projects/"
@@ -184,7 +184,9 @@ msgstr "默认"
msgid ""
"To prevent duplicates recipes with the same name as existing ones are "
"ignored. Check this box to import everything."
msgstr "为防止重复,忽略与现有同名的菜谱。选中此框可导入所有内容(危险操作,请先备份)。"
msgstr ""
"为防止重复,忽略与现有同名的菜谱。选中此框可导入所有内容(危险操作,请先备"
"份)。"
#: .\cookbook\forms.py:197
msgid "Add your comment: "
@@ -202,7 +204,9 @@ msgstr "Nextcloud 留空并输入 Dropbox API 令牌。"
msgid ""
"Leave empty for dropbox and enter only base url for nextcloud (<code>/remote."
"php/webdav/</code> is added automatically)"
msgstr "Dropbox 留空并输入基础 Nextcloud 网址(<code>/remote.php/webdav/</code> 会自动添加)"
msgstr ""
"Dropbox 留空并输入基础 Nextcloud 网址(<code>/remote.php/webdav/</code> 会自"
"动添加)"
#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166
msgid "Storage"
@@ -232,7 +236,8 @@ msgstr "你可以在设置中列出默认用户来分享菜谱。"
msgid ""
"You can use markdown to format this field. See the <a href=\"/docs/markdown/"
"\">docs here</a>"
msgstr "可以使用 Markdown 设置此字段格式。<a href=\"/docs/markdown/\">查看文档</a>"
msgstr ""
"可以使用 Markdown 设置此字段格式。<a href=\"/docs/markdown/\">查看文档</a>"
#: .\cookbook\forms.py:363
msgid "Maximum number of users for this space reached."
@@ -260,14 +265,17 @@ msgstr "接受条款及隐私政策"
msgid ""
"Determines how fuzzy a search is if it uses trigram similarity matching (e."
"g. low values mean more typos are ignored)."
msgstr "确定使用三元图相似性匹配时搜索的模糊程度(例如,较低的值意味着忽略更多的打字错误)。"
msgstr ""
"确定使用三元图相似性匹配时搜索的模糊程度(例如,较低的值意味着忽略更多的打字"
"错误)。"
#: .\cookbook\forms.py:445
#, fuzzy
msgid ""
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
"full desciption of choices."
msgstr "选择搜索类型方法。<a href=\"/docs/search/\">点击此处</a> 查看选项的完整说明。"
"full description of choices."
msgstr ""
"选择搜索类型方法。<a href=\"/docs/search/\">点击此处</a> 查看选项的完整说明。"
#: .\cookbook\forms.py:446
msgid ""
@@ -297,7 +305,9 @@ msgstr "用于搜索开头匹配的字段。如搜索“sa”会返回“sala
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 "“模糊”搜索字段。例如搜索“recpie”将会找到“recipe”。注意此选项将与“web”和“raw”搜索方法冲突。"
msgstr ""
"“模糊”搜索字段。例如搜索“recpie”将会找到“recipe”。注意此选项将"
"与“web”和“raw”搜索方法冲突。"
#: .\cookbook\forms.py:456
msgid ""
@@ -322,7 +332,9 @@ msgid "Partial Match"
msgstr "部分匹配"
#: .\cookbook\forms.py:464
msgid "Starts Wtih"
#, fuzzy
#| msgid "Starts Wtih"
msgid "Starts With"
msgstr "起始于"
#: .\cookbook\forms.py:465
@@ -337,7 +349,9 @@ msgstr "全文"
msgid ""
"Users will see all items you add to your shopping list. They must add you "
"to see items on their list."
msgstr "用户将看到你添加到购物清单中的所有商品。他们必须将你添加到列表才能看到他们清单上的项目。"
msgstr ""
"用户将看到你添加到购物清单中的所有商品。他们必须将你添加到列表才能看到他们清"
"单上的项目。"
#: .\cookbook\forms.py:497
msgid ""
@@ -467,16 +481,14 @@ msgstr "你没有必要的权限来查看这个页面!"
msgid "You cannot interact with this object as it is not owned by you!"
msgstr "你不能与此对象交互,因为它不属于你!"
#: .\cookbook\helper\recipe_search.py:473
#: .\cookbook\helper\recipe_search.py:486
msgid "One of queryset or hash_key must be provided"
msgstr "必须提供 queryset 或 hash_key 之一"
#: .\cookbook\helper\shopping_helper.py:54
msgid "You must supply a recipe or mealplan"
msgstr "你必须提供菜谱或膳食计划"
#: .\cookbook\helper\shopping_helper.py:58
msgid "You must supply a created_by"
#: .\cookbook\helper\shopping_helper.py:148
#, fuzzy
#| msgid "You must supply a created_by"
msgid "You must supply a servings size"
msgstr "你必须提供创建者"
#: .\cookbook\helper\template_helper.py:61
@@ -484,23 +496,23 @@ msgstr "你必须提供创建者"
msgid "Could not parse template code."
msgstr "无法解析模板代码。"
#: .\cookbook\integration\integration.py:200
#: .\cookbook\integration\integration.py:213
msgid ""
"Importer expected a .zip file. Did you choose the correct importer type for "
"your data ?"
msgstr "需要一个 .zip 文件。你是否为数据选择了正确的导入器类型?"
#: .\cookbook\integration\integration.py:203
#: .\cookbook\integration\integration.py:216
msgid ""
"An unexpected error occurred during the import. Please make sure you have "
"uploaded a valid file."
msgstr "在导入过程中发生了一个意外的错误。请确认你已经上传了一个有效的文件。"
#: .\cookbook\integration\integration.py:208
#: .\cookbook\integration\integration.py:221
msgid "The following recipes were ignored because they already existed:"
msgstr "以下菜谱被忽略了,因为它们已经存在了:"
#: .\cookbook\integration\integration.py:212
#: .\cookbook\integration\integration.py:225
#, python-format
msgid "Imported %s recipes."
msgstr "导入了%s菜谱。"
@@ -518,7 +530,6 @@ msgid "Source"
msgstr "来源"
#: .\cookbook\integration\saffron.py:23
#: .\cookbook\templates\include\log_cooking.html:18
#: .\cookbook\templates\url_import.html:231
#: .\cookbook\templates\url_import.html:462
msgid "Servings"
@@ -547,7 +558,9 @@ msgid "Rebuilds full text search index on Recipe"
msgstr "在菜谱上重建全文搜索索引"
#: .\cookbook\management\commands\rebuildindex.py:18
msgid "Only Postgress databases use full text search, no index to rebuild"
#, fuzzy
#| msgid "Only Postgress databases use full text search, no index to rebuild"
msgid "Only Postgresql databases use full text search, no index to rebuild"
msgstr "仅 Postgress 数据库使用全文搜索,没有重建索引"
#: .\cookbook\management\commands\rebuildindex.py:29
@@ -609,93 +622,74 @@ msgstr "大"
msgid "New"
msgstr "新"
#: .\cookbook\models.py:512
#: .\cookbook\models.py:513
msgid " is part of a recipe step and cannot be deleted"
msgstr " 是菜谱步骤的一部分,不能删除"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "文本"
#: .\cookbook\models.py:586
msgid "Time"
msgstr "时间"
#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "文件"
#: .\cookbook\models.py:586
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "菜谱"
#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28
#: .\cookbook\models.py:1065 .\cookbook\templates\search_info.html:28
msgid "Simple"
msgstr "简明"
#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33
#: .\cookbook\models.py:1066 .\cookbook\templates\search_info.html:33
msgid "Phrase"
msgstr "短语"
#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38
#: .\cookbook\models.py:1067 .\cookbook\templates\search_info.html:38
msgid "Web"
msgstr "网络"
#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47
#: .\cookbook\models.py:1068 .\cookbook\templates\search_info.html:47
msgid "Raw"
msgstr "原始"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Food Alias"
msgstr "食物别名"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Unit Alias"
msgstr "单位别名"
#: .\cookbook\models.py:1082
#: .\cookbook\models.py:1106
msgid "Keyword Alias"
msgstr "关键词别名"
#: .\cookbook\serializer.py:175
#: .\cookbook\serializer.py:180
msgid "A user is required"
msgstr "需要一个用户"
#: .\cookbook\serializer.py:195
#: .\cookbook\serializer.py:200
msgid "File uploads are not enabled for this Space."
msgstr "未为此空间启用文件上传。"
#: .\cookbook\serializer.py:206
#: .\cookbook\serializer.py:211
msgid "You have reached your file upload limit."
msgstr "你已达到文件上传的限制。"
#: .\cookbook\serializer.py:962
#: .\cookbook\serializer.py:977
msgid "Existing shopping list to update"
msgstr "要更新现有的购物清单"
#: .\cookbook\serializer.py:964
#: .\cookbook\serializer.py:979
msgid ""
"List of ingredient IDs from the recipe to add, if not provided all "
"ingredients will be added."
msgstr "要添加的菜谱中材料识别符列表,不提供则添加所有材料。"
#: .\cookbook\serializer.py:965
#: .\cookbook\serializer.py:980
msgid ""
"Providing a list_recipe ID and servings of 0 will delete that shopping list."
msgstr "提供一个菜谱列表识别符或份数为0将删除该购物清单。"
#: .\cookbook\serializer.py:973
#: .\cookbook\serializer.py:988
msgid "Amount of food to add to the shopping list"
msgstr "要添加到购物清单中的食物数量"
#: .\cookbook\serializer.py:974
#: .\cookbook\serializer.py:989
msgid "ID of unit to use for the shopping list"
msgstr "用于购物清单的单位识别符"
#: .\cookbook\serializer.py:975
#: .\cookbook\serializer.py:990
msgid "When set to true will delete all food from active shopping lists."
msgstr "当设置为 true 时,将从活动的购物列表中删除所有食物。"
@@ -789,7 +783,9 @@ msgstr "警告:"
msgid ""
"You currently do not have any e-mail address set up. You should really add "
"an e-mail address so you can receive notifications, reset your password, etc."
msgstr "你目前没有设置任何电子邮件地址。你真的应该添加一个电子邮件地址,这样你就可以收到通知,重置你的密码等等。"
msgstr ""
"你目前没有设置任何电子邮件地址。你真的应该添加一个电子邮件地址,这样你就可以"
"收到通知,重置你的密码等等。"
#: .\cookbook\templates\account\email.html:64
msgid "Add E-mail Address"
@@ -817,8 +813,8 @@ msgid ""
" ."
msgstr ""
"请确认\n"
" <a href=\"mailto:%(email)s\">%(email)s</a> 是用户 %(user_display)s "
"的电子邮件地址\n"
" <a href=\"mailto:%(email)s\">%(email)s</a> 是用户 "
"%(user_display)s 的电子邮件地址\n"
" ."
#: .\cookbook\templates\account\email_confirm.html:22
@@ -940,7 +936,8 @@ msgid ""
"password reset</a>."
msgstr ""
"密码重置链接无效,可能是因为它已经被使用。\n"
" 请重新请求 <a href=\"%(passwd_reset_url)s\">重设密码</a>。"
" 请重新请求 <a href=\"%(passwd_reset_url)s\">重设密码</"
"a>。"
#: .\cookbook\templates\account\password_reset_from_key.html:33
msgid "change password"
@@ -1053,8 +1050,8 @@ msgstr "批量编辑"
msgid "History"
msgstr "历史"
#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14
#: .\cookbook\templates\export.html:20
#: .\cookbook\templates\base.html:228
#: .\cookbook\templates\export_response.html:7
#: .\cookbook\templates\shopping_list.html:310
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
msgid "Export"
@@ -1143,7 +1140,6 @@ msgstr "路径必须采用以下格式"
#: .\cookbook\templates\forms\edit_import_recipe.html:14
#: .\cookbook\templates\generic\edit_template.html:23
#: .\cookbook\templates\generic\new_template.html:23
#: .\cookbook\templates\include\log_cooking.html:30
#: .\cookbook\templates\settings.html:70 .\cookbook\templates\settings.html:112
#: .\cookbook\templates\settings.html:130
#: .\cookbook\templates\settings.html:202
@@ -1184,7 +1180,7 @@ msgstr "这可能需要几分钟,取决于同步的菜谱数量,请等待。
msgid "Recipe Books"
msgstr "菜谱书"
#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6
#: .\cookbook\templates\export.html:8 .\cookbook\templates\test2.html:6
msgid "Export Recipes"
msgstr "导出菜谱"
@@ -1306,19 +1302,12 @@ msgstr "导入菜谱"
msgid "Import"
msgstr "导入"
#: .\cookbook\templates\include\log_cooking.html:9
msgid "Log Recipe Cooking"
msgstr "菜谱烹饪记录"
#: .\cookbook\templates\include\recipe_open_modal.html:7
#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260
#: .\cookbook\views\new.py:53
msgid "Recipe"
msgstr "菜谱"
#: .\cookbook\templates\include\log_cooking.html:15
msgid "All fields are optional and can be left empty."
msgstr "所有字段都是可选的,可以留空。"
#: .\cookbook\templates\include\log_cooking.html:21
msgid "Rating"
msgstr "评分"
#: .\cookbook\templates\include\log_cooking.html:29
#: .\cookbook\templates\include\recipe_open_modal.html:18
msgid "Close"
msgstr "关闭"
@@ -1345,7 +1334,8 @@ msgid ""
msgstr ""
"\n"
" <b>密码和令牌</b>字段在数据库中存储为<b>明文</b>。\n"
" 这是必要的,因为它们需要发出应用程序接口请求,但这也增加了被窃取的风险。<br/>\n"
" 这是必要的,因为它们需要发出应用程序接口请求,但这也增加了被窃取的风"
"险。<br/>\n"
" 为了限制可能的损害,可以使用访问受限的令牌或帐户。\n"
" "
@@ -1400,8 +1390,8 @@ msgid ""
msgstr ""
"\n"
" Markdown 是轻量标记语言,很方便格式化纯文本。\n"
" 本站使用 <a href=\"https://python-markdown.github.io/\" target=\"_blank\""
">Python Markdown</a> 库转换你的文本信息成好看的 HTML。\n"
" 本站使用 <a href=\"https://python-markdown.github.io/\" target="
"\"_blank\">Python Markdown</a> 库转换你的文本信息成好看的 HTML。\n"
" 完整的 Markdown 文档可 <a href=\"https://daringfireball.net/projects/"
"markdown/syntax\" target=\"_blank\">点击这里</a> 查看。\n"
" 下面可以找到一个不完整但很可能够用的文档。\n"
@@ -1422,7 +1412,9 @@ msgstr "通过在行尾后添加两个空格插入换行符"
#: .\cookbook\templates\markdown_info.html:57
#: .\cookbook\templates\markdown_info.html:73
msgid "or by leaving a blank line inbetween."
#, fuzzy
#| msgid "or by leaving a blank line inbetween."
msgid "or by leaving a blank line in between."
msgstr "或者在中间留一个空行。"
#: .\cookbook\templates\markdown_info.html:59
@@ -1445,8 +1437,12 @@ msgid "Lists"
msgstr "列表"
#: .\cookbook\templates\markdown_info.html:85
#, fuzzy
#| msgid ""
#| "Lists can ordered or unorderd. It is <b>important to leave a blank line "
#| "before the list!</b>"
msgid ""
"Lists can ordered or unorderd. It is <b>important to leave a blank line "
"Lists can ordered or unordered. It is <b>important to leave a blank line "
"before the list!</b>"
msgstr "列表可以是有序或无序的。重要的是 <b>在列表前留下一个空行!</b>"
@@ -1486,7 +1482,9 @@ msgstr "图片和链接"
msgid ""
"Links can be formatted with Markdown. This application also allows to paste "
"links directly into markdown fields without any formatting."
msgstr "链接可以使用 Markdown 格式化。此应用程序还允许粘贴链接到 markdown 字段而无需格式化。"
msgstr ""
"链接可以使用 Markdown 格式化。此应用程序还允许粘贴链接到 markdown 字段而无需"
"格式化。"
#: .\cookbook\templates\markdown_info.html:132
#: .\cookbook\templates\markdown_info.html:145
@@ -1504,8 +1502,8 @@ msgid ""
"\"noreferrer noopener\" target=\"_blank\">this one.</a>"
msgstr ""
"Markdown 表格难以手写。推荐使用像 <a href=\"https://www.tablesgenerator.com/"
"markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">这个</a> "
"的表格编辑器。"
"markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">这个</a> 的表"
"格编辑器。"
#: .\cookbook\templates\markdown_info.html:155
#: .\cookbook\templates\markdown_info.html:157
@@ -1604,7 +1602,9 @@ msgstr "加入一个现有的空间。"
msgid ""
"To join an existing space either enter your invite token or click on the "
"invite link the space owner send you."
msgstr "要加入一个现有的空间,要么输入你的邀请令牌,要么单击空间所有者发送给你的邀请链接。"
msgstr ""
"要加入一个现有的空间,要么输入你的邀请令牌,要么单击空间所有者发送给你的邀请"
"链接。"
#: .\cookbook\templates\no_space_info.html:48
#: .\cookbook\templates\no_space_info.html:56
@@ -1631,7 +1631,9 @@ msgstr "你目前处于离线状态!"
msgid ""
"The recipes listed below are available for offline viewing because you have "
"recently viewed them. Keep in mind that data might be outdated."
msgstr "下面列出的菜谱可以离线查看,因为你最近已经查看过了。请记住,数据可能是过时的。"
msgstr ""
"下面列出的菜谱可以离线查看,因为你最近已经查看过了。请记住,数据可能是过时"
"的。"
#: .\cookbook\templates\recipe_view.html:26
msgid "by"
@@ -1690,7 +1692,8 @@ msgstr ""
"\n"
" 创造最佳的搜索体验非常复杂,并且对您的个人配置有很大影响。\n"
" 改变任何搜索设置都可能对搜索结果的速度和质量产生重大影响。\n"
" 只有在数据库使用 Postgres 时,才可以使用搜索方法、卦和全文搜索配置。\n"
" 只有在数据库使用 Postgres 时,才可以使用搜索方法、卦和全文搜索配"
"置。\n"
" "
#: .\cookbook\templates\search_info.html:19
@@ -1712,25 +1715,39 @@ msgid ""
" "
msgstr ""
" \n"
" 全文搜索尝试规范化提供的单词以匹配常见变体。例“forked”、“forking”、“forks”都将归为“fork”。\n"
" 下面将介绍几种可用的方法,可以控制搜索多个单词时搜索行为的反应。\n"
" 关于这些操作的完整技术细节可以在 <a href=https://www.postgresql.org/docs/current/"
"textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES>Postgresql的网站</a> 上查看。\n"
" 全文搜索尝试规范化提供的单词以匹配常见变体。例"
"“forked”、“forking”、“forks”都将归为“fork”。\n"
" 下面将介绍几种可用的方法,可以控制搜索多个单词时搜索行为的反"
"。\n"
" 关于这些操作的完整技术细节可以在 <a href=https://www.postgresql."
"org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-"
"QUERIES>Postgresql的网站</a> 上查看。\n"
" "
#: .\cookbook\templates\search_info.html:29
#, fuzzy
#| msgid ""
#| " \n"
#| " Simple searches ignore punctuation and common words such as "
#| "'the', 'a', 'and'. And will treat seperate words as required.\n"
#| " Searching for 'apple or flour' will return any recipe that "
#| "includes both 'apple' and 'flour' anywhere in the fields that have been "
#| "selected for a full text search.\n"
#| " "
msgid ""
" \n"
" Simple searches ignore punctuation and common words such as "
"'the', 'a', 'and'. And will treat seperate words as required.\n"
"'the', 'a', 'and'. And will treat separate words as required.\n"
" Searching for 'apple or flour' will return any recipe that "
"includes both 'apple' and 'flour' anywhere in the fields that have been "
"selected for a full text search.\n"
" "
msgstr ""
" \n"
" 简单搜索会忽略标点符号和常用词如“the”、“a”、“and”。并将根据需要处理单独的单词。\n"
" 搜索“apple or flour”将会在全文搜索中返回任意包含“apple”和“flour”的菜谱。\n"
" 简单搜索会忽略标点符号和常用词如“the”、“a”、“and”。并将根据需要"
"处理单独的单词。\n"
" 搜索“apple or flour”将会在全文搜索中返回任意包"
"含“apple”和“flour”的菜谱。\n"
" "
#: .\cookbook\templates\search_info.html:34
@@ -1751,7 +1768,7 @@ msgid ""
"sites supporting special syntax.\n"
" Placing quotes around several words will convert those words "
"into a phrase.\n"
" 'or' is recongized as searching for the word (or phrase) "
" 'or' is recognized as searching for the word (or phrase) "
"immediately before 'or' OR the word (or phrase) directly after.\n"
" '-' is recognized as searching for recipes that do not include "
"the word (or phrase) that comes immediately after. \n"
@@ -1781,7 +1798,7 @@ msgid ""
"'ppl', 'ple' and will create a score of how closely words match the "
"generated trigrams.\n"
" One benefit of searching trigams is that a search for 'sandwich' "
"will find mispelled words such as 'sandwhich' that would be missed by other "
"will find misspelled words such as 'sandwhich' that would be missed by other "
"methods.\n"
" "
msgstr ""
@@ -1895,7 +1912,9 @@ msgstr "应用程序接口令牌"
msgid ""
"You can use both basic authentication and token based authentication to "
"access the REST API."
msgstr "您可以使用基本身份验证和基于令牌的身份验证来访问表现层状态转换应用程序接口REST API"
msgstr ""
"您可以使用基本身份验证和基于令牌的身份验证来访问表现层状态转换应用程序接口"
"REST API。"
#: .\cookbook\templates\settings.html:160
msgid ""
@@ -1917,13 +1936,16 @@ msgstr "根据个人偏好,有许多选项可以配置搜索。"
msgid ""
"Usually you do <b>not need</b> to configure any of them and can just stick "
"with either the default or one of the following presets."
msgstr "通常你 <b>不需要</b> 配置它们中的任何一个,只需使用默认设置或以下预设值之一。"
msgstr ""
"通常你 <b>不需要</b> 配置它们中的任何一个,只需使用默认设置或以下预设值之一。"
#: .\cookbook\templates\settings.html:175
msgid ""
"If you do want to configure the search you can read about the different "
"options <a href=\"/docs/search/\">here</a>."
msgstr "如果你想要配置搜索,可以在 <a href=\"/docs/search/\">这里</a> 阅读不同的选项。"
msgstr ""
"如果你想要配置搜索,可以在 <a href=\"/docs/search/\">这里</a> 阅读不同的选"
"项。"
#: .\cookbook\templates\settings.html:180
msgid "Fuzzy"
@@ -1934,7 +1956,9 @@ msgid ""
"Find what you need even if your search or the recipe contains typos. Might "
"return more results than needed to make sure you find what you are looking "
"for."
msgstr "即使你的搜索或菜谱中有拼写错误,也要找到你需要的东西。可能会返回比需要更多的结果,以确保你找到所需的内容。"
msgstr ""
"即使你的搜索或菜谱中有拼写错误,也要找到你需要的东西。可能会返回比需要更多的"
"结果,以确保你找到所需的内容。"
#: .\cookbook\templates\settings.html:182
msgid "This is the default behavior"
@@ -1953,7 +1977,8 @@ msgstr "精确"
msgid ""
"Allows fine control over search results but might not return results if too "
"many spelling mistakes are made."
msgstr "允许对搜索结果进行精细控制,但如果出现太多拼写错误,则可能不会返回结果。"
msgstr ""
"允许对搜索结果进行精细控制,但如果出现太多拼写错误,则可能不会返回结果。"
#: .\cookbook\templates\settings.html:190
msgid "Perfect for large Databases"
@@ -2042,7 +2067,9 @@ msgid "Finished"
msgstr "完成"
#: .\cookbook\templates\shopping_list.html:267
msgid "You are offline, shopping list might not syncronize."
#, fuzzy
#| msgid "You are offline, shopping list might not syncronize."
msgid "You are offline, shopping list might not synchronize."
msgstr "你已离线,购物清单可能无法同步。"
#: .\cookbook\templates\shopping_list.html:318
@@ -2203,10 +2230,10 @@ msgid ""
msgstr ""
"\n"
" Django Recipes 是一个开源应用程序。\n"
" 你可以在 <a href=\"https://github.com/vabene1111/recipes\">GitHub</a> "
"中找到。\n"
" 更新日志在 <a href=\"https://github.com/vabene1111/recipes/releases\""
">这里</a>。\n"
" 你可以在 <a href=\"https://github.com/vabene1111/recipes\">GitHub</"
"a> 中找到。\n"
" 更新日志在 <a href=\"https://github.com/vabene1111/recipes/releases"
"\">这里</a>。\n"
" "
#: .\cookbook\templates\system.html:48
@@ -2233,8 +2260,8 @@ msgid ""
" "
msgstr ""
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件。\n"
" 请按照 <a href=\"https://github.com/vabene1111/recipes/releases/tag/"
"0.8.1\">这里</a> 描述的步骤操作更新安装。\n"
" 请按照 <a href=\"https://github.com/vabene1111/recipes/releases/"
"tag/0.8.1\">这里</a> 描述的步骤操作更新安装。\n"
" "
#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73
@@ -2311,6 +2338,14 @@ msgstr "链接"
msgid "App"
msgstr "应用程序"
#: .\cookbook\templates\url_import.html:44
msgid "Text"
msgstr "文本"
#: .\cookbook\templates\url_import.html:46
msgid "File"
msgstr "文件"
#: .\cookbook\templates\url_import.html:64
msgid "Enter website URL"
msgstr "输入网站链接"
@@ -2473,202 +2508,205 @@ msgstr "GitHub 问题"
msgid "Recipe Markup Specification"
msgstr "菜谱标记规范"
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170
#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:174
msgid "Parameter updated_at incorrectly formatted"
msgstr "参数 updated_at 格式不正确"
#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291
#: .\cookbook\views\api.py:194 .\cookbook\views\api.py:295
#, python-brace-format
msgid "No {self.basename} with id {pk} exists"
msgstr ""
#: .\cookbook\views\api.py:194
#: .\cookbook\views\api.py:198
msgid "Cannot merge with the same object!"
msgstr "无法与同一对象合并!"
#: .\cookbook\views\api.py:201
#: .\cookbook\views\api.py:205
#, python-brace-format
msgid "No {self.basename} with id {target} exists"
msgstr ""
#: .\cookbook\views\api.py:206
#: .\cookbook\views\api.py:210
msgid "Cannot merge with child object!"
msgstr "无法与子对象合并!"
#: .\cookbook\views\api.py:239
#: .\cookbook\views\api.py:243
#, python-brace-format
msgid "{source.name} was merged successfully with {target.name}"
msgstr "{source.name} 已成功与 {target.name} 合并"
#: .\cookbook\views\api.py:244
#: .\cookbook\views\api.py:248
#, python-brace-format
msgid "An error occurred attempting to merge {source.name} with {target.name}"
msgstr "视图合并 {source.name} 和 {target.name} 时出错"
#: .\cookbook\views\api.py:300
#: .\cookbook\views\api.py:304
#, python-brace-format
msgid "{child.name} was moved successfully to the root."
msgstr "{child.name} 已成功移动到根目录。"
#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321
#: .\cookbook\views\api.py:307 .\cookbook\views\api.py:325
msgid "An error occurred attempting to move "
msgstr "尝试移动时出错 "
#: .\cookbook\views\api.py:306
#: .\cookbook\views\api.py:310
msgid "Cannot move an object to itself!"
msgstr "无法将对象移动到自身!"
#: .\cookbook\views\api.py:312
#: .\cookbook\views\api.py:316
#, python-brace-format
msgid "No {self.basename} with id {parent} exists"
msgstr ""
#: .\cookbook\views\api.py:318
#: .\cookbook\views\api.py:322
#, python-brace-format
msgid "{child.name} was moved successfully to parent {parent.name}"
msgstr "{child.name} 成功移动到父节点 {parent.name}"
#: .\cookbook\views\api.py:470
#: .\cookbook\views\api.py:474
#, python-brace-format
msgid "{obj.name} was removed from the shopping list."
msgstr "{obj.name} 已从购物清单中删除。"
#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726
#: .\cookbook\views\api.py:479 .\cookbook\views\api.py:729
#: .\cookbook\views\api.py:742
#, python-brace-format
msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} 已添加到购物清单中。"
#: .\cookbook\views\api.py:587
#: .\cookbook\views\api.py:591
msgid "ID of recipe a step is part of. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:588
#: .\cookbook\views\api.py:592
msgid "Query string matched (fuzzy) against object name."
msgstr ""
#: .\cookbook\views\api.py:631
#: .\cookbook\views\api.py:635
msgid ""
"Query string matched (fuzzy) against recipe name. In the future also "
"fulltext search."
msgstr ""
#: .\cookbook\views\api.py:632
#: .\cookbook\views\api.py:636
msgid "ID of keyword a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:633
#: .\cookbook\views\api.py:637
msgid "ID of food a recipe should have. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:634
#: .\cookbook\views\api.py:638
msgid "ID of unit a recipe should have."
msgstr ""
#: .\cookbook\views\api.py:635
#: .\cookbook\views\api.py:639
msgid "Rating a recipe should have. [0 - 5]"
msgstr ""
#: .\cookbook\views\api.py:636
#: .\cookbook\views\api.py:640
msgid "ID of book a recipe should be in. For multiple repeat parameter."
msgstr ""
#: .\cookbook\views\api.py:637
#: .\cookbook\views\api.py:641
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided keywords."
msgstr ""
#: .\cookbook\views\api.py:638
#: .\cookbook\views\api.py:642
msgid ""
"If recipe should have all (AND=false) or any (OR=<b>true</b>) of the "
"provided foods."
msgstr ""
#: .\cookbook\views\api.py:639
#: .\cookbook\views\api.py:643
msgid ""
"If recipe should be in all (AND=false) or any (OR=<b>true</b>) of the "
"provided books."
msgstr ""
#: .\cookbook\views\api.py:640
#: .\cookbook\views\api.py:644
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:641
#: .\cookbook\views\api.py:645
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:642
#: .\cookbook\views\api.py:646
msgid "Returns new results first in search results. [true/<b>false</b>]"
msgstr ""
#: .\cookbook\views\api.py:768
#: .\cookbook\views\api.py:784
msgid ""
"Returns the shopping list entry with a primary key of id. Multiple values "
"allowed."
msgstr ""
#: .\cookbook\views\api.py:771
#: .\cookbook\views\api.py:787
msgid ""
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
"b>]<br> - recent includes unchecked items and recently completed items."
msgstr ""
#: .\cookbook\views\api.py:773
#: .\cookbook\views\api.py:789
msgid "Returns the shopping list entries sorted by supermarket category order."
msgstr ""
#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42
#: .\cookbook\views\api.py:949 .\cookbook\views\data.py:42
#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95
msgid "This feature is not yet available in the hosted version of tandoor!"
msgstr ""
#: .\cookbook\views\api.py:944
#: .\cookbook\views\api.py:971
msgid "Sync successful!"
msgstr "同步成功!"
#: .\cookbook\views\api.py:949
#: .\cookbook\views\api.py:976
msgid "Error synchronizing with Storage"
msgstr "与存储同步时出错"
#: .\cookbook\views\api.py:1028
#: .\cookbook\views\api.py:1055
msgid "Nothing to do."
msgstr "无事可做。"
#: .\cookbook\views\api.py:1043
#: .\cookbook\views\api.py:1070
msgid "The requested site provided malformed data and cannot be read."
msgstr "请求的站点提供了格式错误的数据,无法读取。"
#: .\cookbook\views\api.py:1050
#: .\cookbook\views\api.py:1077
msgid "The requested page could not be found."
msgstr "找不到请求的页面。"
#: .\cookbook\views\api.py:1068
#: .\cookbook\views\api.py:1095
msgid ""
"The requested site does not provide any recognized data format to import the "
"recipe from."
msgstr "请求的站点未提供任何可识别的数据格式,无法从中导入菜谱。"
#: .\cookbook\views\api.py:1082
#: .\cookbook\views\api.py:1109
msgid "Connection Refused."
msgstr "连接被拒绝。"
#: .\cookbook\views\api.py:1091
msgid "No useable data could be found."
#: .\cookbook\views\api.py:1118
#, fuzzy
#| msgid "No useable data could be found."
msgid "No usable data could be found."
msgstr "找不到可用的数据。"
#: .\cookbook\views\api.py:1107
#: .\cookbook\views\api.py:1134
msgid "I couldn't find anything to do."
msgstr "无所事事。"
#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80
#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:81
#: .\cookbook\views\new.py:33
msgid "You have reached the maximum number of recipes for your space."
msgstr "你已经达到了空间的菜谱的最大数量。"
#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84
#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:85
#: .\cookbook\views\new.py:37
msgid "You have more users than allowed in your space."
msgstr "你的空间中的用户数超过了允许的数量。"
@@ -2726,20 +2764,16 @@ msgstr "更改已保存!"
msgid "Error saving changes!"
msgstr "保存更改时出错!"
#: .\cookbook\views\import_export.py:106
#: .\cookbook\views\import_export.py:107 .\cookbook\views\import_export.py:143
msgid "Importing is not implemented for this provider"
msgstr "此提供程序未实现导入"
#: .\cookbook\views\import_export.py:127
#: .\cookbook\views\import_export.py:130
msgid ""
"The PDF Exporter is not enabled on this instance as it is still in an "
"experimental state."
msgstr "此实例上未启用 PDF 导出器,因为它仍处于实验状态。"
#: .\cookbook\views\import_export.py:132
msgid "Exporting is not implemented for this provider"
msgstr "此提供程序未实现导出"
#: .\cookbook\views\lists.py:25
msgid "Import Log"
msgstr "导入日志"
@@ -2856,49 +2890,69 @@ msgstr "要使用此搜索方法,至少选择一个全文搜索字段!"
msgid "Fuzzy search is not compatible with this search method!"
msgstr "模糊搜索与此搜索方法不兼容!"
#: .\cookbook\views\views.py:470
#: .\cookbook\views\views.py:473
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 文档,了解如何重置密码。"
msgstr ""
"设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文"
"档,了解如何重置密码。"
#: .\cookbook\views\views.py:477
#: .\cookbook\views\views.py:480
msgid "Passwords dont match!"
msgstr "密码不匹配!"
#: .\cookbook\views\views.py:493
#: .\cookbook\views\views.py:496
msgid "User has been created, please login!"
msgstr "用户已创建,请登录!"
#: .\cookbook\views\views.py:509
#: .\cookbook\views\views.py:512
msgid "Malformed Invite Link supplied!"
msgstr "提供了格式错误的邀请链接!"
#: .\cookbook\views\views.py:516
#: .\cookbook\views\views.py:519
msgid "You are already member of a space and therefore cannot join this one."
msgstr "你已是空间的成员,因此未能加入。"
#: .\cookbook\views\views.py:527
#: .\cookbook\views\views.py:530
msgid "Successfully joined space."
msgstr "成功加入空间。"
#: .\cookbook\views\views.py:533
#: .\cookbook\views\views.py:536
msgid "Invite Link not valid or already used!"
msgstr "邀请链接无效或已使用!"
#: .\cookbook\views\views.py:614
#: .\cookbook\views\views.py:617
msgid ""
"Reporting share links is not enabled for this instance. Please notify the "
"page administrator to report problems."
msgstr "未为此实例启用报告共享链接。请通知页面管理员报告问题。"
#: .\cookbook\views\views.py:620
#: .\cookbook\views\views.py:623
msgid ""
"Recipe sharing link has been disabled! For additional information please "
"contact the page administrator."
msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理员联系。"
#~ msgid "You must supply a recipe or mealplan"
#~ msgstr "你必须提供菜谱或膳食计划"
#~ msgid "Time"
#~ msgstr "时间"
#~ msgid "Log Recipe Cooking"
#~ msgstr "菜谱烹饪记录"
#~ msgid "All fields are optional and can be left empty."
#~ msgstr "所有字段都是可选的,可以留空。"
#~ msgid "Rating"
#~ msgstr "评分"
#~ msgid "Exporting is not implemented for this provider"
#~ msgstr "此提供程序未实现导出"
#~ msgid "New Unit"
#~ msgstr "新单位"

View File

@@ -1,7 +1,5 @@
from django.contrib.postgres.aggregates import StringAgg
from django.contrib.postgres.search import (
SearchQuery, SearchRank, SearchVector,
)
from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
from django.db import models
from django.db.models import Q
from django.utils import translation

View File

@@ -1,9 +1,10 @@
# Generated by Django 3.2.11 on 2022-02-03 15:03
import cookbook.models
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import cookbook.models
class Migration(migrations.Migration):

View File

@@ -0,0 +1,66 @@
# Generated by Django 3.2.11 on 2022-02-07 17:48
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import cookbook.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('cookbook', '0169_exportlog'),
]
operations = [
migrations.AddField(
model_name='food',
name='child_inherit_fields',
field=models.ManyToManyField(blank=True, related_name='child_inherit', to='cookbook.FoodInheritField'),
),
migrations.AddField(
model_name='food',
name='substitute',
field=models.ManyToManyField(blank=True, related_name='_cookbook_food_substitute_+', to='cookbook.Food'),
),
migrations.AddField(
model_name='food',
name='substitute_children',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='food',
name='substitute_siblings',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='ingredient',
name='unit',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.unit'),
),
migrations.CreateModel(
name='CustomFilter',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('type', models.CharField(choices=[('RECIPE', 'Recipe'), ('FOOD', 'Food'), ('KEYWORD', 'Keyword')], default=('RECIPE', 'Recipe'), max_length=128)),
('search', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('shared', models.ManyToManyField(blank=True, related_name='f_shared_with', to=settings.AUTH_USER_MODEL)),
('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')),
],
bases=(models.Model, cookbook.models.PermissionModelMixin),
),
migrations.AddField(
model_name='recipebook',
name='filter',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.customfilter'),
),
migrations.AddConstraint(
model_name='customfilter',
constraint=models.UniqueConstraint(fields=('space', 'name'), name='cf_unique_name_per_space'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-02-15 00:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0170_auto_20220207_1848'),
]
operations = [
migrations.AlterField(
model_name='searchpreference',
name='trigram_threshold',
field=models.DecimalField(decimal_places=2, default=0.2, max_digits=3),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-02-25 15:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0171_alter_searchpreference_trigram_threshold'),
]
operations = [
migrations.AddField(
model_name='ingredient',
name='original_text',
field=models.CharField(blank=True, default=None, max_length=512, null=True),
),
]

View File

@@ -62,9 +62,10 @@ class TreeManager(MP_NodeManager):
# model.Manager get_or_create() is not compatible with MP_Tree
def get_or_create(self, *args, **kwargs):
kwargs['name'] = kwargs['name'].strip()
try:
return self.get(name__exact=kwargs['name'], space=kwargs['space']), False
except self.model.DoesNotExist:
if obj := self.filter(name__iexact=kwargs['name'], space=kwargs['space']).first():
return obj, False
else:
with scopes_disabled():
try:
defaults = kwargs.pop('defaults', None)
@@ -97,13 +98,6 @@ class TreeModel(MP_Node):
else:
return f"{self.name}"
# MP_Tree move uses raw SQL to execute move, override behavior to force a save triggering post_save signal
def move(self, *args, **kwargs):
super().move(*args, **kwargs)
# treebeard bypasses ORM, need to retrieve the object again to avoid writing previous state back to disk
obj = self.__class__.objects.get(id=self.id)
obj.save()
@property
def parent(self):
parent = self.get_parent()
@@ -488,8 +482,10 @@ class Unit(ExportModelOperationsMixin('unit'), models.Model, PermissionModelMixi
class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin):
# TODO when savings a food as substitute children - assume children and descednants are also substitutes for siblings
# exclude fields not implemented yet
inheritable_fields = FoodInheritField.objects.exclude(field__in=['diet', 'substitute', 'substitute_children', 'substitute_siblings'])
inheritable_fields = FoodInheritField.objects.exclude(field__in=['diet', 'substitute', ])
# TODO add inherit children_inherit, parent_inherit, Do Not Inherit
# WARNING: Food inheritance relies on post_save signals, avoid using UPDATE to update Food objects unless you intend to bypass those signals
if SORT_TREE_BY_NAME:
@@ -501,6 +497,10 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin):
onhand_users = models.ManyToManyField(User, blank=True)
description = models.TextField(default='', blank=True)
inherit_fields = models.ManyToManyField(FoodInheritField, blank=True)
substitute = models.ManyToManyField("self", blank=True)
substitute_siblings = models.BooleanField(default=False)
substitute_children = models.BooleanField(default=False)
child_inherit_fields = models.ManyToManyField(FoodInheritField, blank=True, related_name='child_inherit')
space = models.ForeignKey(Space, on_delete=models.CASCADE)
objects = ScopedManager(space='space', _manager_class=TreeManager)
@@ -514,34 +514,63 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin):
else:
return super().delete()
# MP_Tree move uses raw SQL to execute move, override behavior to force a save triggering post_save signal
def move(self, *args, **kwargs):
super().move(*args, **kwargs)
# treebeard bypasses ORM, need to explicity save to trigger post save signals retrieve the object again to avoid writing previous state back to disk
obj = self.__class__.objects.get(id=self.id)
if parent := obj.get_parent():
# child should inherit what the parent defines it should inherit
fields = list(parent.child_inherit_fields.all() or parent.inherit_fields.all())
if len(fields) > 0:
obj.inherit_fields.set(fields)
obj.save()
@staticmethod
def reset_inheritance(space=None):
def reset_inheritance(space=None, food=None):
# resets inherited fields to the space defaults and updates all inherited fields to root object values
inherit = space.food_inherit.all()
if food:
# if child inherit fields is preset children should be set to that, otherwise inherit this foods inherited fields
inherit = list((food.child_inherit_fields.all() or food.inherit_fields.all()).values('id', 'field'))
tree_filter = Q(path__startswith=food.path, space=space, depth=food.depth+1)
else:
inherit = list(space.food_inherit.all().values('id', 'field'))
tree_filter = Q(space=space)
# remove all inherited fields from food
Through = Food.objects.filter(space=space).first().inherit_fields.through
Through = Food.objects.filter(tree_filter).first().inherit_fields.through
Through.objects.all().delete()
# food is going to inherit attributes
if space.food_inherit.all().count() > 0:
if len(inherit) > 0:
# ManyToMany cannot be updated through an UPDATE operation
for i in inherit:
Through.objects.bulk_create([
Through(food_id=x, foodinheritfield_id=i.id)
for x in Food.objects.filter(space=space).values_list('id', flat=True)
Through(food_id=x, foodinheritfield_id=i['id'])
for x in Food.objects.filter(tree_filter).values_list('id', flat=True)
])
inherit = inherit.values_list('field', flat=True)
if 'ignore_shopping' in inherit:
# get food at root that have children that need updated
Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, space=space, ignore_shopping=True)).update(ignore_shopping=True)
Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, space=space, ignore_shopping=False)).update(ignore_shopping=False)
inherit = [x['field'] for x in inherit]
for field in ['ignore_shopping', 'substitute_children', 'substitute_siblings']:
if field in inherit:
if food and getattr(food, field, None):
food.get_descendants().update(**{f"{field}": True})
elif food and not getattr(food, field, True):
food.get_descendants().update(**{f"{field}": False})
else:
# get food at root that have children that need updated
Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, **{f"{field}": True}, space=space)).update(**{f"{field}": True})
Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, **{f"{field}": False}, space=space)).update(**{f"{field}": False})
if 'supermarket_category' in inherit:
# when supermarket_category is null or blank assuming it is not set and not intended to be blank for all descedants
# find top node that has category set
category_roots = Food.exclude_descendants(queryset=Food.objects.filter(supermarket_category__isnull=False, numchild__gt=0, space=space))
for root in category_roots:
root.get_descendants().update(supermarket_category=root.supermarket_category)
if food and food.supermarket_category:
food.get_descendants().update(supermarket_category=food.supermarket_category)
elif food is None:
# find top node that has category set
category_roots = Food.exclude_descendants(queryset=Food.objects.filter(supermarket_category__isnull=False, numchild__gt=0, space=space))
for root in category_roots:
root.get_descendants().update(supermarket_category=root.supermarket_category)
class Meta:
constraints = [
@@ -554,14 +583,15 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin):
class Ingredient(ExportModelOperationsMixin('ingredient'), models.Model, PermissionModelMixin):
# a pre-delete signal on Food checks if the Ingredient is part of a Step, if it is raises a ProtectedError instead of cascading the delete
# delete method on Food and Unit checks if they are part of a Recipe, if it is raises a ProtectedError instead of cascading the delete
food = models.ForeignKey(Food, on_delete=models.CASCADE, null=True, blank=True)
unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True, blank=True)
unit = models.ForeignKey(Unit, on_delete=models.SET_NULL, null=True, blank=True)
amount = models.DecimalField(default=0, decimal_places=16, max_digits=32)
note = models.CharField(max_length=256, null=True, blank=True)
is_header = models.BooleanField(default=False)
no_amount = models.BooleanField(default=False)
order = models.IntegerField(default=0)
original_text = models.CharField(max_length=512, null=True, blank=True, default=None)
space = models.ForeignKey(Space, on_delete=models.CASCADE)
objects = ScopedManager(space='space')
@@ -725,6 +755,7 @@ class RecipeBook(ExportModelOperationsMixin('book'), models.Model, PermissionMod
icon = models.CharField(max_length=16, blank=True, null=True)
shared = models.ManyToManyField(User, blank=True, related_name='shared_with')
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
filter = models.ForeignKey('cookbook.CustomFilter', null=True, blank=True, on_delete=models.SET_NULL)
space = models.ForeignKey(Space, on_delete=models.CASCADE)
objects = ScopedManager(space='space')
@@ -1002,6 +1033,7 @@ class ImportLog(models.Model, PermissionModelMixin):
def __str__(self):
return f"{self.created_at}:{self.type}"
class ExportLog(models.Model, PermissionModelMixin):
type = models.CharField(max_length=32)
running = models.BooleanField(default=True)
@@ -1077,7 +1109,7 @@ class SearchPreference(models.Model, PermissionModelMixin):
istartswith = models.ManyToManyField(SearchFields, related_name="istartswith_fields", blank=True)
trigram = models.ManyToManyField(SearchFields, related_name="trigram_fields", blank=True, default=nameSearchField)
fulltext = models.ManyToManyField(SearchFields, related_name="fulltext_fields", blank=True)
trigram_threshold = models.DecimalField(default=0.1, decimal_places=2, max_digits=3)
trigram_threshold = models.DecimalField(default=0.2, decimal_places=2, max_digits=3)
class UserFile(ExportModelOperationsMixin('user_files'), models.Model, PermissionModelMixin):
@@ -1119,3 +1151,34 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis
objects = ScopedManager(space='space')
space = models.ForeignKey(Space, on_delete=models.CASCADE)
class CustomFilter(models.Model, PermissionModelMixin):
RECIPE = 'RECIPE'
FOOD = 'FOOD'
KEYWORD = 'KEYWORD'
MODELS = (
(RECIPE, _('Recipe')),
(FOOD, _('Food')),
(KEYWORD, _('Keyword')),
)
name = models.CharField(max_length=128, null=False, blank=False)
type = models.CharField(max_length=128, choices=(MODELS), default=MODELS[0])
# could use JSONField, but requires installing extension on SQLite, don't need to search the objects, so seems unecessary
search = models.TextField(blank=False, null=False)
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
shared = models.ManyToManyField(User, blank=True, related_name='f_shared_with')
objects = ScopedManager(space='space')
space = models.ForeignKey(Space, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Meta:
constraints = [
models.UniqueConstraint(fields=['space', 'name'], name='cf_unique_name_per_space')
]

View File

@@ -9,6 +9,8 @@ from cookbook.models import Recipe, RecipeImport, SyncLog
from cookbook.provider.provider import Provider
from requests.auth import HTTPBasicAuth
from recipes.settings import DEBUG
class Nextcloud(Provider):
@@ -28,15 +30,18 @@ class Nextcloud(Provider):
def import_all(monitor):
client = Nextcloud.get_client(monitor.storage)
if DEBUG:
print(f'TANDOOR_PROVIDER_DEBUG checking path {monitor.path} with client {client}')
files = client.list(monitor.path)
try:
files.pop(0) # remove first element because its the folder itself
except IndexError:
pass # folder is empty, no recipes will be imported
if DEBUG:
print(f'TANDOOR_PROVIDER_DEBUG file list {files}')
import_count = 0
for file in files:
if DEBUG:
print(f'TANDOOR_PROVIDER_DEBUG importing file {file}')
path = monitor.path + '/' + file
if not Recipe.objects.filter(file_path__iexact=path, space=monitor.space).exists() and not RecipeImport.objects.filter(file_path=path, space=monitor.space).exists():
name = os.path.splitext(file)[0]

View File

@@ -1,26 +1,24 @@
import random
from datetime import timedelta
from decimal import Decimal
from gettext import gettext as _
from django.contrib.auth.models import User
from django.db.models import Avg, QuerySet, Sum
from django.db.models import Avg, Q, QuerySet, Sum
from django.urls import reverse
from django.utils import timezone
from drf_writable_nested import UniqueFieldsMixin, WritableNestedModelSerializer
from rest_framework import serializers
from rest_framework.exceptions import NotFound, ValidationError
from rest_framework.fields import empty
from cookbook.helper.HelperFunctions import str2bool
from cookbook.helper.shopping_helper import RecipeShoppingEditor
from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, Food,
FoodInheritField, ImportLog, ExportLog, Ingredient, Keyword, MealPlan, MealType,
NutritionInformation, Recipe, RecipeBook, RecipeBookEntry,
RecipeImport, ShareLink, ShoppingList, ShoppingListEntry,
ShoppingListRecipe, Step, Storage, Supermarket, SupermarketCategory,
SupermarketCategoryRelation, Sync, SyncLog, Unit, UserFile,
UserPreference, ViewLog)
from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, CustomFilter,
ExportLog, Food, FoodInheritField, ImportLog, Ingredient, Keyword,
MealPlan, MealType, NutritionInformation, Recipe, RecipeBook,
RecipeBookEntry, RecipeImport, ShareLink, ShoppingList,
ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket,
SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit,
UserFile, UserPreference, ViewLog)
from cookbook.templatetags.custom_tags import markdown
from recipes.settings import MEDIA_URL
@@ -302,9 +300,9 @@ class KeywordSerializer(UniqueFieldsMixin, ExtendedRecipeMixin):
def create(self, validated_data):
# since multi select tags dont have id's
# duplicate names might be routed to create
validated_data['name'] = validated_data['name'].strip()
validated_data['space'] = self.context['request'].space
obj, created = Keyword.objects.get_or_create(**validated_data)
name = validated_data.pop('name').strip()
space = validated_data.pop('space', self.context['request'].space)
obj, created = Keyword.objects.get_or_create(name=name, space=space, defaults=validated_data)
return obj
class Meta:
@@ -319,9 +317,9 @@ class UnitSerializer(UniqueFieldsMixin, ExtendedRecipeMixin):
recipe_filter = 'steps__ingredients__unit'
def create(self, validated_data):
validated_data['name'] = validated_data['name'].strip()
validated_data['space'] = self.context['request'].space
obj, created = Unit.objects.get_or_create(**validated_data)
name = validated_data.pop('name').strip()
space = validated_data.pop('space', self.context['request'].space)
obj, created = Unit.objects.get_or_create(name=name, space=space, defaults=validated_data)
return obj
def update(self, instance, validated_data):
@@ -337,9 +335,9 @@ class UnitSerializer(UniqueFieldsMixin, ExtendedRecipeMixin):
class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerializer):
def create(self, validated_data):
validated_data['name'] = validated_data['name'].strip()
validated_data['space'] = self.context['request'].space
obj, created = SupermarketCategory.objects.get_or_create(**validated_data)
name = validated_data.pop('name').strip()
space = validated_data.pop('space', self.context['request'].space)
obj, created = SupermarketCategory.objects.get_or_create(name=name, space=space)
return obj
def update(self, instance, validated_data):
@@ -378,28 +376,56 @@ class RecipeSimpleSerializer(serializers.ModelSerializer):
read_only_fields = ['id', 'name', 'url']
class FoodSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Food
fields = ('id', 'name')
read_only_fields = ['id', 'name']
class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedRecipeMixin):
supermarket_category = SupermarketCategorySerializer(allow_null=True, required=False)
recipe = RecipeSimpleSerializer(allow_null=True, required=False)
# shopping = serializers.SerializerMethodField('get_shopping_status')
shopping = serializers.ReadOnlyField(source='shopping_status')
inherit_fields = FoodInheritFieldSerializer(many=True, allow_null=True, required=False)
child_inherit_fields = FoodInheritFieldSerializer(many=True, allow_null=True, required=False)
food_onhand = CustomOnHandField(required=False, allow_null=True)
substitute_onhand = serializers.SerializerMethodField('get_substitute_onhand')
substitute = FoodSimpleSerializer(many=True, allow_null=True, required=False)
recipe_filter = 'steps__ingredients__food'
images = ['recipe__image']
def get_substitute_onhand(self, obj):
shared_users = None
if request := self.context.get('request', None):
shared_users = getattr(request, '_shared_users', None)
if shared_users is None:
try:
shared_users = [x.id for x in list(self.context['request'].user.get_shopping_share())] + [self.context['request'].user.id]
except AttributeError:
shared_users = []
filter = Q(id__in=obj.substitute.all())
if obj.substitute_siblings:
filter |= Q(path__startswith=obj.path[:Food.steplen * (obj.depth - 1)], depth=obj.depth)
if obj.substitute_children:
filter |= Q(path__startswith=obj.path, depth__gt=obj.depth)
return Food.objects.filter(filter).filter(onhand_users__id__in=shared_users).exists()
# def get_shopping_status(self, obj):
# return ShoppingListEntry.objects.filter(space=obj.space, food=obj, checked=False).count() > 0
def create(self, validated_data):
validated_data['name'] = validated_data['name'].strip()
validated_data['space'] = self.context['request'].space
name = validated_data.pop('name').strip()
space = validated_data.pop('space', self.context['request'].space)
# supermarket category needs to be handled manually as food.get or create does not create nested serializers unlike a super.create of serializer
if 'supermarket_category' in validated_data and validated_data['supermarket_category']:
sm_category = validated_data['supermarket_category']
sc_name = sm_category.pop('name', None)
validated_data['supermarket_category'], sc_created = SupermarketCategory.objects.get_or_create(
name=validated_data.pop('supermarket_category')['name'],
space=self.context['request'].space)
name=sc_name,
space=space, defaults=sm_category)
onhand = validated_data.pop('food_onhand', None)
# assuming if on hand for user also onhand for shopping_share users
@@ -414,7 +440,7 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR
else:
validated_data['onhand_users'] = list(set(onhand_users) - set(shared_users))
obj, created = Food.objects.get_or_create(**validated_data)
obj, created = Food.objects.get_or_create(name=name, space=space, defaults=validated_data)
return obj
def update(self, instance, validated_data):
@@ -422,19 +448,26 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR
validated_data['name'] = name.strip()
# assuming if on hand for user also onhand for shopping_share users
onhand = validated_data.get('food_onhand', None)
reset_inherit = self.initial_data.get('reset_inherit', False)
if not onhand is None:
shared_users = [user := self.context['request'].user] + list(user.userpreference.shopping_share.all())
if onhand:
validated_data['onhand_users'] = list(self.instance.onhand_users.all()) + shared_users
else:
validated_data['onhand_users'] = list(set(self.instance.onhand_users.all()) - set(shared_users))
return super(FoodSerializer, self).update(instance, validated_data)
# update before resetting inheritance
saved_instance = super(FoodSerializer, self).update(instance, validated_data)
if reset_inherit and (r := self.context.get('request', None)):
Food.reset_inheritance(food=saved_instance, space=r.space)
return saved_instance
class Meta:
model = Food
fields = (
'id', 'name', 'description', 'shopping', 'recipe', 'food_onhand', 'supermarket_category',
'image', 'parent', 'numchild', 'numrecipe', 'inherit_fields', 'full_name', 'ignore_shopping'
'image', 'parent', 'numchild', 'numrecipe', 'inherit_fields', 'full_name', 'ignore_shopping',
'substitute', 'substitute_siblings', 'substitute_children', 'substitute_onhand', 'child_inherit_fields'
)
read_only_fields = ('id', 'numchild', 'parent', 'image', 'numrecipe')
@@ -448,11 +481,15 @@ class IngredientSerializer(WritableNestedModelSerializer):
validated_data['space'] = self.context['request'].space
return super().create(validated_data)
def update(self, instance, validated_data):
validated_data.pop('original_text', None)
return super().update(instance, validated_data)
class Meta:
model = Ingredient
fields = (
'id', 'food', 'unit', 'amount', 'note', 'order',
'is_header', 'no_amount'
'is_header', 'no_amount', 'original_text'
)
@@ -607,8 +644,22 @@ class CommentSerializer(serializers.ModelSerializer):
fields = '__all__'
class CustomFilterSerializer(SpacedModelSerializer, WritableNestedModelSerializer):
shared = UserNameSerializer(many=True, required=False)
def create(self, validated_data):
validated_data['created_by'] = self.context['request'].user
return super().create(validated_data)
class Meta:
model = CustomFilter
fields = ('id', 'name', 'search', 'shared', 'created_by')
read_only_fields = ('created_by',)
class RecipeBookSerializer(SpacedModelSerializer, WritableNestedModelSerializer):
shared = UserNameSerializer(many=True)
filter = CustomFilterSerializer(allow_null=True, required=False)
def create(self, validated_data):
validated_data['created_by'] = self.context['request'].user
@@ -616,7 +667,7 @@ class RecipeBookSerializer(SpacedModelSerializer, WritableNestedModelSerializer)
class Meta:
model = RecipeBook
fields = ('id', 'name', 'description', 'icon', 'shared', 'created_by')
fields = ('id', 'name', 'description', 'icon', 'shared', 'created_by', 'filter')
read_only_fields = ('created_by',)
@@ -633,7 +684,7 @@ class RecipeBookEntrySerializer(serializers.ModelSerializer):
def create(self, validated_data):
book = validated_data['book']
recipe = validated_data['recipe']
if not book.get_owner() == self.context['request'].user:
if not book.get_owner() == self.context['request'].user and not self.context['request'].user in book.get_shared():
raise NotFound(detail=None, code=None)
obj, created = RecipeBookEntry.objects.get_or_create(book=book, recipe=recipe)
return obj
@@ -677,7 +728,6 @@ class MealPlanSerializer(SpacedModelSerializer, WritableNestedModelSerializer):
read_only_fields = ('created_by',)
# TODO deprecate
class ShoppingListRecipeSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField('get_name') # should this be done at the front end?
recipe_name = serializers.ReadOnlyField(source='recipe.name')
@@ -689,11 +739,11 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer):
value = Decimal(value)
value = value.quantize(Decimal(1)) if value == value.to_integral() else value.normalize() # strips trailing zero
return (
obj.name
or getattr(obj.mealplan, 'title', None)
or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)])
or obj.recipe.name
) + f' ({value:.2g})'
obj.name
or getattr(obj.mealplan, 'title', None)
or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)])
or obj.recipe.name
) + f' ({value:.2g})'
def update(self, instance, validated_data):
# TODO remove once old shopping list

View File

@@ -18,9 +18,8 @@ if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_ps
'django.db.backends.postgresql']:
SQLITE = False
# wraps a signal with the ability to set 'skip_signal' to avoid creating recursive signals
def skip_signal(signal_func):
@wraps(signal_func)
def _decorator(sender, instance, **kwargs):
@@ -38,6 +37,7 @@ def update_recipe_search_vector(sender, instance=None, created=False, **kwargs):
if SQLITE:
return
language = DICTIONARY.get(translation.get_language(), 'simple')
# these indexed fields are space wide, reading user preferences would lead to inconsistent behavior
instance.name_search_vector = SearchVector('name__unaccent', weight='A', config=language)
instance.desc_search_vector = SearchVector('description__unaccent', weight='C', config=language)
try:
@@ -76,8 +76,9 @@ def update_food_inheritance(sender, instance=None, created=False, **kwargs):
# apply changes from parent to instance for each inherited field
if instance.parent and inherit.count() > 0:
parent = instance.get_parent()
if 'ignore_shopping' in inherit:
instance.ignore_shopping = parent.ignore_shopping
for field in ['ignore_shopping', 'substitute_children', 'substitute_siblings']:
if field in inherit:
setattr(instance, field, getattr(parent, field, None))
# if supermarket_category is not set, do not cascade - if this becomes non-intuitive can change
if 'supermarket_category' in inherit and parent.supermarket_category:
instance.supermarket_category = parent.supermarket_category
@@ -87,19 +88,17 @@ def update_food_inheritance(sender, instance=None, created=False, **kwargs):
finally:
del instance.skip_signal
# TODO figure out how to generalize this
# apply changes to direct children - depend on save signals for those objects to cascade inheritance down
_save = []
for child in instance.get_children().filter(inherit_fields__field='ignore_shopping'):
child.ignore_shopping = instance.ignore_shopping
_save.append(child)
# don't cascade empty supermarket category
if instance.supermarket_category:
# apply changes to direct children - depend on save signals for those objects to cascade inheritance down
for child in instance.get_children().filter(inherit_fields__field='supermarket_category'):
child.supermarket_category = instance.supermarket_category
_save.append(child)
for child in set(_save):
for child in instance.get_children().filter(inherit_fields__in=Food.inheritable_fields):
# set inherited field values
for field in (inherit_fields := ['ignore_shopping', 'substitute_children', 'substitute_siblings']):
if field in instance.inherit_fields.values_list('field', flat=True):
setattr(child, field, getattr(instance, field, None))
# don't cascade empty supermarket category
if instance.supermarket_category and 'supermarket_category' in inherit_fields:
setattr(child, 'supermarket_category', getattr(instance, 'supermarket_category', None))
child.save()
@@ -117,19 +116,9 @@ def auto_add_shopping(sender, instance=None, created=False, weak=False, **kwargs
if instance.servings != x.servings:
SLR = RecipeShoppingEditor(id=x.id, user=user, space=instance.space)
SLR.edit_servings(servings=instance.servings)
# list_recipe = list_from_recipe(list_recipe=x, servings=instance.servings, space=instance.space)
elif not user.userpreference.mealplan_autoadd_shopping or not instance.recipe:
return
if created:
# if creating a mealplan - perform shopping list activities
# kwargs = {
# 'mealplan': instance,
# 'space': instance.space,
# 'created_by': user,
# 'servings': instance.servings
# }
SLR = RecipeShoppingEditor(user=user, space=instance.space)
SLR.create(mealplan=instance, servings=instance.servings)
# list_recipe = list_from_recipe(**kwargs)

File diff suppressed because one or more lines are too long

View File

@@ -75,7 +75,7 @@
<ul class="navbar-nav mr-auto">
<li class="nav-item {% if request.resolver_match.url_name in 'view_search' %}active{% endif %}">
<a class="nav-link" href="{% url 'view_search' %}"><i
class="fas fa-book"></i> {% trans 'Cookbook' %}</a>
class="fas fa-book"></i> {% trans 'Recipes' %}</a>
</li>
<li class="nav-item {% if request.resolver_match.url_name in 'view_plan' %}active{% endif %}">
<a class="nav-link" href="{% url 'view_plan' %}"><i

View File

@@ -12,6 +12,7 @@
<script type="application/javascript">
window.IMAGE_PLACEHOLDER = "{% static 'assets/recipe_no_image.svg' %}"
window.CUSTOM_LOCALE = '{{ request.LANGUAGE_CODE }}'
</script>
{% render_bundle 'shopping_list_view' %} {% endblock %}

View File

@@ -88,9 +88,8 @@
<h4>
{% trans 'Members' %}
<small class="text-muted"
>{{ space_users|length }}/ {% if request.space.max_users > 0 %} {{ request.space.max_users }}{% else
%}∞{% endif %}</small
>
>{{ space_users|length }}/{% if request.space.max_users > 0 %} {{ request.space.max_users }}{% else %}∞{% endif %}
</small>
<a class="btn btn-success float-right" href="{% url 'new_invite_link' %}"
><i class="fas fa-plus-circle"></i> {% trans 'Invite User' %}</a
>

View File

@@ -30,7 +30,7 @@
style="height:50%"
href="{% bookmarklet request %}"
title="{% trans 'Drag me to your bookmarks to import recipes from anywhere' %}">
<img src="{% static 'assets/favicon-16x16.png' %}">{% trans 'Bookmark Me!' %} </a>
<img src="{% static 'assets/favicon-16x16.png' %}" style="margin-right: 1em;">{% trans 'Bookmark Me!' %} </a>
</div>
<nav class="nav nav-pills flex-sm-row mb-2">
<a class="nav-link active" href="#nav-url" data-toggle="tab" role="tab" aria-controls="nav-url"
@@ -50,11 +50,11 @@
<div class="tab-pane fade show active" id="nav-url" role="tabpanel">
<div class="btn-group btn-group-toggle mt-2" data-toggle="buttons">
<label class="btn btn-outline-info btn-sm active" @click="automatic=true">
<input type="radio" autocomplete="off" checked> Automatic
<input type="radio" autocomplete="off" checked> {% trans 'Automatic' %}
</label>
<label class="btn btn-outline-info btn-sm" @click="automatic=false">
<input type="radio" autocomplete="off"> Manual
<input type="radio" autocomplete="off"> {% trans 'Manual' %}
</label>
</div>
<div role="group" class="input-group mt-4">
@@ -473,9 +473,9 @@
<div class="card" style="margin-top: 4px">
<div class="card-body">
<div class="row" v-if="i.original">
<div class="row" v-if="i.original_text">
<div class="col-md-12" style="margin-bottom: 4px">
<span class="text-muted"><i class="fas fa-globe"></i> [[i.original]]</span>
<span class="text-muted"><i class="fas fa-globe"></i> [[i.original_text]]</span>
</div>
</div>
<div class="row">
@@ -1024,7 +1024,7 @@
amount: String(response.body.amount),
ingredient: {id: Math.random() * 1000, text: response.body.food},
note: response.body.note,
original: v
original_text: v
}
this.recipe_json.recipeIngredient.push(new_ingredient)
}).catch((err) => {

View File

@@ -485,6 +485,10 @@ def test_tree_filter(obj_tree_1, obj_2, obj_3, u1_s1):
({'has_category': True, 'inherit': False}, 'supermarket_category', False, 'cat_1'),
({'ignore_shopping': True, 'inherit': True}, 'ignore_shopping', True, 'false'),
({'ignore_shopping': True, 'inherit': False}, 'ignore_shopping', False, 'false'),
({'substitute_children': True, 'inherit': True}, 'substitute_children', True, 'false'),
({'substitute_children': True, 'inherit': False}, 'substitute_children', False, 'false'),
({'substitute_siblings': True, 'inherit': True}, 'substitute_siblings', True, 'false'),
({'substitute_siblings': True, 'inherit': False}, 'substitute_siblings', False, 'false'),
], indirect=['obj_tree_1']) # indirect=True populates magic variable request.param of obj_tree_1 with the parameter
def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1):
with scope(space=obj_tree_1.space):
@@ -507,28 +511,42 @@ def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1):
assert (getattr(obj_tree_1, field) == new_val) == inherit
assert (getattr(child, field) == new_val) == inherit
# TODO add test_inherit with child_inherit
@pytest.mark.parametrize("obj_tree_1", [
({'has_category': True, 'inherit': False, 'ignore_shopping': True}),
({'has_category': True, 'inherit': False, 'ignore_shopping': True, 'substitute_children': True, 'substitute_siblings': True}),
], indirect=['obj_tree_1'])
def test_reset_inherit(obj_tree_1, space_1):
@pytest.mark.parametrize("global_reset", [True, False])
@pytest.mark.parametrize("field", ['ignore_shopping', 'substitute_children', 'substitute_siblings', 'supermarket_category'])
def test_reset_inherit_space_fields(obj_tree_1, space_1, global_reset, field):
with scope(space=space_1):
space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields
parent = obj_tree_1.get_parent()
child = obj_tree_1.get_descendants()[0]
obj_tree_1.ignore_shopping = False
assert parent.ignore_shopping == child.ignore_shopping
assert parent.ignore_shopping != obj_tree_1.ignore_shopping
assert parent.supermarket_category != child.supermarket_category
assert parent.supermarket_category != obj_tree_1.supermarket_category
parent.reset_inheritance(space=space_1)
if field == 'supermarket_category':
assert parent.supermarket_category != child.supermarket_category
assert parent.supermarket_category != obj_tree_1.supermarket_category
else:
setattr(obj_tree_1, field, False)
obj_tree_1.save()
assert getattr(parent, field) == getattr(child, field)
assert getattr(parent, field) != getattr(obj_tree_1, field)
if global_reset:
space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields
parent.reset_inheritance(space=space_1)
else:
obj_tree_1.child_inherit_fields.set(Food.inheritable_fields.values_list('id', flat=True))
obj_tree_1.save()
parent.reset_inheritance(space=space_1, food=obj_tree_1)
# djangotree bypasses ORM and need to be retrieved again
obj_tree_1 = Food.objects.get(id=obj_tree_1.id)
parent = obj_tree_1.get_parent()
child = obj_tree_1.get_descendants()[0]
assert parent.ignore_shopping == obj_tree_1.ignore_shopping == child.ignore_shopping
assert parent.supermarket_category == obj_tree_1.supermarket_category == child.supermarket_category
parent = Food.objects.get(id=parent.id)
child = Food.objects.get(id=child.id)
assert (getattr(parent, field) == getattr(obj_tree_1, field)) == global_reset
assert getattr(obj_tree_1, field) == getattr(child, field)
def test_onhand(obj_1, u1_s1, u2_s1):

View File

@@ -90,7 +90,10 @@ def test_add(arg, request, obj_1):
c = request.getfixturevalue(arg[0])
r = c.post(
reverse(LIST_URL),
{'food': model_to_dict(obj_1.food), 'amount': 1},
{'food': {
'id': obj_1.food.__dict__['id'],
'name': obj_1.food.__dict__['name'],
}, 'amount': 1},
content_type='application/json'
)
response = json.loads(r.content)

View File

@@ -103,7 +103,10 @@ def test_add(arg, request, sle):
c = request.getfixturevalue(arg[0])
r = c.post(
reverse(LIST_URL),
{'food': model_to_dict(sle[0].food), 'amount': 1},
{'food': {
'id': sle[0].food.__dict__['id'],
'name': sle[0].food.__dict__['name'],
}, 'amount': 1},
content_type='application/json'
)
response = json.loads(r.content)

View File

@@ -45,19 +45,10 @@ def recipe(request, space_1, u1_s1):
params = request.param # request.param is a magic variable
except AttributeError:
params = {}
# step_recipe = params.get('steps__count', 1)
# steps__recipe_count = params.get('steps__recipe_count', 0)
# steps__food_recipe_count = params.get('steps__food_recipe_count', {})
params['created_by'] = params.get('created_by', auth.get_user(u1_s1))
params['space'] = space_1
return RecipeFactory(**params)
# return RecipeFactory.create(
# steps__recipe_count=steps__recipe_count,
# steps__food_recipe_count=steps__food_recipe_count,
# created_by=created_by,
# space=space_1,
# )
@pytest.mark.parametrize("arg", [

View File

@@ -158,6 +158,31 @@ def dict_compare(d1, d2, details=False):
return any([not added, not removed, not modified, not modified_dicts])
def transpose(text, number=2):
# select random token
tokens = text.split()
positions = list(i for i, e in enumerate(tokens) if len(e) > 1)
if positions:
token_pos = random.choice(positions)
# select random positions in token
positions = random.sample(range(len(tokens[token_pos])), number)
# swap the positions
l = list(tokens[token_pos])
for first, second in zip(positions[::2], positions[1::2]):
l[first], l[second] = l[second], l[first]
# replace original tokens with swapped
tokens[token_pos] = ''.join(l)
# return text with the swapped token
return ' '.join(tokens)
@pytest.fixture
def recipe_1_s1(space_1, u1_s1):
return get_random_recipe(space_1, u1_s1)

View File

@@ -1,4 +1,5 @@
from datetime import date
from decimal import Decimal
import factory
@@ -9,7 +10,7 @@ from django_scopes import scopes_disabled
from faker import Factory as FakerFactory
from pytest_factoryboy import register
from cookbook.models import Step
from cookbook.models import Recipe, Step
# this code will run immediately prior to creating the model object useful when you want a reverse relationship
# log = factory.RelatedFactory(
@@ -111,6 +112,15 @@ class FoodFactory(factory.django.DjangoModelFactory):
)
space = factory.SubFactory(SpaceFactory)
@factory.post_generation
def users_onhand(self, create, extracted, **kwargs):
if not create:
return
if extracted:
for user in extracted:
self.onhand_users.add(user)
class Params:
has_category = False
has_recipe = False
@@ -120,6 +130,33 @@ class FoodFactory(factory.django.DjangoModelFactory):
django_get_or_create = ('name', 'space',)
@register
class RecipeBookFactory(factory.django.DjangoModelFactory):
"""RecipeBook factory."""
name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False))
description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10))
icon = None
# shared = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space'))
created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space'))
filter = None
space = factory.SubFactory(SpaceFactory)
class Meta:
model = 'cookbook.RecipeBook'
django_get_or_create = ('name', 'space',)
@register
class RecipeBookEntryFactory(factory.django.DjangoModelFactory):
"""RecipeBookEntry factory."""
book = factory.SubFactory(RecipeBookFactory, space=factory.SelfAttribute('..recipe.space'))
recipe = None
class Meta:
model = 'cookbook.RecipeBookEntry'
django_get_or_create = ('book', 'recipe',)
@register
class UnitFactory(factory.django.DjangoModelFactory):
"""Unit factory."""
@@ -241,6 +278,15 @@ class ShoppingListEntryFactory(factory.django.DjangoModelFactory):
delay_until = None
space = factory.SubFactory(SpaceFactory)
@classmethod
def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date
created_at = kwargs.pop('created_at', None)
obj = super(ShoppingListEntryFactory, cls)._create(target_class, *args, **kwargs)
if created_at is not None:
obj.created_at = created_at
obj.save()
return obj
class Params:
has_mealplan = False
@@ -288,8 +334,6 @@ class StepFactory(factory.django.DjangoModelFactory):
has_recipe = False
self.ingredients.add(IngredientFactory(space=self.space, food__has_recipe=has_recipe))
num_header = kwargs.get('header', 0)
#######################################################
#######################################################
if num_header > 0:
for i in range(num_header):
self.ingredients.add(IngredientFactory(food=None, unit=None, amount=0, is_header=True, space=self.space))
@@ -315,9 +359,19 @@ class RecipeFactory(factory.django.DjangoModelFactory):
waiting_time = factory.LazyAttribute(lambda x: faker.random_int(min=0, max=360))
internal = False
created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space'))
created_at = factory.LazyAttribute(lambda x: faker.date_this_decade())
created_at = factory.LazyAttribute(lambda x: faker.date_between_dates(date_start=date(2000, 1, 1), date_end=date(2020, 12, 31)))
space = factory.SubFactory(SpaceFactory)
@classmethod
def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date
created_at = kwargs.pop('created_at', None)
# updated_at = kwargs.pop('updated_at', None)
obj = super(RecipeFactory, cls)._create(target_class, *args, **kwargs)
if created_at is not None:
obj.created_at = created_at
obj.save()
return obj
@factory.post_generation
def keywords(self, create, extracted, **kwargs):
if not create:
@@ -368,3 +422,47 @@ class RecipeFactory(factory.django.DjangoModelFactory):
class Meta:
model = 'cookbook.Recipe'
@register
class CookLogFactory(factory.django.DjangoModelFactory):
"""CookLog factory."""
recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space'))
created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space'))
created_at = factory.LazyAttribute(lambda x: faker.date_this_decade())
rating = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=5))
servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=32))
space = factory.SubFactory(SpaceFactory)
@classmethod
def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date
created_at = kwargs.pop('created_at', None)
obj = super(CookLogFactory, cls)._create(target_class, *args, **kwargs)
if created_at is not None:
obj.created_at = created_at
obj.save()
return obj
class Meta:
model = 'cookbook.CookLog'
@register
class ViewLogFactory(factory.django.DjangoModelFactory):
"""ViewLog factory."""
recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space'))
created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space'))
created_at = factory.LazyAttribute(lambda x: faker.past_datetime(start_date='-365d'))
space = factory.SubFactory(SpaceFactory)
@classmethod
def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date
created_at = kwargs.pop('created_at', None)
obj = super(ViewLogFactory, cls)._create(target_class, *args, **kwargs)
if created_at is not None:
obj.created_at = created_at
obj.save()
return obj
class Meta:
model = 'cookbook.ViewLog'

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,133 @@
import pytest
from django.contrib import auth
from django.urls import reverse
from django_scopes import scope
from cookbook.helper.recipe_search import RecipeSearch
from cookbook.models import Food, Recipe
from cookbook.tests.factories import FoodFactory, RecipeFactory
# TODO returns recipes with all ingredients via child substitute
# TODO returns recipes with all ingredients via sibling substitute
@pytest.fixture
def recipes(space_1):
return RecipeFactory.create_batch(10, space=space_1)
@pytest.fixture
def makenow_recipe(request, space_1):
onhand_user = auth.get_user(request.getfixturevalue(request.param.get('onhand_users', 'u1_s1')))
recipe = RecipeFactory.create(space=space_1)
for food in Food.objects.filter(ingredient__step__recipe=recipe.id):
food.onhand_users.add(onhand_user)
return recipe
@pytest.fixture
def user1(u1_s1, u2_s1, space_1):
user1 = auth.get_user(u1_s1)
user2 = auth.get_user(u2_s1)
user1.userpreference.shopping_share.add(user2)
user2.userpreference.shopping_share.add(user1)
return user1
@pytest.mark.parametrize("makenow_recipe", [
({'onhand_users': 'u1_s1'}), ({'onhand_users': 'u2_s1'}),
], indirect=['makenow_recipe'])
def test_makenow_onhand(recipes, makenow_recipe, user1, space_1):
request = type('', (object,), {'space': space_1, 'user': user1})()
search = RecipeSearch(request, makenow='true')
with scope(space=space_1):
search = search.get_queryset(Recipe.objects.all())
assert search.count() == 1
assert search.first().id == makenow_recipe.id
@pytest.mark.parametrize("makenow_recipe", [
({'onhand_users': 'u1_s1'}), ({'onhand_users': 'u2_s1'}),
], indirect=['makenow_recipe'])
def test_makenow_ignoreshopping(recipes, makenow_recipe, user1, space_1):
request = type('', (object,), {'space': space_1, 'user': user1})()
search = RecipeSearch(request, makenow='true')
with scope(space=space_1):
food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first()
food.onhand_users.clear()
assert search.get_queryset(Recipe.objects.all()).count() == 0
food.ignore_shopping = True
food.save()
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, ignore_shopping=True).count() == 1
search = search.get_queryset(Recipe.objects.all())
assert search.count() == 1
assert search.first().id == makenow_recipe.id
@pytest.mark.parametrize("makenow_recipe", [
({'onhand_users': 'u1_s1'}), ({'onhand_users': 'u2_s1'}),
], indirect=['makenow_recipe'])
def test_makenow_substitute(recipes, makenow_recipe, user1, space_1):
request = type('', (object,), {'space': space_1, 'user': user1})()
search = RecipeSearch(request, makenow='true')
with scope(space=space_1):
food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first()
onhand_user = food.onhand_users.first()
food.onhand_users.clear()
assert search.get_queryset(Recipe.objects.all()).count() == 0
food.substitute.add(FoodFactory.create(space=space_1, onhand_users=[onhand_user]))
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, substitute__isnull=False).count() == 1
search = search.get_queryset(Recipe.objects.all())
assert search.count() == 1
assert search.first().id == makenow_recipe.id
@pytest.mark.parametrize("makenow_recipe", [
({'onhand_users': 'u1_s1'}), ({'onhand_users': 'u2_s1'}),
], indirect=['makenow_recipe'])
def test_makenow_child_substitute(recipes, makenow_recipe, user1, space_1):
request = type('', (object,), {'space': space_1, 'user': user1})()
search = RecipeSearch(request, makenow='true')
with scope(space=space_1):
food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first()
onhand_user = food.onhand_users.first()
food.onhand_users.clear()
food.substitute_children = True
food.save()
assert search.get_queryset(Recipe.objects.all()).count() == 0
new_food = FoodFactory.create(space=space_1, onhand_users=[onhand_user])
new_food.move(food, 'first-child')
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, numchild__gt=0).count() == 1
search = search.get_queryset(Recipe.objects.all())
assert search.count() == 1
assert search.first().id == makenow_recipe.id
@pytest.mark.parametrize("makenow_recipe", [
({'onhand_users': 'u1_s1'}), ({'onhand_users': 'u2_s1'}),
], indirect=['makenow_recipe'])
def test_makenow_sibling_substitute(recipes, makenow_recipe, user1, space_1):
request = type('', (object,), {'space': space_1, 'user': user1})()
search = RecipeSearch(request, makenow='true')
with scope(space=space_1):
food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first()
onhand_user = food.onhand_users.first()
food.onhand_users.clear()
food.substitute_siblings = True
food.save()
assert search.get_queryset(Recipe.objects.all()).count() == 0
new_parent = FoodFactory.create(space=space_1)
new_sibling = FoodFactory.create(space=space_1, onhand_users=[onhand_user])
new_sibling.move(new_parent, 'first-child')
food.move(new_parent, 'first-child')
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9
assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, depth=2).count() == 1
search = search.get_queryset(Recipe.objects.all())
assert search.count() == 1
assert search.first().id == makenow_recipe.id

View File

@@ -0,0 +1,353 @@
import itertools
import json
from datetime import timedelta
import pytest
from django.conf import settings
from django.contrib import auth
from django.urls import reverse
from django.utils import timezone
from django_scopes import scope, scopes_disabled
from cookbook.models import Food, Recipe, SearchFields
from cookbook.tests.conftest import transpose
from cookbook.tests.factories import (CookLogFactory, FoodFactory, IngredientFactory,
KeywordFactory, RecipeBookEntryFactory, RecipeFactory,
UnitFactory, ViewLogFactory)
# TODO test combining any/all of the above
# TODO test sort_by
# TODO test sort_by new X number of recipes are new within last Y days
# TODO test loading custom filter
# TODO test loading custom filter with overrided params
# TODO makenow with above filters
# TODO test search food/keywords including/excluding children
LIST_URL = 'api:recipe-list'
sqlite = settings.DATABASES['default']['ENGINE'] not in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']
@pytest.fixture
def accent():
return "àbçđêf ğĦìĵķĽmñ öPqŕşŧ úvŵxyž"
@pytest.fixture
def unaccent():
return "abcdef ghijklmn opqrst uvwxyz"
@pytest.fixture
def user1(request, space_1, u1_s1, unaccent):
user = auth.get_user(u1_s1)
try:
params = {x[0]: x[1] for x in request.param}
except AttributeError:
params = {}
result = 1
misspelled_result = 0
search_term = unaccent
if params.get('fuzzy_lookups', False):
user.searchpreference.lookup = True
misspelled_result = 1
if params.get('fuzzy_search', False):
user.searchpreference.trigram.set(SearchFields.objects.all())
misspelled_result = 1
if params.get('icontains', False):
user.searchpreference.icontains.set(SearchFields.objects.all())
search_term = 'ghijklmn'
if params.get('istartswith', False):
user.searchpreference.istartswith.set(SearchFields.objects.all())
search_term = 'abcdef'
if params.get('unaccent', False):
user.searchpreference.unaccent.set(SearchFields.objects.all())
misspelled_result *= 2
result *= 2
# full text vectors are hard coded to use unaccent - put this after unaccent to override result
if params.get('fulltext', False):
user.searchpreference.fulltext.set(SearchFields.objects.all())
# user.searchpreference.search = 'websearch'
search_term = 'ghijklmn uvwxyz'
result = 2
user.searchpreference.save()
misspelled_term = transpose(search_term, number=3)
return (u1_s1, result, misspelled_result, search_term, misspelled_term, params)
@pytest.fixture
def recipes(space_1):
return RecipeFactory.create_batch(10, space=space_1)
@pytest.fixture
def found_recipe(request, space_1, accent, unaccent, u1_s1, u2_s1):
user1 = auth.get_user(u1_s1)
user2 = auth.get_user(u2_s1)
days_3 = timezone.now() - timedelta(days=3)
days_15 = timezone.now() - timedelta(days=15)
days_30 = timezone.now() - timedelta(days=30)
if request.param.get('createdon', None):
recipe1 = RecipeFactory.create(space=space_1, created_at=days_3)
recipe2 = RecipeFactory.create(space=space_1, created_at=days_30)
recipe3 = RecipeFactory.create(space=space_1, created_at=days_15)
else:
recipe1 = RecipeFactory.create(space=space_1)
recipe2 = RecipeFactory.create(space=space_1)
recipe3 = RecipeFactory.create(space=space_1)
obj1 = None
obj2 = None
if request.param.get('food', None):
obj1 = FoodFactory.create(name=unaccent, space=space_1)
obj2 = FoodFactory.create(name=accent, space=space_1)
recipe1.steps.first().ingredients.add(IngredientFactory.create(food=obj1))
recipe2.steps.first().ingredients.add(IngredientFactory.create(food=obj2))
recipe3.steps.first().ingredients.add(IngredientFactory.create(food=obj1), IngredientFactory.create(food=obj2))
if request.param.get('keyword', None):
obj1 = KeywordFactory.create(name=unaccent, space=space_1)
obj2 = KeywordFactory.create(name=accent, space=space_1)
recipe1.keywords.add(obj1)
recipe2.keywords.add(obj2)
recipe3.keywords.add(obj1, obj2)
recipe1.name = unaccent
recipe2.name = accent
recipe1.save()
recipe2.save()
if request.param.get('book', None):
obj1 = RecipeBookEntryFactory.create(recipe=recipe1).book
obj2 = RecipeBookEntryFactory.create(recipe=recipe2).book
RecipeBookEntryFactory.create(recipe=recipe3, book=obj1)
RecipeBookEntryFactory.create(recipe=recipe3, book=obj2)
if request.param.get('unit', None):
obj1 = UnitFactory.create(name=unaccent, space=space_1)
obj2 = UnitFactory.create(name=accent, space=space_1)
recipe1.steps.first().ingredients.add(IngredientFactory.create(unit=obj1))
recipe2.steps.first().ingredients.add(IngredientFactory.create(unit=obj2))
recipe3.steps.first().ingredients.add(IngredientFactory.create(unit=obj1), IngredientFactory.create(unit=obj2))
if request.param.get('name', None):
recipe1.name = unaccent
recipe2.name = accent
recipe1.save()
recipe2.save()
if request.param.get('description', None):
recipe1.description = unaccent
recipe2.description = accent
recipe1.save()
recipe2.save()
if request.param.get('instruction', None):
i1 = recipe1.steps.first()
i2 = recipe2.steps.first()
i1.instruction = unaccent
i2.instruction = accent
i1.save()
i2.save()
if request.param.get('viewedon', None):
ViewLogFactory.create(recipe=recipe1, created_by=user1, created_at=days_3, space=space_1)
ViewLogFactory.create(recipe=recipe2, created_by=user1, created_at=days_30, space=space_1)
ViewLogFactory.create(recipe=recipe3, created_by=user2, created_at=days_15, space=space_1)
if request.param.get('cookedon', None):
CookLogFactory.create(recipe=recipe1, created_by=user1, created_at=days_3, space=space_1)
CookLogFactory.create(recipe=recipe2, created_by=user1, created_at=days_30, space=space_1)
CookLogFactory.create(recipe=recipe3, created_by=user2, created_at=days_15, space=space_1)
if request.param.get('timescooked', None):
CookLogFactory.create_batch(5, recipe=recipe1, created_by=user1, space=space_1)
CookLogFactory.create(recipe=recipe2, created_by=user1, space=space_1)
CookLogFactory.create_batch(3, recipe=recipe3, created_by=user2, space=space_1)
if request.param.get('rating', None):
CookLogFactory.create(recipe=recipe1, created_by=user1, rating=5.0, space=space_1)
CookLogFactory.create(recipe=recipe2, created_by=user1, rating=1.0, space=space_1)
CookLogFactory.create(recipe=recipe3, created_by=user2, rating=3.0, space=space_1)
return (recipe1, recipe2, recipe3, obj1, obj2, request.param)
@pytest.mark.parametrize("found_recipe, param_type", [
({'food': True}, 'foods'),
({'keyword': True}, 'keywords'),
({'book': True}, 'books'),
], indirect=['found_recipe'])
@pytest.mark.parametrize('operator', [('_or', 3, 0), ('_and', 1, 2), ])
def test_search_or_and_not(found_recipe, param_type, operator, recipes, u1_s1, space_1):
with scope(space=space_1):
param1 = f"{param_type}{operator[0]}={found_recipe[3].id}"
param2 = f"{param_type}{operator[0]}={found_recipe[4].id}"
param1_not = f"{param_type}{operator[0]}_not={found_recipe[3].id}"
param2_not = f"{param_type}{operator[0]}_not={found_recipe[4].id}"
# testing include searches
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}').content)
assert r['count'] == 2
assert found_recipe[0].id in [x['id'] for x in r['results']]
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param2}').content)
assert r['count'] == 2
assert found_recipe[1].id in [x['id'] for x in r['results']]
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}&{param2}').content)
assert r['count'] == operator[1]
assert found_recipe[2].id in [x['id'] for x in r['results']]
# testing _not searches
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1_not}').content)
assert r['count'] == 11
assert found_recipe[0].id not in [x['id'] for x in r['results']]
assert found_recipe[2].id not in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param2_not}').content)
assert r['count'] == 11
assert found_recipe[1].id not in [x['id'] for x in r['results']]
assert found_recipe[2].id not in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1_not}&{param2_not}').content)
assert r['count'] == 10 + operator[2]
assert found_recipe[2].id not in [x['id'] for x in r['results']]
@pytest.mark.parametrize("found_recipe", [
({'unit': True}),
], indirect=['found_recipe'])
def test_search_units(found_recipe, recipes, u1_s1, space_1):
with scope(space=space_1):
param1 = f"units={found_recipe[3].id}"
param2 = f"units={found_recipe[4].id}"
# testing include searches
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}').content)
assert r['count'] == 2
assert found_recipe[0].id in [x['id'] for x in r['results']]
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param2}').content)
assert r['count'] == 2
assert found_recipe[1].id in [x['id'] for x in r['results']]
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}&{param2}').content)
assert r['count'] == 3
assert found_recipe[2].id in [x['id'] for x in r['results']]
@pytest.mark.skipif(sqlite, reason="requires PostgreSQL")
@pytest.mark.parametrize("user1", itertools.product(
[
('fuzzy_search', True), ('fuzzy_search', False),
('fuzzy_lookups', True), ('fuzzy_lookups', False)
],
[('unaccent', True), ('unaccent', False)]
), indirect=['user1'])
@pytest.mark.parametrize("found_recipe, param_type", [
({'unit': True}, 'unit'),
({'keyword': True}, 'keyword'),
({'food': True}, 'food'),
], indirect=['found_recipe'])
def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1):
with scope(space=space_1):
list_url = f'api:{param_type}-list'
param1 = f"query={user1[3]}"
param2 = f"query={user1[4]}"
r = json.loads(user1[0].get(reverse(list_url) + f'?{param1}&limit=2').content)
assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[3].id, found_recipe[4].id]]) == user1[1]
r = json.loads(user1[0].get(reverse(list_url) + f'?{param2}&limit=10').content)
assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[3].id, found_recipe[4].id]]) == user1[2]
# commenting this out for general use - it is really slow
# it should be run on occasion to ensure everything still works
# @pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL")
# @pytest.mark.parametrize("user1", itertools.product(
# [
# ('fuzzy_search', True), ('fuzzy_search', False),
# ('fulltext', True), ('fulltext', False),
# ('icontains', True), ('icontains', False),
# ('istartswith', True), ('istartswith', False),
# ],
# [('unaccent', True), ('unaccent', False)]
# ), indirect=['user1'])
# @pytest.mark.parametrize("found_recipe", [
# ({'name': True}),
# ({'description': True}),
# ({'instruction': True}),
# ({'keyword': True}),
# ({'food': True}),
# ], indirect=['found_recipe'])
# def test_search_string(found_recipe, recipes, user1, space_1):
# with scope(space=space_1):
# param1 = f"query={user1[3]}"
# param2 = f"query={user1[4]}"
# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content)
# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[1]
# r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content)
# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[2]
@pytest.mark.parametrize("found_recipe, param_type, result", [
({'viewedon': True}, 'viewedon', (1, 1)),
({'cookedon': True}, 'cookedon', (1, 1)),
({'createdon': True}, 'createdon', (2, 12)), # created dates are not filtered by user
({'createdon': True}, 'updatedon', (2, 12)), # updated dates are not filtered by user
], indirect=['found_recipe'])
def test_search_date(found_recipe, recipes, param_type, result, u1_s1, u2_s1, space_1):
# force updated_at to equal created_at datetime
with scope(space=space_1):
for recipe in Recipe.objects.all():
Recipe.objects.filter(id=recipe.id).update(updated_at=recipe.created_at)
date = (timezone.now() - timedelta(days=15)).strftime("%Y-%m-%d")
param1 = f"?{param_type}={date}"
param2 = f"?{param_type}=-{date}"
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'{param1}').content)
assert r['count'] == result[0]
assert found_recipe[0].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + f'{param2}').content)
assert r['count'] == result[1]
assert found_recipe[1].id in [x['id'] for x in r['results']]
# test today's date returns for lte and gte searches
r = json.loads(u2_s1.get(reverse(LIST_URL) + f'{param1}').content)
assert r['count'] == result[0]
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u2_s1.get(reverse(LIST_URL) + f'{param2}').content)
assert r['count'] == result[1]
assert found_recipe[2].id in [x['id'] for x in r['results']]
@pytest.mark.parametrize("found_recipe, param_type", [
({'rating': True}, 'rating'),
({'timescooked': True}, 'timescooked'),
], indirect=['found_recipe'])
def test_search_count(found_recipe, recipes, param_type, u1_s1, u2_s1, space_1):
param1 = f'?{param_type}=3'
param2 = f'?{param_type}=-3'
param3 = f'?{param_type}=0'
r = json.loads(u1_s1.get(reverse(LIST_URL) + param1).content)
assert r['count'] == 1
assert found_recipe[0].id in [x['id'] for x in r['results']]
r = json.loads(u1_s1.get(reverse(LIST_URL) + param2).content)
assert r['count'] == 1
assert found_recipe[1].id in [x['id'] for x in r['results']]
# test search for not rated/cooked
r = json.loads(u1_s1.get(reverse(LIST_URL) + param3).content)
assert r['count'] == 11
assert (found_recipe[0].id or found_recipe[1].id) not in [x['id'] for x in r['results']]
# test matched returns for lte and gte searches
r = json.loads(u2_s1.get(reverse(LIST_URL) + param1).content)
assert r['count'] == 1
assert found_recipe[2].id in [x['id'] for x in r['results']]
r = json.loads(u2_s1.get(reverse(LIST_URL) + param2).content)
assert r['count'] == 1
assert found_recipe[2].id in [x['id'] for x in r['results']]

View File

@@ -9,15 +9,17 @@ from cookbook.helper import dal
from recipes.settings import DEBUG
from recipes.version import VERSION_NUMBER
from .models import (Automation, Comment, Food, InviteLink, Keyword, MealPlan, Recipe, RecipeBook,
RecipeBookEntry, RecipeImport, ShoppingList, Step, Storage, Supermarket,
SupermarketCategory, Sync, SyncLog, Unit, UserFile, get_model_name)
from .models import (Automation, Comment, CustomFilter, Food, InviteLink, Keyword, MealPlan, Recipe,
RecipeBook, RecipeBookEntry, RecipeImport, ShoppingList, Step, Storage,
Supermarket, SupermarketCategory, Sync, SyncLog, Unit, UserFile,
get_model_name)
from .views import api, data, delete, edit, import_export, lists, new, telegram, views
router = routers.DefaultRouter()
router.register(r'automation', api.AutomationViewSet)
router.register(r'bookmarklet-import', api.BookmarkletImportViewSet)
router.register(r'cook-log', api.CookLogViewSet)
router.register(r'custom-filter', api.CustomFilterViewSet)
router.register(r'food', api.FoodViewSet)
router.register(r'food-inherit-field', api.FoodInheritFieldViewSet)
router.register(r'import-log', api.ImportLogViewSet)
@@ -181,7 +183,7 @@ for m in generic_models:
)
)
vue_models = [Food, Keyword, Unit, Supermarket, SupermarketCategory, Automation, UserFile, Step]
vue_models = [Food, Keyword, Unit, Supermarket, SupermarketCategory, Automation, UserFile, Step, CustomFilter]
for m in vue_models:
py_name = get_model_name(m)
url_name = py_name.replace('_', '-')

View File

@@ -15,7 +15,7 @@ from django.core.files import File
from django.db.models import (Case, Count, Exists, F, IntegerField, OuterRef, ProtectedError, Q,
Subquery, Value, When)
from django.db.models.fields.related import ForeignObjectRel
from django.db.models.functions import Coalesce
from django.db.models.functions import Coalesce, Lower
from django.http import FileResponse, HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
@@ -42,19 +42,20 @@ from cookbook.helper.recipe_html_import import get_recipe_from_source
from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch, old_search
from cookbook.helper.recipe_url_import import get_from_scraper
from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper
from cookbook.models import (Automation, BookmarkletImport, CookLog, Food, FoodInheritField,
ImportLog, ExportLog, Ingredient, Keyword, MealPlan, MealType, Recipe, RecipeBook,
RecipeBookEntry, ShareLink, ShoppingList, ShoppingListEntry,
ShoppingListRecipe, Step, Storage, Supermarket, SupermarketCategory,
SupermarketCategoryRelation, Sync, SyncLog, Unit, UserFile,
UserPreference, ViewLog)
from cookbook.models import (Automation, BookmarkletImport, CookLog, CustomFilter, ExportLog, Food,
FoodInheritField, ImportLog, Ingredient, Keyword, MealPlan, MealType,
Recipe, RecipeBook, RecipeBookEntry, ShareLink, ShoppingList,
ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket,
SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit,
UserFile, UserPreference, ViewLog)
from cookbook.provider.dropbox import Dropbox
from cookbook.provider.local import Local
from cookbook.provider.nextcloud import Nextcloud
from cookbook.schemas import FilterSchema, QueryParam, QueryParamAutoSchema, TreeSchema
from cookbook.serializer import (AutomationSerializer, BookmarkletImportSerializer,
CookLogSerializer, FoodInheritFieldSerializer, FoodSerializer,
FoodShoppingUpdateSerializer, ImportLogSerializer, ExportLogSerializer,
CookLogSerializer, CustomFilterSerializer, ExportLogSerializer,
FoodInheritFieldSerializer, FoodSerializer,
FoodShoppingUpdateSerializer, ImportLogSerializer,
IngredientSerializer, KeywordSerializer, MealPlanSerializer,
MealTypeSerializer, RecipeBookEntrySerializer,
RecipeBookSerializer, RecipeImageSerializer,
@@ -107,6 +108,7 @@ class ExtendedRecipeMixin():
'''
ExtendedRecipe annotates a queryset with recipe_image and recipe_count values
'''
@classmethod
def annotate_recipe(self, queryset=None, request=None, serializer=None, tree=False):
extended = str2bool(request.query_params.get('extended', None))
@@ -138,19 +140,17 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
schema = FilterSchema()
def get_queryset(self):
self.queryset = self.queryset.filter(space=self.request.space).order_by('name')
self.queryset = self.queryset.filter(space=self.request.space).order_by(Lower('name').asc())
query = self.request.query_params.get('query', None)
fuzzy = self.request.user.searchpreference.lookup
fuzzy = self.request.user.searchpreference.lookup or any([self.model.__name__.lower() in x for x in self.request.user.searchpreference.trigram.values_list('field', flat=True)])
if query is not None and query not in ["''", '']:
if fuzzy:
self.queryset = (
self.queryset
.annotate(starts=Case(When(name__istartswith=query, then=(Value(.3, output_field=IntegerField()))), default=Value(0)))
.annotate(trigram=TrigramSimilarity('name', query))
.annotate(sort=F('starts')+F('trigram'))
.order_by('-sort')
)
if 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))
else:
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name', query))
self.queryset = self.queryset.order_by('-trigram')
else:
# TODO have this check unaccent search settings or other search preferences?
filter = Q(name__icontains=query)
@@ -161,7 +161,7 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
self.queryset
.annotate(starts=Case(When(name__istartswith=query, then=(Value(100))),
default=Value(0))) # put exact matches at the top of the result set
.filter(filter).order_by('-starts', 'name')
.filter(filter).order_by('-starts', Lower('name').asc())
)
updated_at = self.request.query_params.get('updated_at', None)
@@ -175,16 +175,16 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
limit = self.request.query_params.get('limit', None)
random = self.request.query_params.get('random', False)
if random:
self.queryset = self.queryset.order_by("?")
if limit is not None:
if random:
self.queryset = self.queryset.order_by("?")
self.queryset = self.queryset[:int(limit)]
return self.annotate_recipe(queryset=self.queryset, request=self.request, serializer=self.serializer_class)
class MergeMixin(ViewSetMixin):
@ decorators.action(detail=True, url_path='merge/(?P<target>[^/.]+)', methods=['PUT'], )
@ decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer))
@decorators.action(detail=True, url_path='merge/(?P<target>[^/.]+)', methods=['PUT'], )
@decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def merge(self, request, pk, target):
self.description = f"Merge {self.basename} onto target {self.basename} with ID of [int]."
@@ -276,12 +276,12 @@ class TreeMixin(MergeMixin, FuzzyFilterMixin, ExtendedRecipeMixin):
self.queryset = self.model.objects.none()
else:
return self.annotate_recipe(queryset=super().get_queryset(), request=self.request, serializer=self.serializer_class, tree=True)
self.queryset = self.queryset.filter(space=self.request.space).order_by('name')
self.queryset = self.queryset.filter(space=self.request.space).order_by(Lower('name').asc())
return self.annotate_recipe(queryset=self.queryset, request=self.request, serializer=self.serializer_class, tree=True)
@ decorators.action(detail=True, url_path='move/(?P<parent>[^/.]+)', methods=['PUT'], )
@ decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer))
@decorators.action(detail=True, url_path='move/(?P<parent>[^/.]+)', methods=['PUT'], )
@decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def move(self, request, pk, parent):
self.description = f"Move {self.basename} to be a child of {self.basename} with ID of [int]. Use ID: 0 to move {self.basename} to the root."
if self.model.node_order_by:
@@ -404,7 +404,7 @@ class SupermarketCategoryViewSet(viewsets.ModelViewSet, StandardFilterMixin):
permission_classes = [CustomIsUser]
def get_queryset(self):
self.queryset = self.queryset.filter(space=self.request.space).order_by('name')
self.queryset = self.queryset.filter(space=self.request.space).order_by(Lower('name').asc())
return super().get_queryset()
@@ -461,7 +461,7 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
# onhand_status = self.queryset.annotate(onhand_status=Exists(onhand_users_set__in=[shared_users]))
return self.queryset.annotate(shopping_status=Exists(shopping_status)).prefetch_related('onhand_users', 'inherit_fields').select_related('recipe', 'supermarket_category')
@ decorators.action(detail=True, methods=['PUT'], serializer_class=FoodShoppingUpdateSerializer,)
@decorators.action(detail=True, methods=['PUT'], serializer_class=FoodShoppingUpdateSerializer, )
# TODO DRF only allows one action in a decorator action without overriding get_operation_id_base() this should be PUT and DELETE probably
def shopping(self, request, pk):
if self.request.space.demo:
@@ -492,7 +492,7 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
class RecipeBookViewSet(viewsets.ModelViewSet, StandardFilterMixin):
queryset = RecipeBook.objects
serializer_class = RecipeBookSerializer
permission_classes = [CustomIsOwner]
permission_classes = [CustomIsOwner | CustomIsShared]
def get_queryset(self):
self.queryset = self.queryset.filter(Q(created_by=self.request.user) | Q(shared=self.request.user)).filter(
@@ -511,7 +511,7 @@ class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
"""
queryset = RecipeBookEntry.objects
serializer_class = RecipeBookEntrySerializer
permission_classes = [CustomIsOwner]
permission_classes = [CustomIsOwner | CustomIsShared]
def get_queryset(self):
queryset = self.queryset.filter(
@@ -525,7 +525,6 @@ class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
book_id = self.request.query_params.get('book', None)
if book_id is not None:
queryset = queryset.filter(book__pk=book_id)
return queryset
@@ -540,7 +539,7 @@ class MealPlanViewSet(viewsets.ModelViewSet):
"""
queryset = MealPlan.objects
serializer_class = MealPlanSerializer
permission_classes = [CustomIsOwner]
permission_classes = [CustomIsOwner | CustomIsShared]
def get_queryset(self):
queryset = self.queryset.filter(
@@ -630,20 +629,35 @@ class RecipeViewSet(viewsets.ModelViewSet):
# TODO split read and write permission for meal plan guest
permission_classes = [CustomIsShare | CustomIsGuest]
pagination_class = RecipePagination
# TODO the boolean params below (keywords_or through new) should be updated to boolean types with front end refactored accordingly
query_params = [
QueryParam(name='query', description=_('Query string matched (fuzzy) against recipe name. In the future also fulltext search.')),
QueryParam(name='keywords', description=_('ID of keyword a recipe should have. For multiple repeat parameter.'), qtype='int'),
QueryParam(name='keywords', description=_('ID of keyword a recipe should have. For multiple repeat parameter. Equivalent to keywords_or'), qtype='int'),
QueryParam(name='keywords_or', description=_('Keyword IDs, repeat for multiple. Return recipes with any of the keywords'), qtype='int'),
QueryParam(name='keywords_and', description=_('Keyword IDs, repeat for multiple. Return recipes with all of the keywords.'), qtype='int'),
QueryParam(name='keywords_or_not', description=_('Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords.'), qtype='int'),
QueryParam(name='keywords_and_not', description=_('Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords.'), qtype='int'),
QueryParam(name='foods', description=_('ID of food a recipe should have. For multiple repeat parameter.'), qtype='int'),
QueryParam(name='foods_or', description=_('Food IDs, repeat for multiple. Return recipes with any of the foods'), qtype='int'),
QueryParam(name='foods_and', description=_('Food IDs, repeat for multiple. Return recipes with all of the foods.'), qtype='int'),
QueryParam(name='foods_or_not', description=_('Food IDs, repeat for multiple. Exclude recipes with any of the foods.'), qtype='int'),
QueryParam(name='foods_and_not', description=_('Food IDs, repeat for multiple. Exclude recipes with all of the foods.'), qtype='int'),
QueryParam(name='units', description=_('ID of unit a recipe should have.'), qtype='int'),
QueryParam(name='rating', description=_('Rating a recipe should have. [0 - 5]'), qtype='int'),
QueryParam(name='rating', description=_('Rating a recipe should have or greater. [0 - 5] Negative value filters rating less than.'), qtype='int'),
QueryParam(name='books', description=_('ID of book a recipe should be in. For multiple repeat parameter.')),
QueryParam(name='keywords_or', description=_('If recipe should have all (AND=''false'') or any (OR=''<b>true</b>'') of the provided keywords.')),
QueryParam(name='foods_or', description=_('If recipe should have all (AND=''false'') or any (OR=''<b>true</b>'') of the provided foods.')),
QueryParam(name='books_or', description=_('If recipe should be in all (AND=''false'') or any (OR=''<b>true</b>'') of the provided books.')),
QueryParam(name='books_or', description=_('Book IDs, repeat for multiple. Return recipes with any of the books'), qtype='int'),
QueryParam(name='books_and', description=_('Book IDs, repeat for multiple. Return recipes with all of the books.'), qtype='int'),
QueryParam(name='books_or_not', description=_('Book IDs, repeat for multiple. Exclude recipes with any of the books.'), qtype='int'),
QueryParam(name='books_and_not', description=_('Book IDs, repeat for multiple. Exclude recipes with all of the books.'), qtype='int'),
QueryParam(name='internal', description=_('If only internal recipes should be returned. [''true''/''<b>false</b>'']')),
QueryParam(name='random', description=_('Returns the results in randomized order. [''true''/''<b>false</b>'']')),
QueryParam(name='new', description=_('Returns new results first in search results. [''true''/''<b>false</b>'']')),
QueryParam(name='timescooked', description=_('Filter recipes cooked X times or more. Negative values returns cooked less than X times'), qtype='int'),
QueryParam(name='cookedon', description=_('Filter recipes last cooked on or after YYYY-MM-DD. Prepending ''-'' filters on or before date.')),
QueryParam(name='createdon', description=_('Filter recipes created on or after YYYY-MM-DD. Prepending ''-'' filters on or before date.')),
QueryParam(name='updatedon', description=_('Filter recipes updated on or after YYYY-MM-DD. Prepending ''-'' filters on or before date.')),
QueryParam(name='viewedon', description=_('Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending ''-'' filters on or before date.')),
QueryParam(name='makenow', description=_('Filter recipes that can be made with OnHand food. [''true''/''<b>false</b>'']')),
]
schema = QueryParamAutoSchema()
@@ -658,7 +672,6 @@ class RecipeViewSet(viewsets.ModelViewSet):
if not (share and self.detail):
self.queryset = self.queryset.filter(space=self.request.space)
# self.queryset = search_recipes(self.request, self.queryset, self.request.GET)
params = {x: self.request.GET.get(x) if len({**self.request.GET}[x]) == 1 else self.request.GET.getlist(x) for x in list(self.request.GET)}
search = RecipeSearch(self.request, **params)
self.queryset = search.get_queryset(self.queryset).prefetch_related('cooklog_set')
@@ -873,7 +886,6 @@ class ExportLogViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space)
class BookmarkletImportViewSet(viewsets.ModelViewSet):
queryset = BookmarkletImport.objects
serializer_class = BookmarkletImportSerializer
@@ -904,7 +916,19 @@ class AutomationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
return super().get_queryset()
class CustomFilterViewSet(viewsets.ModelViewSet, StandardFilterMixin):
queryset = CustomFilter.objects
serializer_class = CustomFilterSerializer
permission_classes = [CustomIsOwner]
def get_queryset(self):
self.queryset = self.queryset.filter(Q(created_by=self.request.user) | Q(shared=self.request.user)).filter(
space=self.request.space).distinct()
return super().get_queryset()
# -------------- non django rest api views --------------------
def get_recipe_provider(recipe):
if recipe.storage.method == Storage.DROPBOX:
return Dropbox

View File

@@ -156,7 +156,7 @@ def import_url(request):
recipe.steps.add(step)
for kw in data['keywords']:
if data['all_keywords']: # do not remove this check :) https://github.com/vabene1111/recipes/issues/645
if data['all_keywords']: # do not remove this check :) https://github.com/vabene1111/recipes/issues/645
k, created = Keyword.objects.get_or_create(name=kw['text'], space=request.space)
recipe.keywords.add(k)
else:
@@ -168,7 +168,8 @@ def import_url(request):
ingredient_parser = IngredientParser(request, True)
for ing in data['recipeIngredient']:
ingredient = Ingredient(space=request.space, )
original = ing.pop('original', None) or ing.pop('original_text', None)
ingredient = Ingredient(original_text=original, space=request.space, )
if food_text := ing['ingredient']['text'].strip():
ingredient.food = ingredient_parser.get_food(food_text)

View File

@@ -7,12 +7,9 @@ from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django.views.generic import DeleteView
from cookbook.helper.permission_helper import (GroupRequiredMixin,
OwnerRequiredMixin,
group_required)
from cookbook.models import (Comment, InviteLink, MealPlan, Recipe,
RecipeBook, RecipeBookEntry, RecipeImport,
Storage, Sync)
from cookbook.helper.permission_helper import GroupRequiredMixin, OwnerRequiredMixin, group_required
from cookbook.models import (Comment, InviteLink, MealPlan, Recipe, RecipeBook, RecipeBookEntry,
RecipeImport, Storage, Sync)
from cookbook.provider.dropbox import Dropbox
from cookbook.provider.local import Local
from cookbook.provider.nextcloud import Nextcloud

View File

@@ -2,22 +2,16 @@ import os
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render, redirect
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.translation import gettext as _
from django.views.generic import UpdateView
from django.views.generic.edit import FormMixin
from cookbook.forms import (CommentForm, ExternalRecipeForm,
MealPlanForm,
StorageForm, SyncForm,
)
from cookbook.helper.permission_helper import (GroupRequiredMixin,
OwnerRequiredMixin,
group_required)
from cookbook.models import (Comment, MealPlan,
MealType, Recipe, RecipeImport,
Storage, Sync, UserPreference)
from cookbook.forms import CommentForm, ExternalRecipeForm, MealPlanForm, StorageForm, SyncForm
from cookbook.helper.permission_helper import GroupRequiredMixin, OwnerRequiredMixin, group_required
from cookbook.models import (Comment, MealPlan, MealType, Recipe, RecipeImport, Storage, Sync,
UserPreference)
from cookbook.provider.dropbox import Dropbox
from cookbook.provider.local import Local
from cookbook.provider.nextcloud import Nextcloud

View File

@@ -1,21 +1,21 @@
import re
import threading
from io import BytesIO
from django.core.cache import cache
from django.contrib import messages
from django.core.cache import cache
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import render, get_object_or_404
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.utils.translation import gettext as _
from cookbook.forms import ExportForm, ImportForm, ImportExportBase
from cookbook.forms import ExportForm, ImportExportBase, ImportForm
from cookbook.helper.permission_helper import group_required
from cookbook.integration.cookbookapp import CookBookApp
from cookbook.integration.copymethat import CopyMeThat
from cookbook.integration.pepperplate import Pepperplate
from cookbook.helper.recipe_search import RecipeSearch
from cookbook.integration.cheftap import ChefTap
from cookbook.integration.chowdown import Chowdown
from cookbook.integration.cookbookapp import CookBookApp
from cookbook.integration.copymethat import CopyMeThat
from cookbook.integration.default import Default
from cookbook.integration.domestica import Domestica
from cookbook.integration.mealie import Mealie
@@ -23,14 +23,15 @@ from cookbook.integration.mealmaster import MealMaster
from cookbook.integration.nextcloud_cookbook import NextcloudCookbook
from cookbook.integration.openeats import OpenEats
from cookbook.integration.paprika import Paprika
from cookbook.integration.pdfexport import PDFexport
from cookbook.integration.pepperplate import Pepperplate
from cookbook.integration.plantoeat import Plantoeat
from cookbook.integration.recipekeeper import RecipeKeeper
from cookbook.integration.recettetek import RecetteTek
from cookbook.integration.recipekeeper import RecipeKeeper
from cookbook.integration.recipesage import RecipeSage
from cookbook.integration.rezkonv import RezKonv
from cookbook.integration.saffron import Saffron
from cookbook.integration.pdfexport import PDFexport
from cookbook.models import Recipe, ImportLog, ExportLog, UserPreference
from cookbook.models import ExportLog, ImportLog, Recipe, UserPreference
from recipes import settings
@@ -123,6 +124,9 @@ def export_recipe(request):
recipes = form.cleaned_data['recipes']
if form.cleaned_data['all']:
recipes = Recipe.objects.filter(space=request.space, internal=True).all()
elif custom_filter := form.cleaned_data['custom_filter']:
search = RecipeSearch(request, filter=custom_filter)
recipes = search.get_queryset(Recipe.objects.filter(space=request.space, internal=True))
integration = get_integration(request, form.cleaned_data['type'])

View File

@@ -185,6 +185,22 @@ def automation(request):
)
@group_required('user')
def custom_filter(request):
# recipe-param is the name of the parameters used when filtering recipes by this attribute
# model-name is the models.js name of the model, probably ALL-CAPS
return render(
request,
'generic/model_template.html',
{
"title": _("Custom Filters"),
"config": {
'model': "CUSTOM_FILTER", # *REQUIRED* name of the model in models.js
}
}
)
@group_required('user')
def user_file(request):
try:

View File

@@ -5,19 +5,17 @@ from smtplib import SMTPException
from django.contrib import messages
from django.contrib.auth.models import Group
from django.core.mail import send_mail, BadHeaderError
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django.views.generic import CreateView
from cookbook.forms import (ImportRecipeForm, InviteLinkForm,
MealPlanForm, Storage, StorageForm)
from cookbook.helper.permission_helper import (GroupRequiredMixin,
group_required)
from cookbook.models import (InviteLink, MealPlan, MealType, Recipe,
RecipeBook, RecipeImport, ShareLink, Step, UserPreference)
from cookbook.forms import ImportRecipeForm, InviteLinkForm, MealPlanForm, Storage, StorageForm
from cookbook.helper.permission_helper import GroupRequiredMixin, group_required
from cookbook.models import (InviteLink, MealPlan, MealType, Recipe, RecipeBook, RecipeImport,
ShareLink, Step, UserPreference)
from cookbook.views.edit import SpaceFormMixing
from recipes import settings

View File

@@ -8,7 +8,7 @@ from django.views.decorators.csrf import csrf_exempt
from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.permission_helper import group_required
from cookbook.models import TelegramBot, ShoppingList, ShoppingListEntry
from cookbook.models import ShoppingList, ShoppingListEntry, TelegramBot
@group_required('user')
@@ -48,11 +48,11 @@ def hook(request, token):
request.space = tb.space # TODO this is likely a bad idea. Verify and test
request.user = tb.created_by
ingredient_parser = IngredientParser(request, False)
amount, unit, ingredient, note = ingredient_parser.parse(data['message']['text'])
f = ingredient_parser.get_food(ingredient)
amount, unit, food, note = ingredient_parser.parse(data['message']['text'])
f = ingredient_parser.get_food(food)
u = ingredient_parser.get_unit(unit)
ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, created_by=request.user, space=request.space)
ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, original_text=ingredient, created_by=request.user, space=request.space)
return JsonResponse({'data': data['message']['text']})
except Exception:

View File

@@ -12,6 +12,7 @@ from django.contrib.auth.models import Group
from django.contrib.auth.password_validation import validate_password
from django.core.exceptions import ValidationError
from django.db.models import Avg, Q, Sum
from django.db.models.functions import Lower
from django.http import HttpResponseRedirect, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
@@ -60,7 +61,7 @@ def search(request):
if request.user.userpreference.search_style == UserPreference.NEW:
return search_v2(request)
f = RecipeFilter(request.GET,
queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name'),
queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by(Lower('name').asc()),
space=request.space)
if request.user.userpreference.search_style == UserPreference.LARGE:
table = RecipeTable(f.qs)
@@ -361,17 +362,18 @@ def user_settings(request):
sp.istartswith.clear()
sp.trigram.set([SearchFields.objects.get(name='Name')])
sp.fulltext.clear()
sp.trigram_threshold = 0.1
sp.trigram_threshold = 0.2
if search_form.cleaned_data['preset'] == 'precise':
sp.search = SearchPreference.WEB
sp.lookup = True
sp.unaccent.set(SearchFields.objects.all())
sp.icontains.clear()
# full text on food is very slow, add search_vector field and index it (including Admin functions and postsave signal to rebuild index)
sp.icontains.set([SearchFields.objects.get(name__in=['Name', 'Ingredients'])])
sp.istartswith.set([SearchFields.objects.get(name='Name')])
sp.trigram.clear()
sp.fulltext.set(SearchFields.objects.all())
sp.trigram_threshold = 0.1
sp.fulltext.set(SearchFields.objects.filter(name__in=['Ingredients']))
sp.trigram_threshold = 0.2
sp.save()
elif 'shopping_form' in request.POST:
@@ -448,7 +450,7 @@ def history(request):
def system(request):
if not request.user.is_superuser:
return HttpResponseRedirect(reverse('index'))
postgres = False if (
settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2' # noqa: E501
or settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql' # noqa: E501

View File

@@ -347,4 +347,34 @@ follow these instructions:
- Delete local database folder (usually 'postgresql' in the same folder as your 'docker-compose.yml' file)
- Start Tandoor containers again (`docker-compose up -d`)
- Wait for at least 2-3 minutes and then check if everything is working now (migrations can take quite some time!)
- If not, check logs of the web_recipes container with `docker logs <container_name>` and make sure that all migrations are indeed already done
- If not, check logs of the web_recipes container with `docker logs <container_name>` and make sure that all migrations are indeed already done
### Sub Path nginx config
If hosting under a sub-path you might want to change the default nginx config (which gets mounted through the named volume from the application container into the nginx container)
with the following config.
```nginx
location /my_app { # change to subfolder name
include /config/nginx/proxy.conf;
proxy_pass https://mywebapp.com/; # change to your host name:port
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Script-Name /my_app; # change to subfolder name
proxy_cookie_path / /my_app; # change to subfolder name
}
location /media/ {
include /config/nginx/proxy.conf;
alias /mediafiles/;
client_max_body_size 16M;
}
location /static/ {
include /config/nginx/proxy.conf;
alias /staticfiles/;
client_max_body_size 16M;
}
```

View File

@@ -9,15 +9,9 @@ services:
- ./.env
networks:
- default
healthcheck:
test: ["CMD-SHELL", "psql -U $$POSTGRES_USER -d $$POSTGRES_DB --list || exit 1"]
interval: 4s
timeout: 1s
retries: 12
web_recipes:
image: vabene1111/recipes
restart: always
env_file:
- ./.env
volumes:
@@ -25,8 +19,7 @@ services:
- nginx_config:/opt/recipes/nginx/conf.d
- ./mediafiles:/opt/recipes/mediafiles
depends_on:
db_recipes:
condition: service_healthy
- db_recipes
networks:
- default

View File

@@ -7,15 +7,9 @@ services:
- ./postgresql:/var/lib/postgresql/data
env_file:
- ./.env
healthcheck:
test: ["CMD-SHELL", "psql -U $$POSTGRES_USER -d $$POSTGRES_DB --list || exit 1"]
interval: 4s
timeout: 1s
retries: 12
web_recipes:
image: vabene1111/recipes
restart: always
env_file:
- ./.env
volumes:
@@ -23,8 +17,7 @@ services:
- nginx_config:/opt/recipes/nginx/conf.d
- ./mediafiles:/opt/recipes/mediafiles
depends_on:
db_recipes:
condition: service_healthy
- db_recipes
nginx_recipes:
image: nginx:mainline-alpine

View File

@@ -9,15 +9,9 @@ services:
- ./.env
networks:
- default
healthcheck:
test: ["CMD-SHELL", "psql -U $$POSTGRES_USER -d $$POSTGRES_DB --list || exit 1"]
interval: 4s
timeout: 1s
retries: 12
web_recipes:
image: vabene1111/recipes
restart: always
env_file:
- ./.env
volumes:
@@ -25,8 +19,7 @@ services:
- nginx_config:/opt/recipes/nginx/conf.d
- ./mediafiles:/opt/recipes/mediafiles
depends_on:
db_recipes:
condition: service_healthy
- db_recipes
networks:
- default

View File

@@ -24,12 +24,6 @@ spec:
name: recipes-postgresql
namespace: default
spec:
restartPolicy: Always
securityContext:
fsGroup: 999
serviceAccount: recipes
serviceAccountName: recipes
terminationGracePeriodSeconds: 30
containers:
- name: recipes-db
env:
@@ -125,8 +119,6 @@ spec:
serviceAccount: recipes
serviceAccountName: recipes
terminationGracePeriodSeconds: 30
updateStrategy:
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim

View File

@@ -12,5 +12,12 @@ server {
location / {
proxy_set_header Host $http_host;
proxy_pass http://web_recipes:8080;
error_page 502 /errors/http502.html;
}
location /errors/ {
alias /etc/nginx/conf.d/errorpages/;
internal;
}
}

View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Simple HttpErrorPages | MIT License | https://github.com/HttpErrorPages -->
<meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>502 - Webservice currently unavailable</title>
<style type="text/css">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-align:center;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:"Open Sans",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>
</head>
<body>
<div class="cover"><h1>Tandoor Recipes is not yet available <small>502</small></h1>
<p class="lead">
Services are still trying to start.<br>
Please allow up to 3 minutes after you started the application on your server.<br><br>
If this status persists, check the application or docker logs for further information.<br>
After checking and trying everything mentioned in the <a href="https://docs.tandoor.dev/" target="_blank">docs</a>, you can request help on the project's <a href="https://github.com/TandoorRecipes/recipes/issues/new?assignees=&amp;labels=setup+issue&amp;template=help_request.yml" target="_blank">GitHub</a> page.
</p>
</div>
</body>
</html>

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,50 +18,50 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,52 +18,52 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr "Englisch"
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr "Deutsch"
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
#, fuzzy
#| msgid "English"
msgid "Polish"
msgstr "Englisch"
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,50 +18,50 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,50 +18,50 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,50 +18,50 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,50 +17,50 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-18 14:52+0100\n"
"POT-Creation-Date: 2022-02-11 08:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,50 +18,50 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: .\recipes\settings.py:357
#: .\recipes\settings.py:360
msgid "Armenian "
msgstr ""
#: .\recipes\settings.py:358
#: .\recipes\settings.py:361
msgid "Catalan"
msgstr ""
#: .\recipes\settings.py:359
#: .\recipes\settings.py:362
msgid "Czech"
msgstr ""
#: .\recipes\settings.py:360
#: .\recipes\settings.py:363
msgid "Dutch"
msgstr ""
#: .\recipes\settings.py:361
#: .\recipes\settings.py:364
msgid "English"
msgstr ""
#: .\recipes\settings.py:362
#: .\recipes\settings.py:365
msgid "French"
msgstr ""
#: .\recipes\settings.py:363
#: .\recipes\settings.py:366
msgid "German"
msgstr ""
#: .\recipes\settings.py:364
#: .\recipes\settings.py:367
msgid "Italian"
msgstr ""
#: .\recipes\settings.py:365
#: .\recipes\settings.py:368
msgid "Latvian"
msgstr ""
#: .\recipes\settings.py:366
#: .\recipes\settings.py:369
msgid "Polish"
msgstr ""
#: .\recipes\settings.py:367
#: .\recipes\settings.py:370
msgid "Russian"
msgstr ""
#: .\recipes\settings.py:368
#: .\recipes\settings.py:371
msgid "Spanish"
msgstr ""

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