Compare commits

..

77 Commits

Author SHA1 Message Date
boc-the-git
d96c36333b docs: Provide meaningful URLs for some badges (#3742)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2024-06-18 09:21:53 +00:00
Asdoos
b220cd6431 feat: Show nutrition on recipe print (#3740)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2024-06-18 11:08:22 +02:00
Brian Choromanski
598b0f3707 feat: Added images to PWA shortcuts (#3744) 2024-06-17 15:33:41 -05:00
renovate[bot]
c18b9d3184 chore(deps): update dependency mkdocs-material to v9.5.27 (#3741)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-16 18:10:51 +02:00
renovate[bot]
e64d070603 chore(deps): update dependency ruff to v0.4.9 (#3737)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-14 12:01:11 -05:00
renovate[bot]
d843370c07 fix(deps): update dependency orjson to v3.10.5 (#3734)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-14 08:04:57 -05:00
boc-the-git
269be953ce docs: Fix typo in python logging docs (#3736) 2024-06-14 07:55:37 -05:00
Bart Kummel
9f7d74aecf fix: Make fractions in the ingredient list look a tiny bit nicer (#3725) 2024-06-13 13:04:45 +00:00
renovate[bot]
4a0a8e8a5e fix(deps): update dependency pydantic-settings to v2.3.3 (#3733)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-13 21:16:59 +10:00
boc-the-git
75895cab79 docs: Adjust badges in README (#3728)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2024-06-13 04:11:10 +00:00
renovate[bot]
be0cdee8b7 fix(deps): update dependency openai to v1.34.0 (#3730)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-12 23:02:59 -05:00
renovate[bot]
6024c8bc05 fix(deps): update dependency pydantic to v2.7.4 (#3729)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-12 16:37:52 +00:00
Greirson Lee-Thorp
b3241d3e8b docs: Add n8n backup automation example guide (#3648)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2024-06-12 09:42:57 +00:00
Hayden
01b9987812 chore(l10n): New Crowdin updates (#3726) 2024-06-11 18:53:17 +02:00
renovate[bot]
4e613e15f0 fix(deps): update dependency orjson to v3.10.4 (#3722)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 09:57:53 -05:00
renovate[bot]
5298bdc90f fix(deps): update dependency pydantic-settings to v2.3.2 (#3723)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 09:48:39 -05:00
boc-the-git
2a6bb7d444 docs: Add doco for db changes (#3721) 2024-06-10 13:34:02 +02:00
Hayden
21f1d46b6d chore(l10n): New Crowdin updates (#3720) 2024-06-09 10:10:31 -05:00
Hayden
df15a9e74e chore(l10n): New Crowdin updates (#3716) 2024-06-08 15:06:59 +00:00
renovate[bot]
f53cae7c7b fix(deps): update dependency openai to v1.33.0 (#3715)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-07 21:27:28 -05:00
renovate[bot]
219138fce1 fix(deps): update dependency openai to v1.32.1 (#3713)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-07 21:19:45 +00:00
Michael Genson
4634ad5666 fix: Recipe Keeper Errors and Other Safari Issues (#3712)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2024-06-07 15:35:36 +00:00
Hayden
eab7c0d9e5 chore(l10n): New Crowdin updates (#3711) 2024-06-07 15:10:54 +00:00
Michael Genson
4afb767375 feat: Open AI Recipe Scraper (#3690) 2024-06-07 11:45:50 +00:00
renovate[bot]
a49c32e663 fix(deps): update dependency openai to v1.32.0 (#3709)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-07 09:54:50 +02:00
renovate[bot]
5d55e4b4ff chore(deps): update dependency pylint to v3.2.3 (#3706)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-06 14:22:08 -05:00
renovate[bot]
98c5d142eb fix(deps): update dependency openai to v1.31.2 (#3707)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-06 12:03:22 -05:00
renovate[bot]
c0db6ff3d1 chore(deps): update dependency mkdocs-material to v9.5.26 (#3705)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-06 15:43:23 +02:00
renovate[bot]
b71310cdaf fix(deps): update dependency pydantic-settings to v2.3.1 (#3701)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-05 14:29:31 -05:00
renovate[bot]
91fb750768 fix(deps): update dependency openai to v1.31.1 (#3700)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-05 17:20:25 +00:00
renovate[bot]
7f1139618d chore(deps): update dependency ruff to v0.4.8 (#3699)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-05 17:10:04 +00:00
github-actions[bot]
42b2bc7c15 docs(auto): Update image tag, for release v1.8.0 (#3698)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2024-06-05 09:52:58 +00:00
renovate[bot]
583bd742fb fix(deps): update dependency authlib to v1.3.1 (#3696)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 18:04:09 -05:00
renovate[bot]
af86ed2028 chore(deps): update dependency pytest to v8.2.2 (#3695)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 14:49:33 -05:00
renovate[bot]
80dc1dcaad fix(deps): update dependency pydantic to v2.7.3 (#3689)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 19:11:05 +00:00
renovate[bot]
90e184c0fc fix(deps): update dependency pydantic-settings to v2.3.0 (#3688)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 18:58:27 +00:00
renovate[bot]
393103662f fix(deps): update dependency openai to v1.31.0 (#3691)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 15:18:30 +00:00
Hayden
6e2957fb1e chore(l10n): New Crowdin updates (#3694) 2024-06-04 10:05:53 -05:00
boc-the-git
e7a668e64e feat: Ensure PR title fits convention (#3683) 2024-06-04 13:41:02 +00:00
Hayden
88577b696b New Crowdin updates (#3693) 2024-06-04 12:33:42 +02:00
Hayden
289038ba17 New Crowdin updates (#3687) 2024-06-03 07:43:44 +00:00
boc-the-git
4aec294c26 docs: Add Key Features to README (#3678)
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2024-06-03 00:40:49 +00:00
renovate[bot]
99a13bd0c4 fix(deps): update dependency uvicorn to v0.30.1 (#3685)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-02 19:32:21 +10:00
Hayden
3bd4353685 New Crowdin updates (#3684) 2024-06-02 09:30:18 +02:00
Michael Genson
109ec651cc fix: Broken Data Management Tabs (#3680) 2024-06-01 21:46:31 +00:00
Dennis Gaida
166582acf4 [docs] add possible log levels (#3638)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2024-06-02 07:11:40 +10:00
Michael Genson
4bc88e653f feat: Handle Safari-mangled backup ZIPs and improve backup UI (#3674) 2024-06-01 15:58:42 +00:00
Michael Genson
94e91d3602 feat: Update Shopping List Timestamp on List Item Update (#3453) 2024-06-01 11:07:50 +00:00
renovate[bot]
d6ce607a4e fix(deps): update dependency rapidfuzz to v3.9.3 (#3673)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 10:42:57 +00:00
renovate[bot]
9e8822fabe chore(deps): update dependency ruff to v0.4.7 (#3672)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 20:32:44 +10:00
Hayden
0734ec9ce8 New Crowdin updates (#3675) 2024-06-01 11:13:31 +02:00
Jonathan Beaulieu
f4f2b863e0 feat: Add recipekeeper migration (#3642) 2024-05-31 09:58:04 +00:00
DataDalton
a7fcb6c84d docs: Update documentation link on main readme (#3657) 2024-05-31 06:34:19 +00:00
renovate[bot]
abcee51d0c fix(deps): update dependency openai to v1.30.5 (#3670)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-30 17:00:31 +10:00
renovate[bot]
8b61f95c8c fix(deps): update dependency requests to v2.32.3 (#3668)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2024-05-30 06:34:55 +00:00
renovate[bot]
e01bb60aab fix(deps): update dependency rapidfuzz to v3.9.2 (#3667)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-30 06:24:55 +00:00
Hayden
bf5340b902 New Crowdin updates (#3669) 2024-05-30 16:13:43 +10:00
renovate[bot]
985041e61f fix(deps): update dependency uvicorn to ^0.30.0 (#3659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 14:40:17 +00:00
renovate[bot]
70edf36073 fix(deps): update dependency lxml to v5.2.2 (#3389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 09:31:36 -05:00
renovate[bot]
15a0d25caa fix(deps): update dependency extruct to ^0.17.0 (#3666)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 09:21:06 -05:00
aljora
445754c5d8 Setting backend passwords with docker compose secrets (#3656)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2024-05-29 19:53:24 +10:00
Hayden
831cd9c543 New Crowdin updates (#3665) 2024-05-29 08:59:06 +00:00
renovate[bot]
abaf6062c6 chore(deps): update dependency ruff to v0.4.6 (#3663)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-28 19:47:40 -05:00
renovate[bot]
125c3914b3 fix(deps): update dependency pydantic to v2.7.2 (#3662)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-28 19:08:46 +00:00
renovate[bot]
93cb6bf341 chore(deps): update dependency coverage to v7.5.3 (#3660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-28 18:57:54 +00:00
renovate[bot]
46fb2b2c5a fix(deps): update dependency openai to v1.30.4 (#3661)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-28 13:48:59 -05:00
Hayden
ac2a77b3b0 New Crowdin updates (#3658) 2024-05-28 08:00:49 +02:00
renovate[bot]
66a6426d15 chore(deps): update dependency mkdocs-material to v9.5.25 (#3655)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-27 10:44:49 +00:00
Hayden
508ae30133 New Crowdin updates (#3653) 2024-05-27 09:27:28 +02:00
boc-the-git
e3c642debf feat: Set default number of days on meal planner (#3650) 2024-05-26 21:30:15 +00:00
renovate[bot]
af9e0f27a3 chore(deps): update dependency coverage to v7.5.2 (#3651)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-26 09:56:26 -05:00
boc-the-git
e07467df57 fix: Set the daily schedule to a specific time, rather than 24hr from start up (#3645) 2024-05-26 04:00:51 +00:00
renovate[bot]
55b91bf847 fix(deps): update dependency openai to v1.30.3 (#3646)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-24 19:39:11 +00:00
renovate[bot]
58fc46af9f chore(deps): update dependency ruff to v0.4.5 (#3636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-24 21:45:47 +10:00
Hayden
8e4fe55df1 New Crowdin updates (#3641) 2024-05-23 19:54:57 -05:00
renovate[bot]
f150c3f41e fix(deps): update dependency openai to v1.30.2 (#3640)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-23 15:00:34 +02:00
github-actions[bot]
36c7ae5b4b docs(auto): Update image tag, for release v1.7.0 (#3637)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2024-05-23 07:08:46 +00:00
122 changed files with 3167 additions and 1307 deletions

View File

@@ -1,6 +1,12 @@
<!--
This template provides some ideas of things to include in your PR description.
To start, try providing a short summary of your changes in the Title above.
To start, try providing a short summary of your changes in the Title above. We follow Conventional Commits syntax, please ensure your title is prefixed with one of:
- `feat: `
- `fix: `
- `docs: `
- `chore: `
If a section of the PR template does not apply to this PR, then delete that section.
PLEASE READ:
@@ -36,6 +42,8 @@ _(REQUIRED)_
Briefly explain any decisions you made with respect to the changes.
Include anything here that you didn't include in *Release Notes*
above, such as changes to CI or changes to internal methods.
If there is a UI component to the change, please include before/after images.
-->
## Which issue(s) this PR fixes:
@@ -44,7 +52,7 @@ _(REQUIRED)_
<!--
If this PR fixes one of more issues, list them here.
One line each, like so:
One per line, like so:
Fixes #123
Fixes #39
-->

41
.github/workflows/pull-request-lint.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Pull Request Linter
on:
workflow_call:
pull_request:
types: [edited] # This captures the PR title changing
branches:
- mealie-next
jobs:
validate-title:
name: Validate PR title
runs-on: ubuntu-latest
steps:
# https://github.com/amannn/action-semantic-pull-request
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Configure which types are allowed (newline-delimited).
# Default: https://github.com/commitizen/conventional-commit-types
types: |
fix
feat
docs
chore
# Configure which scopes are allowed (newline-delimited).
# These are regex patterns auto-wrapped in `^ $`.
scopes: |
deps
auto
l10n
# Configure that a scope must always be provided.
requireScope: false
# If the PR contains one of these newline-delimited labels, the
# validation is skipped. If you want to rerun the validation when
# labels change, you might want to use the `labeled` and `unlabeled`
# event triggers in your workflow.
ignoreLabels: |
bot
ignore-semantic-pull-request

View File

@@ -6,6 +6,10 @@ on:
- mealie-next
jobs:
pull-request-lint:
name: "Lint PR"
uses: ./.github/workflows/pull-request-lint.yml
backend-tests:
name: "Backend Server Tests"
uses: ./.github/workflows/partial-backend.yml

View File

@@ -1,10 +1,10 @@
[![Latest Release][latest-release-shield]][latest-release-url]
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![AGPL License][license-shield]][license-url]
[![Docker Pulls][docker-pull]][docker-pull]
[![Docker Pulls][docker-pull]][docker-url]
[![GHCR Pulls][ghcr-pulls]][ghcr-url]
<!-- PROJECT LOGO -->
<br />
@@ -18,9 +18,9 @@
<h3 align="center">Mealie</h3>
<p align="center">
A Place for All Your Recipes
A Place For All Your Recipes
<br />
<a href="https://nightly.mealie.io"><strong>Explore the docs »</strong></a>
<a href="https://docs.mealie.io/"><strong>Explore the docs »</strong></a>
<a href="https://github.com/mealie-recipes/mealie">
</a>
<br />
@@ -38,12 +38,20 @@
# About The Project
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the URL and Mealie will automatically import the relevant data, or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
Mealie is a self hosted recipe manager, meal planner and shopping list with a RestAPI backend and a reactive frontend built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the URL and Mealie will automatically import the relevant data, or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
- [Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
- [Documentation](https://nightly.mealie.io)
- [Documentation](https://docs.mealie.io/)
## Key Features
- Recipe imports: Create recipes, by **importing from a URL** or entering data manually
- Meal Planner: Use the **Meal Planner** to plan your what you'll cook for the next week
- Shopping List: Put the necessary ingredients on your **Shopping List**, organised into sections of your local supermarket
- Cookbooks: Group recipes into **Cookbooks** based on your own criteria
- Docker: Easy **Docker** deployment
- Localisation: **Translations** for 35+ languages
<!-- CONTRIBUTING -->
## Contributing
@@ -58,7 +66,7 @@ If you are not a coder, you can still contribute financially. Financial contribu
### Translations
Translations can be a great way for **non-coders** to contribute to project. We use [Crowdin](https://crowdin.com/project/mealie) to allow several contributors to work on translating Mealie. You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
Translations can be a great way for **non-coders** to contribute to the project. We use [Crowdin](https://crowdin.com/project/mealie) to allow several contributors to work on translating Mealie. You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
For more information, check out the translation page on the [contributor's guide](https://nightly.mealie.io/contributors/translating/).
@@ -80,16 +88,17 @@ Thanks to Depot for providing build instances for our Docker image builds.
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/mealie-recipes/mealie.svg?style=flat-square
[docker-pull]: https://img.shields.io/docker/pulls/hkotel/mealie
[docker-pull]: https://img.shields.io/docker/pulls/hkotel/mealie?style=flat-square
[docker-url]: https://hub.docker.com/r/hkotel/mealie
[ghcr-pulls]: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fipitio%2Fghcr-pulls%2Fmaster%2Findex.json&query=%24%5B%3F(%40.owner%3D%3D%22mealie-recipes%22%20%26%26%20%40.repo%3D%3D%22mealie%22%20%26%26%20%40.image%3D%3D%22mealie%22)%5D.pulls&style=flat-square&label=ghcr%20pulls
[ghcr-url]: https://github.com/mealie-recipes/mealie/pkgs/container/mealie
[contributors-url]: https://github.com/mealie-recipes/mealie/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/mealie-recipes/mealie.svg?style=flat-square
[forks-url]: https://github.com/mealie-recipes/mealie/network/members
[stars-shield]: https://img.shields.io/github/stars/mealie-recipes/mealie.svg?style=flat-square
[stars-url]: https://github.com/mealie-recipes/mealie/stargazers
[issues-shield]: https://img.shields.io/github/issues/mealie-recipes/mealie.svg?style=flat-square
[issues-url]: https://github.com/mealie-recipes/mealie/issues
[latest-release-shield]: https://img.shields.io/github/v/release/mealie-recipes/mealie?style=flat-square&label=latest%20release
[latest-release-url]: https://img.shields.io/github/v/release/mealie-recipes/mealie
[latest-release-url]: https://github.com/mealie-recipes/mealie/releases
[license-shield]: https://img.shields.io/github/license/mealie-recipes/mealie.svg?style=flat-square
[license-url]: https://github.com/mealie-recipes/mealie/blob/mealie-next/LICENSE
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555

View File

@@ -148,7 +148,7 @@ tasks:
- poetry run python mealie/app.py
py:migrate:
desc: generates a new migration file e.g. task py:migrate:generate "add new column"
desc: generates a new database migration file e.g. task py:migrate "add new column"
cmds:
- poetry run alembic revision --autogenerate -m "{{ .CLI_ARGS }}"
- task: py:format

View File

@@ -1,4 +1,8 @@
preserve_hierarchy: false
pull_request_title: "chore(l10n): New Crowdin updates"
pull_request_labels: [
"l10n"
]
files:
- source: /frontend/lang/messages/en-US.json
translation: /frontend/lang/messages/%locale%.json

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,386 @@
{
"name": "Mealie Backup",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"id": "2ec440b4-0668-4bc0-aa66-4023d6379f28",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
240,
660
]
},
{
"parameters": {
"method": "POST",
"url": "https://mealie.example/api/admin/backups",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "235f26f7-0f45-479e-a7e3-bf8cda7c8426",
"name": "Run Backup ",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
520,
520
],
"notesInFlow": false,
"credentials": {
"httpHeaderAuth": {
"id": "GSL12tNi3MPvTZux",
"name": "Mealie API"
}
},
"notes": "Send an API call to run the backup"
},
{
"parameters": {
"method": "POST",
"url": "https://ntfy.example/backups",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Title",
"value": "Meale Backup Failure"
},
{
"name": "Priority",
"value": "urgent"
},
{
"name": "Tags",
"value": "warning"
},
{
"name": "Actions",
"value": "view, Open Mealie, https://mealie.example/admin/backups; view, Open n8n, https://n8n.example"
}
]
},
"sendBody": true,
"contentType": "raw",
"body": "\"Full Panic!\"",
"options": {}
},
"id": "40ba81a5-5741-4b15-98af-1a9e6b34f997",
"name": "Ntfy Warning",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
1000,
520
],
"onError": "continueRegularOutput"
},
{
"parameters": {
"url": "https://mealie.example/api/admin/backups",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "b75571d0-d926-440c-897f-55b89c6a5080",
"name": "Get all backups",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
520,
820
],
"credentials": {
"httpHeaderAuth": {
"id": "GSL12tNi3MPvTZux",
"name": "Mealie API"
}
}
},
{
"parameters": {
"fieldToSplitOut": "imports",
"options": {}
},
"id": "943d0e83-682b-4500-9faf-53284cfb02c6",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
720,
820
]
},
{
"parameters": {
"jsCode": "// Get input data\nconst inputData = items.map(item => item.json);\n\n// Sort the data based on the 'date' field in descending order\ninputData.sort((a, b) => new Date(b.date) - new Date(a.date));\n\n// Get all records except the latest 7\nconst allExceptLatest7 = inputData.slice(7);\n\n// Map the output data back to the required format\nreturn allExceptLatest7.map(record => ({ json: record }));\n"
},
"id": "64eae81d-fdb6-44f7-9a2d-eff8d1763281",
"name": "Code",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
860,
820
]
},
{
"parameters": {
"method": "DELETE",
"url": "=https://mealie.example/api/admin/backups/{{ $json.name }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "1148eeb8-4860-46df-8f61-0e85ea1e0e89",
"name": "Delete Oldies",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
1040,
820
],
"credentials": {
"httpHeaderAuth": {
"id": "GSL12tNi3MPvTZux",
"name": "Mealie API"
}
}
},
{
"parameters": {
"content": "Sends API Call to run backup",
"height": 225,
"width": 226,
"color": 4
},
"id": "cd2cb5db-87c1-40d8-a746-e61ace231987",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
460,
460
]
},
{
"parameters": {
"content": "Is there an error?",
"height": 225,
"width": 231,
"color": 3
},
"id": "0bebecbe-903e-4a69-bb1a-35619e68b540",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
700,
460
]
},
{
"parameters": {
"content": "Send alert to NTFY",
"height": 225,
"width": 229
},
"id": "0b732adb-8a84-456d-b26d-5fc5ee5a4cae",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
940,
460
]
},
{
"parameters": {
"content": "Gets all backups in Mealie",
"height": 225,
"width": 226,
"color": 4
},
"id": "99c6886b-6a07-4b51-b395-d4bbcbde7d18",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
460,
760
]
},
{
"parameters": {
"content": "Splits the data, and parses the output",
"height": 225,
"width": 281
},
"id": "549555f8-0aed-42c0-9693-9c0d93902796",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
700,
760
]
},
{
"parameters": {
"content": "Deletes all but the last 7 backups",
"height": 225,
"width": 229
},
"id": "bcc5f0ba-73e9-42d7-b01b-c32f9f69f2f7",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1000,
760
]
},
{
"parameters": {
"content": "Run every day a 01:00",
"height": 225,
"width": 226,
"color": 4
},
"id": "ce797062-d727-43e3-a27f-e29b13ad3c9a",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
180,
600
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "8b00bb85-827f-4f2f-813e-db0d25e927d3",
"leftValue": "={{ $json.error }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "fefd3e8b-9b71-490a-82e3-25e5468a4135",
"name": "Error?",
"type": "n8n-nodes-base.filter",
"typeVersion": 2,
"position": [
760,
520
]
}
],
"pinData": {},
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Run Backup ",
"type": "main",
"index": 0
},
{
"node": "Get all backups",
"type": "main",
"index": 0
}
]
]
},
"Run Backup ": {
"main": [
[
{
"node": "Error?",
"type": "main",
"index": 0
}
]
]
},
"Get all backups": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Delete Oldies",
"type": "main",
"index": 0
}
]
]
},
"Error?": {
"main": [
[
{
"node": "Ntfy Warning",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "68e3e469-3ddb-4838-b09d-3c69fdd851f5",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "630eefaa8c490b9c5221d83a182af6450c2c3efaf4b580b8ac348631abfe1aeb"
},
"id": "whloxeXkdBWWi2Uj",
"tags": []
}

View File

@@ -2,11 +2,11 @@
[Please Join the Discord](https://discord.gg/QuStdQGSGK). We are building a community of developers working on the project.
## We Develop with Github
We use github to host code, to track issues and feature requests, as well as accept pull requests.
## We Develop with GitHub
We use GitHub to host code, to track issues and feature requests, as well as accept pull requests.
## We Use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow)). We actively welcome your pull requests:
## We Use [GitHub Flow](https://docs.github.com/en/get-started/using-github/github-flow), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [GitHub Flow](https://docs.github.com/en/get-started/using-github/github-flow)). We actively welcome your pull requests:
1. Fork the repo and create your branch from `mealie-next`.
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
@@ -14,13 +14,13 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu
4. Once you've got an idea of what changes you want to make, create a draft PR as soon as you can to let us know what you're working on and how we can help!
5. If you've changed APIs, update the documentation.
6. Run tests, including `task py:check`.
6. Issue that pull request! First make a draft PR, make sure that the automated github tests all pass, then mark as ready for review.
7. Be sure to add release notes to the pull request.
7. Issue that pull request! First make a draft PR, make sure that the automated GitHub tests all pass, then mark as ready for review. We follow Conventional Commits syntax; please title your PR as described in the PR template.
8. Be sure to add release notes to the pull request.
## Any contributions you make will be under the AGPL Software License
In short, when you submit code changes, your submissions are understood to be under the same [AGPL License](https://choosealicense.com/licenses/agpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/mealie-recipes/mealie/issues)
## Report bugs using GitHub's [issues](https://github.com/mealie-recipes/mealie/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/mealie-recipes/mealie/issues/new); it's that easy!
## Write bug reports with detail, background, and sample code

View File

@@ -0,0 +1,85 @@
# Development: Database Changes
This document is open to improvement; please share any insights you have/develop.
## Overview
When modifying the database, you will most likely need to change the files under `/mealie/db/models/`.
How exactly you need to modify it is of course highly contextual to the change you're making.
## Using Alembic to generate upgrade script
In your dev container you can run something like (change the message) `task py:migrate "Add creation tag to group preferences"` to have Alembic generate an upgrade script for you.
The script Alembic generates, will be limited! (Perhaps there's a way to resolve that? Haven't looked into it yet)
For example, Alembic generated a script _similar_ to this (it has been modified already to have accurate foreign key names, for instance):
```Python
"""Add creation tag to group preferences
Revision ID: 0ea6eb8eaa44
Revises: ba1e4a6cfe99
Create Date: 2024-01-04 12:40:03.062671
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "0ea6eb8eaa44"
down_revision = "ba1e4a6cfe99"
branch_labels = None
depends_on = None
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column(
"group_preferences", sa.Column("recipe_creation_tag", mealie.db.migration_types.GUID(), nullable=True)
)
op.create_foreign_key("fk_groupprefs_tags", "group_preferences", "tags", ["recipe_creation_tag"], ["id"])
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_constraint("fk_groupprefs_tags", "group_preferences", type_="foreignkey")
op.drop_column("group_preferences", "recipe_creation_tag")
### end Alembic commands ###
```
But when trying to actually use that upgrade script, it becomes clear that our SQLite database doesn't like them. The minor modification needed looks like:
```Python
"""Add creation tag to group preferences
Revision ID: 0ea6eb8eaa44
Revises: ba1e4a6cfe99
Create Date: 2024-01-04 12:40:03.062671
"""
import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
# revision identifiers, used by Alembic.
revision = "0ea6eb8eaa44"
down_revision = "ba1e4a6cfe99"
branch_labels = None
depends_on = None
def upgrade():
with op.batch_alter_table("group_preferences", schema=None) as batch_op:
batch_op.add_column(sa.Column("recipe_creation_tag", mealie.db.migration_types.GUID(), nullable=True))
batch_op.create_foreign_key("fk_groupprefs_tags", "tags", ["recipe_creation_tag"], ["id"])
def downgrade():
with op.batch_alter_table("group_preferences", schema=None) as batch_op:
batch_op.drop_constraint("fk_groupprefs_tags", type_="foreignkey")
batch_op.drop_column("recipe_creation_tag")
```

View File

@@ -0,0 +1,80 @@
# Automating Backups with n8n
!!! info
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
> [n8n](https://github.com/n8n-io/n8n) is a free and source-available fair-code licensed workflow automation tool. Alternative to Zapier or Make, allowing you to use a UI to create automated workflows.
This example workflow:
1. Backups Mealie every morning via an API call
2. Deletes all but the last 7 backups
> [!CAUTION]
> This only automates the backup function, this does not backup your data to anywhere except your local instance. Please make sure you are backing up your data to an external source.
---
![screenshot](../../assets/img/n8n/n8n-mealie-backup.png)
# Setup
## Deploying n8n
Follow the relevant guide in the [n8n Documentation](https://docs.n8n.io/)
## Importing n8n workflow
1. In n8n, add a new workflow
2. In the top right hit the 3 dot menu and select 'Import from URL...'
![screenshot](../../assets/img/n8n/n8n-workflow-import.png)
3. Paste `https://github.com/mealie-recipes/mealie/blob/mealie-next/docs/docs/assets/other/n8n/n8n-mealie-backup.json` and click Import
4. Click through the nodes and update the URLs for your environment
## API Credentials
#### Generate Mealie API Token
1. Head to https://mealie.example.com/user/profile/api-tokens
> If you dont see this screen make sure that "Show advanced features" is checked under https://mealie.example.com/user/profile/edit
2. Under token name, enter the name of the token i.e. 'n8n' and hit Generate
3. Copy and keep this API Token somewhere safe, this is like your password!
> You can use your normal user for this, but assuming you're an admin you could also choose to create a user named n8n and generate the API key against that user.
#### Setup Credentials in n8n
> [n8n Docs](https://docs.n8n.io/credentials/add-edit-credentials/)
1. Create a new "Header Auth" Credential
![screenshot](../../assets/img/n8n/n8n-cred-app.png)
2. In the connection screen set - Name as `Authorization` - Value as `Bearer {INSERT MEALIE API KEY}`
![screenshot](../../assets/img/n8n/n8n-cred-connection.png)
3. In the workflow you created, for the "Run Backup", "Get All backups", and "Delete Oldies" nodes, update:
- Authentication to `Generic Credential Type`
- Generic Auth Type to `Header Auth`
- Header Auth to `Mealie API` or whatever you named your credentials
![screenshot](../../assets/img/n8n/n8n-workflow-auth.png)
## Notification Node
> Please use error notifications of some kind. It's very easy to set and forget an automation, then have the worst happen and lose data.
[ntfy](https://github.com/binwiederhier/ntfy) is a great open source, self-hostable tool for sending notifications.
If you want to use ntfy, you will need to install it on your environment, or sign up for their service, and configure it with the webhook URL.
If you want to use another notification service, you can create a new node in n8n that sends the notification using whatever method you like.
- For example, if you want to send a push notification via [Pushover](https:/pushover.net/) you could create a new node that uses the Pushover API and sends the notification.
- You can use the [Send Email](https://docs.n8n.io/integrations/builtincore-nodes/n8n-nodes-base.sendemail/) node in n8n as an example of how to create your own custom node.
- You can send it off to InfluxDB, Slack, Discord etc. Go nuts.
If you're using another method for backups we'd love to hear about it. Pop in [Discord](https://discord.gg/QuStdQGSGK) and say hi!

View File

@@ -14,10 +14,14 @@ Mealie offers two main ways to create recipes. You can use the integrated recipe
Mealie supports importing recipes from a few other sources besides websites. Currently the following sources are supported:
- Mealie Pre v1
- Tandoor
- Nextcloud Cookbooks
- Paprika
- Chowdown
- Plan to Eat
- Recipe Keeper
- Copy Me That
- My Recipe Box
You can access these options on your installation at the `/group/migrations` page on your installation. If you'd like to see another source added, feel free to request so on Github.

View File

@@ -16,7 +16,8 @@
| TZ | UTC | Must be set to get correct date/time on the server |
| ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token |
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
| LOG_LEVEL | info | logging level configured |
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug, trace) |
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run the daily tasks. |
<super>\*</super> Starting in v1.4.0 this was changed to default to `false` as apart of a security review of the application.
@@ -137,6 +138,28 @@ Setting the following environmental variables will change the theme of the front
| THEME_DARK_WARNING | #FF6D00 | Dark Theme Config Variable |
| THEME_DARK_ERROR | #EF5350 | Dark Theme Config Variable |
### Docker Secrets
Setting a credential can be done using secrets when running in a Docker container.
This can be used to avoid leaking passwords through compose files, environment variables, or command-line history.
For example, to configure the Postgres database password in Docker compose, create a file on the host that contains only the password, and expose that file to the Mealie service as a secret with the correct name.
Note that environment variables take priority over secrets, so any previously defined environment variables should be removed when migrating to secrets.
```
services:
mealie:
...
environment:
...
POSTGRES_USER: postgres
secrets:
- POSTGRES_PASSWORD
secrets:
POSTGRES_PASSWORD:
file: postgrespassword.txt
```
[workers_per_core]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#workers_per_core
[max_workers]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#max_workers
[web_concurrency]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#web_concurrency

View File

@@ -2,7 +2,7 @@
:octicons-tag-24: v1.5.0
## Highlighs
## Highlights
- Logs are written to `/app/data/mealie.log` by default in the container.
- Logs are also written to stdout and stderr.
@@ -13,4 +13,4 @@
Starting in v1.5.0 logging is now highly configurable. Using the `LOG_CONFIG_OVERRIDE` you can provide the application with a custom configuration to log however you'd like. This configuration file is based off the [Python Logging Config](https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig). It can be difficult to understand the configuration at first, so here are some resources to help get started.
- This [YouTube Video](https://www.youtube.com/watch?v=9L77QExPmI0) for a great walkthrough on the logging file format.
- Our [Logging Config](https://github.com/mealie-recipes/mealie/blob/mealie-next/mealie/core/logger/logconf.prod.json)
- Our [Logging Config](https://github.com/mealie-recipes/mealie/blob/mealie-next/mealie/core/logger/logconf.prod.json).

View File

@@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v1.6.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v1.8.0 # (3)
container_name: mealie
restart: always
ports:

View File

@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
```yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v1.6.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v1.8.0 # (3)
container_name: mealie
restart: always
ports:

View File

@@ -79,8 +79,8 @@ nav:
- Permissions and Public Access: "documentation/getting-started/usage/permissions-and-public-access.md"
- Authentication:
- LDAP: "documentation/getting-started/authentication/ldap.md"
- OpenID Connect: "documentation/getting-started/authentication/oidc.md"
- LDAP: "documentation/getting-started/authentication/ldap.md"
- OpenID Connect: "documentation/getting-started/authentication/oidc.md"
- Community Guides:
- iOS Shortcuts: "documentation/community-guide/ios.md"
@@ -88,6 +88,7 @@ nav:
- Home Assistant: "documentation/community-guide/home-assistant.md"
- Bulk Url Import: "documentation/community-guide/bulk-url-import.md"
- Import Bookmarklet: "documentation/community-guide/import-recipe-bookmarklet.md"
- Automate Backups with n8n: "documentation/community-guide/n8n-backup-automation.md"
- API Reference: "api/redoc.md"

View File

@@ -31,6 +31,13 @@
<v-switch v-model="preferences.showNotes" hide-details :label="$tc('recipe.notes')" />
</v-row>
</v-col>
<v-col cols="auto" align-self="start">
<v-row no-gutters>
<v-switch v-model="preferences.showNutrition" hide-details :label="$tc('recipe.nutrition')" />
</v-row>
<v-row no-gutters>
</v-row>
</v-col>
</v-row>
</v-container>
<v-card

View File

@@ -45,6 +45,22 @@ export default defineComponent({
.d-inline {
& > p {
display: inline;
&:has(>sub)>sup {
letter-spacing: -0.05rem;
}
}
&:has(sub) {
&:after {
letter-spacing: -0.2rem;
}
}
sup {
&+span{
letter-spacing: -0.05rem;
}
&:before {
letter-spacing: 0rem;
}
}
}

View File

@@ -8,14 +8,8 @@
<v-card-text v-if="edit">
<div v-for="(item, key, index) in value" :key="index">
<v-text-field
dense
:value="value[key]"
:label="labels[key].label"
:suffix="labels[key].suffix"
type="number"
autocomplete="off"
@input="updateValue(key, $event)"
></v-text-field>
dense :value="value[key]" :label="labels[key].label" :suffix="labels[key].suffix" type="number"
autocomplete="off" @input="updateValue(key, $event)"></v-text-field>
</div>
</v-card-text>
<v-list v-if="showViewer" dense class="mt-0 pt-0">
@@ -34,17 +28,10 @@
</template>
<script lang="ts">
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
import { computed, defineComponent } from "@nuxtjs/composition-api";
import { useNutritionLabels } from "~/composables/recipes";
import { Nutrition } from "~/lib/api/types/recipe";
type NutritionLabelType = {
[key: string]: {
label: string;
suffix: string;
value?: string;
};
};
import { NutritionLabelType } from "~/composables/recipes/use-recipe-nutrition";
export default defineComponent({
props: {
value: {
@@ -57,37 +44,7 @@ export default defineComponent({
},
},
setup(props, context) {
const { i18n } = useContext();
const labels = <NutritionLabelType>{
calories: {
label: i18n.tc("recipe.calories"),
suffix: i18n.tc("recipe.calories-suffix"),
},
fatContent: {
label: i18n.tc("recipe.fat-content"),
suffix: i18n.tc("recipe.grams"),
},
fiberContent: {
label: i18n.tc("recipe.fiber-content"),
suffix: i18n.tc("recipe.grams"),
},
proteinContent: {
label: i18n.tc("recipe.protein-content"),
suffix: i18n.tc("recipe.grams"),
},
sodiumContent: {
label: i18n.tc("recipe.sodium-content"),
suffix: i18n.tc("recipe.milligrams"),
},
sugarContent: {
label: i18n.tc("recipe.sugar-content"),
suffix: i18n.tc("recipe.grams"),
},
carbohydrateContent: {
label: i18n.tc("recipe.carbohydrate-content"),
suffix: i18n.tc("recipe.grams"),
},
};
const { labels } = useNutritionLabels();
const valueNotNull = computed(() => {
let key: keyof Nutrition;
for (key in props.value) {

View File

@@ -83,19 +83,42 @@
</div>
</section>
</div>
<!-- Nutrition -->
<div v-if="preferences.showNutrition">
<v-card-title class="headline pl-0"> {{ $t("recipe.nutrition") }} </v-card-title>
<section>
<div class="print-section">
<table class="nutrition-table">
<tbody>
<tr v-for="(value, key) in recipe.nutrition" :key="key">
<template v-if="value">
<td>{{ labels[key].label }}</td>
<td>{{ value || '-' }}</td>
</template>
</tr>
</tbody>
</table>
</div>
</section>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, computed } from "@nuxtjs/composition-api";
import { computed, defineComponent } from "@nuxtjs/composition-api";
import RecipeTimeCard from "~/components/Domain/Recipe/RecipeTimeCard.vue";
import { useStaticRoutes } from "~/composables/api";
import { Recipe, RecipeIngredient, RecipeStep } from "~/lib/api/types/recipe";
import { Recipe, RecipeIngredient, RecipeStep} from "~/lib/api/types/recipe";
import { NoUndefinedField } from "~/lib/api/types/non-generated";
import { ImagePosition, useUserPrintPreferences } from "~/composables/use-users/preferences";
import { parseIngredientText } from "~/composables/recipes";
import { parseIngredientText, useNutritionLabels } from "~/composables/recipes";
import { usePageState } from "~/composables/recipe-page/shared-state";
type IngredientSection = {
sectionName: string;
ingredients: RecipeIngredient[];
@@ -129,6 +152,10 @@ export default defineComponent({
const preferences = useUserPrintPreferences();
const { recipeImage } = useStaticRoutes();
const { imageKey } = usePageState(props.recipe.slug);
const {labels} = useNutritionLabels();
const recipeImageUrl = computed(() => {
return recipeImage(props.recipe.id, props.recipe.image, imageKey.value);
@@ -221,6 +248,7 @@ export default defineComponent({
}
return {
labels,
hasNotes,
imageKey,
ImagePosition,
@@ -290,4 +318,16 @@ li {
list-style-type: none;
margin-bottom: 0.25rem;
}
.nutrition-table {
width: 25%;
border-collapse: collapse;
}
.nutrition-table td {
padding: 2px;
text-align: left;
font-size: 14px;
}
</style>

View File

@@ -38,7 +38,7 @@
</v-list-item-icon>
<v-list-item-title>{{ item.text }}</v-list-item-title>
</v-list-item>
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>\
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
</div>
</template>
</v-list-item-group>
@@ -80,7 +80,7 @@ export interface MenuItem {
value?: string;
event?: string;
divider?: boolean;
hide?:boolean;
hide?: boolean;
}
export default defineComponent({

View File

@@ -2,4 +2,5 @@ export { useFraction } from "./use-fraction";
export { useRecipe } from "./use-recipe";
export { useRecipes, recentRecipes, allRecipes, useLazyRecipes } from "./use-recipes";
export { parseIngredientText, useParsedIngredientText } from "./use-recipe-ingredients";
export { useNutritionLabels } from "./use-recipe-nutrition";
export { useTools } from "./use-recipe-tools";

View File

@@ -31,13 +31,13 @@ describe(parseIngredientText.name, () => {
test("ingredient text with fraction", () => {
const ingredient = createRecipeIngredient({ quantity: 1.5, unit: { fraction: true, id: "1", name: "cup" } });
expect(parseIngredientText(ingredient, false, 1, true)).contain("1 <sup>1</sup>").and.to.contain("<sub>2</sub>");
expect(parseIngredientText(ingredient, false, 1, true)).contain("1<sup>1</sup>").and.to.contain("<sub>2</sub>");
});
test("ingredient text with fraction when unit is null", () => {
const ingredient = createRecipeIngredient({ quantity: 1.5, unit: undefined });
expect(parseIngredientText(ingredient, false, 1, true)).contain("1 <sup>1</sup>").and.to.contain("<sub>2</sub>");
expect(parseIngredientText(ingredient, false, 1, true)).contain("1<sup>1</sup>").and.to.contain("<sub>2</sub>");
});
test("ingredient text with fraction no formatting", () => {

View File

@@ -63,7 +63,7 @@ export function useParsedIngredientText(ingredient: RecipeIngredient, disableAmo
if (fraction[1] > 0) {
returnQty += includeFormating ?
` <sup>${fraction[1]}</sup>&frasl;<sub>${fraction[2]}</sub>` :
`<sup>${fraction[1]}</sup><span>&frasl;</span><sub>${fraction[2]}</sub>` :
` ${fraction[1]}/${fraction[2]}`;
}
}

View File

@@ -0,0 +1,47 @@
import { useContext } from "@nuxtjs/composition-api";
export interface NutritionLabelType {
[key: string]: {
label: string;
suffix: string;
value?: string;
};
};
export function useNutritionLabels() {
const { i18n } = useContext();
const labels = <NutritionLabelType>{
calories: {
label: i18n.tc("recipe.calories"),
suffix: i18n.tc("recipe.calories-suffix"),
},
fatContent: {
label: i18n.tc("recipe.fat-content"),
suffix: i18n.tc("recipe.grams"),
},
fiberContent: {
label: i18n.tc("recipe.fiber-content"),
suffix: i18n.tc("recipe.grams"),
},
proteinContent: {
label: i18n.tc("recipe.protein-content"),
suffix: i18n.tc("recipe.grams"),
},
sodiumContent: {
label: i18n.tc("recipe.sodium-content"),
suffix: i18n.tc("recipe.milligrams"),
},
sugarContent: {
label: i18n.tc("recipe.sugar-content"),
suffix: i18n.tc("recipe.grams"),
},
carbohydrateContent: {
label: i18n.tc("recipe.carbohydrate-content"),
suffix: i18n.tc("recipe.grams"),
},
};
return { labels }
}

View File

@@ -6,6 +6,7 @@ export interface UserPrintPreferences {
imagePosition: string;
showDescription: boolean;
showNotes: boolean;
showNutrition: boolean;
}
export interface UserSearchQuery {
@@ -18,6 +19,10 @@ export enum ImagePosition {
right = "right",
}
export interface UserMealPlanPreferences {
numberOfDays: number;
}
export interface UserRecipePreferences {
orderBy: string;
orderDirection: string;
@@ -40,6 +45,20 @@ export interface UserParsingPreferences {
parser: RegisteredParser;
}
export function useUserMealPlanPreferences(): Ref<UserMealPlanPreferences> {
const fromStorage = useLocalStorage(
"meal-planner-preferences",
{
numberOfDays: 7,
},
{ mergeDefaults: true }
// we cast to a Ref because by default it will return an optional type ref
// but since we pass defaults we know all properties are set.
) as unknown as Ref<UserMealPlanPreferences>;
return fromStorage;
}
export function useUserPrintPreferences(): Ref<UserPrintPreferences> {
const fromStorage = useLocalStorage(
"recipe-print-preferences",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Maaltydplan opgedateer",
"no-meal-plan-defined-yet": "Nog geen maaltydplan opgestel nie",
"no-meal-planned-for-today": "Geen maaltyd beplan vir vandag nie",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Slegs resepte met hierdie kategorieë sal in maaltydplanne gebruik word",
"planner": "Beplanner",
"quick-week": "Vinnige week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Kon nie verslag uitvee nie",
"recipe-debugger": "Resep debugger",
"recipe-debugger-description": "Gryp die URL van die resep wat jy wil debug en plak dit hier. Die URL sal deur die resepskraper geskraap word en die resultate sal vertoon word. As jy nie enige data terugstuur sien nie, word die webwerf wat jy probeer skraap nie deur Mealie of sy skraperbiblioteek ondersteun nie.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Boomstruktuur",
"recipe-yield": "Resep opbrengs",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Back-up gemaak op {path}",
"backup-deleted": "Back-up verwyder",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Back-up merker",
"create-heading": "Maak 'n back-up",
"delete-backup": "Verwyder back-up",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "تم تحديث خطة الوجبات",
"no-meal-plan-defined-yet": "لم يتم تحديد خطة بعد",
"no-meal-planned-for-today": "لم يتم تخطيط وجبة لهذا اليوم",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "فقط الوجبات التي تحتوي على التصنيفات التالية سوف تستخدم لإنشاء خطتك",
"planner": "المخطط",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Седмичното меню бе обновено",
"no-meal-plan-defined-yet": "Все още няма създадено седмично меню",
"no-meal-planned-for-today": "За днес няма планирано меню",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Само рецептите от тези категории ще бъдат използвани в хранителните планове",
"planner": "Планьор",
"quick-week": "Бърза седмица",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Моята кутия с рецепти",
"description-long": "Mealie може да импортира рецепти от Моята кутия за рецепти. Експортирайте рецептите си в CSV формат, после качете .csv файлът по-долу."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Неуспешно изтриване на доклад",
"recipe-debugger": "Debugger на рецепти",
"recipe-debugger-description": "Вземете URL на рецептата, която желаете да проверите за грешки и го поставете тук. URL ще бъде обходен и резултатите ще бъдат визуализирани. Ако не виждате върнати данни, сайтът който се опитвате да обходите не се поддържа от Mealie или библиотеката за обхождане.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Отстраняване на грешки",
"tree-view": "Дървовиден изглед",
"recipe-yield": "Добиване от рецепта",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Резервно копие е създадено на {path}",
"backup-deleted": "Резервното копие е изтрито",
"restore-success": "Успешно възстановяване",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Етикет на резервното копие",
"create-heading": "Създай резервно копие",
"delete-backup": "Изтрий резервно копие",

View File

@@ -64,7 +64,7 @@
"something-went-wrong": "Alguna cosa ha anat malament!",
"subscribed-events": "Esdeveniments subscrits",
"test-message-sent": "S'ha enviat el missatge",
"message-sent": "Message Sent",
"message-sent": "Missatge enviat",
"new-notification": "Nova notificació",
"event-notifiers": "Notificacions d'esdeveniments",
"apprise-url-skipped-if-blank": "Apprise URL (si es deixa buit, s'ignorarà)",
@@ -81,7 +81,7 @@
"recipe-events": "Esdeveniments de receptes"
},
"general": {
"add": "Add",
"add": "Afegeix",
"cancel": "Anuŀla",
"clear": "Neteja",
"close": "Tanca",
@@ -145,23 +145,23 @@
"save": "Desa",
"settings": "Configuració",
"share": "Compartiu",
"show-all": "Show All",
"show-all": "Mostra-ho tot",
"shuffle": "Barreja",
"sort": "Ordena",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Ordre ascendent",
"sort-descending": "Ordre descendent",
"sort-alphabetically": "Alfabèticament",
"status": "Estat",
"subject": "Assumpte",
"submit": "Envia",
"success-count": "Amb èxit: {count}",
"sunday": "Diumenge",
"system": "System",
"system": "Sistema",
"templates": "Plantilles:",
"test": "Prova",
"themes": "Temes",
"thursday": "Dijous",
"title": "Title",
"title": "Títol",
"token": "Token",
"tuesday": "Dimarts",
"type": "Tipus",
@@ -176,7 +176,7 @@
"units": "Unitats",
"back": "Torna",
"next": "Següent",
"start": "Start",
"start": "Comença",
"toggle-view": "Commuta la visualització",
"date": "Data",
"id": "Id",
@@ -210,7 +210,7 @@
"unsaved-changes": "Tens canvis que no estan guardats. Vols guardar-los abans de sortir? Clica d'acord per guardar-los o cancel·lar per descartar els canvis.",
"clipboard-copy-failure": "No s'ha pogut copiar al porta-retalls.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers"
"organizers": "Organitzadors"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
@@ -246,7 +246,7 @@
"group-preferences": "Preferències per grup",
"private-group": "Grup privat",
"private-group-description": "Marcar el grup com a privat afectarà a totes les opcions de visualització pública per defecte. Podeu canviar-les individualment en les opcions de visualització de cada recepta.",
"enable-public-access": "Enable Public Access",
"enable-public-access": "Permetre l'accés públic",
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
"allow-users-outside-of-your-group-to-see-your-recipes": "Permeteu als usuaris d'altres grups, visualitzar les vostres receptes",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Si ho habiliteu, podreu compartir enllaços públics de receptes específiques sense autoritzar l'usuari. Si està deshabilitat, només podreu compartir amb usuaris del vostre grup o generant enllaços privats",
@@ -291,6 +291,8 @@
"mealplan-updated": "S'ha actualitzat el menú",
"no-meal-plan-defined-yet": "No hi ha cap menú planificat",
"no-meal-planned-for-today": "No hi han cap menú per a hui",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Dies per defecte",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Només s'utilitzaran aquestes categories per als menús",
"planner": "Planificador",
"quick-week": "Pla ràpid",
@@ -375,8 +377,12 @@
"description-long": "Mealie pot importar receptes de Plan to Eat."
},
"myrecipebox": {
"title": "My Recipe Box",
"title": "La Meva Caixa de Receptes",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -511,8 +517,8 @@
"cook-mode": "Mode \"cuinant\"",
"link-ingredients": "Enllaça amb els ingredients",
"merge-above": "Fusiona amb el de dalt",
"move-to-bottom": "Move To Bottom",
"move-to-top": "Move To Top",
"move-to-bottom": "Moure al Final",
"move-to-top": "Moure al Principi",
"reset-scale": "Reinicialitza",
"decrease-scale-label": "Divideix",
"increase-scale-label": "Multiplica",
@@ -549,8 +555,8 @@
"looking-for-migrations": "Estàs buscant migracions?",
"import-with-url": "Importar amb l'URL",
"create-recipe": "Crea la recepta",
"create-recipe-description": "Create a new recipe from scratch.",
"create-recipes": "Create Recipes",
"create-recipe-description": "Crea una nova recepta des de zero.",
"create-recipes": "Crea Receptes",
"import-with-zip": "Importar amb un .zip",
"create-recipe-from-an-image": "Crea la recepta a partir d'una imatge",
"bulk-url-import": "Importació d'URL en massa",
@@ -577,6 +583,8 @@
"report-deletion-failed": "No s'ha pogut suprimir l'informe",
"recipe-debugger": "Depuradora de receptes",
"recipe-debugger-description": "Agafa l'URL de la recepta que vols depurar i enganxa-la aquí. L'URL serà reastrejada pel rastrejador de receptes i es mostraran els resultats. Si no veieu cap dada retornada, el lloc que esteu provant de rastrejar no és compatible amb Mealie ni la seva biblioteca de rastreig.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Depuració",
"tree-view": "Vista en arbre",
"recipe-yield": "Rendiment de la recepta",
@@ -584,8 +592,8 @@
"upload-image": "Puja una imatge",
"screen-awake": "Mantenir la pantalla encesa",
"remove-image": "Esborrar la imatge",
"nextStep": "Next step",
"recipe-actions": "Recipe Actions",
"nextStep": "Següent pas",
"recipe-actions": "Accions de la Recepta",
"parser": {
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
"ingredient-parser": "Ingredient Parser",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "S'ha creat una còpia de seguretat a {path}",
"backup-deleted": "Còpia de seguretat suprimida",
"restore-success": "La restauració s'ha dut a terme correctament",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Etiqueta de la còpia de seguretat",
"create-heading": "Crea una còpia de seguretat",
"delete-backup": "Esborra la còpia de seguretat",
@@ -731,11 +740,11 @@
"webhook-name": "Nom del Webhook",
"description": "Els webhooks definits a sota s'executaran quan es defineixi un menú pel dia. En un temps estipulat, els webhooks s'enviaran amb les dades de la recepta que estigui programada pel dia. L'execució dels webhooks no és exacta. Els webhooks s'executen en un interval de 5 minuts, és a dir, que s'executaran en un interval de +/- 5 minuts del temps estipulat."
},
"bug-report": "Bug Report",
"bug-report": "Informe d'errors",
"bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.",
"tracker": "Tracker",
"configuration": "Configuration",
"docker-volume": "Docker Volume",
"configuration": "Configuració",
"docker-volume": "Volum de Docker",
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
"volumes-are-misconfigured": "Volumes are misconfigured.",
"volumes-are-configured-correctly": "Volumes are configured correctly.",
@@ -744,7 +753,7 @@
"email-configuration-status": "Estat de la configuració del correu electrònic",
"email-configured": "Correu electrònic configurat",
"email-test-results": "Email Test Results",
"ready": "Ready",
"ready": "Llest",
"not-ready": "Not Ready - Check Environmental Variables",
"succeeded": "Va tenir èxit",
"failed": "Ha fallat",
@@ -782,7 +791,7 @@
"food": "Aliments",
"note": "Nota",
"label": "Etiqueta",
"save-label": "Save Label",
"save-label": "Guarda l'etiqueta",
"linked-item-warning": "Aquest element està enllaçat amb una o més receptes. Modificar les unitats o els aliments pot provocar resultats inesperats en afegir o elimina la recepta del llistat.",
"toggle-food": "Mostra el nom de l'aliment",
"manage-labels": "Gestiona etiquetes",
@@ -842,7 +851,7 @@
"untagged-count": "{count} sense etiquetar",
"create-a-tag": "Crea una etiqueta",
"tag-name": "Nom de l'etiqueta",
"tag": "Tag"
"tag": "Etiqueta"
},
"tool": {
"tools": "Estris",
@@ -852,7 +861,7 @@
"create-new-tool": "Crea un nou estri",
"on-hand-checkbox-label": "Mostra com a disponible (marcat)",
"required-tools": "Eines necessàries",
"tool": "Tool"
"tool": "Eina"
},
"user": {
"admin": "Administrador/a",
@@ -877,8 +886,8 @@
"link-id": "Id de l'enllaç",
"link-name": "Nom de l'enllaç",
"login": "Inicieu sessió",
"login-oidc": "Login with",
"or": "or",
"login-oidc": "Inicia sessió amb",
"or": "o",
"logout": "Tanca la sessió",
"manage-users": "Gestionar usuaris",
"manage-users-description": "Create and manage users.",
@@ -939,8 +948,8 @@
"user-name": "Nom de l'usuari",
"authentication-method": "Authentication Method",
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
"permissions": "Permissions",
"administrator": "Administrator",
"permissions": "Permisos",
"administrator": "Administrador",
"user-can-invite-other-to-group": "User can invite other to group",
"user-can-manage-group": "User can manage group",
"user-can-organize-group-data": "User can organize group data",
@@ -949,7 +958,7 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Contrasenya oblidada",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament."
},
"language-dialog": {
"translated": "traduït",
@@ -964,30 +973,30 @@
"merge-food-example": "Combinant {food1} i {food2}",
"seed-dialog-text": "Afegeix a la base de dades els noms dels aliments en el vostre idioma. Açò crearà més de 200 aliments comuns per a què pugueu organitzar la vostra base de dades. Els noms dels aliments han estat traduïts gràcies a l'esforç de la comunitat.",
"seed-dialog-warning": "Ja teniu algunes dades a la vostra base. Aquesta acció no tindrà en compte duplicats i haureu d'eliminar-los manualment.",
"combine-food": "Combine Food",
"source-food": "Source Food",
"target-food": "Target Food",
"create-food": "Create Food",
"combine-food": "Combinar Aliment",
"source-food": "Aliment d'Origen",
"target-food": "Aliment de Destí",
"create-food": "Crear Aliment",
"food-label": "Food Label",
"edit-food": "Edit Food",
"edit-food": "Editar Aliment",
"food-data": "Food Data",
"example-food-singular": "ex: Onion",
"example-food-plural": "ex: Onions"
"example-food-singular": "p. ex.: Ceba",
"example-food-plural": "p. ex.: Cebes"
},
"units": {
"seed-dialog-text": "Afegeix a la base de dades les unitats més comunes en el vostre idioma.",
"combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.",
"combine-unit": "Combine Unit",
"source-unit": "Source Unit",
"target-unit": "Target Unit",
"combine-unit": "Combina Unitats",
"source-unit": "Unitat Origen",
"target-unit": "Unitat Destí",
"merging-unit-into-unit": "Merging {0} into {1}",
"create-unit": "Crea la unitat",
"abbreviation": "Abbreviation",
"plural-abbreviation": "Plural Abbreviation",
"description": "Description",
"display-as-fraction": "Display as Fraction",
"use-abbreviation": "Use Abbreviation",
"edit-unit": "Edit Unit",
"abbreviation": "Abreviatura",
"plural-abbreviation": "Abreviatura del Plural",
"description": "Descripció",
"display-as-fraction": "Mostra com una Fracció",
"use-abbreviation": "Utilitza Abreviatura",
"edit-unit": "Editar Unitat",
"unit-data": "Unit Data",
"use-abbv": "Use Abbv.",
"fraction": "Fraction",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Jídelníček byl aktualizován",
"no-meal-plan-defined-yet": "Dosud nebyl definován žádný jídelníček",
"no-meal-planned-for-today": "Pro dnešek není naplánováno žádné jídlo",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Pouze recepty z těchto kategorií budou použity v jídelníčku",
"planner": "Plánovač",
"quick-week": "Rychlý plán týdne",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Stromové zobrazení",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Záloha vytvořena v {path}",
"backup-deleted": "Záloha smazána",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Štítek zálohy",
"create-heading": "Create a Backup",
"delete-backup": "Smazat zálohu",

View File

@@ -64,7 +64,7 @@
"something-went-wrong": "Noget gik galt!",
"subscribed-events": "Abonnerede begivenheder",
"test-message-sent": "Testbesked sendt",
"message-sent": "Message Sent",
"message-sent": "Besked afsendt",
"new-notification": "Ny notifikation",
"event-notifiers": "Notifikation om begivenheder",
"apprise-url-skipped-if-blank": "Informations link (sprunget over hvis ladet være tomt)",
@@ -86,7 +86,7 @@
"clear": "Ryd",
"close": "Luk",
"confirm": "Bekræft",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Hvordan ser alting ud?",
"confirm-delete-generic": "Er du sikker på, du vil slette dette?",
"copied_message": "Kopieret!",
"create": "Opret",
@@ -161,7 +161,7 @@
"test": "Afprøv",
"themes": "Temaer",
"thursday": "Torsdag",
"title": "Title",
"title": "Titel",
"token": "Token",
"tuesday": "Tirsdag",
"type": "Type",
@@ -210,7 +210,7 @@
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?",
"organizers": "Organizers"
"organizers": "Organisatorer"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
@@ -291,6 +291,8 @@
"mealplan-updated": "Madplanen blev ændret",
"no-meal-plan-defined-yet": "Ingen madplan er defineret",
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun opskrifter med disse kategorier vil blive brugt i madplaner",
"planner": "Planlæg madplan",
"quick-week": "Hurtig uge",
@@ -365,7 +367,7 @@
"choose-migration-type": "Vælg Migreringstype",
"tag-all-recipes": "Tag alle opskrifter med {tag-name} tag",
"nextcloud-text": "Nextcloud opskrifter kan importeres fra en zip-fil, der indeholder data lagret i Nextcloud. Se eksempelmappestrukturen nedenfor for at sikre, at dine opskrifter kan importeres.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
"chowdown-text": "Mealie understøtter chowdown repository fil formater. Download repositoriet som en .zip-fil og upload den nedenfor.",
"recipe-1": "Opskrift 1",
"recipe-2": "Opskrift 2",
"paprika-text": "Mealie kan importere opskrifter fra Paprika applikationen. Eksporter dine opskrifter fra paprika, omdøbe eksportudvidelsen til .zip og uploade den nedenfor.",
@@ -375,8 +377,12 @@
"description-long": "Mealie kan importere opskrifter, der er markeret som \"Planlæg at spise\"."
},
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
"title": "Mine opskrifter",
"description-long": "Mealie kan importere opskrifter fra My Recipe Box. Eksporter dine opskrifter i CSV-format, og upload derefter .csv-filen nedenfor."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -528,7 +534,7 @@
"edit-timeline-event": "Rediger tidslinjebegivenhed",
"timeline": "Tidslinje",
"timeline-is-empty": "Intet på tidslinjen endnu. Prøv at lave denne opskrift!",
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
"timeline-no-events-found-try-adjusting-filters": "Ingen begivenheder fundet. Prøv at justere dine søgefiltre.",
"group-global-timeline": "{groupName} Global Tidslinje",
"open-timeline": "Åbn tidslinje",
"made-this": "Jeg har lavet denne",
@@ -577,6 +583,8 @@
"report-deletion-failed": "Sletning af rapport mislykkedes",
"recipe-debugger": "Fejlsøgning af opskrifter",
"recipe-debugger-description": "Indsæt URL'en på hjemmesiden, der indeholder den opskrift, du vil fejlsøge. URL-adressen vil blive læst og resultaterne vil blive vist. Hvis ingen data bliver vist, er indhentning af opskrifter fra hjemmesiden endnu ikke understøttet af Mealie.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Fejlsøgning",
"tree-view": "Træ visning",
"recipe-yield": "Udbytte af opskrift",
@@ -585,21 +593,21 @@
"screen-awake": "Hold skærmen tændt",
"remove-image": "Fjern billede",
"nextStep": "Næste trin",
"recipe-actions": "Recipe Actions",
"recipe-actions": "Opskriftshandlinger",
"parser": {
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
"ingredient-parser": "Ingredient Parser",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"experimental-alert-text": "Mealie bruger natural language processing til at behandle og oprette relevante måleenheder og fødrerevarer som ingredienser i dine opskrifter. Denne funktion er eksperimentel og fungerer måske ikke altid som forventet. Hvis du foretrækker ikke at bruge de fortolkede resultater, kan du vælge 'Annullér' og dine ændringer vil ikke blive gemt.",
"ingredient-parser": "Ingrediens- Parser",
"explanation": "For at bruge ingrediensparseren, skal du klikke på knappen 'Parse Alle' for at starte behandlingen. Når relevante ingredienser er identificeret, kan du gennemgå sem og kontrollere, at de blev korrekt identificeret. Modellens konfidensscore vises til højre for ingrediensens titel. Denne score er et gennemsnit af alle de enkelte scorer og er måske ikke altid helt præcis.",
"alerts-explainer": "En advarsel vil blive vist, hvis en identificeret fødevare eller måleenhed ikke findes i databasen.",
"select-parser": "Vælg Parser",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"no-food": "No Food"
"parse-all": "Fortolk alt",
"no-unit": "Ingen enhed",
"missing-unit": "Opret manglende måleenhed: {unit}",
"missing-food": "Opret manglende fødevare: {food}",
"no-food": "Ingen fødevarer"
}
},
"search": {
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup oprettet ved {path}",
"backup-deleted": "Backup slettet",
"restore-success": "Gendannelse lykkedes",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backupnavn",
"create-heading": "Opret en backup",
"delete-backup": "Slet backup",
@@ -766,9 +775,9 @@
"oidc-ready": "OIDC er Klar",
"oidc-ready-error-text": "Ikke alle OIDC værdier er konfigureret. Dette kan ignoreres, hvis du ikke bruger OIDC godkendelse.",
"oidc-ready-success-text": "Alle påkrævede OIDC værdier er angivet.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "OpenAI Klar",
"openai-ready-error-text": "Ikke alle OpenAI værdier er konfigureret. Dette kan ignoreres, hvis du ikke bruger OpenAI funktioner.",
"openai-ready-success-text": "Påkrævede OpenAI variabler er alle indstillet."
},
"shopping-list": {
"all-lists": "Alle lister",
@@ -782,7 +791,7 @@
"food": "Fødevarer",
"note": "Note",
"label": "Etiket",
"save-label": "Save Label",
"save-label": "Gem etiket",
"linked-item-warning": "Dette element er tilknyttet en eller flere opskrifter. Justering af enheder eller fødevarer vil give uventede resultater, når du tilføjer eller fjerner opskriften fra denne liste.",
"toggle-food": "Slå fødevarer til/fra",
"manage-labels": "Håndter etiketter",
@@ -842,7 +851,7 @@
"untagged-count": "Ikke-tagget: {count}",
"create-a-tag": "Opret tag",
"tag-name": "Tag navn",
"tag": "Tag"
"tag": "Mærker"
},
"tool": {
"tools": "Værktøjer",
@@ -1024,10 +1033,10 @@
"source-unit-will-be-deleted": "Kildeenhed vil blive slettet"
},
"recipe-actions": {
"recipe-actions-data": "Recipe Actions Data",
"new-recipe-action": "New Recipe Action",
"edit-recipe-action": "Edit Recipe Action",
"action-type": "Action Type"
"recipe-actions-data": "Data for Opskriftshandlinger",
"new-recipe-action": "Ny Opskriftshandling",
"edit-recipe-action": "Rediger Opskriftshandling",
"action-type": "Handlingstype"
},
"create-alias": "Opret alias",
"manage-aliases": "Administrer Aliaser",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Essensplan aktualisiert",
"no-meal-plan-defined-yet": "Noch kein Essensplan definiert",
"no-meal-planned-for-today": "Kein Essen für heute geplant",
"numberOfDays-hint": "Anzahl der Tage beim Laden der Seite",
"numberOfDays-label": "Anzuzeigende Tage",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Nur Rezepte dieser Kategorien werden in Essensplänen verwendet",
"planner": "Planer",
"quick-week": "Schnelle Woche",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie kann Rezepte von My Recipe Box importieren. Exportiere deine Rezepte im CSV-Format und lade dann unten die .csv Datei hoch."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie kann Rezepte von Recipe Keeper importieren. Exportiere deine Rezepte im ZIP-Format und lade dann unten die .zip Datei hoch.\n"
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Bericht löschen fehlgeschlagen",
"recipe-debugger": "Rezept Debugger",
"recipe-debugger-description": "Füge die URL des Rezepts, das du debuggen möchtest, hier ein. Die URL wird vom Scraper eingelesen und die Ergebnisse werden angezeigt. Wenn du keine Ausgabedaten sehen solltest, wird das Einlesen dieser Webseite nicht von Mealie oder dessen Scraper-Bibliothek unterstützt.",
"use-openai": "Verwende OpenAI",
"recipe-debugger-use-openai-description": "Verwende OpenAI anstelle der Scraper-Bibliothek, um die Einträge zu parsen. Wenn du ein Rezept über dessen URL erstellst und der Versuch über die Scraper-Bibliothek fehlschlägt, passiert das automatisch. Aber du kannst es hier auch manuell testen.",
"debug": "Debug",
"tree-view": "Strukturierte Ansicht",
"recipe-yield": "Portionsangabe",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Sicherung erstellt unter {path}",
"backup-deleted": "Sicherung gelöscht",
"restore-success": "Wiederherstellung erfolgreich",
"restore-fail": "Wiederherstellung fehlgeschlagen. Überprüfe deine Serverprotokolle für weitere Informationen",
"backup-tag": "Sicherungsbeschreibung",
"create-heading": "Sicherung erstellen",
"delete-backup": "Sicherung löschen",
@@ -782,7 +791,7 @@
"food": "Lebensmittel",
"note": "Notiz",
"label": "Etikett",
"save-label": "Save Label",
"save-label": "Etikett speichern",
"linked-item-warning": "Dieser Eintrag ist mit einem oder mehreren Rezepten verknüpft. Das Ändern der Einheiten oder Lebensmittel führt zu unerwarteten Ergebnissen, wenn das Rezept von dieser Einkaufsliste entfernt oder hinzugefügt wird.",
"toggle-food": "Lebensmittel-Eingabe umschalten",
"manage-labels": "Etiketten verwalten",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Το Γεύμα Ενημερώθηκε",
"no-meal-plan-defined-yet": "Δεν έχει οριστεί ακόμα σχέδιο γεύματος",
"no-meal-planned-for-today": "Δεν έχει προγραμματιστεί γεύμα για σήμερα",
"numberOfDays-hint": "Αριθμός ημερών κατά την φόρτωση της σελίδας",
"numberOfDays-label": "Προεπιλεγμένες Ημέρες",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Μόνο συνταγές με αυτές τις κατηγορίες θα χρησιμοποιηθούν στα σχέδια γεύματος",
"planner": "Προγραμματισμός",
"quick-week": "Γρήγορη προβολή",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Κιβώτιο Συνταγών",
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το Κουτί Συνταγών. Εξάγετε τις συνταγές σας σε μορφή CSV, στη συνέχεια, ανεβάστε το αρχείο .csv παρακάτω."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το Recipe Keeper. Εξάγετε τις συνταγές σας σε μορφή zip, στη συνέχεια, ανεβάστε το αρχείο .zip παρακάτω."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Χρήση OpenAI",
"recipe-debugger-use-openai-description": "Χρησιμοποιήστε το OpenAI για να αναλύσετε τα αποτελέσματα αντί να βασιστείτε στη βιβλιοθήκη του scraper. Κατά τη δημιουργία μιας συνταγής μέσω URL, αυτό γίνεται αυτόματα αν η βιβλιοθήκη του scraper αποτύχει, αλλά μπορείτε να την δοκιμάσετε χειροκίνητα εδώ.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Δημιουργήθηκε αντίγραφο ασφαλείας στο: {path}",
"backup-deleted": "Το αντίγραφο ασφαλείας διαγράφηκε",
"restore-success": "Restore successful",
"restore-fail": "Η επαναφορά απέτυχε. Ελέγξτε τα αρχεία καταγραφής του διακομιστή σας για περισσότερες λεπτομέρειες",
"backup-tag": "Ετικέτα Αντιγράφου Ασφαλείας",
"create-heading": "Δημιουργία αντιγράφου ασφαλείας",
"delete-backup": "Διαγραφή Αντιγράφου Ασφαλείας",

View File

@@ -189,10 +189,10 @@
"delete-with-name": "Delete {name}",
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
"organizer": "Organizer",
"organizer": "Organiser",
"transfer": "Transfer",
"copy": "Copy",
"color": "Color",
"color": "Colour",
"timestamp": "Timestamp",
"last-made": "Last Made",
"learn-more": "Learn More",
@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create A Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Menú actualizado",
"no-meal-plan-defined-yet": "Todavía no hay ningún menú",
"no-meal-planned-for-today": "No hay ningún menú para hoy",
"numberOfDays-hint": "Número de días al cargar la página",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Sólo las recetas con estas categorías se utilizarán en los menús",
"planner": "Planificador",
"quick-week": "Plan rápido",
@@ -372,11 +374,15 @@
"mealie-text": "Mealie puede importar recetas de la aplicación Mealie desde una versión anterior a v1.0. Exporta tus recetas de tu antigua instancia y sube el archivo zip a continuación. Ten en cuenta que solo se pueden importar recetas de la exportación.",
"plantoeat": {
"title": "Plan to Eat",
"description-long": "Mealie puede importar recetas de Plan a Comer."
"description-long": "Mealie puede importar recetas de Plan to Eat."
},
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie puede importar recetas de My Recipe Box. Exporta tus recetas en formato CSV y sube el archivo a continuación."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Error al eliminar el reporte",
"recipe-debugger": "Depurador de recetas",
"recipe-debugger-description": "Obtenga la URL de la receta que desea depurar y pegala aquí. La URL será analizadada por el extractor de recetas y los resultados se mostrarán. Si no ves ningún dato devuelta, el sitio que estás intentando rascar no está soportado por Mealie o su biblioteca de analizadores.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Depuración",
"tree-view": "Vista en árbol",
"recipe-yield": "Porciones",
@@ -594,7 +602,7 @@
"select-parser": "Seleccionar Analizador",
"natural-language-processor": "Procesador de Lenguaje Natural",
"brute-parser": "Analizador Bruto",
"openai-parser": "OpenAI Parser",
"openai-parser": "Analizador OpenAI",
"parse-all": "Analizar Todo",
"no-unit": "Sin unidad",
"missing-unit": "Crear unidad faltante: {unit}",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Copia de seguridad creada en {path}",
"backup-deleted": "Copia de seguridad eliminada",
"restore-success": "Restauración exitosa",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Etiqueta de la copia de seguridad",
"create-heading": "Crear una copia de seguridad",
"delete-backup": "Eliminar copia de seguridad",
@@ -748,7 +757,7 @@
"not-ready": "No Listo - Comprobar variables de ambiente",
"succeeded": "Logrado",
"failed": "Error",
"general-about": "General Acerca de",
"general-about": "Información General",
"application-version": "Versión de la aplicación",
"application-version-error-text": "Su versión actual ({0}) no coincide con la última versión. Considere actualizar a la última versión ({1}).",
"mealie-is-up-to-date": "Mealie está actualizada",
@@ -766,9 +775,9 @@
"oidc-ready": "OIDC Listo",
"oidc-ready-error-text": "No todos los valores OIDC están configurados. Puedes ignorar esto si no estás usando autenticación OIDC.",
"oidc-ready-success-text": "Todas las variables OIDC requeridas están configuradas.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "OpenAI Listo",
"openai-ready-error-text": "No todos los valores OpenAI están configurados. Puedes ignorar esto si no estás usando funciones de OpenAI.",
"openai-ready-success-text": "Las variables OpenAI requeridas están todas definidas."
},
"shopping-list": {
"all-lists": "Todas las listas",
@@ -782,7 +791,7 @@
"food": "Alimentos",
"note": "Nota",
"label": "Etiqueta",
"save-label": "Save Label",
"save-label": "Guardar etiqueta",
"linked-item-warning": "Este elemento está vinculado a una o más recetas. Ajustar las unidades o los alimentos producirá resultados inesperados al añadir o quitar la receta de esta lista.",
"toggle-food": "Mostrar nombre del alimento",
"manage-labels": "Administrar etiquetas",
@@ -1137,14 +1146,14 @@
"admin": {
"maintenance": {
"storage-details": "Detalle del almacenamiento",
"page-title": "Mantenimiento del sitio",
"page-title": "Mantenimiento del Sitio",
"summary-title": "Índice",
"button-label-get-summary": "Obtener Resumen",
"button-label-open-details": "Detalles",
"info-description-data-dir-size": "Tamaño del directorio de datos",
"info-description-data-dir-size": "Tamaño del Directorio de Datos",
"info-description-log-file-size": "Tamaño del archivo de registro",
"info-description-cleanable-directories": "Directorios eliminables",
"info-description-cleanable-images": "Imágenes eliminables",
"info-description-cleanable-directories": "Directorios Eliminables",
"info-description-cleanable-images": "Imágenes Eliminables",
"storage": {
"title-temporary-directory": "Directorio temporal (.temp)",
"title-backups-directory": "Directorio de Copias de Seguridad (respaldos)",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Ateriasuunnitelma päivitetty",
"no-meal-plan-defined-yet": "Ateriasuunnitelmaa ei ole vielä määritelty",
"no-meal-planned-for-today": "Ei ateriasuunnitelmaa tälle päivälle",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Vain näiden luokkien reseptejä käytetään ateriasuunnitelmissa",
"planner": "Suunnittelija",
"quick-week": "Pikaviikkosuunnitelma",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Reseptilaatikkoni",
"description-long": "Voit tuoda Mealieen reseptejä reseptilaatikosta. Tuo reseptisi csv-muodossa ja lataa sitten csv-tiedosto alempaa."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Raportin poistaminen epäonnistui",
"recipe-debugger": "Reseptin vianhaku",
"recipe-debugger-description": "Tartu sen reseptin URL-osoitteeseen, jonka virheenkorjausta haluat tehdä, ja liitä se tähän. Reseptikaappain hakee URL-osoitteen ja tulokset näytetään. Jos et näe palautettua dataa, Mealie tai sen kappauskirjasto ei tue sivua, jota yrität kaapata.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Vianhaku",
"tree-view": "Puunäkymä",
"recipe-yield": "Reseptin tekijä",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Varmuuskopio luotu sijaintiin {path}",
"backup-deleted": "Varmuuskopio poistettu",
"restore-success": "Palautus onnistui",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Varmuuskopion tunniste",
"create-heading": "Create a Backup",
"delete-backup": "Poista varmuuskopio",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Menu mis à jour",
"no-meal-plan-defined-yet": "Aucun menu planifié",
"no-meal-planned-for-today": "Aucun repas prévu pour aujourd'hui",
"numberOfDays-hint": "Nombre de jours lors du chargement de la page",
"numberOfDays-label": "Jours par défaut",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Seules les recettes appartenant à ces catégories seront utilisées dans les menus",
"planner": "Planificateur",
"quick-week": "Semaine rapide",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléchargez le fichier CSV ci-dessous."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie peut importer des recettes depuis Recipe Keeper. Exportez vos recettes au format Zip, puis téléversez le fichier .zip ci-dessous."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "La suppression du rapport a échoué",
"recipe-debugger": "Débogueur de recette",
"recipe-debugger-description": "Récupérez l'URL de la recette que vous voulez déboguer et collez-la ici. La recette sera analysée et les résultats seront affichés. Si vous ne voyez aucune donnée retournée, le site que vous essayez de récupérer n'est pas pris en charge par Mealie.",
"use-openai": "Utiliser OpenAI",
"recipe-debugger-use-openai-description": "Utilisez OpenAI pour analyser les résultats au lieu de la bibliothèque dextraction. Lors de la création d'une recette via une URL, cela se fait automatiquement si la bibliothèque dextraction échoue, mais vous pouvez le tester manuellement ici.",
"debug": "Déboguer",
"tree-view": "Vue en arborescence",
"recipe-yield": "Nombre de parts",
@@ -594,7 +602,7 @@
"select-parser": "Sélectionner l'analyseur",
"natural-language-processor": "Traitement du Langage Naturel",
"brute-parser": "Analyseur brut",
"openai-parser": "OpenAI Parser",
"openai-parser": "Parseur OpenAI",
"parse-all": "Tout analyser",
"no-unit": "Pas d'unité",
"missing-unit": "Créer une unité manquante : {unit}",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Sauvegarde créée dans {path}",
"backup-deleted": "Sauvegarde supprimée",
"restore-success": "Restauration réussie",
"restore-fail": "Échec de la restauration. Vérifiez les journaux de votre serveur pour plus de détails",
"backup-tag": "Tag de la sauvegarde",
"create-heading": "Créer une sauvegarde",
"delete-backup": "Supprimer la sauvegarde",
@@ -766,9 +775,9 @@
"oidc-ready": "Prêt pour OIDC",
"oidc-ready-error-text": "Toutes les valeurs OIDC ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous nutilisez pas lauthentification OIDC.",
"oidc-ready-success-text": "Les variables OIDC obligatoires sont toutes définies.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "Prêt pour OpenAI",
"openai-ready-error-text": "Toutes les valeurs OpenAI ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n'utilisez pas les fonctionnalités OpenAI.",
"openai-ready-success-text": "Les variables OpenAI obligatoires sont toutes définies."
},
"shopping-list": {
"all-lists": "Toutes les listes",
@@ -782,7 +791,7 @@
"food": "Aliments",
"note": "Note",
"label": "Étiquette",
"save-label": "Save Label",
"save-label": "Sauvegarder le libel",
"linked-item-warning": "Cet article est lié à une ou plusieurs recettes. Ajuster les unités ou les aliments donnera des résultats inattendus lors de lajout ou de la suppression de la recette de cette liste.",
"toggle-food": "Activer/Désactiver aliment",
"manage-labels": "Gérer les libellés",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Menu mis à jour",
"no-meal-plan-defined-yet": "Aucun menu planifié",
"no-meal-planned-for-today": "Aucun repas prévu pour aujourdhui",
"numberOfDays-hint": "Nombre de jours lors du chargement de la page",
"numberOfDays-label": "Jours par défaut",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Seules les recettes appartenant à ces catégories seront utilisées dans les menus",
"planner": "Menu",
"quick-week": "Semaine rapide",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléchargez le fichier CSV ci-dessous."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie peut importer des recettes depuis Recipe Keeper. Exportez vos recettes au format Zip, puis téléversez le fichier .zip ci-dessous."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "La suppression du rapport a échoué",
"recipe-debugger": "Débogueur de recette",
"recipe-debugger-description": "Récupérez l'URL de la recette que vous voulez déboguer et collez-la ici. La recette sera analysée et les résultats seront affichés. Si vous ne voyez aucune donnée retournée, le site que vous essayez de récupérer n'est pas pris en charge par Mealie.",
"use-openai": "Utiliser OpenAI",
"recipe-debugger-use-openai-description": "Utilisez OpenAI pour analyser les résultats au lieu de la bibliothèque dextraction. Lors de la création d'une recette via une URL, cela se fait automatiquement si la bibliothèque dextraction échoue, mais vous pouvez le tester manuellement ici.",
"debug": "Déboguer",
"tree-view": "Vue en arborescence",
"recipe-yield": "Nombre de parts",
@@ -594,7 +602,7 @@
"select-parser": "Sélectionner l'analyseur",
"natural-language-processor": "Traitement du Langage Naturel",
"brute-parser": "Analyseur brut",
"openai-parser": "OpenAI Parser",
"openai-parser": "Parseur OpenAI",
"parse-all": "Tout analyser",
"no-unit": "Pas d'unité",
"missing-unit": "Créer une unité manquante : {unit}",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Sauvegarde créée dans {path}",
"backup-deleted": "Sauvegarde supprimée",
"restore-success": "Restauration réussie",
"restore-fail": "Échec de la restauration. Vérifiez les journaux de votre serveur pour plus de détails",
"backup-tag": "Tag de la sauvegarde",
"create-heading": "Créer une sauvegarde",
"delete-backup": "Supprimer la sauvegarde",
@@ -766,9 +775,9 @@
"oidc-ready": "Prêt pour OIDC",
"oidc-ready-error-text": "Toutes les valeurs OIDC ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous nutilisez pas lauthentification OIDC.",
"oidc-ready-success-text": "Les variables OIDC obligatoires sont toutes définies.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "Prêt pour OpenAI",
"openai-ready-error-text": "Toutes les valeurs OpenAI ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n'utilisez pas les fonctionnalités OpenAI.",
"openai-ready-success-text": "Les variables OpenAI obligatoires sont toutes définies."
},
"shopping-list": {
"all-lists": "Toutes les listes",
@@ -782,7 +791,7 @@
"food": "Aliment",
"note": "Note",
"label": "Étiquette",
"save-label": "Save Label",
"save-label": "Sauvegarder le libel",
"linked-item-warning": "Cet article est lié à une ou plusieurs recettes. Ajuster les unités ou les aliments donnera des résultats inattendus lors de lajout ou de la suppression de la recette de cette liste.",
"toggle-food": "Activer/Désactiver aliment",
"manage-labels": "Gérer les libellés",

View File

@@ -25,14 +25,14 @@
"sponsor": "Patrocinador"
},
"asset": {
"assets": "Activos",
"assets": "Recursos",
"code": "Código",
"file": "Ficheiro",
"image": "Imaxe",
"new-asset": "Novo documento",
"new-asset": "Novo Recurso",
"pdf": "PDF",
"recipe": "Receita",
"show-assets": "Amosar documentos",
"show-assets": "Amosar Recursos",
"error-submitting-form": "Erro ao enviar formulario"
},
"category": {
@@ -56,61 +56,61 @@
"event-delete-confirmation": "Estás seguro de que queres eliminar este evento?",
"event-deleted": "Evento eliminado",
"event-updated": "Evento actualizado",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-version": "New version available!",
"notification": "Notification",
"refresh": "Refresh",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"subscribed-events": "Subscribed Events",
"test-message-sent": "Test Message Sent",
"message-sent": "Message Sent",
"new-notification": "New Notification",
"event-notifiers": "Event Notifiers",
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
"enable-notifier": "Enable Notifier",
"what-events": "What events should this notifier subscribe to?",
"user-events": "User Events",
"mealplan-events": "Mealplan Events",
"when-a-user-in-your-group-creates-a-new-mealplan": "When a user in your group creates a new mealplan",
"shopping-list-events": "Shopping List Events",
"cookbook-events": "Cookbook Events",
"tag-events": "Tag Events",
"category-events": "Category Events",
"when-a-new-user-joins-your-group": "When a new user joins your group",
"recipe-events": "Recipe Events"
"new-notification-form-description": "Mealie usa a biblioteca de Appprise para xerar notificacións. Ofrecen moitas opcións para que os servizos usen as notificacións. Consulte a súa wiki para obter unha guía completa sobre como crear o URL para o seu servizo. Se está dispoñible, a selección do tipo de notificación pode incluír funcións adicionais.",
"new-version": "Nova versión dispoñible!",
"notification": "Notificación",
"refresh": "Actualizar",
"scheduled": "Programación",
"something-went-wrong": "Algo Fallou!",
"subscribed-events": "Eventos Subscritos",
"test-message-sent": "Mensaxe de Proba Enviada",
"message-sent": "Mensaxe Enviada",
"new-notification": "Nova notificación",
"event-notifiers": "Notificadores de Eventos",
"apprise-url-skipped-if-blank": "URL de Apprise (omitido se está en branco)",
"enable-notifier": "Activar o Notificador",
"what-events": "A que eventos debería subscribirse este notificador?",
"user-events": "Eventos de Usuario",
"mealplan-events": "Eventos do Menú",
"when-a-user-in-your-group-creates-a-new-mealplan": "Cando un usuario do teu grupo crea un novo plan de comidas",
"shopping-list-events": "Eventos da Lista da Compra",
"cookbook-events": "Eventos de Libros de Cociña",
"tag-events": "Eventos de Etiquetas",
"category-events": "Eventos de Categorías",
"when-a-new-user-joins-your-group": "Cando un novo usuario se une ao teu grupo",
"recipe-events": "Eventos de Receitas"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",
"confirm": "Confirm",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-delete-generic": "Are you sure you want to delete this?",
"copied_message": "Copied!",
"create": "Create",
"created": "Created",
"custom": "Custom",
"dashboard": "Dashboard",
"delete": "Delete",
"disabled": "Disabled",
"download": "Download",
"duplicate": "Duplicate",
"edit": "Edit",
"enabled": "Enabled",
"exception": "Exception",
"failed-count": "Failed: {count}",
"failure-uploading-file": "Failure uploading file",
"favorites": "Favorites",
"field-required": "Field Required",
"file-folder-not-found": "File/folder not found",
"file-uploaded": "File uploaded",
"filter": "Filter",
"friday": "Friday",
"general": "General",
"get": "Get",
"home": "Home",
"add": "Engadir",
"cancel": "Cancelar",
"clear": "Borrar",
"close": "Pechar",
"confirm": "Confirmar",
"confirm-how-does-everything-look": "Como se ve todo?",
"confirm-delete-generic": "Estás seguro de que queres eliminar isto?",
"copied_message": "Copiado!",
"create": "Crear",
"created": "Creado",
"custom": "Personalizado",
"dashboard": "Panel",
"delete": "Eliminar",
"disabled": "Desactivado",
"download": "Descargar",
"duplicate": "Duplicar",
"edit": "Editar",
"enabled": "Activado",
"exception": "Excepción",
"failed-count": "Produciuse un erro: {count}",
"failure-uploading-file": "Produciuse un erro ao cargar o ficheiro",
"favorites": "Favoritos",
"field-required": "Campo Obrigatorio",
"file-folder-not-found": "Non se atopou o ficheiro/cartafol",
"file-uploaded": "Ficheiro cargado",
"filter": "Filtro",
"friday": "Venres",
"general": "Xeral",
"get": "Obter",
"home": "Inicio",
"image": "Imaxe",
"image-upload-failed": "Fallou a subida da imaxe",
"import": "Importar",
@@ -145,197 +145,199 @@
"save": "Gardar",
"settings": "Axustes",
"share": "Compartir",
"show-all": "Show All",
"show-all": "Amosar todo",
"shuffle": "Barallar",
"sort": "Ordenar",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Orde Ascendente",
"sort-descending": "Orde Descendente",
"sort-alphabetically": "Alfabético",
"status": "Estado",
"subject": "Asunto",
"submit": "Enviar",
"success-count": "Éxito: {count}",
"sunday": "Domingo",
"system": "System",
"system": "Sistema",
"templates": "Modelos:",
"test": "Probar",
"themes": "Temas",
"thursday": "Xoves",
"title": "Title",
"title": "Titulo",
"token": "Identificador",
"tuesday": "Martes",
"type": "Tipo",
"update": "Actualizar",
"updated": "Updated",
"upload": "Upload",
"updated": "Actualizado",
"upload": "Subir",
"url": "URL",
"view": "View",
"wednesday": "Wednesday",
"yes": "Yes",
"foods": "Foods",
"units": "Units",
"back": "Back",
"next": "Next",
"start": "Start",
"toggle-view": "Toggle View",
"date": "Date",
"view": "Ver",
"wednesday": "Mércores",
"yes": "Si",
"foods": "Comidas",
"units": "Unidades",
"back": "Atrás",
"next": "Seguinte",
"start": "Comezo",
"toggle-view": "Cambiar a Vista",
"date": "Data",
"id": "Id",
"owner": "Owner",
"date-added": "Date Added",
"none": "None",
"run": "Run",
"menu": "Menu",
"a-name-is-required": "A Name is Required",
"owner": "Dono",
"date-added": "Engadida o",
"none": "Nada",
"run": "Executar",
"menu": "Menú",
"a-name-is-required": "Requírese un Nome",
"delete-with-name": "Delete {name}",
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
"organizer": "Organizer",
"transfer": "Transfer",
"copy": "Copy",
"color": "Color",
"timestamp": "Timestamp",
"last-made": "Last Made",
"learn-more": "Learn More",
"this-feature-is-currently-inactive": "This feature is currently inactive",
"clipboard-not-supported": "Clipboard not supported",
"copied-to-clipboard": "Copied to clipboard",
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
"actions": "Actions",
"selected-count": "Selected: {count}",
"export-all": "Export All",
"refresh": "Refresh",
"upload-file": "Upload File",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers"
"confirm-delete-generic-with-name": "Estás seguro de que queres eliminar este {name}?",
"confirm-delete-own-admin-account": "Ten en conta que estás tentando eliminar a túa propia conta de administrador. Esta acción non se pode desfacer e eliminarase permanentemente a túa conta?",
"organizer": "Organizador",
"transfer": "Transferir",
"copy": "Copiar",
"color": "Cor",
"timestamp": "Data e hora",
"last-made": "Feito por Última Vez",
"learn-more": "Saber máis",
"this-feature-is-currently-inactive": "Esta función está actualmente inactiva",
"clipboard-not-supported": "Portapapeis non compatible",
"copied-to-clipboard": "Copiado ao portapapeis",
"your-browser-does-not-support-clipboard": "O teu navegador non soporta o portapapeis",
"copied-items-to-clipboard": "Non se copiou ningún elemento no portapapeis|Copiouse un elemento no portapapeis|Copiáronse {count} elementos no portapapeis",
"actions": "Accións",
"selected-count": "Seleccionado: {count}",
"export-all": "Exportar Todo",
"refresh": "Recargar",
"upload-file": "Subir Arquivo",
"created-on-date": "Creado o: {0}",
"unsaved-changes": "Tes cambios sen gardar. Queres gardar antes de saír? OK para gardar, Cancelar para descartar cambios.",
"clipboard-copy-failure": "Produciuse un erro ao copiar contido no portapapeis.",
"confirm-delete-generic-items": "Estás seguro de que queres eliminar os seguintes elementos?",
"organizers": "Organizadores"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
"cannot-delete-default-group": "Cannot delete default group",
"cannot-delete-group-with-users": "Cannot delete group with users",
"confirm-group-deletion": "Confirm Group Deletion",
"create-group": "Create Group",
"error-updating-group": "Error updating group",
"group": "Group",
"group-deleted": "Group deleted",
"group-deletion-failed": "Group deletion failed",
"group-id-with-value": "Group ID: {groupID}",
"group-name": "Group Name",
"group-not-found": "Group not found",
"group-token": "Group Token",
"group-with-value": "Group: {groupID}",
"groups": "Groups",
"manage-groups": "Manage Groups",
"user-group": "User Group",
"user-group-created": "User Group Created",
"user-group-creation-failed": "User Group Creation Failed",
"are-you-sure-you-want-to-delete-the-group": "Estás seguro de que queres eliminar <b>{groupName}<b/>?",
"cannot-delete-default-group": "Non se pode eliminar o grupo predeterminado",
"cannot-delete-group-with-users": "Non se pode eliminar un grupo con usuarios",
"confirm-group-deletion": "Confirme a Eliminación do Grupo",
"create-group": "Crear Grupo",
"error-updating-group": "Produciuse un erro ao actualizar o grupo",
"group": "Grupo",
"group-deleted": "Grupo eliminado",
"group-deletion-failed": "Produciuse un erro ao eliminar o grupo",
"group-id-with-value": "ID do grupo: {groupID}",
"group-name": "Nome do Grupo",
"group-not-found": "Non se atopou o grupo",
"group-token": "Token de Grupo",
"group-with-value": "Grupo: {groupID}",
"groups": "Grupos",
"manage-groups": "Xestionar Grupos",
"user-group": "Grupo de Usuarios",
"user-group-created": "Grupo de Usuarios Creado",
"user-group-creation-failed": "Produciuse un Erro na Creación do Grupo de Usuarios",
"settings": {
"keep-my-recipes-private": "Keep My Recipes Private",
"keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later."
"keep-my-recipes-private": "Mantén as Miñas Receitas Privadas",
"keep-my-recipes-private-description": "Establece o teu grupo e todas as receitas como privados por defecto. Sempre podes cambiar isto máis tarde."
},
"manage-members": "Manage Members",
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
"manage": "Manage",
"invite": "Invite",
"looking-to-update-your-profile": "Looking to Update Your Profile?",
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your group. These can be changed for individual recipes in the recipe settings menu.",
"default-recipe-preferences": "Default Recipe Preferences",
"group-preferences": "Group Preferences",
"private-group": "Private Group",
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
"enable-public-access": "Enable Public Access",
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
"show-nutrition-information": "Show nutrition information",
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
"show-recipe-assets": "Show recipe assets",
"show-recipe-assets-description": "When enabled the recipe assets will be shown on the recipe if available",
"default-to-landscape-view": "Default to landscape view",
"default-to-landscape-view-description": "When enabled the recipe header section will be shown in landscape view",
"disable-users-from-commenting-on-recipes": "Disable users from commenting on recipes",
"disable-users-from-commenting-on-recipes-description": "Hides the comment section on the recipe page and disables commenting",
"disable-organizing-recipe-ingredients-by-units-and-food": "Disable organizing recipe ingredients by units and food",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields.",
"general-preferences": "General Preferences",
"group-recipe-preferences": "Group Recipe Preferences",
"report": "Report",
"report-with-id": "Report ID: {id}",
"group-management": "Group Management",
"admin-group-management": "Admin Group Management",
"admin-group-management-text": "Changes to this group will be reflected immediately.",
"group-id-value": "Group Id: {0}"
"manage-members": "Xestionar Membros",
"manage-members-description": "Xestiona os permisos dos membros dos teus grupos. {manage} permítelle ao usuario acceder á páxina de xestión de datos {invite} permítelle xerar ligazóns de invitación para outros usuarios. Os propietarios do grupo non poden cambiar os seus propios permisos.",
"manage": "Xestionar",
"invite": "Convidar",
"looking-to-update-your-profile": "Buscas Actualizar o Teu Perfil?",
"default-recipe-preferences-description": "Estas son as opcións predeterminadas cando se crea unha nova receita no teu grupo. Pódense cambiar para receitas individuais no menú de configuración de receitas.",
"default-recipe-preferences": "Preferencias de Receitas Predeterminadas",
"group-preferences": "Preferencias do Grupo",
"private-group": "Grupo Privado",
"private-group-description": "Ao configurar o teu grupo como privado, todas as opcións de visualización pública serán predeterminadas. Isto anula a configuración de vista pública dunha receita individual.",
"enable-public-access": "Habilitar o Acceso Público",
"enable-public-access-description": "Fai que as receitas do grupo sexan públicas de forma predeterminada e permita que os visitantes vexan receitas sen iniciar sesión",
"allow-users-outside-of-your-group-to-see-your-recipes": "Permite que os usuarios alleos ao teu grupo vexan as túas receitas",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Cando estea activado, podes usar unha ligazón pública para compartir receitas específicas sen autorizar o usuario. Cando estea desactivado, só podes compartir receitas con usuarios que estean no teu grupo ou cunha ligazón privada xerada previamente",
"show-nutrition-information": "Mostrar información nutricional",
"show-nutrition-information-description": "Cando estea activado, a información nutricional mostrarase na receita se está dispoñible. Se non hai información nutricional dispoñible, a información nutricional non se mostrará",
"show-recipe-assets": "Mostrar recursos da receita",
"show-recipe-assets-description": "Cando estea activado, os recursos da receita mostraranse na receita se están dispoñibles",
"default-to-landscape-view": "Vista predeterminada en horizontal",
"default-to-landscape-view-description": "Cando estea activado, a sección de cabeceira da receita mostrarase en horizontal",
"disable-users-from-commenting-on-recipes": "Deshabilitar aos usuarios para comentar receitas",
"disable-users-from-commenting-on-recipes-description": "Oculta a sección de comentarios na páxina de receitas e desactiva os comentarios",
"disable-organizing-recipe-ingredients-by-units-and-food": "Desactivar a organización dos ingredientes da receita por unidades e alimentos",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Oculta os campos Comida, Unidade e Cantidade dos ingredientes e trata os ingredientes como campos de texto simple.",
"general-preferences": "Preferencias Xerais",
"group-recipe-preferences": "Preferencias de Receitas de Grupo",
"report": "Informar",
"report-with-id": "ID do informe: {id}",
"group-management": "Xestión de Grupos",
"admin-group-management": "Xestión do Grupo de Administración",
"admin-group-management-text": "Os cambios neste grupo reflectiranse inmediatamente.",
"group-id-value": "Id do grupo: {0}"
},
"meal-plan": {
"create-a-new-meal-plan": "Create a New Meal Plan",
"update-this-meal-plan": "Update this Meal Plan",
"dinner-this-week": "Dinner This Week",
"dinner-today": "Dinner Today",
"dinner-tonight": "DINNER TONIGHT",
"edit-meal-plan": "Edit Meal Plan",
"end-date": "End Date",
"group": "Group (Beta)",
"main": "Main",
"meal-planner": "Meal Planner",
"meal-plans": "Meal Plans",
"mealplan-categories": "MEALPLAN CATEGORIES",
"mealplan-created": "Mealplan created",
"mealplan-creation-failed": "Mealplan creation failed",
"mealplan-deleted": "Mealplan Deleted",
"mealplan-deletion-failed": "Mealplan deletion failed",
"mealplan-settings": "Mealplan Settings",
"mealplan-update-failed": "Mealplan update failed",
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
"side": "Side",
"sides": "Sides",
"start-date": "Start Date",
"rule-day": "Rule Day",
"meal-type": "Meal Type",
"breakfast": "Breakfast",
"lunch": "Lunch",
"dinner": "Dinner",
"type-any": "Any",
"day-any": "Any",
"create-a-new-meal-plan": "Crea un Novo Menú",
"update-this-meal-plan": "Actualiza este Menú",
"dinner-this-week": "Cea Desta Semana",
"dinner-today": "Cea de Hoxe",
"dinner-tonight": "CEA DESTA NOITE",
"edit-meal-plan": "Editar o Menú",
"end-date": "Data de Finalización",
"group": "Grupo (Beta)",
"main": "Principal",
"meal-planner": "Planificador de Menús",
"meal-plans": "Menús",
"mealplan-categories": "CATEGORÍAS DE COMIDAS",
"mealplan-created": "Menú creado",
"mealplan-creation-failed": "Produciuse un erro ao crear o menú",
"mealplan-deleted": "Menú Eliminado",
"mealplan-deletion-failed": "Produciuse un erro ao eliminar o menú",
"mealplan-settings": "Axustes do Menú",
"mealplan-update-failed": "Produciuse un erro na actualización do menú",
"mealplan-updated": "Menú Actualizado",
"no-meal-plan-defined-yet": "Aínda non se definiu ningún menú",
"no-meal-planned-for-today": "Non hai ningunha comida prevista para hoxe",
"numberOfDays-hint": "Número de días ao cargar a páxina",
"numberOfDays-label": "Días Predeterminados",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Só se utilizarán receitas con estas categorías nos Menús",
"planner": "Planificador",
"quick-week": "Plan Rápido",
"side": "Guarnición",
"sides": "Guarnicións",
"start-date": "Data de inicio",
"rule-day": "Regra para o Día",
"meal-type": "Tipo de Comida",
"breakfast": "Almorzo",
"lunch": "Xantar",
"dinner": "Cea",
"type-any": "Calquera",
"day-any": "Calquera",
"editor": "Editor",
"meal-recipe": "Meal Recipe",
"meal-title": "Meal Title",
"meal-note": "Meal Note",
"note-only": "Note Only",
"random-meal": "Random Meal",
"random-dinner": "Random Dinner",
"random-side": "Random Side",
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
"to-all-days": "to all days",
"on-days": "on {0}s",
"for-all-meal-types": "for all meal types",
"for-type-meal-types": "for {0} meal types",
"meal-plan-rules": "Meal Plan Rules",
"new-rule": "New Rule",
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
"recipe-rules": "Recipe Rules",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-recipe": "Receita de Comida",
"meal-title": "Título de Comida",
"meal-note": "Nota da Comida",
"note-only": "Só Nota",
"random-meal": "Comida Aleatoria",
"random-dinner": "Cea Aleatoria",
"random-side": "Guarnición Aleatoria",
"this-rule-will-apply": "Esta regra aplicarase {dayCriteria} {mealTypeCriteria}.",
"to-all-days": "a todos os días",
"on-days": "en {0}s",
"for-all-meal-types": "para todo tipo de comidas",
"for-type-meal-types": "para {0} tipos de comidas",
"meal-plan-rules": "Regras do Menú",
"new-rule": "Nova Regra",
"meal-plan-rules-description": "Podes crear regras para a selección automática de receitas para os teus menús. Estas regras son usadas polo servidor para determinar o grupo aleatorio de receitas para seleccionar ao crear menús. Teña en conta que se as regras teñen as mesmas restricións de día/tipo, fusionaranse as categorías das regras. Na práctica, é innecesario crear regras duplicadas, pero é posible facelo.",
"new-rule-description": "Ao crear unha nova regra para un menú, pode restrinxir a regra para que se aplique a un día específico da semana e/ou a un tipo específico de comida. Para aplicar unha regra a todos os días ou a todos os tipos de comidas, pode establecer a regra en \"Calquera\" que a aplicará a todos os valores posibles para o día e/ou o tipo de comida.",
"recipe-rules": "Regras da Receita",
"applies-to-all-days": "Aplícase a todos os días",
"applies-on-days": "Aplícase en {0}s",
"meal-plan-settings": "Axustes do Menú"
},
"migration": {
"migration-data-removed": "Migration data removed",
"new-migration": "New Migration",
"no-file-selected": "No File Selected",
"no-migration-data-available": "No Migration Data Available",
"previous-migrations": "Previous Migrations",
"recipe-migration": "Recipe Migration",
"migration-data-removed": "Elimináronse os datos de migración",
"new-migration": "Nova Migración",
"no-file-selected": "Non se Seleccionou Ningún Ficheiro",
"no-migration-data-available": "Non Hai Datos de Migración Dispoñibles",
"previous-migrations": "Migracións Anteriores",
"recipe-migration": "Migración de Receitas",
"chowdown": {
"description": "Migrate data from Chowdown",
"description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
"description": "Migra os datos dende Chowdown",
"description-long": "Mealie admite de forma nativa o formato do repositorio de chowdown. Descarga o repositorio de códigos como ficheiro .zip e cárgao a continuación.",
"title": "Chowdown"
},
"nextcloud": {
@@ -365,18 +367,22 @@
"choose-migration-type": "Choose Migration Type",
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
"chowdown-text": "Mealie admite de forma nativa o formato do repositorio de chowdown. Descarga o repositorio de códigos como ficheiro .zip e cárgao a continuación.",
"recipe-1": "Recipe 1",
"recipe-2": "Recipe 2",
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
"mealie-text": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.",
"plantoeat": {
"title": "Plan to Eat",
"description-long": "Mealie can import recipies from Plan to Eat."
"description-long": "Mealie pode importar receitas de Plan to Eat."
},
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Garda Receitas",
"description-long": "Mealie pode importar receitas do Garda Receitas. Exporta as túas receitas en formato zip e, a continuación, carga o ficheiro .zip abaixo."
}
},
"new-recipe": {
@@ -407,81 +413,81 @@
"new-page-created": "New page created",
"page": "Page",
"page-creation-failed": "Page creation failed",
"page-deleted": "Page deleted",
"page-deletion-failed": "Page deletion failed",
"page-update-failed": "Page update failed",
"page-updated": "Page updated",
"pages-update-failed": "Pages update failed",
"pages-updated": "Pages updated",
"404-not-found": "404 Not Found",
"an-error-occurred": "An error occurred"
"page-deleted": "Páxina eliminada",
"page-deletion-failed": "Produciuse un erro ao eliminar a páxina",
"page-update-failed": "Produciuse un erro na actualización da páxina",
"page-updated": "Páxina actualizada",
"pages-update-failed": "Produciuse un erro na actualización das páxinas",
"pages-updated": "Páxinas actualizadas",
"404-not-found": "404 non atopado",
"an-error-occurred": "Houbo un erro"
},
"recipe": {
"add-key": "Add Key",
"add-to-favorites": "Add to Favorites",
"api-extras": "API Extras",
"calories": "Calories",
"calories-suffix": "calories",
"carbohydrate-content": "Carbohydrate",
"categories": "Categories",
"comment-action": "Comment",
"comment": "Comment",
"comments": "Comments",
"delete-confirmation": "Are you sure you want to delete this recipe?",
"delete-recipe": "Delete Recipe",
"description": "Description",
"disable-amount": "Disable Ingredient Amounts",
"add-key": "Engadir Chave",
"add-to-favorites": "Engadir a Favoritos",
"api-extras": "Extras da API",
"calories": "Calorías",
"calories-suffix": "calorías",
"carbohydrate-content": "Carbohidratos",
"categories": "Categorías",
"comment-action": "Comentar",
"comment": "Comentario",
"comments": "Comentarios",
"delete-confirmation": "Estás seguro de que queres eliminar esta receita?",
"delete-recipe": "Eliminar Receita",
"description": "Descrición",
"disable-amount": "Desactivar as Cantidades de Ingredientes",
"disable-comments": "Disable Comments",
"duplicate": "Duplicate recipe",
"duplicate-name": "Name of the new recipe",
"duplicate": "Duplicar a receita",
"duplicate-name": "Nome da nova receita",
"edit-scale": "Edit Scale",
"fat-content": "Fat",
"fiber-content": "Fiber",
"grams": "grams",
"ingredient": "Ingredient",
"ingredients": "Ingredients",
"insert-ingredient": "Insert Ingredient",
"insert-section": "Insert Section",
"instructions": "Instructions",
"key-name-required": "Key Name Required",
"landscape-view-coming-soon": "Landscape View",
"milligrams": "milligrams",
"new-key-name": "New Key Name",
"no-white-space-allowed": "No White Space Allowed",
"note": "Note",
"nutrition": "Nutrition",
"object-key": "Object Key",
"object-value": "Object Value",
"original-url": "Original URL",
"perform-time": "Cook Time",
"prep-time": "Prep Time",
"protein-content": "Protein",
"public-recipe": "Public Recipe",
"recipe-created": "Recipe created",
"recipe-creation-failed": "Recipe creation failed",
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
"recipe-updated": "Recipe updated",
"remove-from-favorites": "Remove from Favorites",
"remove-section": "Remove Section",
"save-recipe-before-use": "Save recipe before use",
"section-title": "Section Title",
"servings": "Servings",
"share-recipe-message": "I wanted to share my {0} recipe with you.",
"show-nutrition-values": "Show Nutrition Values",
"sodium-content": "Sodium",
"step-index": "Step: {step}",
"sugar-content": "Sugar",
"title": "Title",
"total-time": "Total Time",
"unable-to-delete-recipe": "Unable to Delete Recipe",
"no-recipe": "No Recipe",
"locked-by-owner": "Locked by Owner",
"join-the-conversation": "Join the Conversation",
"fat-content": "Graxa",
"fiber-content": "Fibra",
"grams": "gramos",
"ingredient": "Ingrediente",
"ingredients": "Ingredientes",
"insert-ingredient": "Inserir Ingrediente",
"insert-section": "Inserir Sección",
"instructions": "Instrucns",
"key-name-required": "Nome da Chave Obrigatorio",
"landscape-view-coming-soon": "Vista Horizontal",
"milligrams": "miligramos",
"new-key-name": "Novo Nome da Chave",
"no-white-space-allowed": "Non se Permiten Espazos en Branco",
"note": "Nota",
"nutrition": "Nutrición",
"object-key": "Chave do Obxecto",
"object-value": "Valor do Obxecto",
"original-url": "URL orixinal",
"perform-time": "Tempo de Cocción",
"prep-time": "Tempo de Preparación",
"protein-content": "Proteína",
"public-recipe": "Receita Pública",
"recipe-created": "Receita creada",
"recipe-creation-failed": "Produciuse un erro na creación da receita",
"recipe-deleted": "Eliminouse a receita",
"recipe-image": "Imaxe da Receita",
"recipe-image-updated": "Actualizouse a imaxe da receita",
"recipe-name": "Nome da Receita",
"recipe-settings": "Configuración da Receita",
"recipe-update-failed": "Produciuse un erro na actualización da receita",
"recipe-updated": "Receita actualizada",
"remove-from-favorites": "Eliminar de Favoritos",
"remove-section": "Eliminar Sección",
"save-recipe-before-use": "Garda a receita antes de usala",
"section-title": "Título da Sección",
"servings": "Porcións",
"share-recipe-message": "Quería compartir a miña receita de {0} contigo.",
"show-nutrition-values": "Mostrar Valores Nutricionais",
"sodium-content": "Sodio",
"step-index": "Paso: {step}",
"sugar-content": "Azucre",
"title": "Titulo",
"total-time": "Tempo Total",
"unable-to-delete-recipe": "Non se Puido Eliminar a Receita",
"no-recipe": "Sen Receita",
"locked-by-owner": "Bloqueado polo Propietario",
"join-the-conversation": "Únete á Conversa",
"add-recipe-to-mealplan": "Add Recipe to Mealplan",
"entry-type": "Entry Type",
"date-format-hint": "MM/DD/YYYY format",
@@ -533,9 +539,9 @@
"open-timeline": "Open Timeline",
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"last-made-date": "Last Made {date}",
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
"user-made-this": "{user} fixo isto",
"last-made-date": "Feito por Última Vez {date}",
"api-extras-description": "Os extras de receitas son unha característica clave da API de Mealie. Permítenche crear pares de clave/valor JSON personalizados dentro dunha receita, para facer referencia desde aplicacións de terceiros. Podes usar estas teclas para proporcionar información, por exemplo, para activar automatizacións ou mensaxes personalizadas para transmitir ao dispositivo que desexes.",
"message-key": "Message Key",
"parse": "Parse",
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
@@ -546,7 +552,7 @@
"edit-markdown": "Edit Markdown",
"recipe-creation": "Recipe Creation",
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
"looking-for-migrations": "Looking For Migrations?",
"looking-for-migrations": "Buscando As Migracións?",
"import-with-url": "Import with URL",
"create-recipe": "Create Recipe",
"create-recipe-description": "Create a new recipe from scratch.",
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -588,13 +596,13 @@
"recipe-actions": "Recipe Actions",
"parser": {
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
"ingredient-parser": "Ingredient Parser",
"ingredient-parser": "Analizador de Ingredientes",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"select-parser": "Seleccione Analizador",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"brute-parser": "Analizador Bruto",
"openai-parser": "Analizador OpenAI",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
@@ -626,27 +634,28 @@
"admin-settings": "Admin Settings",
"backup": {
"backup-created": "Backup created successfully",
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-created-at-response-export_path": "Copia de Seguridade Creada en {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create A Backup",
"create-heading": "Crea Unha Copia de Seguridade",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
"import-summary": "Import Summary",
"partial-backup": "Partial Backup",
"unable-to-delete-backup": "Unable to Delete Backup.",
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
"backup-restore": "Backup Restore",
"experimental-description": "As copias de seguridade son instantáneas totais da base de datos e do directorio de datos do sitio. Isto inclúe todos os datos e non se pode configurar para excluír subconxuntos de datos. Podes pensar nisto como unha instantánea de Mealie nun momento específico. Estas serven como unha forma independente da base de datos para exportar e importar datos ou facer unha copia de seguridade do sitio nunha localización externa.",
"backup-restore": "Restaurar Copia de Seguridade",
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
"cannot-be-undone": "This action cannot be undone - use with caution.",
"postgresql-note": "If you are using PostGreSQL, please review the {backup-restore-process} prior to restoring.",
"backup-restore-process-in-the-documentation": "backup/restore process in the documentation",
"irreversible-acknowledgment": "I understand that this action is irreversible, destructive and may cause data loss",
"restore-backup": "Restore Backup"
"irreversible-acknowledgment": "Entendo que esta acción é irreversible, destrutiva e pode provocar a perda de datos",
"restore-backup": "Restaurar Copia de Seguridad"
},
"backup-and-exports": "Backups",
"backup-and-exports": "Copias de seguridade",
"change-password": "Change Password",
"current": "Version:",
"custom-pages": "Custom Pages",
@@ -676,7 +685,7 @@
"set-new-time": "Set New Time",
"settings-update-failed": "Settings update failed",
"settings-updated": "Settings updated",
"site-settings": "Site Settings",
"site-settings": "Configuración do sitio",
"theme": {
"accent": "Accent",
"dark": "Dark",
@@ -731,43 +740,43 @@
"webhook-name": "Webhook Name",
"description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled."
},
"bug-report": "Bug Report",
"bug-report": "Informe de Erros",
"bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.",
"tracker": "Tracker",
"configuration": "Configuration",
"configuration": "Configuración",
"docker-volume": "Docker Volume",
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
"volumes-are-misconfigured": "Volumes are misconfigured.",
"volumes-are-configured-correctly": "Volumes are configured correctly.",
"status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.",
"validate": "Validate",
"email-configuration-status": "Email Configuration Status",
"email-configured": "Email Configured",
"email-test-results": "Email Test Results",
"email-configuration-status": "Estado da Configuración do Correo-e",
"email-configured": "Correo-e Configurado",
"email-test-results": "Resultados da Proba de Correo-e",
"ready": "Ready",
"not-ready": "Not Ready - Check Environmental Variables",
"succeeded": "Succeeded",
"failed": "Failed",
"general-about": "General About",
"application-version": "Application Version",
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
"general-about": "Información Xeral",
"application-version": "Versión da Aplicación",
"application-version-error-text": "A túa versión actual ({0}) non coincide coa última versión. Considera actualizar á última versión ({1}).",
"mealie-is-up-to-date": "Mealie is up to date",
"secure-site": "Secure Site",
"secure-site": "Sitio Seguro",
"secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.",
"secure-site-success-text": "Site is accessed by localhost or https",
"server-side-base-url": "Server Side Base URL",
"secure-site-success-text": "Accédese ao sitio por localhost ou https",
"server-side-base-url": "URL Base do Servidor",
"server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.",
"server-side-base-url-success-text": "Server Side URL does not match the default",
"ldap-ready": "LDAP Ready",
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
"server-side-base-url-success-text": "O URL do servidor non coincide co predeterminado",
"ldap-ready": "LDAP Listo",
"ldap-ready-error-text": "Non todos os valores LDAP están configurados. Isto pódese ignorar se non está a usar a Autenticación LDAP.",
"ldap-ready-success-text": "Required LDAP variables are all set.",
"build": "Build",
"recipe-scraper-version": "Recipe Scraper Version",
"oidc-ready": "OIDC Ready",
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
"recipe-scraper-version": "Versión do Analizador de Receitas",
"oidc-ready": "OIDC Listo",
"oidc-ready-error-text": "Non todos os valores OIDC están configurados. Isto pódese ignorar se non está a usar a Autenticación OIDC.",
"oidc-ready-success-text": "Required OIDC variables are all set.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-error-text": "Non todos os valores de OpenAI están configurados. Isto pódese ignorar se non está a usar as funcións de OpenAI.",
"openai-ready-success-text": "Required OpenAI variables are all set."
},
"shopping-list": {
@@ -801,7 +810,7 @@
},
"sidebar": {
"all-recipes": "All Recipes",
"backups": "Backups",
"backups": "Copias de seguridade",
"categories": "Categories",
"cookbooks": "Cookbooks",
"dashboard": "Dashboard",
@@ -810,13 +819,13 @@
"migrations": "Migrations",
"profile": "Profile",
"search": "Search",
"site-settings": "Site Settings",
"site-settings": "Configuración do sitio",
"tags": "Tags",
"toolbox": "Toolbox",
"language": "Language",
"maintenance": "Maintenance",
"background-tasks": "Background Tasks",
"parser": "Parser",
"parser": "Analizador",
"developer": "Developer",
"cookbook": "Cookbook",
"create-cookbook": "Create a new cookbook"
@@ -868,7 +877,7 @@
"current-password": "Current Password",
"e-mail-must-be-valid": "E-mail must be valid",
"edit-user": "Edit User",
"email": "Email",
"email": "Correo-e",
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
"existing-password-does-not-match": "Existing password does not match",
"full-name": "Full Name",
@@ -894,7 +903,7 @@
"register": "Register",
"reset-password": "Reset Password",
"sign-in": "Sign in",
"total-mealplans": "Total MealPlans",
"total-mealplans": "Menús Totais",
"total-users": "Total Users",
"upload-photo": "Upload Photo",
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
@@ -919,7 +928,7 @@
"enable-advanced-content": "Enable Advanced Content",
"enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later",
"favorite-recipes": "Favorite Recipes",
"email-or-username": "Email or Username",
"email-or-username": "Correo-e ou Nome de Usuario",
"remember-me": "Remember Me",
"please-enter-your-email-and-password": "Please enter your email and password",
"invalid-credentials": "Invalid Credentials",
@@ -1070,7 +1079,7 @@
"validation": {
"group-name-is-taken": "Group name is taken",
"username-is-taken": "Username is taken",
"email-is-taken": "Email is taken",
"email-is-taken": "O correo-e está collido",
"this-field-is-required": "This Field is Required"
},
"export": {
@@ -1137,50 +1146,50 @@
"admin": {
"maintenance": {
"storage-details": "Storage Details",
"page-title": "Site Maintenance",
"page-title": "Mantemento do Sitio",
"summary-title": "Summary",
"button-label-get-summary": "Get Summary",
"button-label-get-summary": "Obter un Resumo",
"button-label-open-details": "Details",
"info-description-data-dir-size": "Data Directory Size",
"info-description-data-dir-size": "Tamaño do Directorio de Datos",
"info-description-log-file-size": "Log File Size",
"info-description-cleanable-directories": "Cleanable Directories",
"info-description-cleanable-images": "Cleanable Images",
"info-description-cleanable-directories": "Directorios Eliminables",
"info-description-cleanable-images": "Imaxes Eliminables",
"storage": {
"title-temporary-directory": "Temporary Directory (.temp)",
"title-backups-directory": "Backups Directory (backups)",
"title-backups-directory": "Directorio de Copias de Seguridade (copias de seguridade)",
"title-groups-directory": "Groups Directory (groups)",
"title-recipes-directory": "Recipes Directory (recipes)",
"title-user-directory": "User Directory (user)"
},
"action-delete-log-files-name": "Delete Log Files",
"action-delete-log-files-description": "Deletes all the log files",
"action-clean-directories-name": "Clean Directories",
"action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs",
"action-clean-temporary-files-name": "Clean Temporary Files",
"action-clean-temporary-files-description": "Removes all files and folders in the .temp directory",
"action-clean-images-name": "Clean Images",
"action-clean-images-description": "Removes all the images that don't end with .webp",
"actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.",
"actions-description-destructive": "destructive",
"action-clean-directories-name": "Limpar Directorios",
"action-clean-directories-description": "Elimina todos os cartafoles de receitas sin UUIDs válidos",
"action-clean-temporary-files-name": "Limpar Ficheiros Temporais",
"action-clean-temporary-files-description": "Elimina todos os ficheiros e cartafoles do directorio .temp",
"action-clean-images-name": "Eliminar Imaxes",
"action-clean-images-description": "Elimina todas as imaxes que non rematan en .webp",
"actions-description": "As accións de mantemento son {destructive_in_bold} e deben usarse con precaución. Realizar calquera destas accións é {irreversible_in_bold}.",
"actions-description-destructive": "destrutivas",
"actions-description-irreversible": "irreversible",
"logs-action-refresh": "Refresh Logs",
"logs-page-title": "Mealie Logs",
"logs-tail-lines-label": "Tail Lines"
},
"mainentance": {
"actions-title": "Actions"
"actions-title": "Accións"
},
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
"ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.",
"ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.",
"nlp": "NLP",
"brute": "Brute",
"ingredients-natural-language-processor": "Procesador de Linguaxe Natural de Ingredientes",
"ingredients-natural-language-processor-explanation": "Mealie usa Campos Aleatorios Condicionais (CACs) para analizar e procesar ingredientes. O modelo utilizado para os ingredientes baséase nun conxunto de datos de máis de 100.000 ingredientes dun conxunto de datos compilado polo New York Times. Teña en conta que, como o modelo está adestrado só en inglés, pode ter resultados variados ao usar o modelo noutros idiomas. Esta páxina é unha zona de xogos para probar o modelo.",
"ingredients-natural-language-processor-explanation-2": "Non é perfecto, pero dá excelentes resultados en xeral e é un bo punto de partida para analizar manualmente os ingredientes en campos individuais. Alternativamente, tamén pode usar o procesador \"Bruto\" que usa unha técnica de coincidencia de patróns para identificar ingredientes.",
"nlp": "PLN",
"brute": "Bruto",
"openai": "OpenAI",
"show-individual-confidence": "Show individual confidence",
"show-individual-confidence": "Amosar confianza individual",
"ingredient-text": "Ingredient Text",
"average-confident": "{0} Confident",
"try-an-example": "Try an example",
"parser": "Parser",
"try-an-example": "Proba un exemplo",
"parser": "Analizador",
"background-tasks": "Background Tasks",
"background-tasks-description": "Here you can view all the running background tasks and their status",
"no-logs-found": "No Logs Found",
@@ -1225,8 +1234,8 @@
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
"data-migrations": "Data Migrations",
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
"email-sent": "Email Sent",
"error-sending-email": "Error Sending Email",
"email-sent": "Correo-e Enviado",
"error-sending-email": "Erro ao Enviar o Correo-e",
"personal-information": "Personal Information",
"preferences": "Preferences",
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "תכנית ארוחה עודכנה",
"no-meal-plan-defined-yet": "עדיין לא הוגדרה תכנית ארוחה",
"no-meal-planned-for-today": "לא מתוכננת ארוחה להיום",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "רק מתכונים שהוגדרו עם הקטגוריות הללו ישומשו בתכנוני ארוחות",
"planner": "תכנון",
"quick-week": "תכנון שבועי מהיר",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "מחיקת דוח נכשלה",
"recipe-debugger": "דיבאגר למתכון",
"recipe-debugger-description": "הדבק פה את קישור המתקון שברצונך לבצע לו דיבוג. הקישור יפוענך ע\"י מפענך המתכונים והתוצאה תוצג. אם לא חוזרת תוצאה, האתר אותו אתה מנסה להוסיף אינו נתמך ע\"י מילי או ספריית הפיענוך.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "דיבאג",
"tree-view": "תצוגת עץ",
"recipe-yield": "תשואת מתכון",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "גיבוי נוצר ב {path}",
"backup-deleted": "גיבוי נמחק",
"restore-success": "השחזור הצליח",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "תגית גיבוי",
"create-heading": "Create a Backup",
"delete-backup": "מחיקת גיבוי",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Plan obroka je Ažuriran",
"no-meal-plan-defined-yet": "Plan obroka još nije definiran",
"no-meal-planned-for-today": "Nema Plan obroka za današnji dan",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Samo recepti s ovim kategorijama bit će korišteni u planovima obroka",
"planner": "Planer",
"quick-week": "Brzi Tjedan",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Brisanje nije uspjelo",
"recipe-debugger": "Ispravljač Pogrešaka Recepta",
"recipe-debugger-description": "Preuzmite URL recepta koji želite ispraviti i zalijepite ga ovdje. URL će biti obrađen od strane scraper-a za recepte i rezultati će biti prikazani. Ako ne vidite nikakve povratne podatke, to znači da web stranica koju pokušavate obraditi nije podržana od strane Mealie-a ili njegove biblioteke za scraper-e.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Ispravljanje grešaka",
"tree-view": "Prikaz Stabla",
"recipe-yield": "Konačna Količina Recepta",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Sigurnosna Kopija Kreirana na lokaciji {path}",
"backup-deleted": "Sigurnosna kopija izbrisana",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Sigurnosna kopija Oznake",
"create-heading": "Kreiraj sigurnosnu kopiju",
"delete-backup": "Izbriši sigurnosnu kopiju",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Menüterv módosítva",
"no-meal-plan-defined-yet": "Nincs még menüterv létrehozva",
"no-meal-planned-for-today": "Nincs mára menüterv",
"numberOfDays-hint": "Napok száma az oldal betöltésekor",
"numberOfDays-label": "Alapértelmezett napok",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "A menütervekben csak a következő kategóriához tartozó receptek kerülnek felhasználásra",
"planner": "Tervező",
"quick-week": "Gyors hét",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Az én receptes dobozom",
"description-long": "A Mealie képest recepteket importálni az Én Receptes Dobozomból. Exportáld a receptjeidet CSV formátúmba, aztán töltsd fel a .csv fájlt lentebb."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "A Mealie képes recepteket importálni a Recipe Keeperből. Exportálja a receptjeit zip formátumban, majd töltse fel a .zip fájlt az oldal alján."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Jelentés törlése sikertelen",
"recipe-debugger": "Recept hibakereső",
"recipe-debugger-description": "Fogja meg a hibakereséshez szükséges recept URL-címét, és illessze be ide. Az URL-t a receptkinyerő átemeli, és az eredmények megjelennek. Ha nem lát semmilyen visszaadott adatot, akkor a Mealie vagy a receptkinyerő nem támogatja az oldal formátumát.",
"use-openai": "OpenAI használata",
"recipe-debugger-use-openai-description": "Használja az OpenAI-t az eredmények elemzésére, ahelyett, hogy a scraper könyvtárra hagyatkozna. Ha URL-címen keresztül hoz létre receptet, ez automatikusan megtörténik, ha a scraper könyvtár nem működik, ám itt manuálisan is tesztelheti.",
"debug": "Hibakeresés",
"tree-view": "Fa nézet",
"recipe-yield": "Adagonkénti információk",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Mentés a következő helyre: {path}",
"backup-deleted": "Biztonsági mentés törölve",
"restore-success": "Sikeres visszaállítás",
"restore-fail": "A visszaállítás sikertelen. További részletekért ellenőrizze a szervernaplókat",
"backup-tag": "Biztonsági mentés leírás",
"create-heading": "Biztonsági mentés létrehozása",
"delete-backup": "Biztonsági mentés törlése",
@@ -782,7 +791,7 @@
"food": "Étel",
"note": "Megjegyzés",
"label": "Címke",
"save-label": "Save Label",
"save-label": "Címke mentése",
"linked-item-warning": "Ez a tétel egy vagy több recepthez kapcsolódik. A mennyiségi egységek vagy az alapanyagok átállítása nem várt eredményeket fog eredményezni, amikor hozzáadja vagy eltávolítja a receptet ebből a listából.",
"toggle-food": "Váltás alapanyagokra",
"manage-labels": "Címkék kezelése",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create A Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Piano Alimentare Aggiornato",
"no-meal-plan-defined-yet": "Ancora nessun piano alimentare definito",
"no-meal-planned-for-today": "Nessun piano alimentare per oggi",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Solo ricette con queste categorie possono essere utilizzate un un Piano Alimentare",
"planner": "Pianificatore",
"quick-week": "Settimana Veloce",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Il mio ricettario",
"description-long": "Mealie può importare ricette da My Recipe Box. Esporta le tue ricette in formato HTML, quindi carica il .zip qui sotto."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Eliminazione report fallita",
"recipe-debugger": "Debugger Ricetta",
"recipe-debugger-description": "Prendi l'URL della ricetta che vuoi fare il debug e incollalo qui. L'URL verrà recuperato dallo scraper di ricette e i risultati verranno visualizzati. Se non si vede alcun dato restituito, il sito che si sta cercando di analizzare non è supportato da Mealie o la sua libreria di scraping.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Visualizzazione ad Albero",
"recipe-yield": "Resa Ricetta",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Creato in {path}",
"backup-deleted": "Backup eliminato",
"restore-success": "Ripristino riuscito",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Tag Backup",
"create-heading": "Crea un Backup",
"delete-backup": "Elimina Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "献立を更新しました",
"no-meal-plan-defined-yet": "食事プランはまだ定義されていません",
"no-meal-planned-for-today": "今日の食事プランはありません",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "食事プランでは、これらのカテゴリを持つレシピのみが使用されます",
"planner": "プランナー",
"quick-week": "クイックウィーク",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "MealieはMy Recipe Boxからレシピをインポートできます。レシピをCSV形式でエクスポートし、以下に.csvをアップロードしてください。"
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "レポートの削除に失敗しました",
"recipe-debugger": "レシピのデバッガー",
"recipe-debugger-description": "デバッグしたいレシピのURLを取得し、ここに貼り付けます。 URLはレシピスクレーパーによって削除され、結果が表示されます。 データが返されていない場合、スクレイプしようとしているサイトはMealieまたはそのスクレイパーライブラリではサポートされていません。",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "デバッグ",
"tree-view": "ツリービュー",
"recipe-yield": "レシピ収率",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "{path} にバックアップを作成しました",
"backup-deleted": "バックアップを削除しました",
"restore-success": "復元に成功しました",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "バックアップ タグ",
"create-heading": "Create a Backup",
"delete-backup": "バックアップを削除",
@@ -1197,7 +1206,7 @@
}
},
"profile": {
"welcome-user": "👋 Welcome, {0}!",
"welcome-user": "👋 ようこそ, {0}!",
"description": "プロフィール、レシピ、グループ設定を管理します。",
"get-invite-link": "招待リンクを取得",
"get-public-link": "公開リンクを取得",

View File

@@ -42,9 +42,9 @@
"category-deleted": "카테고리 삭제됨",
"category-deletion-failed": "카테고리 삭제 실패",
"category-filter": "카테고리 필터",
"category-update-failed": "Category update failed",
"category-update-failed": "Category 업데이트 실패",
"category-updated": "카테고리 업데이트",
"uncategorized-count": "Uncategorized {count}",
"uncategorized-count": "카테고리 없음 {count}",
"create-a-category": "카테고리 생성",
"category-name": "카테고리 이름",
"category": "카테고리"
@@ -56,22 +56,22 @@
"event-delete-confirmation": "정말로 이 이벤트를 삭제하시겠어요?",
"event-deleted": "이벤트 삭제됨",
"event-updated": "이벤트 업데이트됨",
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
"new-notification-form-description": "Mealie는 Apprise 라이브러리를 사용하여 알림을 생성합니다. 알림에 사용할 서비스에 대한 다양한 옵션을 제공합니다. 서비스의 URL을 만드는 방법에 대한 종합적인 가이드는 해당 Wiki 문서를 참조하세요. 알림 유형에 따라 추가 기능이 포함될 수 있습니다.",
"new-version": "새로운 버전 사용 가능",
"notification": "알림",
"refresh": "새로고침",
"scheduled": "Scheduled",
"something-went-wrong": "Something Went Wrong!",
"something-went-wrong": "문제가 발생했습니다!",
"subscribed-events": "구독한 이벤트",
"test-message-sent": "Test Message Sent",
"message-sent": "Message Sent",
"test-message-sent": "테스트 메시지가 전송됐습니다.",
"message-sent": "메세지가 전송됨",
"new-notification": "새 알림",
"event-notifiers": "Event Notifiers",
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
"apprise-url-skipped-if-blank": "Apprise URL (비워두면 생략합니다)",
"enable-notifier": "Enable Notifier",
"what-events": "What events should this notifier subscribe to?",
"user-events": "User Events",
"mealplan-events": "Mealplan Events",
"user-events": "사용자 이벤트",
"mealplan-events": "Mealplan 이벤트",
"when-a-user-in-your-group-creates-a-new-mealplan": "When a user in your group creates a new mealplan",
"shopping-list-events": "Shopping List Events",
"cookbook-events": "Cookbook Events",
@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "백업 삭제됨",
"restore-success": "복원 성공!",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "백업 삭제",

View File

@@ -64,7 +64,7 @@
"something-went-wrong": "Įvyko klaida!",
"subscribed-events": "Prenumeruojami įvykiai",
"test-message-sent": "Testinė žinutė išsiųsta",
"message-sent": "Message Sent",
"message-sent": "Žinutė išsiųsta",
"new-notification": "Naujas pranešimas",
"event-notifiers": "Įvykių pranešimai",
"apprise-url-skipped-if-blank": "Apprise URL (praleidžiama, jei tuščia)",
@@ -81,7 +81,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"add": "Pridėti",
"cancel": "Atšaukti",
"clear": "Išvalyti",
"close": "Uždaryti",
@@ -117,9 +117,9 @@
"json": "JSON",
"keyword": "Raktažodis",
"link-copied": "Nuoroda nukopijuota",
"loading": "Loading",
"loading": "Kraunasi",
"loading-events": "Užkrovimo įvykiai",
"loading-recipe": "Loading recipe...",
"loading-recipe": "Receptai kraunasi...",
"loading-ocr-data": "Loading OCR data...",
"loading-recipes": "Receptai kraunasi",
"message": "Pranešimas",
@@ -145,18 +145,18 @@
"save": "Išsaugoti",
"settings": "Nustatymai",
"share": "Dalintis",
"show-all": "Show All",
"show-all": "Rodyti viską",
"shuffle": "Maišyti",
"sort": "Rikiavimas",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Rūšiuoti didėjimo tvarka",
"sort-descending": "Rūšiuoti mažėjančia tvarka",
"sort-alphabetically": "Pagal abėcėlę",
"status": "Būsena",
"subject": "Tema",
"submit": "Pateikti",
"success-count": "Sėkmingų: {count}",
"sunday": "Sekmadienis",
"system": "System",
"system": "Sistema",
"templates": "Ruošiniai:",
"test": "Tikrinti",
"themes": "Temos",
@@ -176,7 +176,7 @@
"units": "Vienetai",
"back": "Atgal",
"next": "Kitas",
"start": "Start",
"start": "Pradėti",
"toggle-view": "Perjungti vaizdą",
"date": "Data",
"id": "Id",
@@ -291,6 +291,8 @@
"mealplan-updated": "Mitybos planas atnaujintas",
"no-meal-plan-defined-yet": "Nėra nustatytų mitybos planų",
"no-meal-planned-for-today": "Nėra šios dienos mitybos plano",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Mitybos planuose bus naudojami tik šių kategorijų receptai",
"planner": "Planuoklis",
"quick-week": "Greitas savaitės planas",
@@ -375,8 +377,12 @@
"description-long": "Mealie can import recipies from Plan to Eat."
},
"myrecipebox": {
"title": "My Recipe Box",
"title": "Mano receptų dėžutė",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Ataskaitų trynimas nepavyko",
"recipe-debugger": "Recepto klaidų radimas",
"recipe-debugger-description": "Įkelkite neveikiančio recepto URL nuorodą. Iš nuorodos bus nuskaitytas receptas ir parodyti nuskaitymo rezultatai. Jei nematote jokių duomenų - ši svetainė nėra suderinama su Mealie.",
"use-openai": "Naudoti 'OpenAI'",
"recipe-debugger-use-openai-description": "Naudokite 'OpenAI', kad išanalizuoti rezultatus, o ne pasikliauti tinklalapių duomenų rinkiklio įrankiu. Kuriant receptą naudojant URL, tai padaroma automatiškai, jei duomenų rinkiklio įrankiui nepavyksta apdoroti rezultatų, tačiau čia jį galite išbandyti rankiniu būdu.",
"debug": "Šalinti klaidas",
"tree-view": "Medžio struktūra",
"recipe-yield": "Recepto išeiga",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Atsarginė kopija sukurta {path}",
"backup-deleted": "Atsarginė kopija ištrinta",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Atsarginės kopijos žyma",
"create-heading": "Sukurti atsarginę kopiją",
"delete-backup": "Ištrinti atsarginę kopiją",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create A Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Maaltijdplan bijgewerkt",
"no-meal-plan-defined-yet": "Nog geen maaltijdplan opgesteld",
"no-meal-planned-for-today": "Geen maaltijd gepland voor vandaag",
"numberOfDays-hint": "Aantal dagen bij laden van de pagina",
"numberOfDays-label": "Standaard aantal dagen",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Alleen recepten met deze categorieën zullen worden gebruikt in maaltijdplannen",
"planner": "Planner",
"quick-week": "Snelle week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Mijn Receptenbox",
"description-long": "Mealie kan recepten importeren uit My Recipe Box. Exporteer je recepten in CSV formaat, upload daarna het .csv bestand hieronder."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie kan recepten importeren van Recipe Keeper. Exporteer de recepten als .zip. Dat bestand kunt u hier dan uploaden."
}
},
"new-recipe": {
@@ -558,7 +564,7 @@
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Maak een recept door het een naam te geven. Alle recepten moeten unieke namen hebben.",
"new-recipe-names-must-be-unique": "Nieuwe receptnamen moeten uniek zijn",
"scrape-recipe": "Scrape recept",
"scrape-recipe-description": "Voeg een recept toe via een url. Geef de url op van de site welke je wil scannen voor een recept., en Mealie zal proberen het recept vanaf die plek te scannen en aan je collectie toe te voegen.",
"scrape-recipe-description": "Voeg een recept toe via een URL. Geef de URL op van de site die je wil scannen voor een recept en Mealie zal proberen het recept vanaf die plek te scannen en aan je collectie toe te voegen.",
"scrape-recipe-have-a-lot-of-recipes": "Heb je veel recepten die je in 1 keer wil importeren?",
"scrape-recipe-suggest-bulk-importer": "Probeer de bulk importer uit",
"import-original-keywords-as-tags": "Importeer oorspronkelijke trefwoorden als tags",
@@ -577,6 +583,8 @@
"report-deletion-failed": "Rapport verwijderen is mislukt",
"recipe-debugger": "Recept debugger",
"recipe-debugger-description": "Pak de URL van het recept dat u wilt debuggen en plak die hier. De URL zal door de receptenscraper worden gescrapt en de resultaten zullen worden weergegeven. Als u geen gegevens ziet, wordt de site die u probeert te scrapen niet ondersteund door Mealie of zijn scraperbibliotheek.",
"use-openai": "Gebruik OpenAI",
"recipe-debugger-use-openai-description": "Gebruik OpenAI om de resultaten te verwerken in plaats van te vertrouwen op de scraper-bibliotheek. Bij het maken van een recept via een URL wordt dit automatisch gedaan als de scraper-bibliotheek mislukt, maar u kunt het hier handmatig testen.",
"debug": "Debug",
"tree-view": "Boomstructuurweergave",
"recipe-yield": "Recept Opbrengst",
@@ -588,18 +596,18 @@
"recipe-actions": "Acties met recepten ",
"parser": {
"experimental-alert-text": "Mealie gebruikt natuurlijke taalverwerking om te ontleden en maakt eenheden en levensmiddelen voor de ingrediënten van je recept. Deze functie is experimenteel en werkt misschien niet altijd zoals verwacht. Als u liever niet de bewerkte resultaten gebruikt, kunt u 'Annuleren' selecteren en de wijzigingen worden niet opgeslagen.",
"ingredient-parser": "",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI verwerker",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"no-food": "No Food"
"ingredient-parser": "Ingrediëntenontleder",
"explanation": "Om de ingrediëntenontleder te gebruiken, klik op de knop 'Alles ontleden' om het proces te starten. Zodra de verwerkte ingrediënten beschikbaar zijn, kan je de items bekijken en controleren of ze correct verwerkt zijn. De vertrouwensscore van het model wordt weergegeven aan de rechterkant van het item titel. Deze score is een gemiddelde van alle afzonderlijke scores en is mogelijk niet altijd volledig.",
"alerts-explainer": "Waarschuwingen zullen worden getoond als er een overeenkomend voedsel of eenheid is gevonden, maar niet bestaat in de database.",
"select-parser": "Selecteer ontleder",
"natural-language-processor": "Natuurlijke taalverwerker",
"brute-parser": "Ruwe ontleder",
"openai-parser": "OpenAI ontleder",
"parse-all": "Alles ontleden",
"no-unit": "Geen eenheid",
"missing-unit": "Maak ontbrekende eenheid aan: {unit}",
"missing-food": "Ontbrekende voedsel maken: {food}",
"no-food": "Geen voedsel"
}
},
"search": {
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Back-up gemaakt op {path}",
"backup-deleted": "Back-up verwijderd",
"restore-success": "Herstellen gelukt",
"restore-fail": "Herstel mislukt. Controleer de logbestanden van uw server voor meer informatie",
"backup-tag": "Back-uplabel",
"create-heading": "Back-up maken",
"delete-backup": "Back-up verwijderen",
@@ -763,9 +772,9 @@
"ldap-ready-success-text": "Vereiste LDAP variabelen zijn helemaal ingesteld.",
"build": "Bouw",
"recipe-scraper-version": "Versie van de receptenscraper",
"oidc-ready": "OIDC Ready",
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
"oidc-ready-success-text": "Required OIDC variables are all set.",
"oidc-ready": "OIDC klaar",
"oidc-ready-error-text": "Niet alle OIDC-waarden zijn geconfigureerd. Dit kan worden genegeerd als je geen OIDC-authenticatie gebruikt.",
"oidc-ready-success-text": "Vereiste OIDC variabelen zijn allemaal ingesteld.",
"openai-ready": "OpenAI staat klaar",
"openai-ready-error-text": "Niet alle tekstvakken voor OpenAI zijn ingevuld. Als je geen OpenAI gebruikt kun je dit leeg laten.",
"openai-ready-success-text": "Verplichte tekstvakken voor OpenAI zijn ingevuld."
@@ -782,7 +791,7 @@
"food": "Voedsel",
"note": "Notitie",
"label": "Label",
"save-label": "Save Label",
"save-label": "Label opslaan",
"linked-item-warning": "Dit element is gekoppeld aan een of meer recepten. Het aanpassen van de eenheden of ingrediënten zal onverwachte resultaten opleveren bij het toevoegen of verwijderen van het recept uit deze lijst.",
"toggle-food": "Voedsel schakelen",
"manage-labels": "Labels beheren",
@@ -816,7 +825,7 @@
"language": "Taal",
"maintenance": "Onderhoud",
"background-tasks": "Achtergrondtaken",
"parser": "Parser",
"parser": "Ontleder",
"developer": "Ontwikkelaar",
"cookbook": "Kookboek",
"create-cookbook": "Maak een nieuw kookboek aan"
@@ -877,8 +886,8 @@
"link-id": "Koppeling ID",
"link-name": "Koppeling Naam",
"login": "Inloggen",
"login-oidc": "Login with",
"or": "or",
"login-oidc": "Login met",
"or": "of",
"logout": "Uitloggen",
"manage-users": "Beheer Gebruikers",
"manage-users-description": "Aanmaken en beheren van gebruikers.",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Måltidsplan oppdatert",
"no-meal-plan-defined-yet": "Ingen måltidsplan er definert ennå",
"no-meal-planned-for-today": "Ingen måltid planlagt i dag",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun oppskrifter med disse kategoriene vil bli brukt i måltidsplaner",
"planner": "Planlegger",
"quick-week": "Hurtigplan",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie kan importere oppskrifter fra My Recipe Box. Eksporter oppskrifter i CSV-format, og last deretter opp .csv-filen nedenfor."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Sletting av rapport mislyktes",
"recipe-debugger": "Oppskriftsfeilsøker",
"recipe-debugger-description": "Hent nettadressen til oppskriften du vil feilsøke og lim den inn her. Nettsiden vil bli skrapt og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Feilsøk",
"tree-view": "Trevisning",
"recipe-yield": "Utbytte av oppskrift",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Sikkerhetskopi opprettet i {path}",
"backup-deleted": "Sikkerhetskopi slettet",
"restore-success": "Gjenopprettingen var vellykket",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Emneord for sikkerhetskopi",
"create-heading": "Opprett en sikkerhetskopi",
"delete-backup": "Slett sikkerhetskopi",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Plan posiłków został zaktualizowany",
"no-meal-plan-defined-yet": "Brak zdefiniowanego planu posiłków",
"no-meal-planned-for-today": "Brak zaplanowane posiłku na dziś",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Tylko przepisy z tych kategorii będą używane w planach posiłków",
"planner": "Planer",
"quick-week": "Szybki plan na tydzień",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Nie udało się usunąć raportu",
"recipe-debugger": "Debugger przepisów",
"recipe-debugger-description": "Skopiuj link do przepisu, który chcesz debugować i wklej go tutaj. Strona zostanie obskrobana przez skrobarkę przepisów i jej wynik zostanie wyświetlony. Jeśli nic nie zostało zwrócone, strona, którą próbujesz obskrobać, nie jest wspierana przez Mealie i jej bibliotekę skrobania.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debuguj",
"tree-view": "Widok drzewa",
"recipe-yield": "Wydajność przepisu",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Kopia zapasowa została utworzona w {path}",
"backup-deleted": "Kopia zapasowa została usunięta",
"restore-success": "Przywracanie zakończone sukcesem",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Etykieta kopii zapasowej",
"create-heading": "Utwórz kopię zapasową",
"delete-backup": "Usuń kopię zapasową",

View File

@@ -5,9 +5,9 @@
"api-docs": "Documentação da API",
"api-port": "Porta da API",
"application-mode": "Modo do Aplicativo",
"database-type": "Tipo do banco de dados",
"database-url": "URL do servidor de banco de dados",
"default-group": "Grupo padrão",
"database-type": "Tipo do Banco de Dados",
"database-url": "URL do banco de dados",
"default-group": "Grupo Padrão",
"demo": "Demonstração",
"demo-status": "Status da Demonstração",
"development": "Desenvolvimento",
@@ -25,20 +25,20 @@
"sponsor": "Patrocinar"
},
"asset": {
"assets": "Arquivos",
"assets": "Ativos",
"code": "Código",
"file": "Arquivo",
"image": "Imagem",
"new-asset": "Novo Arquivo",
"pdf": "PDF",
"recipe": "Receita",
"show-assets": "Exibir Arquivos",
"show-assets": "Exibir Ativos",
"error-submitting-form": "Erro ao enviar o formulário"
},
"category": {
"categories": "Categorias",
"category-created": "Categoria criada",
"category-creation-failed": "Falha ao criar categoria",
"category-creation-failed": "Falha ao criar Categoria",
"category-deleted": "Categoria Excluída",
"category-deletion-failed": "Falha ao excluir a categoria",
"category-filter": "Filtro de categoria",
@@ -52,24 +52,24 @@
"events": {
"apprise-url": "URL do Apprise",
"database": "Banco de dados",
"delete-event": "Apagar evento",
"delete-event": "Excluir Evento",
"event-delete-confirmation": "Tem certeza de que quer excluir este evento?",
"event-deleted": "Evento Excluído",
"event-updated": "Evento Atualizado",
"new-notification-form-description": "Mealie usa a biblioteca Apprise para gerar notificações. Eles oferecem várias opções de serviços para serem usados para notificações. Consulte a wiki para um guia completo sobre como criar a URL para o seu serviço. Se disponível, selecionar o tipo de notificação pode incluir recursos extras.",
"new-notification-form-description": "Mealie usa a biblioteca Apprise para gerar notificações. Eles oferecem várias opções de serviços para usar em notificações. Consulte sua wiki para um guia completo sobre como criar a URL para o seu serviço. Se disponível, selecionar o tipo da sua notificação pode incluir recursos extras.",
"new-version": "Nova versão disponível!",
"notification": "Notificação",
"refresh": "Atualizar",
"refresh": "Recarregar",
"scheduled": "Agendado",
"something-went-wrong": "Algo deu errado!",
"subscribed-events": "Eventos Inscritos",
"test-message-sent": "Mensagem de teste enviada",
"message-sent": "Message Sent",
"message-sent": "Mensagem enviada",
"new-notification": "Nova Notificação",
"event-notifiers": "Notificações de Eventos",
"apprise-url-skipped-if-blank": "URL Apprise (ignorado se estiver em branco)",
"enable-notifier": "Habilitar Notificações",
"what-events": "Quais eventos esse notificador deve subscrever?",
"enable-notifier": "Habilitar Notificador",
"what-events": "A quais eventos este notificador deve subscrever?",
"user-events": "Eventos do usuário",
"mealplan-events": "Eventos do Plano Refeições",
"when-a-user-in-your-group-creates-a-new-mealplan": "Quando um usuário do seu grupo criar um plano de refeição",
@@ -81,12 +81,12 @@
"recipe-events": "Eventos da Receita"
},
"general": {
"add": "Add",
"add": "Adicionar",
"cancel": "Cancelar",
"clear": "Limpar",
"close": "Fechar",
"confirm": "Confirmar",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Como está tudo?",
"confirm-delete-generic": "Você tem certeza de que deseja apagar isto?",
"copied_message": "Copiado!",
"create": "Criar",
@@ -145,23 +145,23 @@
"save": "Salvar",
"settings": "Configurações",
"share": "Compartilhar",
"show-all": "Show All",
"show-all": "Exibir Tudo",
"shuffle": "Aleatório",
"sort": "Ordenar",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Ordenação Crescente",
"sort-descending": "Ordenação Decrescente",
"sort-alphabetically": "Alfabética",
"status": "Estado",
"subject": "Assunto",
"submit": "Submeter",
"success-count": "Sucesso: {count}",
"sunday": "Domingo",
"system": "System",
"system": "Sistema",
"templates": "Modelos:",
"test": "Teste",
"themes": "Temas",
"thursday": "Quinta-feira",
"title": "Title",
"title": "Título",
"token": "Token",
"tuesday": "Terça-feira",
"type": "Tipo",
@@ -176,7 +176,7 @@
"units": "Unidades",
"back": "Voltar",
"next": "Avançar",
"start": "Start",
"start": "Iniciar",
"toggle-view": "Alternar Visualização",
"date": "Data",
"id": "Id",
@@ -208,9 +208,9 @@
"upload-file": "Enviar arquivo",
"created-on-date": "Criado em {0}",
"unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações.",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers"
"clipboard-copy-failure": "Falha ao copiar para a área de transferência.",
"confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?",
"organizers": "Organizadores"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Tem certeza que deseja excluir o grupo <b>{groupName}<b/>?",
@@ -246,8 +246,8 @@
"group-preferences": "Preferências de Grupo",
"private-group": "Grupo Privado",
"private-group-description": "Definir seu grupo para privado irá padronizar todas as opções de visualização para padrão. Isso substitui as configurações de visualização pública individuais.",
"enable-public-access": "Enable Public Access",
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
"enable-public-access": "Ativar Acesso Público",
"enable-public-access-description": "Tornar receitas do grupo públicas por padrão, e permitir a sua visualização por visitantes não logados",
"allow-users-outside-of-your-group-to-see-your-recipes": "Permitir que usuários fora do seu grupo vejam suas receitas",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Quando habilitado, você pode usar um link de compartilhamento público para compartilhar receitas específicas sem autorizar o usuário. Quando desativado, você pode apenas compartilhar receitas com usuários que estão em seu grupo ou com um link privado pré-gerado",
"show-nutrition-information": "Mostrar informações nutricionais",
@@ -271,7 +271,7 @@
},
"meal-plan": {
"create-a-new-meal-plan": "Criar um novo plano de refeições",
"update-this-meal-plan": "Update this Meal Plan",
"update-this-meal-plan": "Atualizar este Plano de Refeição",
"dinner-this-week": "Jantar desta semana",
"dinner-today": "Jantar de hoje",
"dinner-tonight": "JANTAR DE HOJE À NOITE",
@@ -291,6 +291,8 @@
"mealplan-updated": "Plano de Refeições atualizado",
"no-meal-plan-defined-yet": "Nenhum Plano de Refeições definido ainda",
"no-meal-planned-for-today": "Nenhuma refeição planejada para hoje",
"numberOfDays-hint": "Número de dias ao carregar a página",
"numberOfDays-label": "Dias Padrões",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Apenas receitas com essas categorias serão usadas nos Planos de Refeições",
"planner": "Planejamento",
"quick-week": "Semana Rápida",
@@ -361,11 +363,11 @@
},
"recipe-data-migrations": "Migrações de Dados de Receita",
"recipe-data-migrations-explanation": "Receitas podem ser migradas de outro aplicativo suportado para o Mealie. Esta é uma ótima maneira de começar com Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vindo de outra aplicação ou de uma versão mais antiga do Mealie? Confira as migrações e veja se seus dados podem ser importados.",
"choose-migration-type": "Escolher Tipo de Migração",
"tag-all-recipes": "Marcar todas as receitas com o marcador {tag-name}",
"nextcloud-text": "As receitas da Nextcloud podem ser importadas a partir de um arquivo .zip que contém os dados armazenados na Nextcloud. Veja abaixo o exemplo da estrutura da pasta para garantir que suas receitas possam ser importadas.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
"chowdown-text": "Mealie suporta nativamente o formato de repositório chowdown. Baixe o repositório de códigos como um arquivo ZIP e envie-o abaixo.",
"recipe-1": "Receita 1",
"recipe-2": "Receita 2",
"paprika-text": "Mealie pode importar receitas do aplicativo Paprika. Exporte suas receitas do Paprika, renomeie a extensão do arquivo para .zip e carregue-o abaixo.",
@@ -376,7 +378,11 @@
},
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
"description-long": "Mealie pode importar receitas do My Recipe Box. Exporte suas receitas em formato CSV e envie o arquivo abaixo."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie pode importar receitas do Recipe Keeper. Exporte suas receitas no formato ZIP, então envie o arquivo abaixo."
}
},
"new-recipe": {
@@ -491,11 +497,11 @@
"add-to-timeline": "Adicionar à linha do tempo",
"recipe-added-to-list": "Receita adicionada à lista",
"recipes-added-to-list": "Receitas adicionadas à lista",
"successfully-added-to-list": "Successfully added to list",
"successfully-added-to-list": "Sucesso ao adicionar à lista",
"recipe-added-to-mealplan": "Receita adicionada ao plano de refeições",
"failed-to-add-recipes-to-list": "Falha ao adicionar receita à lista",
"failed-to-add-recipe-to-mealplan": "Falha ao adicionar a receita ao plano de refeições",
"failed-to-add-to-list": "Failed to add to list",
"failed-to-add-to-list": "Falha ao adicionar à lista",
"yield": "Rendimento",
"quantity": "Quantidade",
"choose-unit": "Escolher unidades",
@@ -511,8 +517,8 @@
"cook-mode": "Modo Cozinheiro",
"link-ingredients": "Vincular ingredientes",
"merge-above": "Mesclar acima",
"move-to-bottom": "Move To Bottom",
"move-to-top": "Move To Top",
"move-to-bottom": "Mover para o Final",
"move-to-top": "Mover para o Topo",
"reset-scale": "Redefinir escala",
"decrease-scale-label": "Diminuir Escala por 1",
"increase-scale-label": "Aumentar Escala por 1",
@@ -528,14 +534,14 @@
"edit-timeline-event": "Editar Linha do Tempo do Evento",
"timeline": "Linha do Tempo",
"timeline-is-empty": "Nada na linha do tempo ainda. Tente fazer esta receita!",
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
"timeline-no-events-found-try-adjusting-filters": "Eventos não encontrados. Tente ajustar seus filtros de busca.",
"group-global-timeline": "{groupName} Linha do Tempo Global",
"open-timeline": "Abrir a Linha do Tempo",
"made-this": "Eu Fiz Isso",
"how-did-it-turn-out": "Como que ficou?",
"user-made-this": "{user} fez isso",
"last-made-date": "Feito pela última vez em {date}",
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
"api-extras-description": "Extras de receitas são atributos-chave da API do Mealie. Assim, você pode criar pares chave/valor JSON personalizados dentro de uma receita, referenciando aplicações de terceiros. Você pode usar as chaves para fornecer informações, como por ex. ativar automações ou mensagens que serão enviadas a seus dispositivos.",
"message-key": "Chave de mensagem",
"parse": "Analisar",
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
@@ -549,8 +555,8 @@
"looking-for-migrations": "Procurando por migrações?",
"import-with-url": "Importar a partir da URL",
"create-recipe": "Criar Receita",
"create-recipe-description": "Create a new recipe from scratch.",
"create-recipes": "Create Recipes",
"create-recipe-description": "Criar uma receita do zero.",
"create-recipes": "Criar Receitas",
"import-with-zip": "Importar a partir de .zip",
"create-recipe-from-an-image": "Criar Receita a partir de uma imagem",
"bulk-url-import": "Importação de URL em massa",
@@ -559,8 +565,8 @@
"new-recipe-names-must-be-unique": "Novos nomes de receitas devem ser únicos",
"scrape-recipe": "Extrair receita do site",
"scrape-recipe-description": "Scrape uma receita por url. Forneça o Url para o site que você deseja scrape, e Mealie tentará raspar a receita desse site e adicioná-la à sua coleção.",
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
"scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas a extrair de uma vez?",
"scrape-recipe-suggest-bulk-importer": "Tente o importador em massa",
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
"stay-in-edit-mode": "Permanecer no modo de edição",
"import-from-zip": "Importar do .zip",
@@ -577,6 +583,8 @@
"report-deletion-failed": "Relatório de exclusão falhou",
"recipe-debugger": "Depurador de Receita",
"recipe-debugger-description": "Pegue a URL da receita que deseja depurar e cole aqui. A URL será encontrada pelo scraper das receitas e os resultados serão exibidos. Se não ver nenhum dado retornado, o site que você está tentando criar um scrape não é suportado pelo Mealie ou pela sua biblioteca de scraper.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Depurar",
"tree-view": "Visualização em árvore",
"recipe-yield": "Rendimento da Receita",
@@ -584,22 +592,22 @@
"upload-image": "Enviar imagem",
"screen-awake": "Manter a tela ligada",
"remove-image": "Remover imagem",
"nextStep": "Next step",
"recipe-actions": "Recipe Actions",
"nextStep": "Próximo passo",
"recipe-actions": "Ações de Receita",
"parser": {
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
"ingredient-parser": "Ingredient Parser",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"no-food": "No Food"
"experimental-alert-text": "Mealie usa processamento de linguagem natural para analisar e criar unidades e itens de comida para seus ingredientes. Esse recurso é experimental e pode não funcionar como esperado. Se preferir não usar os resultados analisados, selecione \"Cancelar\" e suas mudanças não serão salvas.",
"ingredient-parser": "Analisador de Ingredientes",
"explanation": "Para usar o analisador de ingredientes, clique no botão \"Analisar Tudo\" para iniciar o processo. Assim que os ingredientes processados estiverem disponíveis, você pode revisá-los e verificar se foram analisados corretamente. A pontuação de confiança do modelo estará à direita do título do item. Essa pontuação é uma média de todas as pontuações individuais e podem não ser precisas.",
"alerts-explainer": "Avisos serão exibidos se uma comida, ou unidade, for encontrada, mas não existir no banco de dados.",
"select-parser": "Selecione um Analisador",
"natural-language-processor": "Processador de Linguagem Natural",
"brute-parser": "Analisador Bruto",
"openai-parser": "Analisador OpenAI",
"parse-all": "Analisar Tudo",
"no-unit": "Sem unidades",
"missing-unit": "Criar unidade ausente: {unit}",
"missing-food": "Criar comida ausente: {food}",
"no-food": "Sem Comida"
}
},
"search": {
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup criado em {path}",
"backup-deleted": "Backup excluído",
"restore-success": "Restauração bem-sucedida",
"restore-fail": "Restauração falhou. Mais detalhes nos registros do servidor",
"backup-tag": "Etiqueta de Backup",
"create-heading": "Criar um Backup",
"delete-backup": "Excluir Backup",
@@ -637,7 +646,7 @@
"import-summary": "Resumo da importação",
"partial-backup": "Backup parcial",
"unable-to-delete-backup": "Não foi possível apagar o backup.",
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
"experimental-description": "Cópias de segurança são \"retratos\" do banco de dados e diretórios de dados do site. Isso inclui todos os dados e não pode segregar subconjuntos de dados. Pense como um retrato do Mealie num momento específico. Elas servem como uma forma agnóstica de exportar e importar dados, ou copiar o site para um local externo.",
"backup-restore": "Restauração de Backup",
"back-restore-description": "Restaurar este backup substituirá todos os dados atuais no seu banco de dados e no diretório de dados e os substituirá pelo conteúdo deste backup. {cannot-be-undone} Se a restauração for bem-sucedida, você será desconectado.",
"cannot-be-undone": "Esta ação não pode ser desfeita - use com cautela.",
@@ -763,12 +772,12 @@
"ldap-ready-success-text": "As variáveis LDAP necessárias estão todas definidas.",
"build": "Compilaçāo",
"recipe-scraper-version": "Versão do receptor de receita",
"oidc-ready": "OIDC Ready",
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
"oidc-ready-success-text": "Required OIDC variables are all set.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"oidc-ready": "OIDC Pronto",
"oidc-ready-error-text": "Nem todos os valores OIDC estão configurados. Pode ser ignorado se não estiver usando Autenticação OIDC.",
"oidc-ready-success-text": "Variáveis OIDC necessárias estão todas definidas.",
"openai-ready": "OpenAI Pronta",
"openai-ready-error-text": "Nem todos os valores da OpenAI estão configurados. Pode ser ignorado se não estiver usando recursos OpenAI.",
"openai-ready-success-text": "Variáveis OpenAI necessárias estão todas definidas."
},
"shopping-list": {
"all-lists": "Todas as Listas",
@@ -782,7 +791,7 @@
"food": "Comida",
"note": "Nota",
"label": "Marcador",
"save-label": "Save Label",
"save-label": "Salvar Rótulo",
"linked-item-warning": "Este item está vinculado a uma ou mais receitas. Ajustar as unidades ou alimentos produzirá resultados inesperados ao adicionar ou remover a receita desta lista.",
"toggle-food": "Mostrar nome da Comida",
"manage-labels": "Gerenciar marcadores",
@@ -842,7 +851,7 @@
"untagged-count": "{count} sem marcador",
"create-a-tag": "Criar um marcador",
"tag-name": "Nome do Marcador",
"tag": "Tag"
"tag": "Etiqueta"
},
"tool": {
"tools": "Ferramentas",
@@ -852,7 +861,7 @@
"create-new-tool": "Criar Ferramenta",
"on-hand-checkbox-label": "Mostrar como disponível (checado)",
"required-tools": "Ferramentas necessárias",
"tool": "Tool"
"tool": "Utensílio"
},
"user": {
"admin": "Administrador",
@@ -877,11 +886,11 @@
"link-id": "ID do Link",
"link-name": "Nome do link",
"login": "Entrar",
"login-oidc": "Login with",
"or": "or",
"login-oidc": "Entrar com",
"or": "ou",
"logout": "Sair",
"manage-users": "Gerenciar Usuários",
"manage-users-description": "Create and manage users.",
"manage-users-description": "Criar e gerir usuários.",
"new-password": "Nova senha",
"new-user": "Novo Usuário",
"password-has-been-reset-to-the-default-password": "A senha foi redefinida para a senha padrão",
@@ -1024,10 +1033,10 @@
"source-unit-will-be-deleted": "Unidade de origem será excluída"
},
"recipe-actions": {
"recipe-actions-data": "Recipe Actions Data",
"new-recipe-action": "New Recipe Action",
"edit-recipe-action": "Edit Recipe Action",
"action-type": "Action Type"
"recipe-actions-data": "Dados de Ações de Receita",
"new-recipe-action": "Nova Ação de Receita",
"edit-recipe-action": "Alterar Ação de Receita",
"action-type": "Tipo de Ação"
},
"create-alias": "Criar Apelido",
"manage-aliases": "Gerenciar apelidos",
@@ -1186,32 +1195,32 @@
"no-logs-found": "Nenhum log encontrado",
"tasks": "Tarefas",
"setup": {
"first-time-setup": "First Time Setup",
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
"common-settings-for-new-sites": "Here are some common settings for new sites",
"setup-complete": "Setup Complete!",
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
"first-time-setup": "Primeira Configuração",
"welcome-to-mealie-get-started": "Bem-vindo(a) ao Mealie! Vamos começar",
"already-set-up-bring-to-homepage": "Já estou pronto, apenas me leve à página inicial",
"common-settings-for-new-sites": "Estas são algumas configurações comuns para novos sites",
"setup-complete": "Configuração Concluída!",
"here-are-a-few-things-to-help-you-get-started": "Aqui há algumas coisas para ajudá-lo a começar com o Mealie",
"restore-from-v1-backup": "Tem uma cópia de segurança de uma instância anterior do Mealie v1? Você pode restaurá-la aqui.",
"manage-profile-or-get-invite-link": "Gerencie seu próprio perfil, ou pegue um link de convite para compartilhar."
}
},
"profile": {
"welcome-user": "👋 Welcome, {0}!",
"welcome-user": "👋 Bem-vindo(a), {0}!",
"description": "Gerencie seu perfil, receitas e configurações de grupo.",
"get-invite-link": "Obter link de convite",
"get-public-link": "Obter link público",
"account-summary": "Resumo da conta",
"account-summary-description": "Here's a summary of your group's information.",
"account-summary-description": "Aqui está um resumo das informações do seu grupo.",
"group-statistics": "Estatísticas do Grupo",
"group-statistics-description": "Suas Estatísticas em Grupo fornecem algumas informações sobre como você está usando o Mealie.",
"storage-capacity": "Capacidade de armazenamento",
"storage-capacity-description": "Sua capacidade de armazenamento é um cálculo das imagens e arquivos que você carregou.",
"personal": "Pessoal",
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
"personal-description": "Estas configurações são pessoais. Mudanças aqui não afetarão outros usuários.",
"user-settings": "Configurações de Usuário",
"user-settings-description": "Manage your preferences, change your password, and update your email.",
"api-tokens-description": "Manage your API Tokens for access from external applications.",
"user-settings-description": "Gerencie suas preferências, altere sua senha, e atualize seu e-mail.",
"api-tokens-description": "Gerencie seus Tokens de API para acessar de aplicações externas.",
"group-description": "Esses itens são compartilhados dentro do seu grupo. Ao editar um deles vai mudá-lo para todo o grupo!",
"group-settings": "Configurações do Grupo",
"group-settings-description": "Gerencie suas configurações comuns de grupo como a refeição e as configurações de privacidade.",
@@ -1222,9 +1231,9 @@
"notifiers": "Notificadores",
"notifiers-description": "Configure e-mails e notificações push que desencadeiam eventos específicos.",
"manage-data": "Gerenciar dados",
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
"manage-data-description": "Gerencie seus dados do Mealie; Comidas, Unidades, Categorias, Tags e mais.",
"data-migrations": "Migrações de dados",
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
"data-migrations-description": "Migre seus dados existentes de outras aplicações, como Nextcloud Recipes e Chowdown.",
"email-sent": "E-mail enviado",
"error-sending-email": "Erro enviando email",
"personal-information": "Informações pessoais",
@@ -1252,7 +1261,7 @@
"require-all-tools": "Exigir todas as ferramentas",
"cookbook-name": "Nome do Livro de Receitas",
"cookbook-with-name": "Livro de Receitas {0}",
"create-a-cookbook": "Create a Cookbook",
"cookbook": "Cookbook"
"create-a-cookbook": "Criar um Livro de Receitas",
"cookbook": "Livro de Receitas"
}
}

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Plano de Refeições atualizado",
"no-meal-plan-defined-yet": "Nenhum plano de refeições definido",
"no-meal-planned-for-today": "Nenhum plano de refeições definido para hoje",
"numberOfDays-hint": "Número de dias no carregamento da página",
"numberOfDays-label": "Dias predefinidos",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Só serão usadas receitas com estas categorias nos Planos de Refeições",
"planner": "Planeador",
"quick-week": "Semana Rápida",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "O Mealie pode importar receitas do My Recipe Box. Exporte as suas receitas em formato CSV e, em seguida, carregue o ficheiro .csv abaixo."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "O Mealie pode importar receitas do Recipe Keeper. Exporte as suas receitas em formato zip e, em seguida, carregue o ficheiro .zip abaixo."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Erro ao eliminar relatório",
"recipe-debugger": "Depurador de Receitas",
"recipe-debugger-description": "Copie o URL da receita que quer depurar e cole-o aqui. O URL será lido pelo leitor de receitas e os resultados serão apresentados. Se nenhuma informação for devolvida, a página que está a tentar ler não é suportada pelo Mealie ou pela sua biblioteca de 'scrapping'.",
"use-openai": "Utilizar OpenAI",
"recipe-debugger-use-openai-description": "Utilize o OpenAI para analisar os resultados em vez de depender da biblioteca de scrapers. Ao criar uma receita através de um URL, isto é feito automaticamente se a biblioteca de scrapers falhar, mas pode testá-la manualmente aqui.",
"debug": "Depurar",
"tree-view": "Vista em árvore",
"recipe-yield": "Rendimento da receita",
@@ -587,19 +595,19 @@
"nextStep": "Próximo passo",
"recipe-actions": "Ações da Receita",
"parser": {
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
"ingredient-parser": "Ingredient Parser",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"no-food": "No Food"
"experimental-alert-text": "O Mealie utiliza o processamento de linguagem natural para analisar e criar unidades e itens alimentares para os ingredientes da sua receita. Esta funcionalidade é experimental e pode nem sempre funcionar como esperado. Se preferir não utilizar os resultados analisados, pode selecionar “Cancelar” e as suas alterações não serão guardadas.",
"ingredient-parser": "Analisador de ingredientes",
"explanation": "Para utilizar o analisador de ingredientes, clique no botão “Analisar tudo” para iniciar o processo. Quando os ingredientes processados estiverem disponíveis, pode rever os itens e verificar se foram analisados corretamente. A pontuação de confiança do modelo é apresentada à direita do título do item. Esta pontuação é uma média de todas as pontuações individuais e pode nem sempre ser completamente exata.",
"alerts-explainer": "Serão apresentados alertas se for encontrado um alimento ou unidade correspondente, mas que não exista na base de dados.",
"select-parser": "Selecionar Analisador",
"natural-language-processor": "Processador de Linguagem Natural",
"brute-parser": "Analisador Bruto",
"openai-parser": "Analisador OpenAI",
"parse-all": "Analisar tudo",
"no-unit": "Nenhuma unidade",
"missing-unit": "Criar unidade em falta: {unit}",
"missing-food": "Criar ingrediente em falta: {food}",
"no-food": "Nenhum Ingrediente"
}
},
"search": {
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup criado em {path}",
"backup-deleted": "Backup eliminado",
"restore-success": "Restauro bem-sucedido",
"restore-fail": "O restauro falhou. Verifique os registos do servidor para obter mais detalhes",
"backup-tag": "Cópia de segurança de Etiqueta",
"create-heading": "Criar um Backup",
"delete-backup": "Eliminar Backup",
@@ -766,9 +775,9 @@
"oidc-ready": "Suporta OICD",
"oidc-ready-error-text": "Nem todos os valores OICD estão configurados. Pode ignorar isto se não estiver a utilizar autenticação OICD.",
"oidc-ready-success-text": "As variáveis OICD necessárias estão definidas.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "Preparado para OpenAI",
"openai-ready-error-text": "Nem todos os valores OpenAI estão configurados. Isto pode ser ignorado se não estiver a utilizar as funcionalidades OpenAI.",
"openai-ready-success-text": "As variáveis OpenAI necessárias estão todas definidas."
},
"shopping-list": {
"all-lists": "Todas as Listas",
@@ -782,7 +791,7 @@
"food": "Alimentos",
"note": "Nota",
"label": "Rótulo",
"save-label": "Save Label",
"save-label": "Guardar Rótulo",
"linked-item-warning": "Este item tem ligação a uma ou mais receitas. Ajustar as unidades ou alimentos irá produzir resultados inesperados quando adicionar ou remover a receita desta lista.",
"toggle-food": "Alternar Alimento",
"manage-labels": "Gerir Rótulos",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Plan de mese actualizat",
"no-meal-plan-defined-yet": "Nici un plan de mese definit încă",
"no-meal-planned-for-today": "Nicio masă planificată pentru astăzi",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Numai rețetele cu aceste categorii vor fi utilizate în Planurile de mese",
"planner": "Planificator",
"quick-week": "Săptămână rapidă",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Cutia mea de rețete",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Ștergerea raportului a eșuat",
"recipe-debugger": "Depanare rețetă",
"recipe-debugger-description": "Copiază URL-ul rețetei pe care vrei să o depanezi și lipește-l aici. URL-ul va fi importat și rezultatele vor fi afișate ulterior. Dacă nu vedeți date returnate, site-ul pe care încerci să îl procesezi nu este suportat de Mealie sau biblioteca sa de import.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Depanare",
"tree-view": "Vizualizare Ierarhică",
"recipe-yield": "Producere rețetă",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup creat la {path}",
"backup-deleted": "Backup şters",
"restore-success": "Restaurare efectuată",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup la Tag-uri",
"create-heading": "Create a Backup",
"delete-backup": "Șterge Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "План питания обновлен",
"no-meal-plan-defined-yet": "План питания еще не определен",
"no-meal-planned-for-today": "На сегодня нет запланированных блюд",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Только рецепты с этими категориями будут использоваться в планах питания",
"planner": "Планировщик",
"quick-week": "Быстрый план",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Не удалось удалить отчёт",
"recipe-debugger": "Отладчик рецептов",
"recipe-debugger-description": "Вставьте сюда URL рецепта, который вы хотите отладить. Рецепт по указанному URL-адресу будет отсканирован и результаты сканирования будут указаны ниже. Если вы не видите никаких возвращенных данных, то сайт, который вы пытаетесь обработать, не поддерживается Mealie или библиотекой сканера.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Отладка",
"tree-view": "В виде дерева",
"recipe-yield": "Количество порций",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Резервная копия создана в {path}",
"backup-deleted": "Резервная копия удалена",
"restore-success": "Восстановление прошло успешно",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Тег резервной копии",
"create-heading": "Создать резервную копию",
"delete-backup": "Удалить резервную копию",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Jedálniček aktualizovaný",
"no-meal-plan-defined-yet": "Nebol vytvorený žiadny jedálniček",
"no-meal-planned-for-today": "Pre dnešok žiadne jedlo v jedálničku",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "V jedálničkoch budú použité iba recepty z nasledovných kategórií",
"planner": "Plánovač",
"quick-week": "Rýchly návrh týždňa",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Vymazanie reportov zlyhalo",
"recipe-debugger": "Debugger receptov",
"recipe-debugger-description": "Vezmite URL odkaz receptu, ktorý chcete opraviť a vložte ju sem. Recept bude stiahnutý z URL odkazu pomocou scrapera receptov a zobrazí sa výsledok sťahovania. V prípade, ak nevidíte žiadne zobrazené dáta, stránka z URL odkazu nie je podporovaná Mealie alebo jej scrapovacou knižnicou.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debugovať",
"tree-view": "Stromový pohľad",
"recipe-yield": "Počet porcií",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Záloha vytvorená v {path}",
"backup-deleted": "Záloha bola odstránená",
"restore-success": "Obnovenie bolo úspešné",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Označenie zálohy",
"create-heading": "Vytvoriť zálohu",
"delete-backup": "Odstrániť zálohu",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Jedilnik je posodobljen",
"no-meal-plan-defined-yet": "Za danes ni definiranjega načrta obroka",
"no-meal-planned-for-today": "Za danes ni planiranega načrta obroka",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Samo recepti v teh kategorija bodo uporabljeni v načrtu obroka",
"planner": "Načrtovalec",
"quick-week": "Hiter pogled tedna",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie lahko uvozi recepte iz aplikacije My Recipe Box. Izvozi recepte v CSV formatu, nato pa .csv datoteko naloži spodaj."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Brisanje poročila ni bilo uspešno",
"recipe-debugger": "Odpravljanje težav v strganju recepta",
"recipe-debugger-description": "Prilepi povezavo do recepta, ki ga želiš postrgati. Strgalnik receptov bo postrgal spletno stran in prikazal rezultate. Če ne vidiš nobenih podatkov, potem spletna stran, ki jo želiš strgati ni podprta v Mealie oz. v strgalniku, ki ga uporablja.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Drevesni prikaz",
"recipe-yield": "Število porcij",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Varnostna kopija ustvarjena v {path}",
"backup-deleted": "Varnostna kopija je izbrisana",
"restore-success": "Obnovitev uspešna",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Oznaka varnostne kopije",
"create-heading": "Izdelaj varnostno kopijo",
"delete-backup": "Izbriši varnostno kopijo",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Јеловник је ажуриран",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Само рецепти са овим категоријама ће бити коришћени у јеловницима",
"planner": "Планер",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Резервна копија је креирана на {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",

View File

@@ -86,7 +86,7 @@
"clear": "Rensa",
"close": "Stäng",
"confirm": "Bekräfta",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Hur ser det ut?",
"confirm-delete-generic": "Är du säker på att du vill radera detta?",
"copied_message": "Kopierad!",
"create": "Skapa",
@@ -291,6 +291,8 @@
"mealplan-updated": "Måltidsplan uppdaterad",
"no-meal-plan-defined-yet": "Ingen måltidsplan definierad ännu",
"no-meal-planned-for-today": "Ingen måltidsplan för idag",
"numberOfDays-hint": "Antal dagar vid sidhämtning",
"numberOfDays-label": "Förvalda dagar",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Endast recept med dessa kategorier kommer att användas i måltidsplaner",
"planner": "Planeringkalender",
"quick-week": "Snabb vecka",
@@ -365,7 +367,7 @@
"choose-migration-type": "Välj migrationstyp",
"tag-all-recipes": "Tagga alla recept med {tag-name} tagg",
"nextcloud-text": "Nextcloud-recept kan importeras från en zip-fil som innehåller data som lagras i Nextcloud. Se exempelmappens struktur nedan för att säkerställa att dina recept kan importeras.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
"chowdown-text": "Mealie har inbyggt stöd för chowdowns repository-format. Ladda ner kodförrådet som en .zip-fil och ladda upp det nedan.",
"recipe-1": "Recept 1",
"recipe-2": "Recept 2",
"paprika-text": "Mealie kan importera recept från Paprika-applikationen. Exportera dina recept från Paprika, byt namn på filnamnstillägget på exporten till .zip och ladda upp det nedan.",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Min receptlåda",
"description-long": "Mealie kan importera recept från appen 'My Recipe Box'. Exportera dina recept i CSV format, och sen ladda upp .csv filen nedan."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie kan importera recept från Recept Keeper. Exportera dina recept i zip-format, ladda sedan upp .zip-filen här under."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Rapporten gick inte att radera",
"recipe-debugger": "Receptfelsökning",
"recipe-debugger-description": "Ta tag i URL: en till det recept du vill felsöka och klistra in det här. URL-adressen kommer att skrapas av receptskrapan och resultaten kommer att visas. Om du inte ser några data returnerade, stödjs inte webbplatsen du försöker skrapa av Mealie eller dess skrapbibliotek.",
"use-openai": "Använd OpenAI",
"recipe-debugger-use-openai-description": "Använd OpenAI för att tolka resultaten istället för att förlita sig på skrapans bibliotek. När du skapar ett recept via URL görs detta automatiskt om skrapbiblioteket misslyckas, men du kan testa det manuellt här.",
"debug": "Felsök",
"tree-view": "Trädvy",
"recipe-yield": "Receptutfall",
@@ -585,7 +593,7 @@
"screen-awake": "Håll skärmen vaken",
"remove-image": "Ta bort bild",
"nextStep": "Nästa steg",
"recipe-actions": "Recipe Actions",
"recipe-actions": "Recept åtgärder",
"parser": {
"experimental-alert-text": "Mealie använder naturligt språk för att tolka enheter och livsmedel som behövs för dina recept. Denna funktion är experimentell och kanske inte alltid funkar som förväntat. Om du föredrar att inte använda de tolkade resultatet, kan du välja 'Avbryt' och förändringarna kommer då inte sparas.",
"ingredient-parser": "Ingrediensanalysator",
@@ -599,7 +607,7 @@
"no-unit": "Ingen enhet",
"missing-unit": "Skapa saknad enhet: {unit}",
"missing-food": "Skapa saknad ingrediens: {food}",
"no-food": "No Food"
"no-food": "Ingen mat"
}
},
"search": {
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup skapad {path}",
"backup-deleted": "Backup raderad",
"restore-success": "Återställning slutförd",
"restore-fail": "Återställning misslyckades. Kontrollera dina serverloggar för mer information",
"backup-tag": "Backup tagg",
"create-heading": "Skapa en säkerhetskopia",
"delete-backup": "Ta bort säkerhetskopian",
@@ -766,9 +775,9 @@
"oidc-ready": "OIDC Klar",
"oidc-ready-error-text": "Alla OIDC-värden är inte konfigurerade. Detta kan ignoreras om du inte använder OIDC-autentisering.",
"oidc-ready-success-text": "Alla obligatoriska OIDC-variabler är satta.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "OpenAI redo",
"openai-ready-error-text": "Alla OpenAI-värden är inte konfigurerade. Detta kan ignoreras om du inte använder OpenAI-funktioner.",
"openai-ready-success-text": "Alla obligatoriska OpenAI-variabler är satta."
},
"shopping-list": {
"all-lists": "Visa alla listor",
@@ -782,7 +791,7 @@
"food": "Mat",
"note": "Anteckning",
"label": "Etikett",
"save-label": "Save Label",
"save-label": "Spara etikett",
"linked-item-warning": "Denna artikel är länkad till ett eller flera recept. Justering av enheter eller livsmedel ger oväntade resultat när du lägger till eller tar bort receptet från denna lista.",
"toggle-food": "Växla mat",
"manage-labels": "Hantera etiketter",
@@ -1024,10 +1033,10 @@
"source-unit-will-be-deleted": "Källenheten kommer att raderas"
},
"recipe-actions": {
"recipe-actions-data": "Recipe Actions Data",
"new-recipe-action": "New Recipe Action",
"edit-recipe-action": "Edit Recipe Action",
"action-type": "Action Type"
"recipe-actions-data": "Data för receptåtgärder",
"new-recipe-action": "Ny receptåtgärd",
"edit-recipe-action": "Redigera receptåtgärd",
"action-type": "Åtgärdstyp"
},
"create-alias": "Skapa alias",
"manage-aliases": "Hantera alias",
@@ -1186,14 +1195,14 @@
"no-logs-found": "Inga loggar hittade",
"tasks": "Uppgifter",
"setup": {
"first-time-setup": "First Time Setup",
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
"common-settings-for-new-sites": "Here are some common settings for new sites",
"setup-complete": "Setup Complete!",
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
"first-time-setup": "Första installationen",
"welcome-to-mealie-get-started": "Välkommen till Mealie! Låt oss komma igång",
"already-set-up-bring-to-homepage": "Jag har redan gjort inställningarna, ta mig bara till hemsidan",
"common-settings-for-new-sites": "Här är några vanliga inställningar för nya webbplatser",
"setup-complete": "Konfigurationen slutförd!",
"here-are-a-few-things-to-help-you-get-started": "Här är några saker som hjälper dig att komma igång med Mealie",
"restore-from-v1-backup": "Har du en säkerhetskopia från en tidigare instans av Mealie v1? Du kan återställa den här.",
"manage-profile-or-get-invite-link": "Hantera din egen profil eller hämta en inbjudningslänk för att dela med andra."
}
},
"profile": {
@@ -1202,16 +1211,16 @@
"get-invite-link": "Få inbjudningslänk",
"get-public-link": "Få offentlig länk",
"account-summary": "Kontosammanfattning",
"account-summary-description": "Here's a summary of your group's information.",
"account-summary-description": "Här är en sammanfattning av din grupps information.",
"group-statistics": "Gruppstatistik",
"group-statistics-description": "Din gruppstatistik ger dig en inblick i hur du använder Mealie.",
"storage-capacity": "Lagringskapacitet",
"storage-capacity-description": "Din lagringskapacitet är en beräkning av de bilder och tillgångar du har laddat upp.",
"personal": "Personligt",
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
"personal-description": "Det här är inställningar som är personliga för dig. Ändringar här påverkar inte andra användare.",
"user-settings": "Användarinställningar",
"user-settings-description": "Manage your preferences, change your password, and update your email.",
"api-tokens-description": "Manage your API Tokens for access from external applications.",
"user-settings-description": "Hantera dina inställningar, ändra ditt lösenord och uppdatera din e-post.",
"api-tokens-description": "Hantera dina API-Tokens för åtkomst från externa program.",
"group-description": "Dessa objekt delas inom din grupp. Att redigera en av dem kommer att ändra den för hela gruppen!",
"group-settings": "Gruppinställningar",
"group-settings-description": "Hantera dina gemensamma gruppinställningar som måltidsplan och sekretessinställningar.",
@@ -1222,9 +1231,9 @@
"notifiers": "Notifierare",
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
"manage-data": "Hantera data",
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
"manage-data-description": "Hantera din Mealie data; Livsmedel, Enheter, Kategorier, Taggar och mer.",
"data-migrations": "Data migreringar",
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
"data-migrations-description": "Migrera befintliga data från andra program som Nextcloud Recipes och Chowdown.",
"email-sent": "E-post skickades",
"error-sending-email": "Fel vid sändning av e-post",
"personal-information": "Personlig information",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Öğün planı güncellendi",
"no-meal-plan-defined-yet": "Henüz bir öğün planı tanımlanmadı",
"no-meal-planned-for-today": "Bugün için öğün planı tanımlanmadı",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Sadece bu kategorilerdeki tarifler öğün planlarında kullanılacak",
"planner": "Planlayıcı",
"quick-week": "Hızlı Hafta",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "Tarife Kutum",
"description-long": "Mealie Tarife Kutum'dan tarifleri içe aktarabilir. Tariflerinizi CSV formatında dışa aktarın, ardından .csv dosyasını aşağıya yükleyin."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Hata ayıklama",
"tree-view": "Ağaç Görünümü",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Yedekleme silindi",
"restore-success": "Geri yükleme başarılı",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Yedek Etiketi",
"create-heading": "Create a Backup",
"delete-backup": "Yedeği Sil",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "План харчування оновлено",
"no-meal-plan-defined-yet": "Не створено жодного плану харчування",
"no-meal-planned-for-today": "Не заплановано харчування на сьогодні",
"numberOfDays-hint": "Скільки днів завантажувати на сторінку",
"numberOfDays-label": "Дні за замовчуванням",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Лише рецепти з цими категоріями будуть використані в планах харчування",
"planner": "Планувальник",
"quick-week": "Швидкий тиждень",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie може імпортувати рецепти з My Recipe Box. Експортуйте ваші рецепти в форматі CSV, а потім відвантажте .csv файл нижче."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie може імпортувати рецепти з Recipe Keeper. Експортувати ваші рецепти у форматі zip, а потім відвантажте файл .zip нижче."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Не вдалося видалити звіт",
"recipe-debugger": "Дебаггер рецептів",
"recipe-debugger-description": "Вставте URL-адресу рецепта, який ви хочете дебажити сюди. URL буде розпарсено парсером рецептів й результати будуть відображені. Якщо ви не бачите жодних даних - значить Mealie або парсер рецептів не підтримує сайт який ви намагаєтеся використати.",
"use-openai": "Використовувати OpenAI",
"recipe-debugger-use-openai-description": "Використовуйте OpenAI для аналізу результатів замість використання бібліотеки парсера. Під час створення рецепта через URL це робиться автоматично, якщо бібліотека парсера не впоралася, але ви можете перевірити це тут вручну.",
"debug": "Дебажити",
"tree-view": "У вигляді дерева",
"recipe-yield": "Вихід рецепту",
@@ -594,7 +602,7 @@
"select-parser": "Вибрати аналізатор",
"natural-language-processor": "Аналізатор природної мови",
"brute-parser": "Простий аналізатор",
"openai-parser": "OpenAI Parser",
"openai-parser": "OpenAI аналізатор",
"parse-all": "Аналізувати все",
"no-unit": "Без одиниці",
"missing-unit": "Створити відсутню одиниці: {unit}",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Резервна копія створена {path}",
"backup-deleted": "Резервна копія видалена",
"restore-success": "Відновлення успішне",
"restore-fail": "Не вдалося відновити. Перевірте журнали вашого сервера для більш докладної інформації",
"backup-tag": "Мітка резервної копії",
"create-heading": "Створити резервну копію",
"delete-backup": "Видалити резервну копію",
@@ -766,9 +775,9 @@
"oidc-ready": "OIDC готово",
"oidc-ready-error-text": "Не всі значення OIDC налаштовано. Це можна ігнорувати, якщо ви не використовуєте авторизацію OIDC.",
"oidc-ready-success-text": "Всі необхідні змінні OIDC встановлені.",
"openai-ready": "OpenAI Ready",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
"openai-ready": "OpenAI готовий",
"openai-ready-error-text": "Не всі значення OpenAI налаштовано. Це можна ігнорувати, якщо ви не використовуєте функції OpenAI.",
"openai-ready-success-text": "Всі необхідні змінні OpenAI встановлені."
},
"shopping-list": {
"all-lists": "Всі списки",
@@ -782,7 +791,7 @@
"food": "Продукт",
"note": "Нотатка",
"label": "Етикетка",
"save-label": "Save Label",
"save-label": "Зберегти мітку",
"linked-item-warning": "Цей предмет зв'язано з одним або більше рецептами. Зміна одиниць виміру або продуктів дасть неочікувані результати при додаванні або видаленні рецепту з цього списку.",
"toggle-food": "Перемкнути продукт",
"manage-labels": "Керування етикетками",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "Mealplan Updated",
"no-meal-plan-defined-yet": "No meal plan defined yet",
"no-meal-planned-for-today": "No meal planned for today",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
"planner": "Planner",
"quick-week": "Quick Week",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "Backup Created at {path}",
"backup-deleted": "Backup deleted",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"delete-backup": "Delete Backup",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "已更新饮食计划",
"no-meal-plan-defined-yet": "还没有制定饮食计划",
"no-meal-planned-for-today": "今日没有饮食计划",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "只有属于这些分类的食谱才会被用于饮食计划",
"planner": "计划人",
"quick-week": "快速创建周食谱计划",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie可以从“My Recipe Box\"导入食谱。把你的食谱导出为CSV模式然后在下面上传.csv文件。"
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "删除报告失败",
"recipe-debugger": "食谱调试器",
"recipe-debugger-description": "抓取你想要的食谱的URL并粘贴在此。食谱刮削器将尝试刮削该URL并显示结果。如果你没看到任何返回数据则说明对应的网站不支持Mealie或它的刮削库。",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "调试",
"tree-view": "树状图",
"recipe-yield": "食谱菜量",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "备份创建于 {path}",
"backup-deleted": "备份已删除",
"restore-success": "还原成功",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "标签备份",
"create-heading": "创建备份",
"delete-backup": "删除备份",

View File

@@ -291,6 +291,8 @@
"mealplan-updated": "用餐計劃已更新",
"no-meal-plan-defined-yet": "目前無用餐計畫",
"no-meal-planned-for-today": "本日無用餐計畫",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "只有屬於這些類別的食譜會被用於用餐計畫",
"planner": "規劃師",
"quick-week": "快速規劃",
@@ -377,6 +379,10 @@
"myrecipebox": {
"title": "My Recipe Box",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
},
"recipekeeper": {
"title": "Recipe Keeper",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
}
},
"new-recipe": {
@@ -577,6 +583,8 @@
"report-deletion-failed": "Report deletion failed",
"recipe-debugger": "Recipe Debugger",
"recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.",
"use-openai": "Use OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Tree View",
"recipe-yield": "Recipe Yield",
@@ -629,6 +637,7 @@
"backup-created-at-response-export_path": "已備份於:{path}",
"backup-deleted": "備份已刪除",
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "備份標籤",
"create-heading": "創建備份",
"delete-backup": "刪除備份",

View File

@@ -16,7 +16,8 @@ export type SupportedMigrations =
| "paprika"
| "mealie_alpha"
| "tandoor"
| "plantoeat";
| "plantoeat"
| "recipekeeper";
export interface CreateGroupPreferences {
privateGroup?: boolean;

View File

@@ -128,8 +128,8 @@ export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> {
return this.requests.post<UpdateImageResponse>(routes.recipesRecipeSlugImage(slug), { url });
}
async testCreateOneUrl(url: string) {
return await this.requests.post<Recipe | null>(routes.recipesTestScrapeUrl, { url });
async testCreateOneUrl(url: string, useOpenAI = false) {
return await this.requests.post<Recipe | null>(routes.recipesTestScrapeUrl, { url, useOpenAI });
}
async createOneByUrl(url: string, includeTags: boolean) {

View File

@@ -401,12 +401,24 @@ export default {
"short_name": "Shopping Lists",
"description": "Open the shopping lists",
"url": "/shopping-lists",
"icons": [
{
"src": "/svgs/mdiFormatListChecks.svg",
"sizes": "256x256",
}
]
},
{
"name": "Meal Planner",
"short_name": "Meal Planner",
"description": "Open the meal planner",
"url": "/group/mealplan/planner/view",
"icons": [
{
"src": "/svgs/mdiCalendarMultiselect.svg",
"sizes": "256x256",
}
]
},
],
},

View File

@@ -162,6 +162,8 @@ export default defineComponent({
if (error) {
console.log(error);
state.importDialog = false;
state.runningRestore = false;
alert.error(i18n.tc("settings.backup.restore-fail"));
} else {
alert.success(i18n.tc("settings.backup.restore-success"));
$auth.logout();

View File

@@ -18,7 +18,11 @@
:rules="[validators.url]"
:hint="$t('new-recipe.url-form-hint')"
persistent-hint
></v-text-field>
/>
</v-card-text>
<v-card-text v-if="appInfo && appInfo.enableOpenai">
{{ $t('recipe.recipe-debugger-use-openai-description') }}
<v-checkbox v-model="useOpenAI" :label="$t('recipe.use-openai')"></v-checkbox>
</v-card-text>
<v-card-actions class="justify-center">
<div style="width: 250px">
@@ -51,7 +55,7 @@
<script lang="ts">
import { defineComponent, reactive, toRefs, ref, useRouter, computed, useRoute } from "@nuxtjs/composition-api";
import { useUserApi } from "~/composables/api";
import { useAppInfo, useUserApi } from "~/composables/api";
import { validators } from "~/composables/use-validators";
import { Recipe } from "~/lib/api/types/recipe";
@@ -60,11 +64,13 @@ export default defineComponent({
const state = reactive({
error: false,
loading: false,
useOpenAI: false,
});
const api = useUserApi();
const route = useRoute();
const router = useRouter();
const appInfo = useAppInfo();
const recipeUrl = computed({
set(recipe_import_url: string | null) {
@@ -89,13 +95,14 @@ export default defineComponent({
state.loading = true;
const { data } = await api.recipes.testCreateOneUrl(url);
const { data } = await api.recipes.testCreateOneUrl(url, state.useOpenAI);
state.loading = false;
debugData.value = data;
}
return {
appInfo,
recipeUrl,
debugTreeView,
debugUrl,

View File

@@ -54,44 +54,44 @@ export default defineComponent({
const DATA_TYPE_OPTIONS = computed(() => [
{
text: i18n.t("general.recipes"),
text: i18n.tc("general.recipes"),
value: "new",
to: "/group/data/recipes",
},
{
text: i18n.t("recipe.recipe-actions"),
text: i18n.tc("recipe.recipe-actions"),
value: "new",
to: "/group/data/recipe-actions",
divider: true,
},
{
text: i18n.t("general.foods"),
text: i18n.tc("general.foods"),
value: "url",
to: "/group/data/foods",
},
{
text: i18n.t("general.units"),
text: i18n.tc("general.units"),
value: "new",
to: "/group/data/units",
},
{
text: i18n.t("data-pages.labels.labels"),
text: i18n.tc("data-pages.labels.labels"),
value: "new",
to: "/group/data/labels",
divider: true,
},
{
text: i18n.t("category.categories"),
text: i18n.tc("category.categories"),
value: "new",
to: "/group/data/categories",
},
{
text: i18n.t("tag.tags"),
text: i18n.tc("tag.tags"),
value: "new",
to: "/group/data/tags",
},
{
text: i18n.t("tool.tools"),
text: i18n.tc("tool.tools"),
value: "new",
to: "/group/data/tools",
}

View File

@@ -23,6 +23,13 @@
:first-day-of-week="firstDayOfWeek"
:local="$i18n.locale"
>
<v-text-field
v-model="numberOfDays"
type="number"
:label="$t('meal-plan.numberOfDays-label')"
:hint="$t('meal-plan.numberOfDays-hint')"
persistent-hint
/>
<v-spacer></v-spacer>
<v-btn text color="primary" @click="state.picker = false">
{{ $t("general.ok") }}
@@ -47,10 +54,11 @@
</template>
<script lang="ts">
import { computed, defineComponent, ref, useRoute, useRouter } from "@nuxtjs/composition-api";
import { computed, defineComponent, ref, useRoute, useRouter, watch } from "@nuxtjs/composition-api";
import { isSameDay, addDays, parseISO } from "date-fns";
import { useGroupSelf } from "~/composables/use-groups";
import { useMealplans } from "~/composables/use-group-mealplan";
import { useUserMealPlanPreferences } from "~/composables/use-users/preferences";
export default defineComponent({
middleware: ["auth"],
@@ -59,6 +67,12 @@ export default defineComponent({
const router = useRouter();
const { group } = useGroupSelf();
const mealPlanPreferences = useUserMealPlanPreferences();
const numberOfDays = ref<number>(mealPlanPreferences.value.numberOfDays || 7);
watch(numberOfDays, (val) => {
mealPlanPreferences.value.numberOfDays = Number(val);
});
// Force to /view if current route is /planner
if (route.value.path === "/group/mealplan/planner") {
router.push("/group/mealplan/planner/view");
@@ -74,18 +88,16 @@ export default defineComponent({
}
const state = ref({
range: [fmtYYYYMMDD(new Date()), fmtYYYYMMDD(addDays(new Date(), 6))] as [string, string],
range: [fmtYYYYMMDD(new Date()), fmtYYYYMMDD(addDays(new Date(), adjustForToday(numberOfDays.value)))] as [string, string],
start: new Date(),
picker: false,
end: addDays(new Date(), 6),
end: addDays(new Date(), adjustForToday(numberOfDays.value)),
});
const firstDayOfWeek = computed(() => {
return group.value?.preferences?.firstDayOfWeek || 0;
});
const recipeSearchTerm = ref("");
const weekRange = computed(() => {
const sorted = state.value.range.sort((a, b) => {
return parseYYYYMMDD(a).getTime() - parseYYYYMMDD(b).getTime();
@@ -99,7 +111,7 @@ export default defineComponent({
}
return {
start: new Date(),
end: addDays(new Date(), 6),
end: addDays(new Date(), adjustForToday(numberOfDays.value)),
};
});
@@ -113,6 +125,12 @@ export default defineComponent({
});
}
function adjustForToday(days: number) {
// The use case for this function is "how many days are we adding to 'today'?"
// e.g. If the user wants 7 days, we substract one to do "today + 6"
return days > 0 ? days - 1 : days + 1
}
const days = computed(() => {
const numDays =
Math.floor((weekRange.value.end.getTime() - weekRange.value.start.getTime()) / (1000 * 60 * 60 * 24)) + 1;
@@ -141,7 +159,7 @@ export default defineComponent({
mealsByDate,
weekRange,
firstDayOfWeek,
recipeSearchTerm,
numberOfDays,
};
},
head() {

View File

@@ -82,6 +82,7 @@ const MIGRATIONS = {
nextcloud: "nextcloud",
paprika: "paprika",
plantoeat: "plantoeat",
recipekeeper: "recipekeeper",
tandoor: "tandoor",
};
@@ -131,6 +132,10 @@ export default defineComponent({
text: i18n.tc("migration.plantoeat.title"),
value: MIGRATIONS.plantoeat,
},
{
text: i18n.tc("migration.recipekeeper.title"),
value: MIGRATIONS.recipekeeper,
},
{
text: i18n.tc("migration.tandoor.title"),
value: MIGRATIONS.tandoor,
@@ -307,6 +312,26 @@ export default defineComponent({
}
],
},
[MIGRATIONS.recipekeeper]: {
text: i18n.tc("migration.recipekeeper.description-long"),
acceptedFileType: ".zip",
tree: [
{
id: 1,
icon: $globals.icons.zip,
name: "recipekeeperhtml.zip",
children: [
{ id: 2, name: "recipes.html", icon: $globals.icons.codeJson },
{ id: 3, name: "images", icon: $globals.icons.folderOutline,
children: [
{ id: 4, name: "image1.jpg", icon: $globals.icons.fileImage },
{ id: 5, name: "image2.jpg", icon: $globals.icons.fileImage },
]
},
],
}
],
},
[MIGRATIONS.tandoor]: {
text: i18n.tc("migration.tandoor.description-long"),
acceptedFileType: ".zip",

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mdi-calendar-multiselect" viewBox="0 0 24 24"><path d="M19,19V8H5V19H19M16,1H18V3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1M7,10H9V12H7V10M15,10H17V12H15V10M11,14H13V16H11V14M15,14H17V16H15V14Z" /></svg>

After

Width:  |  Height:  |  Size: 297 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mdi-format-list-checks" viewBox="0 0 24 24"><path d="M3,5H9V11H3V5M5,7V9H7V7H5M11,7H21V9H11V7M11,15H21V17H11V15M5,20L1.5,16.5L2.91,15.09L5,17.17L9.59,12.59L11,14L5,20Z" /></svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@@ -57,6 +57,8 @@ class AppSettings(BaseSettings):
ALLOW_SIGNUP: bool = False
DAILY_SCHEDULE_TIME: str = "23:45"
# ===============================================
# Security Configuration
@@ -199,7 +201,11 @@ class AppSettings(BaseSettings):
def OIDC_READY(self) -> bool:
"""Validates OIDC settings are all set"""
required = {self.OIDC_CLIENT_ID, self.OIDC_CONFIGURATION_URL, self.OIDC_USER_CLAIM}
required = {
self.OIDC_CLIENT_ID,
self.OIDC_CONFIGURATION_URL,
self.OIDC_USER_CLAIM,
}
not_none = None not in required
valid_group_claim = True
if (not self.OIDC_USER_GROUP or not self.OIDC_ADMIN_GROUP) and not self.OIDC_GROUPS_CLAIM:
@@ -236,7 +242,7 @@ class AppSettings(BaseSettings):
# Testing Config
TESTING: bool = False
model_config = SettingsConfigDict(arbitrary_types_allowed=True, extra="allow")
model_config = SettingsConfigDict(arbitrary_types_allowed=True, extra="allow", secrets_dir="/run/secrets")
def app_settings_constructor(data_dir: Path, production: bool, env_file: Path, env_encoding="utf-8") -> AppSettings:

View File

@@ -1,7 +1,9 @@
from contextvars import ContextVar
from datetime import datetime
from typing import TYPE_CHECKING, Optional
from pydantic import ConfigDict
from sqlalchemy import Boolean, Float, ForeignKey, Integer, String, UniqueConstraint, orm
from sqlalchemy import Boolean, Float, ForeignKey, Integer, String, UniqueConstraint, event, orm
from sqlalchemy.ext.orderinglist import ordering_list
from sqlalchemy.orm import Mapped, mapped_column
@@ -150,3 +152,60 @@ class ShoppingList(SqlAlchemyBase, BaseMixins):
@auto_init()
def __init__(self, **_) -> None:
pass
class SessionBuffer:
def __init__(self) -> None:
self.shopping_list_ids: set[GUID] = set()
def add(self, shopping_list_id: GUID) -> None:
self.shopping_list_ids.add(shopping_list_id)
def pop(self) -> GUID | None:
try:
return self.shopping_list_ids.pop()
except KeyError:
return None
def clear(self) -> None:
self.shopping_list_ids.clear()
session_buffer_context = ContextVar("session_buffer", default=SessionBuffer())
@event.listens_for(ShoppingListItem, "after_insert")
@event.listens_for(ShoppingListItem, "after_update")
@event.listens_for(ShoppingListItem, "after_delete")
def buffer_shopping_list_updates(_, connection, target: ShoppingListItem):
"""Adds the shopping list id to the session buffer so its `update_at` property can be updated later"""
session_buffer = session_buffer_context.get()
session_buffer.add(target.shopping_list_id)
@event.listens_for(orm.Session, "after_flush")
def update_shopping_lists(session: orm.Session, _):
"""Pulls all pending shopping list updates from the buffer and updates their `update_at` property"""
session_buffer = session_buffer_context.get()
if not session_buffer.shopping_list_ids:
return
local_session = orm.Session(bind=session.connection())
try:
local_session.begin()
while True:
shopping_list_id = session_buffer.pop()
if not shopping_list_id:
break
shopping_list = local_session.query(ShoppingList).filter(ShoppingList.id == shopping_list_id).first()
if not shopping_list:
continue
shopping_list.update_at = datetime.now()
local_session.commit()
except Exception:
local_session.rollback()
raise

View File

@@ -5,8 +5,8 @@
"recipe": {
"unique-name-error": "Opskriftsnavnet er allerede i brug",
"recipe-defaults": {
"ingredient-note": "1 Cup Flour",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
"ingredient-note": "1 Kop Mel",
"step-text": "Du kan bruge markdown kode i beskrivelser og andre felter i opskrifter.\n\n**Tilføj et link**\n\n[Mit link](https://demo.mealie.io)\n"
}
},
"mealplan": {

View File

@@ -1,25 +1,25 @@
{
"generic": {
"server-error": "An unexpected error occurred"
"server-error": "예상하지 못한 에러가 발생했습니다."
},
"recipe": {
"unique-name-error": "Recipe names must be unique",
"unique-name-error": "Recipe 이름은 고유해야 합니다",
"recipe-defaults": {
"ingredient-note": "1 Cup Flour",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
"ingredient-note": "밀가루 1컵",
"step-text": "Recipe 단계는 물론 recipe 페이지의 다른 필드도 Markdown 문법을 지원합니다.\n\n**Add a link**\n\n[\b나의 링크](https://demo.mealie.io)"
}
},
"mealplan": {
"no-recipes-match-your-rules": "No recipes match your rules"
"no-recipes-match-your-rules": "규칙과 일치하는 Recipe가 없습니다"
},
"user": {
"user-updated": "User updated",
"password-updated": "Password updated",
"invalid-current-password": "Invalid current password",
"ldap-update-password-unavailable": "Unable to update password, user is controlled by LDAP"
"password-updated": "비밀번호가 변경되었습니다",
"invalid-current-password": "현재 비밀번호가 잘못되었습니다",
"ldap-update-password-unavailable": "사용자가 LDAP으로 제어되기 때문에 비밀번호를 변경할 수 없습니다"
},
"group": {
"report-deleted": "Report deleted."
"report-deleted": "Report가 삭제됐습니다"
},
"exceptions": {
"permission_denied": "You do not have permission to perform this action",

View File

@@ -3,10 +3,10 @@
"server-error": "Ocorreu um erro inesperado"
},
"recipe": {
"unique-name-error": "O nome das receitas precisar ser único",
"unique-name-error": "Nomes de receitas devem ser únicos",
"recipe-defaults": {
"ingredient-note": "1 Cup Flour",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
"ingredient-note": "1 Xícara de Farinha",
"step-text": "Passos das receitas, assim como outros campos na página da receita, suportam sintaxe \"markdown\".\n\n**Adicione um link**\n\n[Meu Link](https://demo.mealie.io)\n"
}
},
"mealplan": {
@@ -16,10 +16,10 @@
"user-updated": "Usuário atualizado",
"password-updated": "Senha atualizada",
"invalid-current-password": "Senha atual inválida",
"ldap-update-password-unavailable": "Não é possível atualizar a senha, o usuário é controlado pelo LDAP"
"ldap-update-password-unavailable": "Impossível atualizar a senha, o usuário é controlado por LDAP"
},
"group": {
"report-deleted": "Relatório excluído"
"report-deleted": "Relatório excluído."
},
"exceptions": {
"permission_denied": "Você não tem permissão para realizar esta ação",
@@ -37,12 +37,12 @@
"generic-deleted": "{name} foi excluído"
},
"datetime": {
"year": "year|years",
"day": "day|days",
"hour": "hour|hours",
"minute": "minute|minutes",
"second": "second|seconds",
"millisecond": "millisecond|milliseconds",
"microsecond": "microsecond|microseconds"
"year": "ano|anos",
"day": "dia|dias",
"hour": "hora|horas",
"minute": "minuto|minutos",
"second": "segundo|segundos",
"millisecond": "milissegundo|milissegundos",
"microsecond": "microssegundo|microssegundos"
}
}

View File

@@ -5,8 +5,8 @@
"recipe": {
"unique-name-error": "Os nomes de receitas devem ser únicos",
"recipe-defaults": {
"ingredient-note": "1 Cup Flour",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
"ingredient-note": "1 Chávena de Farinha",
"step-text": "Os passos da receita, bem como outros campos na página da receita, suportam a sintaxe markdown.\n\n**Adicionar um link**\n\n[Meu link](https://demo.mealie.io)\n"
}
},
"mealplan": {

View File

@@ -12,7 +12,7 @@
"baking-powder": "fermento em pó",
"baking-soda": "bicarbonato de sódio",
"baking-sugar": "açúcar de confeiteiro",
"bar-sugar": "açúcar em barra",
"bar-sugar": "açúcar refinado",
"basil": "manjericão",
"bell-peppers": "pimentões",
"blackberries": "amoras silvestres",
@@ -80,15 +80,15 @@
"eggplant": "berinjela",
"endive": "endívia",
"fats": "gorduras",
"speck": "speck",
"fava-beans": "fava beans",
"speck": "presunto",
"fava-beans": "feijão-fava",
"fiddlehead": "fiddlehead",
"fish": "peixe",
"catfish": "bagre ",
"cod": "bacalhau",
"salt-cod": "bacalhau salgado",
"salmon": "salmão",
"skate": "skate",
"skate": "raia",
"stockfish": "stockfish",
"trout": "truta",
"tuna": "atum",
@@ -146,7 +146,7 @@
"mussels": "mussels",
"nori": "nori",
"nutmeg": "nutmeg",
"nutritional-yeast-flakes": "nutritional yeast flakes",
"nutritional-yeast-flakes": "levedura nutricional em flocos",
"nuts": "nozes",
"nanaimo-bar-mix": "nanaimo bar mix",
"octopuses": "polvos",
@@ -195,14 +195,14 @@
"squash": "squash",
"zucchini": "abobrinha",
"sugar": "açúcar",
"caster-sugar": "caster sugar",
"granulated-sugar": "granulated sugar",
"superfine-sugar": "superfine sugar",
"caster-sugar": "açúcar refinado",
"granulated-sugar": "açúcar cristal",
"superfine-sugar": "açúcar refinado",
"turbanado-sugar": "turbanado sugar",
"unrefined-sugar": "açúcar não refinado",
"white-sugar": "açucar refinado",
"white-sugar": "açúcar cristal",
"sweet-potato": "batata doce",
"sweeteners": "adoçante",
"sweeteners": "adoçantes",
"cane-sugar": "açúcar de cana",
"tahini": "tahine",
"tubers": "tubérculos",

View File

@@ -2,17 +2,17 @@
"teaspoon": {
"name": "teaspoon",
"description": "",
"abbreviation": "tsp"
"abbreviation": "culleradiña"
},
"tablespoon": {
"name": "tablespoon",
"description": "",
"abbreviation": "tbsp"
"abbreviation": "culleradas sopeiras"
},
"cup": {
"name": "cup",
"name": "taza",
"description": "",
"abbreviation": "cup"
"abbreviation": "taza"
},
"fluid-ounce": {
"name": "fluid ounce",

View File

@@ -2,7 +2,7 @@
"teaspoon": {
"name": "colher de chá",
"description": "",
"abbreviation": "col. de chá"
"abbreviation": "cc"
},
"tablespoon": {
"name": "colher de sopa",
@@ -12,7 +12,7 @@
"cup": {
"name": "xícara",
"description": "",
"abbreviation": "xíc."
"abbreviation": "x"
},
"fluid-ounce": {
"name": "onça fluida",

View File

@@ -17,6 +17,7 @@ from mealie.services.migrations import (
NextcloudMigrator,
PaprikaMigrator,
PlanToEatMigrator,
RecipeKeeperMigrator,
TandoorMigrator,
)
@@ -56,6 +57,7 @@ class GroupMigrationController(BaseUserController):
SupportedMigrations.tandoor: TandoorMigrator,
SupportedMigrations.plantoeat: PlanToEatMigrator,
SupportedMigrations.myrecipebox: MyRecipeBoxMigrator,
SupportedMigrations.recipekeeper: RecipeKeeperMigrator,
}
constructor = table.get(migration_type, None)

View File

@@ -5,7 +5,17 @@ from zipfile import ZipFile
import orjson
import sqlalchemy
from fastapi import BackgroundTasks, Depends, File, Form, HTTPException, Path, Query, Request, status
from fastapi import (
BackgroundTasks,
Depends,
File,
Form,
HTTPException,
Path,
Query,
Request,
status,
)
from fastapi.datastructures import UploadFile
from fastapi.responses import JSONResponse
from pydantic import UUID4, BaseModel, Field
@@ -14,7 +24,11 @@ from starlette.background import BackgroundTask
from starlette.responses import FileResponse
from mealie.core import exceptions
from mealie.core.dependencies import get_temporary_path, get_temporary_zip_path, validate_recipe_token
from mealie.core.dependencies import (
get_temporary_path,
get_temporary_zip_path,
validate_recipe_token,
)
from mealie.core.security import create_recipe_slug_token
from mealie.db.models.group.cookbook import CookBook
from mealie.pkgs import cache
@@ -26,10 +40,19 @@ from mealie.routes._base.routers import MealieCrudRoute, UserAPIRouter
from mealie.schema.cookbook.cookbook import ReadCookBook
from mealie.schema.make_dependable import make_dependable
from mealie.schema.recipe import Recipe, RecipeImageTypes, ScrapeRecipe
from mealie.schema.recipe.recipe import CreateRecipe, CreateRecipeByUrlBulk, RecipeLastMade, RecipeSummary
from mealie.schema.recipe.recipe import (
CreateRecipe,
CreateRecipeByUrlBulk,
RecipeLastMade,
RecipeSummary,
)
from mealie.schema.recipe.recipe_asset import RecipeAsset
from mealie.schema.recipe.recipe_scraper import ScrapeRecipeTest
from mealie.schema.recipe.request_helpers import RecipeDuplicate, RecipeZipTokenResponse, UpdateImageResponse
from mealie.schema.recipe.request_helpers import (
RecipeDuplicate,
RecipeZipTokenResponse,
UpdateImageResponse,
)
from mealie.schema.response import PaginationBase, PaginationQuery
from mealie.schema.response.pagination import RecipeSearchQuery
from mealie.schema.response.responses import ErrorResponse
@@ -40,13 +63,21 @@ from mealie.services.event_bus_service.event_types import (
EventRecipeData,
EventTypes,
)
from mealie.services.recipe.recipe_data_service import InvalidDomainError, NotAnImageError, RecipeDataService
from mealie.services.recipe.recipe_data_service import (
InvalidDomainError,
NotAnImageError,
RecipeDataService,
)
from mealie.services.recipe.recipe_service import RecipeService
from mealie.services.recipe.template_service import TemplateService
from mealie.services.scraper.recipe_bulk_scraper import RecipeBulkScraperService
from mealie.services.scraper.scraped_extras import ScraperContext
from mealie.services.scraper.scraper import create_from_url
from mealie.services.scraper.scraper_strategies import ForceTimeoutException, RecipeScraperPackage
from mealie.services.scraper.scraper_strategies import (
ForceTimeoutException,
RecipeScraperOpenAI,
RecipeScraperPackage,
)
class JSONBytes(JSONResponse):
@@ -210,10 +241,11 @@ class RecipeController(BaseRecipeController):
return {"reportId": report_id}
@router.post("/test-scrape-url")
async def test_parse_recipe_url(self, url: ScrapeRecipeTest):
async def test_parse_recipe_url(self, data: ScrapeRecipeTest):
# Debugger should produce the same result as the scraper sees before cleaning
ScraperClass = RecipeScraperOpenAI if data.use_openai else RecipeScraperPackage
try:
if scraped_data := await RecipeScraperPackage(url.url, self.translator).scrape_url():
if scraped_data := await ScraperClass(data.url, self.translator).scrape_url():
return scraped_data.schema.data
except ForceTimeoutException as e:
raise HTTPException(

View File

@@ -12,6 +12,7 @@ class SupportedMigrations(str, enum.Enum):
tandoor = "tandoor"
plantoeat = "plantoeat"
myrecipebox = "myrecipebox"
recipekeeper = "recipekeeper"
class DataMigrationCreate(MealieModel):

View File

View File

@@ -0,0 +1,10 @@
from pydantic import BaseModel
class OpenAIBase(BaseModel):
"""
This class defines the JSON schema sent to OpenAI. Its schema is
injected directly into the OpenAI prompt.
"""
__doc__ = "" # we don't want to include the docstring in the JSON schema

View File

@@ -0,0 +1,92 @@
from textwrap import dedent
from pydantic import Field, field_validator
from ._base import OpenAIBase
class OpenAIIngredient(OpenAIBase):
input: str = Field(
...,
description=dedent(
"""
The input is simply the ingredient string you are processing as-is. It is forbidden to
modify this at all, you must provide the input exactly as you received it.
"""
),
)
confidence: float | None = Field(
None,
description=dedent(
"""
This value is a float between 0 - 100, where 100 is full confidence that the result is correct,
and 0 is no confidence that the result is correct. If you're unable to parse anything,
and you put the entire string in the notes, you should return 0 confidence. If you can easily
parse the string into each component, then you should return a confidence of 100. If you have to
guess which part is the unit and which part is the food, your confidence should be lower, such as 60.
Even if there is no unit or note, if you're able to determine the food, you may use a higher confidence.
If the entire ingredient consists of only a food, you can use a confidence of 100.
"""
),
)
quantity: float | None = Field(
0,
description=dedent(
"""
The numerical representation of how much of this ingredient. For instance, if you receive
"3 1/2 grams of minced garlic", the quantity is "3 1/2". Quantity may be represented as a whole number
(integer), a float or decimal, or a fraction. You should output quantity in only whole numbers or
floats, converting fractions into floats. Floats longer than 10 decimal places should be
rounded to 10 decimal places.
"""
),
)
unit: str | None = Field(
None,
description=dedent(
"""
The unit of measurement for this ingredient. For instance, if you receive
"2 lbs chicken breast", the unit is "lbs" (short for "pounds").
"""
),
)
food: str | None = Field(
None,
description=dedent(
"""
The actual physical ingredient used in the recipe. For instance, if you receive
"3 cups of onions, chopped", the food is "onions".
"""
),
)
note: str | None = Field(
None,
description=dedent(
"""
The rest of the text that represents more detail on how to prepare the ingredient.
Anything that is not one of the above should be the note. For instance, if you receive
"one can of butter beans, drained" the note would be "drained". If you receive
"3 cloves of garlic peeled and finely chopped", the note would be "peeled and finely chopped".
"""
),
)
@field_validator("quantity")
def coerce_none_qty(cls, v: float | None) -> float:
return v or 0
@field_validator("confidence")
def validate_confidence(cls, v: float | None) -> float:
v = v or 0
if v < 0:
v = 0
elif v > 100:
v = 100
return v / 100
class OpenAIIngredients(OpenAIBase):
ingredients: list[OpenAIIngredient] = []

View File

@@ -1,10 +1,11 @@
from pydantic import ConfigDict
from pydantic import ConfigDict, Field
from mealie.schema._mealie.mealie_model import MealieModel
class ScrapeRecipeTest(MealieModel):
url: str
use_openai: bool = Field(False, alias="useOpenAI")
class ScrapeRecipe(MealieModel):

View File

@@ -8,9 +8,39 @@ class BackupContents:
_tables: dict | None = None
def __init__(self, file: Path) -> None:
self.base = file
self.data_directory = self.base / "data"
self.tables = self.base / "database.json"
self.base = self._find_base(file)
self.data_directory = self._find_data_dir_from_base(self.base)
self.tables = self._find_database_from_base(self.base)
@classmethod
def _find_base(cls, file: Path) -> Path:
# Safari mangles our ZIP structure and adds a "__MACOSX" directory at the root along with
# an arbitrarily-named directory containing the actual contents. So, if we find a dunder directory
# at the root (i.e. __MACOSX) we traverse down the first non-dunder directory and assume this is the base.
# This works because our backups never contain a directory that starts with "__".
dirs = [d for d in file.iterdir() if d.is_dir()]
dunder_dirs = [d for d in dirs if d.name.startswith("__")]
normal_dirs = [d for d in dirs if not d.name.startswith("__")]
if not dunder_dirs:
return file
# If the backup somehow adds a __MACOSX directory alongside the data directory, rather than in the
# parent directory, we don't want to traverse down. We check for our database.json file, and if it exists,
# we're already at the correct base.
if cls._find_database_from_base(file).exists():
return file
# This ZIP file was mangled, so we return the first non-dunder directory (if it exists).
return normal_dirs[0] if normal_dirs else file
@classmethod
def _find_data_dir_from_base(cls, base: Path) -> Path:
return base / "data"
@classmethod
def _find_database_from_base(cls, base: Path) -> Path:
return base / "database.json"
def validate(self) -> bool:
if not self.base.is_dir():

View File

@@ -5,4 +5,5 @@ from .myrecipebox import *
from .nextcloud import *
from .paprika import *
from .plantoeat import *
from .recipekeeper import *
from .tandoor import *

View File

@@ -74,6 +74,28 @@ class BaseMigrator(BaseService):
super().__init__()
@classmethod
def get_zip_base_path(cls, path: Path) -> Path:
# Safari mangles our ZIP structure and adds a "__MACOSX" directory at the root along with
# an arbitrarily-named directory containing the actual contents. So, if we find a dunder directory
# at the root (i.e. __MACOSX) we traverse down the first non-dunder directory and assume this is the base.
# We assume migration exports never contain a directory that starts with "__".
normal_dirs: list[Path] = []
dunder_dirs: list[Path] = []
for dir in path.iterdir():
if not dir.is_dir():
continue
if dir.name.startswith("__"):
dunder_dirs.append(dir)
else:
normal_dirs.append(dir)
if len(normal_dirs) == 1 and len(dunder_dirs) == 1:
return normal_dirs[0]
else:
return path
def _migrate(self) -> None:
raise NotImplementedError

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