Compare commits

...

80 Commits
2.3.3 ... 2.3.4

Author SHA1 Message Date
vabene1111
84fd3055ea Merge branch 'develop' 2025-11-18 15:29:08 +01:00
vabene1111
2bd60a6f13 tiny fix 2025-11-18 15:29:02 +01:00
SerhiiOS
fe75052baa Translated using Weblate (Ukrainian)
Currently translated at 100.0% (869 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-11-18 07:01:59 +00:00
SerhiiOS
0a3b750294 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-11-18 07:01:59 +00:00
Vincenzo Reale
fcd3918b5f Translated using Weblate (Italian)
Currently translated at 100.0% (373 of 373 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2025-11-18 07:01:59 +00:00
vabene1111
e7aac06ca7 improved print view 2025-11-17 07:51:31 +01:00
Vincenzo Reale
67e1f57723 Translated using Weblate (Italian)
Currently translated at 100.0% (869 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-11-17 06:42:04 +00:00
Vincenzo Reale
10581329e8 Translated using Weblate (Italian)
Currently translated at 87.9% (328 of 373 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/
2025-11-17 06:42:04 +00:00
SerhiiOS
553c06f291 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (869 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-11-16 01:59:51 +00:00
SerhiiOS
e0cbfd824c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-11-16 01:59:51 +00:00
Matjaž T.
a5a522d378 Translated using Weblate (Slovenian)
Currently translated at 100.0% (869 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-11-15 12:08:14 +00:00
Matjaž T.
8502bb235b Translated using Weblate (Slovenian)
Currently translated at 100.0% (373 of 373 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/sl/
2025-11-15 12:08:14 +00:00
SerhiiOS
42f2ad624f Translated using Weblate (Ukrainian)
Currently translated at 62.7% (545 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-11-14 19:01:59 +00:00
SerhiiOS
3b95bf40da Translated using Weblate (Ukrainian)
Currently translated at 80.7% (394 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-11-14 19:01:58 +00:00
SerhiiOS
81a6837b06 Translated using Weblate (Ukrainian)
Currently translated at 43.6% (379 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-11-13 13:33:58 +00:00
SerhiiOS
a95e352250 Translated using Weblate (Ukrainian)
Currently translated at 62.7% (306 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-11-13 13:33:58 +00:00
Justin Straver
a4ca66d287 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 91.4% (795 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hant/
2025-11-12 12:02:00 +00:00
Justin Straver
ec30b81ae5 Translated using Weblate (Russian)
Currently translated at 91.1% (792 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/ru/
2025-11-12 12:02:00 +00:00
Justin Straver
92211b1f51 Translated using Weblate (Portuguese (Brazil))
Currently translated at 75.4% (656 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pt_BR/
2025-11-12 12:02:00 +00:00
Justin Straver
8eeea42057 Translated using Weblate (Italian)
Currently translated at 99.3% (863 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/
2025-11-12 12:02:00 +00:00
Justin Straver
7e76a71ccc Translated using Weblate (French)
Currently translated at 88.7% (771 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/
2025-11-12 12:02:00 +00:00
Justin Straver
b397c94f0a Translated using Weblate (Spanish)
Currently translated at 87.5% (761 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/
2025-11-12 12:02:00 +00:00
Justin Straver
9552564e59 Translated using Weblate (German)
Currently translated at 99.7% (867 of 869 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-11-12 12:02:00 +00:00
SerhiiOS
4ecf323e4f Translated using Weblate (Ukrainian)
Currently translated at 31.5% (154 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-11-12 12:02:00 +00:00
vabene1111
d5d5c2c52b Merge pull request #4159 from erikbledsoe/patch-1
documentation typo
2025-11-11 15:42:05 +01:00
vabene1111
7ffabfe711 Merge pull request #4166 from EifX/docs/apache-reverse-proxy
feat: add apache reverse proxy documentation
2025-11-11 15:41:13 +01:00
vabene1111
49e0b5b962 improve handling of vuetify locale 2025-11-11 15:40:50 +01:00
vabene1111
a05f1ece24 updated recipe scrapers 2025-11-11 14:45:34 +01:00
vabene1111
748b91bb8a improve servings parsing and AI failure logging 2025-11-11 14:44:09 +01:00
vabene1111
bd2e9cc3d9 Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2025-11-11 14:16:37 +01:00
vabene1111
c40bb20a7a fixed copying meal plans did not add to shopping 2025-11-11 14:16:32 +01:00
vabene1111
b377d2cd35 Merge pull request #4192 from Daan5556/patch-1
Docs: Added trailing slash to `system` path
2025-11-11 14:12:17 +01:00
vabene1111
dc0e91d0f9 Merge pull request #4193 from ThomasLeister/patch-1
Update manual setup instructions: vue is now vue3
2025-11-11 14:11:26 +01:00
vabene1111
5f12907544 fixed edge case where no recipe is displayed in a mostly empty space 2025-11-11 14:09:02 +01:00
vabene1111
889ddac7dc remove debug button from message dialog and added button to open it 2025-11-11 13:41:14 +01:00
vabene1111
b369e2618a fixed decimals in share view 2025-11-11 13:06:56 +01:00
vabene1111
5a4e0204c9 fixed debug toolbar setup 2025-11-11 12:59:45 +01:00
vabene1111
bfc2e96b54 Merge pull request #4101 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vuetify-3.10.3
Bump vuetify from 3.9.7 to 3.10.3 in /vue3
2025-11-11 12:51:23 +01:00
vabene1111
f065ef80aa Merge pull request #4100 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vueuse/router-13.9.0
Bump @vueuse/router from 13.6.0 to 13.9.0 in /vue3
2025-11-11 12:51:11 +01:00
vabene1111
61c14b8b05 Merge pull request #4099 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue/tsconfig-0.8.1
Bump @vue/tsconfig from 0.7.0 to 0.8.1 in /vue3
2025-11-11 12:51:03 +01:00
vabene1111
35d5d64809 Merge pull request #4096 from TandoorRecipes/dependabot/pip/lxml-6.0.2
Bump lxml from 5.3.1 to 6.0.2
2025-11-11 12:50:52 +01:00
vabene1111
63c711d18c Merge pull request #4094 from TandoorRecipes/dependabot/pip/pytest-8.4.2
Bump pytest from 8.4.1 to 8.4.2
2025-11-11 12:50:42 +01:00
vabene1111
59e3ea70d1 Merge pull request #4095 from TandoorRecipes/dependabot/pip/django-debug-toolbar-6.0.0
Bump django-debug-toolbar from 4.3.0 to 6.0.0
2025-11-11 12:50:19 +01:00
vabene1111
6771662a9f Merge pull request #4092 from TandoorRecipes/dependabot/pip/pyyaml-6.0.3
Bump pyyaml from 6.0.2 to 6.0.3
2025-11-11 12:49:29 +01:00
vabene1111
9b792a1393 Merge pull request #4093 from TandoorRecipes/dependabot/pip/drf-spectacular-0.28.0
Bump drf-spectacular from 0.27.1 to 0.28.0
2025-11-11 12:49:19 +01:00
vabene1111
862957c121 Merge pull request #4098 from TandoorRecipes/dependabot/github_actions/actions/setup-python-6
Bump actions/setup-python from 5 to 6
2025-11-11 12:48:50 +01:00
vabene1111
bdcbafd52f Merge pull request #4200 from TandoorRecipes/dependabot/github_actions/github/codeql-action-4
Bump github/codeql-action from 3 to 4
2025-11-11 12:48:26 +01:00
vabene1111
5e454a5212 Merge pull request #4201 from TandoorRecipes/dependabot/github_actions/actions/setup-node-6
Bump actions/setup-node from 4 to 6
2025-11-11 12:48:18 +01:00
vabene1111
20bea63997 Merge pull request #4202 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.6.0
Bump awalsh128/cache-apt-pkgs-action from 1.5.3 to 1.6.0
2025-11-11 12:48:09 +01:00
vabene1111
8a265772c0 Merge pull request #4211 from TandoorRecipes/dependabot/pip/django-5.2.8
Bump django from 5.2.7 to 5.2.8
2025-11-11 12:47:16 +01:00
vabene1111
6febb4e3e8 Merge pull request #4174 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-7.1.11
Bump vite from 7.1.5 to 7.1.11 in /vue3
2025-11-11 12:47:00 +01:00
vabene1111
04f9167fd8 Merge branch 'develop-weblate' into develop
# Conflicts:
#	cookbook/locale/nl/LC_MESSAGES/django.po
#	cookbook/locale/uk/LC_MESSAGES/django.po
#	vue3/src/locales/de.json
#	vue3/src/locales/en.json
#	vue3/src/locales/nl.json
#	vue3/src/locales/sl.json
#	vue3/src/locales/uk.json
2025-11-11 12:27:48 +01:00
dependabot[bot]
8f29e01daf Bump django from 5.2.7 to 5.2.8
Bumps [django](https://github.com/django/django) from 5.2.7 to 5.2.8.
- [Commits](https://github.com/django/django/compare/5.2.7...5.2.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-05 20:17:31 +00:00
Erik Bledsoe
e810363b22 Merge branch 'develop' into patch-1 2025-11-01 07:05:19 -04:00
tan
b5a2120bdf Added translation using Weblate (Korean) 2025-11-01 10:09:09 +00:00
tan
643fcbad9b Added translation using Weblate (Korean) 2025-11-01 10:09:09 +00:00
dependabot[bot]
4a3b834463 Bump awalsh128/cache-apt-pkgs-action from 1.5.3 to 1.6.0
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.5.3 to 1.6.0.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.5.3...v1.6.0)

---
updated-dependencies:
- dependency-name: awalsh128/cache-apt-pkgs-action
  dependency-version: 1.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:12 +00:00
dependabot[bot]
003149133a Bump actions/setup-node from 4 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:10 +00:00
dependabot[bot]
a43de0ca4d Bump github/codeql-action from 3 to 4
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:06 +00:00
Thomas Leister
e05aaed75c Update manual setup instructions: vue is now vue3
The documentation has not been updated: "vue" directory is now "vue3".
2025-10-27 13:36:57 +01:00
Daan5556
4984e3e31b Added trailing slash to system path 2025-10-27 13:03:53 +01:00
dependabot[bot]
11dce4c6ad Bump vite from 7.1.5 to 7.1.11 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-20 22:56:53 +00:00
Alexander Eifler
8d0d338ea2 feat: add apache reverse proxy documentation 2025-10-15 20:56:39 +02:00
Erik Bledsoe
d7b26d1b29 documentation typo 2025-10-13 13:44:15 -04:00
dependabot[bot]
e292b72e34 Bump vuetify from 3.9.7 to 3.10.3 in /vue3
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.9.7 to 3.10.3.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.10.3/packages/vuetify)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:34:43 +00:00
dependabot[bot]
4e795ecf55 Bump @vueuse/router from 13.6.0 to 13.9.0 in /vue3
Bumps [@vueuse/router](https://github.com/vueuse/vueuse/tree/HEAD/packages/router) from 13.6.0 to 13.9.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v13.9.0/packages/router)

---
updated-dependencies:
- dependency-name: "@vueuse/router"
  dependency-version: 13.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:34:23 +00:00
dependabot[bot]
e3c2a66723 Bump @vue/tsconfig from 0.7.0 to 0.8.1 in /vue3
Bumps [@vue/tsconfig](https://github.com/vuejs/tsconfig) from 0.7.0 to 0.8.1.
- [Release notes](https://github.com/vuejs/tsconfig/releases)
- [Commits](https://github.com/vuejs/tsconfig/compare/v0.7.0...v0.8.1)

---
updated-dependencies:
- dependency-name: "@vue/tsconfig"
  dependency-version: 0.8.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:33:58 +00:00
dependabot[bot]
eec3e97f97 Bump actions/setup-python from 5 to 6
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:04:39 +00:00
dependabot[bot]
3f481d6922 Bump lxml from 5.3.1 to 6.0.2
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.1 to 6.0.2.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.1...lxml-6.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:38 +00:00
dependabot[bot]
0810ab7210 Bump django-debug-toolbar from 4.3.0 to 6.0.0
Bumps [django-debug-toolbar](https://github.com/django-commons/django-debug-toolbar) from 4.3.0 to 6.0.0.
- [Release notes](https://github.com/django-commons/django-debug-toolbar/releases)
- [Changelog](https://github.com/django-commons/django-debug-toolbar/blob/main/docs/changes.rst)
- [Commits](https://github.com/django-commons/django-debug-toolbar/compare/4.3...6.0.0)

---
updated-dependencies:
- dependency-name: django-debug-toolbar
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:32 +00:00
dependabot[bot]
abd621145c Bump pytest from 8.4.1 to 8.4.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.1 to 8.4.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.1...8.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:29 +00:00
dependabot[bot]
7d218aa93d Bump drf-spectacular from 0.27.1 to 0.28.0
Bumps [drf-spectacular](https://github.com/tfranzel/drf-spectacular) from 0.27.1 to 0.28.0.
- [Release notes](https://github.com/tfranzel/drf-spectacular/releases)
- [Changelog](https://github.com/tfranzel/drf-spectacular/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tfranzel/drf-spectacular/compare/0.27.1...0.28.0)

---
updated-dependencies:
- dependency-name: drf-spectacular
  dependency-version: 0.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:24 +00:00
dependabot[bot]
1b41bd9115 Bump pyyaml from 6.0.2 to 6.0.3
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/6.0.3/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.2...6.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:21 +00:00
S
d4f654554b Translated using Weblate (Ukrainian)
Currently translated at 43.9% (380 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-09-23 19:45:37 +00:00
Matjaž T.
c8115545b8 Translated using Weblate (Slovenian)
Currently translated at 100.0% (864 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-09-23 19:45:37 +00:00
Justin Straver
6dbf0871ec Translated using Weblate (Dutch)
Currently translated at 99.5% (860 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-09-23 19:45:36 +00:00
Justin Straver
f1c5c8bc43 Translated using Weblate (German)
Currently translated at 99.1% (857 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-09-23 19:45:36 +00:00
S
22e0108992 Translated using Weblate (Ukrainian)
Currently translated at 18.6% (91 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-09-23 19:45:36 +00:00
Justin Straver
e2e05c8d1d Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2025-09-23 19:45:36 +00:00
Justin Straver
b02b36812d Translated using Weblate (English)
Currently translated at 100.0% (864 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-09-23 19:45:36 +00:00
44 changed files with 14997 additions and 10617 deletions

View File

@@ -35,7 +35,7 @@ jobs:
fi
# Build Vue 3 frontend
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version: '22'
cache: yarn

View File

@@ -13,14 +13,14 @@ jobs:
node-version: ["22"]
steps:
- uses: actions/checkout@v5
- uses: awalsh128/cache-apt-pkgs-action@v1.5.3
- uses: awalsh128/cache-apt-pkgs-action@v1.6.0
with:
packages: libsasl2-dev python3-dev libxml2-dev libxmlsec1-dev libxslt-dev libxmlsec1-openssl libxslt-dev libldap2-dev libssl-dev gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl
version: 1.0
# Setup python & dependencies
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
@@ -43,7 +43,7 @@ jobs:
# Build Vue frontend & Dependencies
- name: Set up Node ${{ matrix.node-version }}
if: steps.django_cache.outputs.cache-hit != 'true'
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"

View File

@@ -25,7 +25,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
# Override language selection by uncommenting this and choosing your languages
with:
languages: python, javascript
@@ -47,6 +47,6 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
with:
languages: javascript, python

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with:
python-version: 3.x
- run: pip install mkdocs-material mkdocs-include-markdown-plugin

View File

@@ -69,16 +69,8 @@ def get_from_scraper(scrape, request):
recipe_json['description'] = parse_description(description)
recipe_json['description'] = automation_engine.apply_regex_replace_automation(recipe_json['description'], Automation.DESCRIPTION_REPLACE)
# assign servings attributes
try:
# dont use scrape.yields() as this will always return "x servings" or "x items", should be improved in scrapers directly
# max(x,1) to prevent 0 servings which breaks scaling
servings = max(scrape.schema.data.get('recipeYield') or 1, 1)
except Exception:
servings = 1
recipe_json['servings'] = parse_servings(servings)
recipe_json['servings_text'] = parse_servings_text(servings)
recipe_json['servings'] = parse_servings(scrape.schema.data.get('recipeYield'))
recipe_json['servings_text'] = parse_servings_text(scrape.schema.data.get('recipeYield'))
# assign time attributes
try:
@@ -407,7 +399,7 @@ def parse_servings(servings):
def parse_servings_text(servings):
if isinstance(servings, str):
try:
servings = re.sub("\\d+", '', servings).strip()
servings = re.sub("\\d+", '', servings, 1).strip()
except Exception:
servings = ''
if isinstance(servings, list):

View File

@@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-22 20:15+0200\n"
"PO-Revision-Date: 2025-09-22 10:09+0000\n"
"PO-Revision-Date: 2025-11-18 07:01+0000\n"
"Last-Translator: Vincenzo Reale <smart2128vr@gmail.com>\n"
"Language-Team: Italian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/it/>\n"
@@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13.1\n"
"X-Generator: Weblate 5.13.3\n"
#: .\cookbook\forms.py:50
msgid "Default"
@@ -126,54 +126,52 @@ msgid "ferment"
msgstr "fermentare"
#: .\cookbook\helper\recipe_url_import.py:325
#, fuzzy
#| msgid "Last cooked"
msgid "slow cook"
msgstr "Cucinato di recente"
msgstr "cottura lenta"
#: .\cookbook\helper\recipe_url_import.py:326
msgid "egg boiler"
msgstr ""
msgstr "bollitore per uova"
#: .\cookbook\helper\recipe_url_import.py:327
msgid "kettle"
msgstr ""
msgstr "teiera"
#: .\cookbook\helper\recipe_url_import.py:328
msgid "blend"
msgstr ""
msgstr "miscela"
#: .\cookbook\helper\recipe_url_import.py:329
msgid "pre-clean"
msgstr ""
msgstr "pre-pulizia"
#: .\cookbook\helper\recipe_url_import.py:330
msgid "high temperature"
msgstr ""
msgstr "alta temperatura"
#: .\cookbook\helper\recipe_url_import.py:331
msgid "rice cooker"
msgstr ""
msgstr "cuociriso"
#: .\cookbook\helper\recipe_url_import.py:332
msgid "caramelize"
msgstr ""
msgstr "caramellare"
#: .\cookbook\helper\recipe_url_import.py:333
msgid "peeler"
msgstr ""
msgstr "pelapatate"
#: .\cookbook\helper\recipe_url_import.py:334
msgid "slicer"
msgstr ""
msgstr "affettatrice"
#: .\cookbook\helper\recipe_url_import.py:335
msgid "grater"
msgstr ""
msgstr "grattugia"
#: .\cookbook\helper\recipe_url_import.py:336
msgid "spiralizer"
msgstr ""
msgstr "tagliaverdure a spirale"
#: .\cookbook\helper\recipe_url_import.py:337
msgid "sous-vide"
@@ -235,7 +233,7 @@ msgstr "Carboidrati"
#: .\cookbook\integration\mealie1.py:212
msgid "Cholesterol"
msgstr ""
msgstr "Colesterolo"
#: .\cookbook\integration\mealie1.py:213
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
@@ -244,33 +242,31 @@ msgstr "Grassi"
#: .\cookbook\integration\mealie1.py:214
msgid "Fiber"
msgstr ""
msgstr "Fibra"
#: .\cookbook\integration\mealie1.py:215
#, fuzzy
#| msgid "Proteins"
msgid "Protein"
msgstr "Proteine"
msgstr "Proteina"
#: .\cookbook\integration\mealie1.py:216
msgid "Saturated Fat"
msgstr ""
msgstr "Grasso saturo"
#: .\cookbook\integration\mealie1.py:217
msgid "Sodium"
msgstr ""
msgstr "Sodio"
#: .\cookbook\integration\mealie1.py:218
msgid "Sugar"
msgstr ""
msgstr "Zucchero"
#: .\cookbook\integration\mealie1.py:219
msgid "Trans Fat"
msgstr ""
msgstr "Grasso trans"
#: .\cookbook\integration\mealie1.py:220
msgid "Unsaturated Fat"
msgstr ""
msgstr "Grasso insaturo"
#: .\cookbook\integration\openeats.py:28
msgid "Recipe source:"
@@ -484,7 +480,7 @@ msgstr "Hai raggiungo il limite per il caricamento dei file."
#: .\cookbook\serializer.py:281
msgid "The given file type is not allowed."
msgstr ""
msgstr "Il tipo di filo specificato non è consentito."
#: .\cookbook\serializer.py:421 .\cookbook\views\views.py:94
msgid ""
@@ -493,7 +489,7 @@ msgstr "Hai raggiunto il numero massimo di istanze di tua proprietà."
#: .\cookbook\serializer.py:434
msgid "Space Name must be unique."
msgstr ""
msgstr "Il nome dello spazio deve essere univoco."
#: .\cookbook\serializer.py:469
msgid "Cannot modify Space owner permission."
@@ -847,10 +843,8 @@ msgid "We are sorry, but the sign up is currently closed."
msgstr "Spiacenti, al momento le iscrizioni sono chiuse."
#: .\cookbook\templates\frontend\tandoor.html:15
#, fuzzy
#| msgid "Tandoor Recipes Invite"
msgid "Tandoor Recipe Manager"
msgstr "Invito per Tandoor Recipes"
msgstr "Gestore delle ricette Tandoor"
#: .\cookbook\templates\index.html:28
msgid "Search recipe ..."
@@ -1442,8 +1436,6 @@ msgstr ""
" %(site_name)s. Per finire, completa il modulo seguente:"
#: .\cookbook\templates\socialaccount\signup.html:32
#, fuzzy
#| msgid "I accept the follwoing"
msgid "I accept the following"
msgstr "Accetto i seguenti"
@@ -1529,15 +1521,6 @@ msgid "System"
msgstr "Sistema"
#: .\cookbook\templates\system.html:24
#, fuzzy
#| msgid ""
#| "\n"
#| " Django Recipes is an open source free software application. It "
#| "can be found on\n"
#| " <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
#| " Changelogs can be found <a href=\"https://github.com/vabene1111/"
#| "recipes/releases\">here</a>.\n"
#| " "
msgid ""
"\n"
" Tandoor Recipes is an open source free software application. It can "
@@ -1548,11 +1531,11 @@ msgid ""
" "
msgstr ""
"\n"
" Django Recipes è una applicazione gratuita e open source. È "
" Tandoor Recipes è una applicazione gratuita e open source. È "
"disponibile su\n"
" <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
" Puoi consultare le ultime novità <a href=\"https://github.com/"
"vabene1111/recipes/releases\">qui</a>.\n"
" <a href=\"https://github.com/TandoorRecipes/recipes\">GitHub</a>.\n"
" Puoi consultare le ultime novità <a href="
"\"https://github.com/TandoorRecipes/recipes/releases\">qui</a>.\n"
" "
#: .\cookbook\templates\system.html:30
@@ -1574,7 +1557,7 @@ msgstr ""
#: .\cookbook\templates\system.html:56
msgid "Plugins"
msgstr ""
msgstr "Estensioni"
#: .\cookbook\templates\system.html:67
msgid "Media Serving"
@@ -1802,18 +1785,12 @@ msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} è stato aggiunto alla lista della spesa."
#: .\cookbook\views\api.py:1239
#, fuzzy
#| msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgid "Filter meal plans from date (inclusive)."
msgstr ""
"Filtra i piani alimentari in base alla data (inclusa) nel formato AAAA-MM-GG."
msgstr "Filtra i piani alimentari dalla data (inclusa)."
#: .\cookbook\views\api.py:1241
#, fuzzy
#| msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgid "Filter meal plans to date (inclusive)."
msgstr ""
"Filtra i piani alimentari fino alla data (inclusa) nel formato AAAA-MM-GG."
msgstr "Filtra i piani alimentari fino alla data (inclusa)."
#: .\cookbook\views\api.py:1244
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
@@ -1940,115 +1917,70 @@ msgstr "ID dell'unità che una ricetta dovrebbe avere."
#: .\cookbook\views\api.py:1464
msgid "Exact rating of recipe"
msgstr ""
msgstr "Valutazione precisa della ricetta"
#: .\cookbook\views\api.py:1465
#, fuzzy
#| msgid "ID of unit a recipe should have."
msgid "Rating a recipe should have or greater."
msgstr "ID dell'unità che una ricetta dovrebbe avere."
msgstr "La valutazione che una ricetta dovrebbe avere o superiore."
#: .\cookbook\views\api.py:1466
#, fuzzy
#| msgid "ID of unit a recipe should have."
msgid "Rating a recipe should have or smaller."
msgstr "ID dell'unità che una ricetta dovrebbe avere."
msgstr "La valutazione che una ricetta dovrebbe avere o inferiore."
#: .\cookbook\views\api.py:1468
msgid "Filter recipes cooked X times."
msgstr ""
msgstr "Filtra le ricette cucinate N volte."
#: .\cookbook\views\api.py:1469
#, fuzzy
#| msgid ""
#| "Filter recipes cooked X times or more. Negative values returns cooked "
#| "less than X times"
msgid "Filter recipes cooked X times or more."
msgstr ""
"Filtra le ricette cucinate X volte o più. I valori negativi restituiscono "
"ricette cucinate meno di X volte"
msgstr "Filtra le ricette cucinate N volte o più."
#: .\cookbook\views\api.py:1470
msgid "Filter recipes cooked X times or less."
msgstr ""
msgstr "Filtra le ricette cucinate N volte o meno."
#: .\cookbook\views\api.py:1472
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes created on the given date."
msgstr "Filtra le voci con la ricetta specificata"
msgstr "Filtra create alla data specificata."
#: .\cookbook\views\api.py:1473
#, fuzzy
#| msgid ""
#| "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
#| "before date."
msgid "Filter recipes created on the given date or after."
msgstr ""
"Filtra le ricette create il o dopo AAAA-MM-GG. Anteponendo: filtra alla data "
"o prima della data."
msgstr "Filtra le ricette create alla data specificata o dopo."
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid ""
#| "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
#| "before date."
msgid "Filter recipes created on the given date or before."
msgstr ""
"Filtra le ricette create il o dopo AAAA-MM-GG. Anteponendo: filtra alla data "
"o prima della data."
msgstr "Filtra le ricette create alla data specificata o prima."
#: .\cookbook\views\api.py:1476 .\cookbook\views\api.py:1477
#: .\cookbook\views\api.py:1478
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes updated on the given date."
msgstr "Filtra le voci con la ricetta specificata"
msgstr "Filtra le ricette aggiornate alla data specificata."
#: .\cookbook\views\api.py:1480
#, fuzzy
#| msgid ""
#| "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes last cooked on the given date or after."
msgstr ""
"Filtra le ricette cucinate l'ultima volta il o dopo AAAA-MM-GG. Anteponendo "
"- filtra alla data o prima della data."
msgstr "Filtra le ricette cucinate l'ultima volta alla data specificata o dopo."
#: .\cookbook\views\api.py:1481
#, fuzzy
#| msgid ""
#| "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes last cooked on the given date or before."
msgstr ""
"Filtra le ricette cucinate l'ultima volta il o dopo AAAA-MM-GG. Anteponendo "
"- filtra alla data o prima della data."
"Filtra le ricette cucinate l'ultima volta alla data specificata o prima."
#: .\cookbook\views\api.py:1483 .\cookbook\views\api.py:1484
#, fuzzy
#| msgid ""
#| "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes lasts viewed on the given date."
msgstr ""
"Filtra le ricette visualizzate per ultime il o dopo AAAA-MM-GG. Anteponendo "
"- filtra alla data o prima della data."
msgstr "Filtra le ricette visualizzate per ultime alla data specificata."
#: .\cookbook\views\api.py:1486
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes for ones created by the given user ID"
msgstr "Filtra le voci con la ricetta specificata"
msgstr "Filtra le ricette create dall'ID utente specificato"
#: .\cookbook\views\api.py:1487
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
msgstr ""
"Se devono essere restituite solo le ricette interne. [vero/<b>falso</b>]"
"Se devono essere restituite solo le ricette interne. [true/<b>false</b>]"
#: .\cookbook\views\api.py:1488
msgid "Returns the results in randomized order. [true/<b>false</b>]"
msgstr "Restituisce i risultati in ordine casuale. [vero/<b>falso</b>]"
msgstr "Restituisce i risultati in ordine casuale. [true/<b>false</b>]"
#: .\cookbook\views\api.py:1490
msgid ""
@@ -2056,6 +1988,9 @@ msgid ""
"lastcooked,-lastcooked,rating,-rating,times_cooked,-times_cooked,created_at,-"
"created_at,lastviewed,-lastviewed"
msgstr ""
"Determina l'ordine dei risultati. Le opzioni sono: "
"score,-score,name,-name,lastcooked,-lastcooked,rating,-rating,times_cooked,-times_cooked,created_at,-created_at,lastviewed,-lastviewed"
""
#: .\cookbook\views\api.py:1492
msgid "Returns new results first in search results. [true/<b>false</b>]"
@@ -2068,10 +2003,14 @@ msgid ""
"Returns the given number of recently viewed recipes before search results "
"(if given)"
msgstr ""
"Restituisce il numero specificato di ricette visualizzate di recente prima "
"dei risultati di ricerca (se indicati)"
#: .\cookbook\views\api.py:1494
msgid "ID of a custom filter. Returns all recipes matched by that filter."
msgstr ""
"ID di un filtro personalizzato. Restituisce tutte le ricette verificate da "
"quel filtro."
#: .\cookbook\views\api.py:1495
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
@@ -2084,48 +2023,47 @@ msgid ""
"Return the PropertyTypes matching the property category. Repeat for "
"multiple."
msgstr ""
"Restituisci i PropertyTypes corrispondenti alla categoria di proprietà. "
"Ripeti per più di uno."
#: .\cookbook\views\api.py:1804 .\cookbook\views\api.py:1860
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Returns only entries associated with the given mealplan id"
msgstr "Filtra le voci con la ricetta specificata"
msgstr ""
"Restituisce solo le voci associate all'ID del piano alimentare specificato"
#: .\cookbook\views\api.py:1858
msgid ""
"Returns only elements updated after the given timestamp in ISO 8601 format."
msgstr ""
"Restituisce solo gli elementi aggiornati dopo la marca temporale specificata "
"nel formato ISO 8601."
#: .\cookbook\views\api.py:2031
#, fuzzy
#| msgid ""
#| "Return the Automations matching the automation type. Multiple values "
#| "allowed."
msgid ""
"Return the Automations matching the automation type. Repeat for multiple."
msgstr ""
"Restituisce le automazioni corrispondenti al tipo di automazione. Sono "
"consentiti più valori."
"Restituisci le automazioni corrispondenti al tipo di automazione. Ripeti per "
"più automazioni."
#: .\cookbook\views\api.py:2048
msgid ""
"Text field to store data that gets carried over to the UserSpace created "
"from the InviteLink"
msgstr ""
"Campo di testo per memorizzare i dati che vengono trasferiti allo spazio "
"utente creato dal collegamento di invito"
#: .\cookbook\views\api.py:2049
msgid "Only return InviteLinks that have not been used yet."
msgstr ""
"Restituisci solo i collegamenti di invito che non sono ancora stati "
"utilizzati."
#: .\cookbook\views\api.py:2076
#, fuzzy
#| msgid ""
#| "Return the Automations matching the automation type. Multiple values "
#| "allowed."
msgid "Return the CustomFilters matching the model type. Repeat for multiple."
msgstr ""
"Restituisce le automazioni corrispondenti al tipo di automazione. Sono "
"consentiti più valori."
"Restituisci i CustomFilters corrispondenti al tipo di modello. Ripeti per "
"più di un modello."
#: .\cookbook\views\api.py:2176
msgid "Nothing to do."
@@ -2149,13 +2087,15 @@ msgstr "Nessuna informazione utilizzabile è stata trovata."
#: .\cookbook\views\api.py:2286 .\cookbook\views\api.py:2434
msgid "You must select an AI provider to perform your request."
msgstr ""
msgstr "Devi selezionare un fornitore AI per eseguire la tua richiesta."
#: .\cookbook\views\api.py:2293 .\cookbook\views\api.py:2441
msgid ""
"You don't have any credits remaining to use AI or AI features are not "
"enabled for your space."
msgstr ""
"Non hai credito rimanente per utilizzare l'AI o le funzionalità di AI "
"abilitate per il tuo spazio."
#: .\cookbook\views\api.py:2499 .\cookbook\views\api.py:2667
msgid "File is above space limit"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-22 20:15+0200\n"
"PO-Revision-Date: 2024-11-19 06:58+0000\n"
"PO-Revision-Date: 2025-11-15 12:08+0000\n"
"Last-Translator: \"Matjaž T.\" <matjaz@moj-svet.si>\n"
"Language-Team: Slovenian <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/sl/>\n"
@@ -16,9 +16,9 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 5.6.2\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 5.13.3\n"
#: .\cookbook\forms.py:50
msgid "Default"
@@ -123,51 +123,51 @@ msgstr "fermentiramo"
#: .\cookbook\helper\recipe_url_import.py:325
msgid "slow cook"
msgstr ""
msgstr "počasno kuhanje"
#: .\cookbook\helper\recipe_url_import.py:326
msgid "egg boiler"
msgstr ""
msgstr "kuhalnik jajc"
#: .\cookbook\helper\recipe_url_import.py:327
msgid "kettle"
msgstr ""
msgstr "kotel"
#: .\cookbook\helper\recipe_url_import.py:328
msgid "blend"
msgstr ""
msgstr "mešanica"
#: .\cookbook\helper\recipe_url_import.py:329
msgid "pre-clean"
msgstr ""
msgstr "predhodno čiščenje"
#: .\cookbook\helper\recipe_url_import.py:330
msgid "high temperature"
msgstr ""
msgstr "visoka temperatura"
#: .\cookbook\helper\recipe_url_import.py:331
msgid "rice cooker"
msgstr ""
msgstr "kuhalnik riža"
#: .\cookbook\helper\recipe_url_import.py:332
msgid "caramelize"
msgstr ""
msgstr "karamelizirati"
#: .\cookbook\helper\recipe_url_import.py:333
msgid "peeler"
msgstr ""
msgstr "lupilec"
#: .\cookbook\helper\recipe_url_import.py:334
msgid "slicer"
msgstr ""
msgstr "rezalnik"
#: .\cookbook\helper\recipe_url_import.py:335
msgid "grater"
msgstr ""
msgstr "strgalo"
#: .\cookbook\helper\recipe_url_import.py:336
msgid "spiralizer"
msgstr ""
msgstr "spiralizator"
#: .\cookbook\helper\recipe_url_import.py:337
msgid "sous-vide"
@@ -229,7 +229,7 @@ msgstr "Ogljikovi hidrati"
#: .\cookbook\integration\mealie1.py:212
msgid "Cholesterol"
msgstr ""
msgstr "Holesterol"
#: .\cookbook\integration\mealie1.py:213
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
@@ -238,33 +238,31 @@ msgstr "Maščoba"
#: .\cookbook\integration\mealie1.py:214
msgid "Fiber"
msgstr ""
msgstr "Vlaknine"
#: .\cookbook\integration\mealie1.py:215
#, fuzzy
#| msgid "Proteins"
msgid "Protein"
msgstr "Beljakovine"
#: .\cookbook\integration\mealie1.py:216
msgid "Saturated Fat"
msgstr ""
msgstr "Nasičene maščobe"
#: .\cookbook\integration\mealie1.py:217
msgid "Sodium"
msgstr ""
msgstr "Natrij"
#: .\cookbook\integration\mealie1.py:218
msgid "Sugar"
msgstr ""
msgstr "Sladkor"
#: .\cookbook\integration\mealie1.py:219
msgid "Trans Fat"
msgstr ""
msgstr "Trans maščobe"
#: .\cookbook\integration\mealie1.py:220
msgid "Unsaturated Fat"
msgstr ""
msgstr "Nenasičene maščobe"
#: .\cookbook\integration\openeats.py:28
msgid "Recipe source:"
@@ -478,7 +476,7 @@ msgstr "Dosegli ste omejitev nalaganja datotek."
#: .\cookbook\serializer.py:281
msgid "The given file type is not allowed."
msgstr ""
msgstr "Navedena vrsta datoteke ni dovoljena."
#: .\cookbook\serializer.py:421 .\cookbook\views\views.py:94
msgid ""
@@ -487,7 +485,7 @@ msgstr "Dosegli ste največje število prostorov, ki so lahko v vaši lasti."
#: .\cookbook\serializer.py:434
msgid "Space Name must be unique."
msgstr ""
msgstr "Ime prostora mora biti edinstveno."
#: .\cookbook\serializer.py:469
msgid "Cannot modify Space owner permission."
@@ -838,10 +836,8 @@ msgid "We are sorry, but the sign up is currently closed."
msgstr "Žal nam je, vendar so registracije trenutno zaprte."
#: .\cookbook\templates\frontend\tandoor.html:15
#, fuzzy
#| msgid "Tandoor Recipes Invite"
msgid "Tandoor Recipe Manager"
msgstr "Tandoor Recepti vabilo"
msgstr "Urejevalnik Tandoor Recepti"
#: .\cookbook\templates\index.html:28
msgid "Search recipe ..."
@@ -1428,8 +1424,6 @@ msgstr ""
" %(site_name)s. Kot zadnji korak izpolnite naslednji obrazec:"
#: .\cookbook\templates\socialaccount\signup.html:32
#, fuzzy
#| msgid "I accept the follwoing"
msgid "I accept the following"
msgstr "Sprejemam naslednje"
@@ -1514,15 +1508,6 @@ msgid "System"
msgstr "Sistem"
#: .\cookbook\templates\system.html:24
#, fuzzy
#| msgid ""
#| "\n"
#| " Django Recipes is an open source free software application. It "
#| "can be found on\n"
#| " <a href=\"https://github.com/vabene1111/recipes\">GitHub</a>.\n"
#| " Changelogs can be found <a href=\"https://github.com/vabene1111/"
#| "recipes/releases\">here</a>.\n"
#| " "
msgid ""
"\n"
" Tandoor Recipes is an open source free software application. It can "
@@ -1533,11 +1518,11 @@ msgid ""
" "
msgstr ""
"\n"
" Django Recipes je odprtokodna brezplačna programska aplikacija. "
"Najdete ga na GitHub\n"
" <a href=\"https://github.com/vabene1111/recipes\"></a>.\n"
" Dnevnike sprememb lahko najdete tukaj <a href=\"https://github.com/"
"vabene1111/recipes/releases\"></a>.\n"
" Tandoor Recipes je odprtokodna brezplačna programska oprema. Najdete "
"jo na\n"
" <a href=\"https://github.com/TandoorRecipes/recipes\">GitHub</a>.\n"
" Dnevnike sprememb najdete <a href="
"\"https://github.com/TandoorRecipes/recipes/releases\">tukaj</a>.\n"
" "
#: .\cookbook\templates\system.html:30
@@ -1559,7 +1544,7 @@ msgstr ""
#: .\cookbook\templates\system.html:56
msgid "Plugins"
msgstr ""
msgstr "Vtičniki"
#: .\cookbook\templates\system.html:67
msgid "Media Serving"
@@ -1789,16 +1774,12 @@ msgid "{obj.name} was added to the shopping list."
msgstr "{obj.name} je bil dodan na nakupovalni seznam."
#: .\cookbook\views\api.py:1239
#, fuzzy
#| msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
msgid "Filter meal plans from date (inclusive)."
msgstr "Filtrirajte načrte obrokov od datuma (vključno) v obliki LLLL-MM-DD."
msgstr "Filtriraj načrte obrokov od datuma (vključno)."
#: .\cookbook\views\api.py:1241
#, fuzzy
#| msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
msgid "Filter meal plans to date (inclusive)."
msgstr "Filtrirajte dosedanje načrte obrokov (vključno) v obliki LLLL-MM-DD."
msgstr "Filtriraj načrte obrokov do danes (vključno)."
#: .\cookbook\views\api.py:1244
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
@@ -1905,106 +1886,62 @@ msgstr "ID enote, ki bi jo moral imeti recept."
#: .\cookbook\views\api.py:1464
msgid "Exact rating of recipe"
msgstr ""
msgstr "Natančna ocena recepta"
#: .\cookbook\views\api.py:1465
#, fuzzy
#| msgid "ID of unit a recipe should have."
msgid "Rating a recipe should have or greater."
msgstr "ID enote, ki bi jo moral imeti recept."
msgstr "Ocena, ki bi jo moral imeti recept, ali višja."
#: .\cookbook\views\api.py:1466
#, fuzzy
#| msgid "ID of unit a recipe should have."
msgid "Rating a recipe should have or smaller."
msgstr "ID enote, ki bi jo moral imeti recept."
msgstr "Ocena, ki jo mora imeti recept, je 1 ali manjša."
#: .\cookbook\views\api.py:1468
msgid "Filter recipes cooked X times."
msgstr ""
msgstr "Filtriraj recepte, kuhane X-krat."
#: .\cookbook\views\api.py:1469
#, fuzzy
#| msgid ""
#| "Filter recipes cooked X times or more. Negative values returns cooked "
#| "less than X times"
msgid "Filter recipes cooked X times or more."
msgstr ""
"Filtrirajte recepte, kuhane X-krat ali večkrat. Negativne vrednosti se "
"vrnejo kuhane manj kot X-krat"
msgstr "Filtriraj recepte, kuhane X-krat ali večkrat."
#: .\cookbook\views\api.py:1470
msgid "Filter recipes cooked X times or less."
msgstr ""
msgstr "Filtriraj recepte, kuhane X-krat ali manj."
#: .\cookbook\views\api.py:1472
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes created on the given date."
msgstr "Filter za vnose z danim receptom"
msgstr "Filtriraj recepte, ustvarjene na določen datum."
#: .\cookbook\views\api.py:1473
#, fuzzy
#| msgid ""
#| "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
#| "before date."
msgid "Filter recipes created on the given date or after."
msgstr ""
"Filtrirajte recepte, ustvarjene LLLL-MM-DD ali pozneje. Pred - filtrira na "
"ali pred datumom."
msgstr "Filtriraj recepte, ustvarjene na določen datum ali pozneje."
#: .\cookbook\views\api.py:1474
#, fuzzy
#| msgid ""
#| "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or "
#| "before date."
msgid "Filter recipes created on the given date or before."
msgstr ""
"Filtrirajte recepte, ustvarjene LLLL-MM-DD ali pozneje. Pred - filtrira na "
"ali pred datumom."
msgstr "Filtriraj recepte, ustvarjene na določen datum ali prej."
#: .\cookbook\views\api.py:1476 .\cookbook\views\api.py:1477
#: .\cookbook\views\api.py:1478
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes updated on the given date."
msgstr "Filter za vnose z danim receptom"
msgstr "Filtriraj recepte, posodobljene na navedeni datum."
#: .\cookbook\views\api.py:1480
#, fuzzy
#| msgid ""
#| "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes last cooked on the given date or after."
msgstr ""
"Filtriraj recepte, nazadnje kuhane LLLL-MM-DD ali pozneje. Pred - filtrira "
"na ali pred datumom."
"Filtriraj recepte, ki so bili nazadnje kuhani na določen datum ali pozneje."
#: .\cookbook\views\api.py:1481
#, fuzzy
#| msgid ""
#| "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes last cooked on the given date or before."
msgstr ""
"Filtriraj recepte, nazadnje kuhane LLLL-MM-DD ali pozneje. Pred - filtrira "
"na ali pred datumom."
"Filtriraj recepte, ki so bili nazadnje kuhani na določen datum ali prej."
#: .\cookbook\views\api.py:1483 .\cookbook\views\api.py:1484
#, fuzzy
#| msgid ""
#| "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters "
#| "on or before date."
msgid "Filter recipes lasts viewed on the given date."
msgstr ""
"Recepti filtrov so zadnjič prikazani LLLL-MM-DD ali pozneje. Pred - filtrira "
"na ali pred datumom."
msgstr "Filtriraj recepte, ki so bili nazadnje ogledani na določen datum."
#: .\cookbook\views\api.py:1486
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Filter recipes for ones created by the given user ID"
msgstr "Filter za vnose z danim receptom"
msgstr "Filtriraj recepte po tistih, ki jih je ustvaril dani uporabniški ID"
#: .\cookbook\views\api.py:1487
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
@@ -2021,6 +1958,9 @@ msgid ""
"lastcooked,-lastcooked,rating,-rating,times_cooked,-times_cooked,created_at,-"
"created_at,lastviewed,-lastviewed"
msgstr ""
"Določa vrstni red rezultatov. Možnosti so: "
"score,-score,name,-name,lastcooked,-lastcooked,rating,-rating,times_cooked,-times_cooked,created_at,-created_at,lastviewed,-lastviewed"
""
#: .\cookbook\views\api.py:1492
msgid "Returns new results first in search results. [true/<b>false</b>]"
@@ -2031,10 +1971,12 @@ msgid ""
"Returns the given number of recently viewed recipes before search results "
"(if given)"
msgstr ""
"Vrne podano število nedavno ogledanih receptov pred rezultati iskanja "
"(če je podano)"
#: .\cookbook\views\api.py:1494
msgid "ID of a custom filter. Returns all recipes matched by that filter."
msgstr ""
msgstr "ID filtra po meri. Vrne vse recepte, ki se ujemajo s tem filtrom."
#: .\cookbook\views\api.py:1495
msgid "Filter recipes that can be made with OnHand food. [true/<b>false</b>]"
@@ -2047,48 +1989,43 @@ msgid ""
"Return the PropertyTypes matching the property category. Repeat for "
"multiple."
msgstr ""
"Vrne vrste lastnosti (PropertyTypes), ki ustrezajo kategoriji lastnosti. "
"Ponovite za več vrst lastnosti."
#: .\cookbook\views\api.py:1804 .\cookbook\views\api.py:1860
#, fuzzy
#| msgid "Filter for entries with the given recipe"
msgid "Returns only entries associated with the given mealplan id"
msgstr "Filter za vnose z danim receptom"
msgstr "Vrne samo vnose, povezane z danim ID-jem načrta obrokov"
#: .\cookbook\views\api.py:1858
msgid ""
"Returns only elements updated after the given timestamp in ISO 8601 format."
msgstr ""
"Vrne samo elemente, posodobljene po danem časovnem žigu v formatu ISO 8601."
#: .\cookbook\views\api.py:2031
#, fuzzy
#| msgid ""
#| "Return the Automations matching the automation type. Multiple values "
#| "allowed."
msgid ""
"Return the Automations matching the automation type. Repeat for multiple."
msgstr ""
"Vrnite avtomatizacije, ki ustrezajo vrsti avtomatizacije. Dovoljenih je "
"več vrednosti."
"Vrne avtomatizacije, ki ustrezajo vrsti avtomatizacije. Ponovite za več "
"avtomatizacij."
#: .\cookbook\views\api.py:2048
msgid ""
"Text field to store data that gets carried over to the UserSpace created "
"from the InviteLink"
msgstr ""
"Besedilno polje za shranjevanje podatkov, ki se prenesejo v uporabniški "
"prostor, ustvarjen iz InviteLink"
#: .\cookbook\views\api.py:2049
msgid "Only return InviteLinks that have not been used yet."
msgstr ""
msgstr "Vrni samo povezave InviteLink, ki še niso bile uporabljene."
#: .\cookbook\views\api.py:2076
#, fuzzy
#| msgid ""
#| "Return the Automations matching the automation type. Multiple values "
#| "allowed."
msgid "Return the CustomFilters matching the model type. Repeat for multiple."
msgstr ""
"Vrnite avtomatizacije, ki ustrezajo vrsti avtomatizacije. Dovoljenih je "
"več vrednosti."
"Vrne filtre CustomFilters, ki ustrezajo vrsti modela. Ponovite za več "
"filtrov."
#: .\cookbook\views\api.py:2176
msgid "Nothing to do."
@@ -2112,13 +2049,15 @@ msgstr "Uporabnih podatkov ni bilo mogoče najti."
#: .\cookbook\views\api.py:2286 .\cookbook\views\api.py:2434
msgid "You must select an AI provider to perform your request."
msgstr ""
msgstr "Za izvedbo vaše zahteve morate izbrati ponudnika umetne inteligence."
#: .\cookbook\views\api.py:2293 .\cookbook\views\api.py:2441
msgid ""
"You don't have any credits remaining to use AI or AI features are not "
"enabled for your space."
msgstr ""
"Nimate več kreditov za uporabo umetne inteligence ali pa funkcije umetne "
"inteligence niso omogočene za vaš prostor."
#: .\cookbook\views\api.py:2499 .\cookbook\views\api.py:2667
msgid "File is above space limit"

File diff suppressed because it is too large Load Diff

View File

@@ -2562,6 +2562,13 @@ class AiImportView(APIView):
'msg': "Error parsing AI results. Response Text:\n\n" + response_text
}
return Response(RecipeFromSourceResponseSerializer(context={'request': request}).to_representation(response), status=status.HTTP_400_BAD_REQUEST)
except Exception:
traceback.print_exc()
response = {
'error': True,
'msg': "Error processing AI results. Response Text:\n\n" + response_text + "\n\n" + traceback.format_exc()
}
return Response(RecipeFromSourceResponseSerializer(context={'request': request}).to_representation(response), status=status.HTTP_400_BAD_REQUEST)
else:
response = {
'error': True,

View File

@@ -33,4 +33,4 @@ Convert pictures of recipes to a structure that can be imported to Tandoor with
Maintained by [smilerz](https://github.com/smilerz/tandoor-menu-generator)
Generate a mealplan tbased on complex criteria and optionally insert it into an SVG menu template.
Generate a meal plan based on complex criteria and optionally insert it into an SVG menu template.

View File

@@ -36,7 +36,7 @@ then make sure you have set [all required headers](install/docker.md#required-he
If that doesn't fix it, you can also refer to the appropriate sub section in the [reverse proxy documentation](install/docker.md#reverse-proxy) and verify your general webserver configuration.
### Required Headers
Navigate to `/system` and review the headers listed in the DEBUG section. At a minimum, if you are using a reverse proxy the headers must match the below conditions.
Navigate to `/system/` and review the headers listed in the DEBUG section. At a minimum, if you are using a reverse proxy the headers must match the below conditions.
| Header | Requirement |
| :--- | :---- |

View File

@@ -69,8 +69,6 @@ wget https://raw.githubusercontent.com/vabene1111/recipes/develop/docs/install/d
Most deployments will likely use a reverse proxy.
If your reverse proxy is not listed below, please refer to chapter [Others](#others).
#### **Traefik**
If you use Traefik, this configuration is the one for you.
@@ -115,6 +113,17 @@ wget https://raw.githubusercontent.com/vabene1111/recipes/develop/docs/install/d
{% include "./docker/nginx-proxy/docker-compose.yml" %}
~~~
#### **Apache proxy**
If you use Apache as a reverse proxy, this configuration is the one for you.
~~~yaml
{% include "./docker/apache-proxy/docker-compose.yml" %}
~~~
Keep in mind, that the port configured for the service `web_recipes` should be the same as in chapter [Required Headers: Apache](#apache).
## **DockSTARTer**
The main goal of [DockSTARTer](https://dockstarter.com/) is to make it quick and easy to get up and running with Docker.
@@ -139,7 +148,8 @@ if you manually change it/bind the folder as a volume.
Please be sure to supply all required headers in your nginx/Apache/Caddy/... configuration!
nginx:
#### **nginx**
```nginx
location / {
proxy_set_header Host $http_host; # try $host instead if this doesn't work
@@ -149,7 +159,8 @@ location / {
}
```
Apache:
#### **Apache**
```apache
RequestHeader set X-Forwarded-Proto "https"
Header always set Access-Control-Allow-Origin "*"

View File

@@ -0,0 +1,24 @@
services:
db_recipes:
restart: always
image: postgres:16-alpine
volumes:
- ./postgresql:/var/lib/postgresql/data
env_file:
- ./.env
web_recipes:
restart: always
image: vabene1111/recipes
ports:
- 127.0.0.1:8080:80 # replace port
env_file:
- ./.env
volumes:
- staticfiles:/opt/recipes/staticfiles
- ./mediafiles:/opt/recipes/mediafiles
depends_on:
- db_recipes
volumes:
staticfiles:

View File

@@ -77,10 +77,10 @@ Using binaries from the virtual env:
/var/www/recipes/bin/pip3 install -r requirements.txt
```
You will also need to install front end requirements and build them. For this navigate to the `./vue` folder and run
You will also need to install front end requirements and build them. For this navigate to the `./vue3` folder and run
```shell
cd ./vue
cd ./vue3
yarn install
yarn build
```
@@ -224,7 +224,7 @@ bin/python3 manage.py migrate
bin/python3 manage.py collectstatic --no-input
bin/python3 manage.py collectstatic_js_reverse
# change to frontend directory
cd vue
cd vue3
# install and build frontend
yarn install
yarn build

View File

@@ -34,7 +34,7 @@ urlpatterns = [
),
]
if settings.DEBUG:
if settings.DEBUG and settings.DEBUG_TOOLBAR:
urlpatterns += path('__debug__/', include('debug_toolbar.urls')),
if settings.ENABLE_METRICS:

View File

@@ -1,18 +1,18 @@
Django==5.2.7
Django==5.2.8
cryptography===45.0.5
django-annoying==0.10.6
django-cleanup==9.0.0
django-crispy-forms==2.4
crispy-bootstrap4==2025.6
djangorestframework==3.16.1
drf-spectacular==0.27.1
drf-spectacular==0.28.0
drf-spectacular-sidecar==2025.8.1
drf-writable-nested==0.7.2
django-oauth-toolkit==2.4.0
django-debug-toolbar==4.3.0
django-debug-toolbar==6.0.0
bleach==6.2.0
gunicorn==23.0.0
lxml==5.3.1
lxml==6.0.2
Markdown==3.7
Pillow==11.3.0
psycopg2-binary==2.9.10
@@ -22,14 +22,14 @@ six==1.17.0
webdavclient3==3.14.6
whitenoise==6.8.2
icalendar==6.3.1
pyyaml==6.0.2
pyyaml==6.0.3
uritemplate==4.1.1
beautifulsoup4==4.12.3
microdata==0.8.0
mock==5.2.0
Jinja2==3.1.6
django-allauth[mfa,socialaccount]==65.9.0
recipe-scrapers==15.8.0
recipe-scrapers==15.10.0
django-scopes==2.0.0
django-treebeard==4.7.1
django-cors-headers==4.6.0
@@ -53,7 +53,7 @@ django-vite==3.1.0
litellm==1.64.1
# Development
pytest==8.4.1
pytest==8.4.2
pytest-django==4.11.0
pytest-cov===6.2.1
pytest-factoryboy==2.8.1

View File

@@ -13,7 +13,7 @@
"@types/sortablejs": "^1.15.8",
"@vueform/multiselect": "^2.6.11",
"@vueuse/core": "^13.6.0",
"@vueuse/router": "^13.6.0",
"@vueuse/router": "^13.9.0",
"luxon": "^3.7.1",
"mavon-editor": "^3.0.1",
"pinia": "^3.0.2",
@@ -23,7 +23,7 @@
"vue-router": "^4.5.0",
"vue-simple-calendar": "7.1.0",
"vuedraggable": "^4.1.0",
"vuetify": "^3.9.7"
"vuetify": "^3.10.3"
},
"devDependencies": {
"@fortawesome/fontawesome-free": "^6.7.2",
@@ -31,11 +31,11 @@
"@types/jsdom": "^21.1.7",
"@types/node": "^24.0.8",
"@vitejs/plugin-vue": "^6.0.0",
"@vue/tsconfig": "^0.7.0",
"@vue/tsconfig": "^0.8.1",
"esbuild-register": "^3.6.0",
"jsdom": "^26.1.0",
"typescript": "^5.8.3",
"vite": "7.1.5",
"vite": "7.1.11",
"vite-plugin-pwa": "^1.0.3",
"vite-plugin-vuetify": "^2.1.1",
"vue-tsc": "^3.0.6",

View File

@@ -1,10 +1,10 @@
<template>
<v-app>
<v-app-bar color="tandoor" flat density="comfortable" v-if="!useUserPreferenceStore().isAuthenticated">
<v-app-bar color="tandoor" flat density="comfortable" v-if="!useUserPreferenceStore().isAuthenticated && !useUserPreferenceStore().isPrintMode">
</v-app-bar>
<v-app-bar :color="useUserPreferenceStore().activeSpace.navBgColor ? useUserPreferenceStore().activeSpace.navBgColor : useUserPreferenceStore().userSettings.navBgColor"
flat density="comfortable" v-if="useUserPreferenceStore().isAuthenticated" :scroll-behavior="useUserPreferenceStore().userSettings.navSticky ? '' : 'hide'">
flat density="comfortable" v-if="useUserPreferenceStore().isAuthenticated && !useUserPreferenceStore().isPrintMode" :scroll-behavior="useUserPreferenceStore().userSettings.navSticky ? '' : 'hide'">
<router-link :to="{ name: 'StartPage', params: {} }">
<v-img src="../../assets/brand_logo.svg" width="140px" class="ms-2"
v-if="useUserPreferenceStore().userSettings.navShowLogo && !useUserPreferenceStore().activeSpace.navLogo"></v-img>
@@ -58,7 +58,7 @@
</p>
</v-app-bar>
<v-app-bar color="info" density="compact" v-if="useUserPreferenceStore().isAuthenticated && useUserPreferenceStore().activeSpace.message != ''">
<v-app-bar color="info" density="compact" v-if="useUserPreferenceStore().isAuthenticated && useUserPreferenceStore().activeSpace.message != '' && !useUserPreferenceStore().isPrintMode">
<p class="text-center w-100">
{{ useUserPreferenceStore().activeSpace.message }}
</p>
@@ -69,7 +69,7 @@
</v-main>
<!-- completely hide in print mode because setting d-print-node keeps layout -->
<v-navigation-drawer v-if="lgAndUp && useUserPreferenceStore().isAuthenticated && !isPrintMode">
<v-navigation-drawer v-if="lgAndUp && useUserPreferenceStore().isAuthenticated && !useUserPreferenceStore().isPrintMode">
<v-list nav>
<v-list-item :to="{ name: 'SettingsPage', params: {} }">
<template #prepend>
@@ -96,7 +96,7 @@
</v-navigation-drawer>
<v-bottom-navigation grow v-if="useUserPreferenceStore().isAuthenticated && !lgAndUp">
<v-bottom-navigation grow v-if="useUserPreferenceStore().isAuthenticated && !lgAndUp && !useUserPreferenceStore().isPrintMode">
<v-btn value="recent" :to="{ name: 'StartPage', params: {} }">
<v-icon icon="fa-fw fas fa-book "/>
</v-btn>
@@ -131,43 +131,44 @@
<script lang="ts" setup>
import GlobalSearchDialog from "@/components/inputs/GlobalSearchDialog.vue"
import {useDisplay} from "vuetify"
import {useDisplay, useLocale} from "vuetify"
import VSnackbarQueued from "@/components/display/VSnackbarQueued.vue";
import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import NavigationDrawerContextMenu from "@/components/display/NavigationDrawerContextMenu.vue";
import {useDjangoUrls} from "@/composables/useDjangoUrls";
import {nextTick, onMounted} from "vue";
import {nextTick, onMounted, ref} from "vue";
import {isSpaceAboveLimit} from "@/utils/logic_utils";
import {useMediaQuery, useTitle} from "@vueuse/core";
import {useTitle} from "@vueuse/core";
import HelpDialog from "@/components/dialogs/HelpDialog.vue";
import {NAVIGATION_DRAWER} from "@/utils/navigation.ts";
import {useNavigation} from "@/composables/useNavigation.ts";
import {useRouter} from "vue-router";
import {useI18n} from "vue-i18n";
const {lgAndUp} = useDisplay()
const {getDjangoUrl} = useDjangoUrls()
const {t} = useI18n()
const title = useTitle()
const router = useRouter()
const isPrintMode = useMediaQuery('print')
onMounted(() => {
useUserPreferenceStore().init().then(() => {
if (useUserPreferenceStore().activeSpace.spaceSetupCompleted != undefined && !useUserPreferenceStore().activeSpace.spaceSetupCompleted) {
router.push({name: 'WelcomePage'})
}
})
const {current} = useLocale()
let locale = document.querySelector('html')!.getAttribute('lang')
if (locale != null) {
current.value = locale
}
})
/**
* global title update handler, might be overridden by page specific handlers
*/
router.afterEach((to, from) => {
if(to.name == 'StartPage' && useUserPreferenceStore().initCompleted && !useUserPreferenceStore().activeSpace.spaceSetupCompleted != undefined &&!useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!){
if (to.name == 'StartPage' && useUserPreferenceStore().initCompleted && !useUserPreferenceStore().activeSpace.spaceSetupCompleted != undefined && !useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!) {
router.push({name: 'WelcomePage'})
}
nextTick(() => {

View File

@@ -79,7 +79,7 @@
<v-card-actions>
<v-spacer></v-spacer>
<v-btn @click="useMessageStore().deleteAllMessages()" color="error">{{$t('Delete_All')}}</v-btn>
<v-btn @click="addTestMessage()" color="warning">{{$t('Add')}}</v-btn>
<!-- <v-btn @click="addTestMessage()" color="warning">{{$t('Add')}}</v-btn>-->
<v-btn @click="isActive.value = false">{{ $t('Close')}}</v-btn>
</v-card-actions>
</v-card>

View File

@@ -54,15 +54,13 @@
</router-link>
<a v-else-if="i.food.url" :href="i.food.url" target="_blank">{{ ingredientToFoodString(i, ingredientFactor) }}</a>
<span v-else>{{ ingredientToFoodString(i, ingredientFactor) }}</span>
<template v-if="i.note != '' && i.note != undefined">
<span class="d-none d-print-block text-disabled font-italic">&nbsp;{{ i.note }}</span>
</template>
</template>
</td>
<td style="width: 1%; text-wrap: nowrap" class="d-print-none">
<td v-if="useUserPreferenceStore().isPrintMode">
<span class="text-disabled font-italic"> {{ i.note }}</span>
</td>
<td style="width: 1%; text-wrap: nowrap" v-if="!useUserPreferenceStore().isPrintMode">
<v-icon class="far fa-comment float-right" v-if="i.note != '' && i.note != undefined">
<v-tooltip activator="parent" open-on-click location="start">{{ i.note }}</v-tooltip>
</v-icon>

View File

@@ -157,6 +157,7 @@ function dropCalendarItemOnDate(undefinedItem: IMealPlanNormalizedCalendarItem,
let new_entry = Object.assign({}, mealPlan)
new_entry.fromDate = targetDate
new_entry.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate()
new_entry.addshopping = mealPlan.shopping
useMealPlanStore().createObject(new_entry)
} else {
mealPlan.fromDate = targetDate

View File

@@ -1,5 +1,5 @@
<template>
<v-card class="mt-1 d-print-none" v-if="useUserPreferenceStore().isAuthenticated" :loading="loading">
<v-card class="mt-1" v-if="useUserPreferenceStore().isAuthenticated && !useUserPreferenceStore().isPrintMode" :loading="loading">
<v-card-text>
<v-textarea :label="$t('Comment')" rows="2" v-model="newCookLog.comment" auto-grow></v-textarea>
<v-row dense>

View File

@@ -121,10 +121,10 @@
<template v-if="recipe.filePath">
<external-recipe-viewer class="mt-2" :recipe="recipe"></external-recipe-viewer>
<v-card :title="$t('AI')" prepend-icon="$ai" :loading="fileApiLoading || loading" :disabled="fileApiLoading || loading || !useUserPreferenceStore().activeSpace.aiEnabled"
<v-card :title="$t('AI')" prepend-icon="$ai" :loading="fileApiLoading || loading" :disabled="fileApiLoading || loading || !useUserPreferenceStore().activeSpace.aiEnabled"
v-if="!recipe.internal">
<v-card-text>
{{$t('ConvertUsingAI')}}
{{ $t('ConvertUsingAI') }}
<model-select model="AiProvider" v-model="selectedAiProvider">
<template #append>
@@ -135,7 +135,8 @@
</v-card>
</template>
<v-card class="mt-1" v-if="(recipe.steps.length > 1 || (recipe.steps.length == 1 && !recipe.steps[0].showIngredientsTable)) && recipe.showIngredientOverview">
<v-card class="mt-1"
v-if="(recipe.steps.length > 1 || (recipe.steps.length == 1 && !recipe.steps[0].showIngredientsTable)) && recipe.showIngredientOverview && !useUserPreferenceStore().isPrintMode">
<steps-overview :steps="recipe.steps" :ingredient-factor="ingredientFactor"></steps-overview>
</v-card>
@@ -147,8 +148,8 @@
<v-card class="mt-2">
<v-card-text>
<v-row>
<v-col cols="12" md="3">
<v-row dense>
<v-col cols="12" :sm="(recipe.sourceUrl) ? 3 : 4">
<v-card
variant="outlined"
:title="$t('CreatedBy')"
@@ -157,7 +158,7 @@
:to="(useUserPreferenceStore().isAuthenticated) ? {name: 'SearchPage', query: {createdby: recipe.createdBy.id!}}: undefined">
</v-card>
</v-col>
<v-col cols="12" md="3">
<v-col cols="12" :sm="(recipe.sourceUrl) ? 3 : 4">
<v-card
variant="outlined"
:title="$t('Created')"
@@ -166,7 +167,7 @@
:to="(useUserPreferenceStore().isAuthenticated) ? {name: 'SearchPage', query: {createdon: DateTime.fromJSDate(recipe.createdAt).toISODate()}} : undefined">
</v-card>
</v-col>
<v-col cols="12" md="3">
<v-col cols="12" :sm="(recipe.sourceUrl) ? 3 : 4">
<v-card
variant="outlined"
:title="$t('Updated')"
@@ -175,7 +176,7 @@
:to="(useUserPreferenceStore().isAuthenticated) ? {name: 'SearchPage', query: {updatedon: DateTime.fromJSDate(recipe.updatedAt).toISODate()}}: undefined">
</v-card>
</v-col>
<v-col cols="12" md="3" v-if="recipe.sourceUrl">
<v-col cols="12" :sm="(recipe.sourceUrl) ? 3 : 4" v-if="recipe.sourceUrl">
<v-card
variant="outlined"
:title="$t('Imported_From')"
@@ -257,7 +258,7 @@ onBeforeUnmount(() => {
function aiConvertRecipe() {
let api = new ApiApi()
doAiImport(selectedAiProvider.value.id!,null, '', recipe.value.id!).then(r => {
doAiImport(selectedAiProvider.value.id!, null, '', recipe.value.id!).then(r => {
if (r.recipe) {
recipe.value.internal = true
recipe.value.steps = r.recipe.steps

View File

@@ -26,11 +26,9 @@
<v-progress-circular v-if="duplicateLoading" indeterminate size="small"></v-progress-circular>
</template>
</v-list-item>
<!-- TODO when calling print() some timing or whatever issue makes it so the useMediaQuery does not work and the sidebar is still shown -->
<!-- <v-list-item prepend-icon="fa-solid fa-print" @click="openPrintView()">-->
<!-- {{ $t('Print') }}-->
<!-- </v-list-item>-->
<v-list-item :to="{ name: 'RecipeViewPage', params: { id: recipe.id}, query: {print: 'true'} }" :active="false" target="_blank" prepend-icon="fa-solid fa-print">
{{ $t('Print') }}
</v-list-item>
</v-list>
</v-menu>
</v-btn>

View File

@@ -29,7 +29,11 @@
<v-checkbox v-model="useUserPreferenceStore().deviceSettings.start_showMealPlan" :label="$t('ShowMealPlanOnStartPage')"></v-checkbox>
<v-btn @click="useUserPreferenceStore().resetDeviceSettings()" color="warning">{{ $t('Reset') }}</v-btn> <br/>
<v-btn @click="useUserPreferenceStore().deviceSettings.general_closedHelpAlerts = []" color="warning" class="mt-1">{{ $t('ResetHelp') }}</v-btn>
<v-btn @click="useUserPreferenceStore().deviceSettings.general_closedHelpAlerts = []" color="warning" class="mt-1">{{ $t('ResetHelp') }}</v-btn> <br/>
<v-btn color="info" class="mt-1">
<message-list-dialog></message-list-dialog>
{{ $t('Messages') }}
</v-btn>
</v-form>
</template>
@@ -43,6 +47,7 @@ import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/Messa
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {useDjangoUrls} from "@/composables/useDjangoUrls";
import ThankYouNote from "@/components/display/ThankYouNote.vue";
import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
const {getDjangoUrl} = useDjangoUrls()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

866
vue3/src/locales/ko.json Normal file
View File

@@ -0,0 +1,866 @@
{
"AI": "",
"AIImportSubtitle": "",
"AISettingsHostedHelp": "",
"API": "",
"APIKey": "",
"API_Browser": "",
"API_Documentation": "",
"AccessTokenHelp": "",
"Access_Token": "",
"Account": "",
"Actions": "",
"Active": "",
"Activity": "",
"Add": "",
"AddAll": "",
"AddChild": "",
"AddFilter": "",
"AddFoodToShopping": "",
"AddMany": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
"Add_Step": "",
"Add_nutrition_recipe": "",
"Add_to_Plan": "",
"Add_to_Shopping": "",
"Added_To_Shopping_List": "",
"Added_by": "",
"Added_on": "",
"Admin": "",
"Advanced": "",
"AiCreditsBalance": "",
"AiLog": "",
"AiLogHelp": "",
"AiModelHelp": "",
"AiProvider": "",
"AiProviderHelp": "",
"Alignment": "",
"AllRecipes": "",
"Amount": "",
"App": "",
"AppImportSubtitle": "",
"Apply": "",
"Are_You_Sure": "",
"Auto_Planner": "",
"Auto_Sort": "",
"Auto_Sort_Help": "",
"Automate": "",
"Automation": "",
"AutomationHelp": "",
"Available": "",
"AvailableCategories": "",
"Back": "",
"BaseUnit": "",
"BaseUnitHelp": "",
"Basics": "",
"BatchDeleteConfirm": "",
"BatchDeleteHelp": "",
"BatchEdit": "",
"BatchEditUpdatingItemsCount": "",
"Blocking": "",
"BlockingHelp": "",
"Book": "",
"Bookmarklet": "",
"BookmarkletHelp1": "",
"BookmarkletHelp2": "",
"BookmarkletHelp3": "",
"BookmarkletImportSubtitle": "",
"Books": "",
"CREATE_ERROR": "",
"Calculator": "",
"Calories": "",
"Cancel": "",
"Cannot_Add_Notes_To_Shopping": "",
"Carbohydrates": "",
"Cards": "",
"Cascading": "",
"CascadingHelp": "",
"Categories": "",
"Category": "",
"CategoryInstruction": "",
"CategoryName": "",
"Change_Password": "",
"Changing": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"Choose_Category": "",
"Clear": "",
"Click_To_Edit": "",
"Clone": "",
"Close": "",
"Color": "",
"Combine_All_Steps": "",
"Coming_Soon": "",
"Comment": "",
"Comments_setting": "",
"Completed": "",
"Confirm": "",
"ConnectorConfig": "",
"ConnectorConfigHelp": "",
"Continue": "",
"Conversion": "",
"ConversionsHelp": "",
"ConvertUsingAI": "",
"CookLog": "",
"CookLogHelp": "",
"Cooked": "",
"Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
"Copy_template_reference": "",
"Cosmetic": "",
"CountMore": "",
"Create": "",
"Create Food": "",
"Create Recipe": "",
"CreateFirstRecipe": "",
"CreateInvitation": "",
"Create_Meal_Plan_Entry": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Meal_Type": "",
"Create_New_Shopping Category": "",
"Create_New_Shopping_Category": "",
"Create_New_Unit": "",
"Created": "",
"CreatedBy": "",
"Credits": "",
"Ctrl+K": "",
"Current_Period": "",
"Custom Filter": "",
"CustomImageHelp": "",
"CustomLogoHelp": "",
"CustomLogos": "",
"CustomNavLogoHelp": "",
"CustomTheme": "",
"CustomThemeHelp": "",
"DELETE_ERROR": "",
"Data_Import_Info": "",
"Database": "",
"DatabaseHelp": "",
"Datatype": "",
"Date": "",
"Day": "",
"Days": "",
"Decimals": "",
"Default": "",
"DefaultPage": "",
"Default_Unit": "",
"DelayFor": "",
"DelayUntil": "",
"Delete": "",
"DeleteConfirmQuestion": "",
"DeleteShoppingConfirm": "",
"DeleteSomething": "",
"Delete_All": "",
"Delete_Food": "",
"Delete_Keyword": "",
"Deleted": "",
"Description": "",
"Description_Replace": "",
"DeviceSettings": "",
"DeviceSettingsHelp": "",
"Disable": "",
"Disable_Amount": "",
"Disabled": "",
"Documentation": "",
"DontChange": "",
"Down": "",
"Download": "",
"DragToUpload": "",
"Drag_Here_To_Delete": "",
"Duplicate": "",
"DuplicateFoundInfo": "",
"Edit": "",
"Edit_Food": "",
"Edit_Keyword": "",
"Edit_Meal_Plan_Entry": "",
"Edit_Recipe": "",
"Email": "",
"Empty": "",
"Enable": "",
"Enable_Amount": "",
"Enabled": "",
"EndDate": "",
"Energy": "",
"Entries": "",
"Error": "",
"ErrorUrlListImport": "",
"Events": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
"Export_Supported": "",
"Export_To_ICal": "",
"External": "",
"ExternalRecipe": "",
"ExternalRecipeImport": "",
"ExternalRecipeImportHelp": "",
"ExternalStorage": "",
"External_Recipe_Image": "",
"FDC_ID": "",
"FDC_ID_help": "",
"FDC_Search": "",
"FETCH_ERROR": "",
"Failure": "",
"Fats": "",
"File": "",
"Files": "",
"FinishedAt": "",
"First": "",
"First_name": "",
"Food": "",
"FoodHelp": "",
"FoodInherit": "",
"FoodNotOnHand": "",
"FoodOnHand": "",
"Food_Alias": "",
"Food_Replace": "",
"Foods": "",
"Friday": "",
"FromBalance": "",
"Fulltext": "",
"FulltextHelp": "",
"Fuzzy": "",
"FuzzySearchHelp": "",
"GettingStarted": "",
"Global": "",
"GlobalHelp": "",
"Group": "",
"GroupBy": "",
"HeaderWarning": "",
"Headline": "",
"Help": "",
"Hide_External": "",
"Hide_Food": "",
"Hide_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Hide_as_header": "",
"Hierarchy": "",
"History": "",
"HostedFreeVersion": "",
"Hour": "",
"Hours": "",
"Icon": "",
"IgnoreAccents": "",
"IgnoreAccentsHelp": "",
"IgnoreThis": "",
"Ignore_Shopping": "",
"IgnoredFood": "",
"Image": "",
"Import": "",
"Import Recipe": "",
"ImportAll": "",
"ImportFirstRecipe": "",
"ImportIntoTandoor": "",
"ImportMealPlans": "",
"ImportShoppingList": "",
"Import_Error": "",
"Import_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Import_Supported": "",
"Import_finished": "",
"Imported": "",
"Imported_From": "",
"Importer_Help": "",
"Information": "",
"Ingredient": "",
"Ingredient Editor": "",
"Ingredient Overview": "",
"IngredientEditorHelp": "",
"IngredientHelp": "",
"IngredientInShopping": "",
"Ingredients": "",
"Inherit": "",
"InheritFields": "",
"InheritFields_help": "",
"InheritWarning": "",
"Input": "",
"Instruction_Replace": "",
"Instructions": "",
"InstructionsEditHelp": "",
"Internal": "",
"InviteLinkHelp": "",
"Invite_Link": "",
"Invites": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Keyword": "",
"KeywordHelp": "",
"Keyword_Alias": "",
"Keywords": "",
"Language": "",
"Last": "",
"Last_name": "",
"Learn_More": "",
"LeaveSpace": "",
"Link": "",
"Load": "",
"Load_More": "",
"LogCredits": "",
"LogCreditsHelp": "",
"Log_Cooking": "",
"Log_Recipe_Cooking": "",
"Logo": "",
"Logout": "",
"Make_Header": "",
"Make_Ingredient": "",
"ManageSubscription": "",
"Manage_Books": "",
"Manage_Emails": "",
"MealPlanHelp": "",
"MealPlanShoppingHelp": "",
"MealTypeHelp": "",
"Meal_Plan": "",
"Meal_Plan_Days": "",
"Meal_Type": "",
"Meal_Type_Required": "",
"Meal_Types": "",
"Merge": "",
"MergeAutomateHelp": "",
"MergeInsteadOfDelete": "",
"Merge_Keyword": "",
"Message": "",
"Messages": "",
"Miscellaneous": "",
"MissingConversion": "",
"MissingProperties": "",
"Model": "",
"ModelSelectResultsHelp": "",
"Monday": "",
"Month": "",
"MonthlyCredits": "",
"MonthlyCreditsUsed": "",
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "",
"Move_Food": "",
"Move_Keyword": "",
"Move_Up": "",
"Multiple": "",
"Name": "",
"Name_Replace": "",
"Nav_Color": "",
"Nav_Color_Help": "",
"Nav_Text_Mode": "",
"Nav_Text_Mode_Help": "",
"Never_Unit": "",
"New": "",
"New_Cookbook": "",
"New_Entry": "",
"New_Food": "",
"New_Keyword": "",
"New_Meal_Type": "",
"New_Recipe": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"New_Unit": "",
"Next": "",
"Next_Day": "",
"Next_Period": "",
"No": "",
"NoCategory": "",
"NoMoreUndo": "",
"NoUnit": "",
"No_ID": "",
"No_Results": "",
"NotFound": "",
"NotFoundHelp": "",
"NotInShopping": "",
"Note": "",
"NullingHelp": "",
"Number of Objects": "",
"Nutrition": "",
"NutritionsPerServing": "",
"NutritionsPerServingHelp": "",
"OfflineAlert": "",
"Ok": "",
"OnHand": "",
"OnHand_help": "",
"Open": "",
"Open_Data_Import": "",
"Open_Data_Slug": "",
"Options": "",
"Order": "",
"OrderInformation": "",
"Original_Text": "",
"Owner": "",
"Page": "",
"Parameter": "",
"Parent": "",
"PartialMatch": "",
"PartialMatchHelp": "",
"Password": "",
"Path": "",
"PerPage": "",
"Period": "",
"Periods": "",
"Pin": "",
"Pinned": "",
"PinnedConfirmation": "",
"Plan_Period_To_Show": "",
"Plan_Show_How_Many_Periods": "",
"Planned": "",
"Planner": "",
"Planner_Settings": "",
"Planning&Shopping": "",
"Plural": "",
"Postpone": "",
"PostponedUntil": "",
"PrecisionSearchHelp": "",
"Preferences": "",
"Preparation": "",
"Preview": "",
"Previous_Day": "",
"Previous_Period": "",
"Print": "",
"Private": "",
"Private_Recipe": "",
"Private_Recipe_Help": "",
"Profile": "",
"Properties": "",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Property": "",
"PropertyHelp": "",
"PropertyType": "",
"PropertyTypeHelp": "",
"Property_Editor": "",
"Protected": "",
"Proteins": "",
"Quick actions": "",
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "",
"Recipe": "",
"RecipeBookEntryHelp": "",
"RecipeBookHelp": "",
"RecipeHelp": "",
"RecipeStepsHelp": "",
"Recipe_Book": "",
"Recipe_Image": "",
"Recipes": "",
"Recipes_In_Import": "",
"Recipes_per_page": "",
"Refresh": "",
"Remove": "",
"RemoveAllType": "",
"RemoveFoodFromShopping": "",
"RemoveParent": "",
"Remove_nutrition_recipe": "",
"Reset": "",
"ResetHelp": "",
"Reset_Search": "",
"Reusable": "",
"Role": "",
"Root": "",
"Saturday": "",
"Save": "",
"Save/Load": "",
"Save_and_View": "",
"SavedSearch": "",
"SavedSearchHelp": "",
"ScalableNumber": "",
"Search": "",
"Search Settings": "",
"SearchMethod": "",
"SearchSettingsOverview": "",
"SearchSettingsWarning": "",
"Second": "",
"Seconds": "",
"Select": "",
"SelectAll": "",
"SelectNone": "",
"Select_App_To_Import": "",
"Select_Book": "",
"Select_File": "",
"Selected": "",
"SelectedCategories": "",
"Serving": "",
"Servings": "",
"ServingsText": "",
"Settings": "",
"SettingsOnlySuperuser": "",
"Share": "",
"ShopLater": "",
"ShopNow": "",
"ShoppingBackgroundSyncWarning": "",
"ShoppingListEntry": "",
"ShoppingListEntryHelp": "",
"ShoppingListRecipe": "",
"Shopping_Categories": "",
"Shopping_Category": "",
"Shopping_List_Empty": "",
"Shopping_input_placeholder": "",
"Shopping_list": "",
"ShowDelayed": "",
"ShowIngredients": "",
"ShowMealPlanOnStartPage": "",
"ShowRecentlyCompleted": "",
"ShowUncategorizedFood": "",
"Show_Logo": "",
"Show_Logo_Help": "",
"Show_Week_Numbers": "",
"Show_as_header": "",
"Single": "",
"Size": "",
"Skip": "",
"Social_Authentication": "",
"Sort_by_new": "",
"Source": "",
"SourceImportHelp": "",
"SourceImportSubtitle": "",
"Space": "",
"SpaceHelp": "",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "",
"StartDate": "",
"Starting_Day": "",
"StartsWith": "",
"StartsWithHelp": "",
"Step": "",
"StepHelp": "",
"Step_Name": "",
"Step_Type": "",
"Step_start_time": "",
"Steps": "",
"StepsOverview": "",
"Sticky_Nav": "",
"Sticky_Nav_Help": "",
"Storage": "",
"StorageHelp": "",
"StoragePasswordTokenHelp": "",
"Structured": "",
"SubstituteOnHand": "",
"Substitutes": "",
"Success": "",
"SuccessClipboard": "",
"Summary": "",
"Sunday": "",
"Supermarket": "",
"SupermarketCategoriesOnly": "",
"SupermarketCategoryHelp": "",
"SupermarketHelp": "",
"SupermarketName": "",
"Supermarkets": "",
"SupportsDescriptionField": "",
"SyncLog": "",
"SyncLogHelp": "",
"SyncedPath": "",
"SyncedPathHelp": "",
"System": "",
"Table": "",
"Table_of_Contents": "",
"Text": "",
"ThankYou": "",
"ThanksTextHosted": "",
"ThanksTextSelfhosted": "",
"Theme": "",
"Thursday": "",
"Time": "",
"Title": "",
"Title_or_Recipe_Required": "",
"Today": "",
"Toggle": "",
"Transpose_Words": "",
"TrigramThreshold": "",
"TrigramThresholdHelp": "",
"Tuesday": "",
"Type": "",
"UPDATE_ERROR": "",
"Unchanged": "",
"Undefined": "",
"Undo": "",
"Unit": "",
"UnitConversion": "",
"UnitConversionHelp": "",
"UnitHelp": "",
"Unit_Alias": "",
"Unit_Replace": "",
"Units": "",
"Unpin": "",
"UnpinnedConfirmation": "",
"Unrated": "",
"Up": "",
"Update": "",
"Update_Existing_Data": "",
"Updated": "",
"UpgradeNow": "",
"Url": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",
"Use_Kj": "",
"Use_Metric": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"User": "",
"UserFileHelp": "",
"UserHelp": "",
"Username": "",
"Users": "",
"Valid Until": "",
"View": "",
"ViewLogHelp": "",
"View_Recipes": "",
"Viewed": "",
"Visibility": "",
"Waiting": "",
"WaitingTime": "",
"WarnPageLeave": "",
"Warning": "",
"WarningRecipeBookEntryDuplicate": "",
"Warning_Delete_Supermarket_Category": "",
"Website": "",
"Wednesday": "",
"Week": "",
"Week_Numbers": "",
"Welcome": "",
"WelcomeSettingsHelp": "",
"WelcometoTandoor": "",
"WorkingTime": "",
"Year": "",
"Yes": "",
"YourSpaces": "",
"active": "",
"add_keyword": "",
"additional_options": "",
"advanced": "",
"advanced_search_settings": "",
"after": "",
"all": "",
"all_fields_optional": "",
"and": "",
"and_down": "",
"and_up": "",
"any": "",
"asc": "",
"base_amount": "",
"base_unit": "",
"before": "",
"book_filter_help": "",
"click_image_import": "",
"confirm_delete": "",
"convert_internal": "",
"converted_amount": "",
"converted_unit": "",
"copy_markdown_table": "",
"copy_to_clipboard": "",
"copy_to_new": "",
"create_food_desc": "",
"create_rule": "",
"create_title": "",
"created_by": "",
"created_on": "",
"csv_delim_help": "",
"csv_delim_label": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"date_created": "",
"date_viewed": "",
"default_delay": "",
"default_delay_desc": "",
"del_confirmation_tree": "",
"delete_confirmation": "",
"delete_title": "",
"desc": "",
"download_csv": "",
"download_pdf": "",
"edit_title": "",
"empty_list": "",
"enable_expert": "",
"err_creating_resource": "",
"err_deleting_protected_resource": "",
"err_deleting_resource": "",
"err_fetching_resource": "",
"err_importing_recipe": "",
"err_merge_self": "",
"err_merging_resource": "",
"err_move_self": "",
"err_moving_resource": "",
"err_updating_resource": "",
"exact": "",
"exclude": "",
"expert_mode": "",
"explain": "",
"fields": "",
"file_upload_disabled": "",
"filter": "",
"filter_name": "",
"filter_to_supermarket": "",
"filter_to_supermarket_desc": "",
"fluid_ounce": "",
"food_inherit_info": "",
"food_recipe_help": "",
"g": "",
"gallon": "",
"hide_step_ingredients": "",
"hours": "",
"ignore_shopping_help": "",
"imperial_fluid_ounce": "",
"imperial_gallon": "",
"imperial_pint": "",
"imperial_quart": "",
"imperial_tbsp": "",
"imperial_tsp": "",
"import_duplicates": "",
"import_running": "",
"in_shopping": "",
"ingredient_list": "",
"kg": "",
"l": "",
"last_cooked": "",
"last_viewed": "",
"left_handed": "",
"left_handed_help": "",
"make_now": "",
"make_now_count": "",
"mark_complete": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related": "",
"mealplan_autoinclude_related_desc": "",
"merge_confirmation": "",
"merge_selection": "",
"merge_title": "",
"min": "",
"ml": "",
"move_confirmation": "",
"move_selection": "",
"move_title": "",
"no_more_images_found": "",
"no_pinned_recipes": "",
"not": "",
"nothing": "",
"nothing_planned_today": "",
"on": "",
"one_url_per_line": "",
"open_data_help_text": "",
"or": "",
"ounce": "",
"parameter_count": "",
"paste_ingredients": "",
"paste_ingredients_placeholder": "",
"paste_json": "",
"per_serving": "",
"pint": "",
"plan_share_desc": "",
"plural_short": "",
"plural_usage_info": "",
"pound": "",
"property_type_fdc_hint": "",
"quart": "",
"recipe_filter": "",
"recipe_name": "",
"recipe_property_info": "",
"related_recipes": "",
"remember_hours": "",
"remember_search": "",
"remove_selection": "",
"reset_children": "",
"reset_children_help": "",
"reset_food_inheritance": "",
"reset_food_inheritance_info": "",
"reusable_help_text": "",
"review_shopping": "",
"save_filter": "",
"searchFilterCreatedByHelp": "",
"searchFilterObjectsAndHelp": "",
"searchFilterObjectsAndNotHelp": "",
"searchFilterObjectsHelp": "",
"searchFilterObjectsOrNotHelp": "",
"search_create_help_text": "",
"search_import_help_text": "",
"search_no_recipes": "",
"search_rank": "",
"seconds": "",
"select_file": "",
"select_food": "",
"select_keyword": "",
"select_recipe": "",
"select_unit": "",
"shared_with": "",
"shopping_add_onhand": "",
"shopping_add_onhand_desc": "",
"shopping_auto_sync": "",
"shopping_auto_sync_desc": "",
"shopping_category_help": "",
"shopping_recent_days": "",
"shopping_recent_days_desc": "",
"shopping_share": "",
"shopping_share_desc": "",
"show_books": "",
"show_filters": "",
"show_foods": "",
"show_ingredient_overview": "",
"show_ingredients_table": "",
"show_keywords": "",
"show_only_internal": "",
"show_rating": "",
"show_sortby": "",
"show_split_screen": "",
"show_sql": "",
"show_step_ingredients": "",
"show_step_ingredients_setting": "",
"show_step_ingredients_setting_help": "",
"show_units": "",
"simple_mode": "",
"sort_by": "",
"sql_debug": "",
"step_time_minutes": "",
"substitute_children": "",
"substitute_children_help": "",
"substitute_help": "",
"substitute_siblings": "",
"substitute_siblings_help": "",
"success_creating_resource": "",
"success_deleting_resource": "",
"success_fetching_resource": "",
"success_merging_resource": "",
"success_moving_resource": "",
"success_updating_resource": "",
"tbsp": "",
"theUsernameCannotBeChanged": "",
"times_cooked": "",
"to_close": "",
"to_navigate": "",
"to_select": "",
"today_recipes": "",
"total": "",
"tree_root": "",
"tree_select": "",
"tsp": "",
"unsaved": "",
"updatedon": "",
"view_recipe": "",
"warning_duplicate_filter": "",
"warning_feature_beta": "",
"warning_space_delete": ""
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,13 @@
<template>
<v-container :class="{'ps-0 pe-0 pt-0': mobile}">
<recipe-view v-model="recipe"></recipe-view>
<v-defaults-provider :defaults="(useUserPreferenceStore().isPrintMode ? {VCard: {variant: 'flat'}} : {})">
<div class="mt-2" v-if="isShared && Object.keys(recipe).length > 0">
<import-tandoor-dialog></import-tandoor-dialog>
</div>
<recipe-view v-model="recipe"></recipe-view>
<div class="mt-2" v-if="isShared && Object.keys(recipe).length > 0">
<import-tandoor-dialog></import-tandoor-dialog>
</div>
</v-defaults-provider>
</v-container>
@@ -56,6 +58,12 @@ function refreshData(recipeId: string) {
recipe.value = r
title.value = recipe.value.name
setTimeout(() => {
if (useUserPreferenceStore().isPrintMode) {
window.print()
}
}, 500)
if (useUserPreferenceStore().isAuthenticated) {
api.apiViewLogCreate({viewLog: {recipe: Number(recipeId)} as ViewLog})
}

View File

@@ -34,10 +34,10 @@
</v-card-text>
</v-card>
<template v-if="totalRecipes > 0">
<horizontal-recipe-scroller :skeletons="4" mode="recent" v-if="totalRecipes > 0"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="recent" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="new" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="keyword" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="random" v-if="totalRecipes >= 5"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="random" v-if="totalRecipes > 0"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="created_by" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="2" mode="rating" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="keyword" v-if="totalRecipes > 25"></horizontal-recipe-scroller>

View File

@@ -7,6 +7,7 @@ import {computed, ComputedRef, ref} from "vue";
import {DeviceSettings} from "@/types/settings";
import {useTheme} from "vuetify";
import {useRouter} from "vue-router";
import {useRouteQuery} from "@vueuse/router";
const DEVICE_SETTINGS_KEY = 'TANDOOR_DEVICE_SETTINGS'
const USER_PREFERENCE_KEY = 'TANDOOR_USER_PREFERENCE'
@@ -55,6 +56,11 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
*/
const defaultUnitObj = ref<Unit | null>(null)
/**
* detect if print mode is activated by checking for "print" query parameter
*/
const isPrintMode = useRouteQuery('print', false, {transform: Boolean})
const theme = useTheme()
const router = useRouter()
@@ -250,10 +256,10 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
* applies user settings regarding themes/styling
*/
function updateTheme() {
if (userSettings.value.theme == 'TANDOOR') {
theme.change('light')
} else if (userSettings.value.theme == 'TANDOOR_DARK') {
if (userSettings.value.theme == 'TANDOOR_DARK' && !isPrintMode.value) {
theme.change('dark')
} else {
theme.change('light')
}
}
@@ -281,6 +287,7 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
spaces,
activeUserSpace,
isAuthenticated,
isPrintMode,
initCompleted,
defaultUnitObj,
loadUserSettings,

View File

@@ -6,6 +6,9 @@ import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
*/
export function roundDecimals(num: number) {
let decimals = useUserPreferenceStore().userSettings.ingredientDecimals
if (decimals === undefined) {
decimals = 2
}
return Number(num.toFixed(decimals))
}

View File

@@ -5,6 +5,7 @@ import {aliases, fa} from 'vuetify/iconsets/fa'
// Composables
import {createVuetify} from 'vuetify'
import {DateTime} from "luxon";
import {af, ar, az, bg, ca, ckb, cs, da, de, el, en, es, et, fi, fr, he, hr, hu, id, it, ja, km, ko, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, srCyrl, srLatn, sv, th, tr, uk, vi, zhHans, zhHant} from "vuetify/locale";
// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
export default createVuetify({
@@ -22,22 +23,24 @@ export default createVuetify({
maxWidth: '1400px'
},
// always localize the date display of DateInputs
VDateInput: {
displayFormat: (date: Date) => DateTime.fromJSDate(date).toLocaleString()
},
// VDateInput: {
// displayFormat: (date: Date) => DateTime.fromJSDate(date).toLocaleString()
// },
// always use color for switches to properly see if enabled or not
VSwitch: {
color: 'primary'
},
// globally set the correct decimal seperator
VNumberInput: {
decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
}
// VNumberInput: {
// decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
// }
},
locale: {
locale: 'en',
fallback: 'en',
messages: {af, ar, az, bg, ca, ckb, cs, da, de, el, en, es, et, fi, fr, he, hr, hu, id, it, ja, km, ko, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, srCyrl, srLatn, sv, th, tr, uk, vi, zhHans, zhHant},
decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
},
// locale: {
// locale: 'de',
// fallback: 'en',
// },
theme: {
defaultTheme: 'light',
themes: {

View File

@@ -1417,10 +1417,10 @@
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.17.tgz#e8b3a41f0be76499882a89e8ed40d86a70fa4b70"
integrity sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==
"@vue/tsconfig@^0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz#67044c847b7a137b8cbfd6b23104c36dbaf80d1d"
integrity sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==
"@vue/tsconfig@^0.8.1":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz#4732251fa58945024424385cf3be0b1708fad5fe"
integrity sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==
"@vueform/multiselect@^2.6.11":
version "2.6.11"
@@ -1448,18 +1448,23 @@
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-13.6.0.tgz#49196025c96c7daeb591c20a54b61cc336af99b6"
integrity sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==
"@vueuse/router@^13.6.0":
version "13.6.0"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.6.0.tgz#29456dab42eb75a0dc5fe4c62f59dd3f7c21a6ab"
integrity sha512-iXRwR4K7nz4PReW0QudhnM9NtYGvN4KrskFgF9G7NouM43big3bpSNRRocJKFWK7iu97ww5y82B3QA2zz3S/vw==
"@vueuse/router@^13.9.0":
version "13.9.0"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.9.0.tgz#44235e6732a30b53d1c8e2ef13ce783fdd189ca6"
integrity sha512-7AYay8Pv/0fC4D0eygbIyZuLyVs+9D7dsnO5D8aqat9qcOz91v/XFWR667WE1+p+OkU0ib+FjQUdnTVBNoIw8g==
dependencies:
"@vueuse/shared" "13.6.0"
"@vueuse/shared" "13.9.0"
"@vueuse/shared@13.6.0":
version "13.6.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.6.0.tgz#872fdbd725fb4e3a12bd5aab85af9a5db0b1e481"
integrity sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==
"@vueuse/shared@13.9.0":
version "13.9.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.9.0.tgz#7168b4ed647e625b05eb4e7e80fe8aabd00e3923"
integrity sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==
acorn@^8.14.0:
version "8.15.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
@@ -3343,10 +3348,10 @@ vite-plugin-vuetify@^2.1.1:
debug "^4.3.3"
upath "^2.0.1"
vite@7.1.5:
version "7.1.5"
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.5.tgz#4dbcb48c6313116689be540466fc80faa377be38"
integrity sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==
vite@7.1.11:
version "7.1.11"
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.11.tgz#4d006746112fee056df64985191e846ebfb6007e"
integrity sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==
dependencies:
esbuild "^0.25.0"
fdir "^6.5.0"
@@ -3418,10 +3423,10 @@ vuedraggable@^4.1.0:
dependencies:
sortablejs "1.14.0"
vuetify@^3.9.7:
version "3.9.7"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.9.7.tgz#aea996f35111f25dd7e31ab956fbb40911841c24"
integrity sha512-Ib8PB3ItcguCol8f0DXLpoGyy7FvoOYW23SEWqXX+in1CSItJZHxUXXGSus94m5JWqYqQrFiwCykbHm7UWPi4Q==
vuetify@^3.10.3:
version "3.10.3"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.10.3.tgz#f04e507bb5efee6b52f11b2fd60a20dced1a8831"
integrity sha512-psc7oZfjz3LwH96ZRzSm4iGcOKKoeoVZIyO5Q5xO4vcUfWYxobL7TvMQv53jv1PnNvaMIXWeVIrQmiyce5dpTg==
w3c-xmlserializer@^5.0.0:
version "5.0.0"