mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-26 01:33:12 -05:00
Compare commits
186 Commits
v1.0.0-RC1
...
v1.0.0-RC2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9852daf0e | ||
|
|
1f35a23bfa | ||
|
|
cf00325c2b | ||
|
|
714fb6a723 | ||
|
|
340841b37a | ||
|
|
421f718ace | ||
|
|
435b66ce3d | ||
|
|
7742e97bde | ||
|
|
416d7525fc | ||
|
|
14442c61a6 | ||
|
|
1aae6b0f0a | ||
|
|
8536dc7b92 | ||
|
|
b0b7690348 | ||
|
|
781bbe77d7 | ||
|
|
620020abcf | ||
|
|
2ed7bea7eb | ||
|
|
e7d569d4d2 | ||
|
|
ba7e22d045 | ||
|
|
77b4bf67f1 | ||
|
|
5bd5559601 | ||
|
|
97b35735c0 | ||
|
|
c30b47456f | ||
|
|
8268f0bdb9 | ||
|
|
05be1dcefb | ||
|
|
6a00931143 | ||
|
|
627e930d0b | ||
|
|
eac65af05c | ||
|
|
27e9cc0970 | ||
|
|
67e94834dd | ||
|
|
c5f743220b | ||
|
|
38201b0f3c | ||
|
|
5619ba0891 | ||
|
|
caf3922f22 | ||
|
|
3692c4a722 | ||
|
|
0a451cf01b | ||
|
|
297406e453 | ||
|
|
1258de3592 | ||
|
|
0a80b437b6 | ||
|
|
ffa1074298 | ||
|
|
40b5d33cba | ||
|
|
2fa03b71a2 | ||
|
|
ce5555674a | ||
|
|
ccbddf0e7c | ||
|
|
8dee4e942e | ||
|
|
2df8d86e83 | ||
|
|
a4e72a1f63 | ||
|
|
c8722cb44f | ||
|
|
c3c6bd6d33 | ||
|
|
ff115284d9 | ||
|
|
6cec7f6dcd | ||
|
|
fcd4854cb8 | ||
|
|
215bd7adaa | ||
|
|
0933ad4367 | ||
|
|
1e3418c5f5 | ||
|
|
6c920c2e05 | ||
|
|
3e4a6ac93b | ||
|
|
e175bc8f65 | ||
|
|
2ff0b60d8c | ||
|
|
9fd61308d5 | ||
|
|
1444404154 | ||
|
|
d29f6ffbea | ||
|
|
7fe7a87ff4 | ||
|
|
a0c891bae8 | ||
|
|
fc31ade49e | ||
|
|
3fa8c39f3d | ||
|
|
645421b566 | ||
|
|
be43e5bccd | ||
|
|
b1903aa205 | ||
|
|
66b429c981 | ||
|
|
8f7132ec86 | ||
|
|
5390efc2e7 | ||
|
|
b975e9f05b | ||
|
|
e8db1bbe80 | ||
|
|
a7bb02ffbd | ||
|
|
31579d09a3 | ||
|
|
49b4ee2b90 | ||
|
|
0775072ffa | ||
|
|
23e398e0df | ||
|
|
3870819e38 | ||
|
|
984953e2ce | ||
|
|
dad3b37946 | ||
|
|
55defdac8c | ||
|
|
e98eee56be | ||
|
|
63ac21bce2 | ||
|
|
098c94e253 | ||
|
|
08656ec09a | ||
|
|
6c2ac73df7 | ||
|
|
f9742b30d8 | ||
|
|
6f2358106c | ||
|
|
41a9a39cf3 | ||
|
|
05fec0b36e | ||
|
|
b7cc5c0666 | ||
|
|
7ecba52075 | ||
|
|
9b1449194e | ||
|
|
7d0ed267f7 | ||
|
|
ed76d28665 | ||
|
|
74ea7d5e40 | ||
|
|
ac6c8ec35b | ||
|
|
f0ed0d4919 | ||
|
|
1bd31d3dbf | ||
|
|
6dc7613936 | ||
|
|
fbc908585e | ||
|
|
c2fe9dd573 | ||
|
|
24b9b4179e | ||
|
|
4a1b76b2c4 | ||
|
|
d15ec892bc | ||
|
|
04f2022537 | ||
|
|
91ad10dd1a | ||
|
|
c7d76e39fa | ||
|
|
ff8ea8d72a | ||
|
|
99681be075 | ||
|
|
049f8edb86 | ||
|
|
2d05169a8e | ||
|
|
85aac1b97d | ||
|
|
01f1d7538f | ||
|
|
62ca936e91 | ||
|
|
c840407b94 | ||
|
|
a158149273 | ||
|
|
4e22377748 | ||
|
|
ba38434587 | ||
|
|
dfb298e4e3 | ||
|
|
fac0941308 | ||
|
|
600e5c6010 | ||
|
|
94d28295f9 | ||
|
|
43c51d9d4a | ||
|
|
ee1ed670a5 | ||
|
|
3b4d1c4627 | ||
|
|
d787234ac1 | ||
|
|
0d3751e83b | ||
|
|
c3a39d6f43 | ||
|
|
42ecee87e4 | ||
|
|
9fd2a39f43 | ||
|
|
273e584598 | ||
|
|
9634e87f72 | ||
|
|
8880cc09d5 | ||
|
|
f54670e670 | ||
|
|
2589849682 | ||
|
|
bc575ec5ae | ||
|
|
71f95ca3c6 | ||
|
|
b02188a88c | ||
|
|
d440d51ffe | ||
|
|
4b55b838ed | ||
|
|
3a62c9eaa0 | ||
|
|
f61bb87c8e | ||
|
|
80968b02bb | ||
|
|
94cf690e8f | ||
|
|
4fc1ec7663 | ||
|
|
2764d9e2dd | ||
|
|
8ac8459054 | ||
|
|
75e95817a3 | ||
|
|
18b7e3ac9a | ||
|
|
4ec7bd4352 | ||
|
|
83796611a6 | ||
|
|
603a0c0bd9 | ||
|
|
1e92395aab | ||
|
|
97a9fa94a0 | ||
|
|
c918b8f6e4 | ||
|
|
168e226f0e | ||
|
|
f7f8c51661 | ||
|
|
ccb2cd2d6d | ||
|
|
14cc44f948 | ||
|
|
08b6f3b70a | ||
|
|
13f0fcb082 | ||
|
|
fbe8a4e2da | ||
|
|
228679952e | ||
|
|
79796ce4c2 | ||
|
|
1a148a53de | ||
|
|
b7c7c0f947 | ||
|
|
defdc82d74 | ||
|
|
3257ea2980 | ||
|
|
766cfa76b6 | ||
|
|
45141a5c5f | ||
|
|
15f79d1586 | ||
|
|
ebe11da343 | ||
|
|
df3b10b5c2 | ||
|
|
4b04137a04 | ||
|
|
eba9ff00ce | ||
|
|
5f0a9981f3 | ||
|
|
cb1769a352 | ||
|
|
f72fcc3031 | ||
|
|
e8b5d8d66f | ||
|
|
8acd6f906e | ||
|
|
5bc78f81ea | ||
|
|
2ad7cb0ea4 | ||
|
|
3af400ab28 | ||
|
|
3f49e80b9a |
@@ -18,31 +18,26 @@
|
||||
"source=mealie-devcontainer-workspace,target=/workspaces/mealie/frontend/node_modules,type=volume",
|
||||
"source=mealie-bashhistory,target=/home/vscode/commandhistory,type=volume"
|
||||
],
|
||||
// Set *default* container specific settings.json values on container create.
|
||||
"settings": {
|
||||
"python.defaultInterpreterPath": "/usr/local/bin/python",
|
||||
"python.linting.enabled": true,
|
||||
"python.linting.pylintEnabled": true,
|
||||
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
|
||||
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
|
||||
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
|
||||
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
|
||||
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
|
||||
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
|
||||
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
|
||||
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
|
||||
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint"
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"settings": {
|
||||
"python.defaultInterpreterPath": "/usr/local/bin/python",
|
||||
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
|
||||
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
|
||||
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
|
||||
},
|
||||
"extensions": [
|
||||
"dbaeumer.vscode-eslint",
|
||||
"matangover.mypy",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.isort",
|
||||
"ms-python.pylint",
|
||||
"ms-python.python",
|
||||
"ms-python.vscode-pylance",
|
||||
"Vue.volar"
|
||||
]
|
||||
}
|
||||
},
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
"extensions": [
|
||||
"dbaeumer.vscode-eslint",
|
||||
"matangover.mypy",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.isort",
|
||||
"ms-python.python",
|
||||
"ms-python.vscode-pylance",
|
||||
"Vue.volar"
|
||||
],
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [
|
||||
3000,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
.git
|
||||
.github
|
||||
.dockerignore
|
||||
.gitattributes
|
||||
.gitignore
|
||||
.idea
|
||||
.vscode
|
||||
@@ -12,6 +13,7 @@ __pycache__/
|
||||
htmlcov/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.pylintrc
|
||||
.pytest_cache/
|
||||
.venv
|
||||
venv
|
||||
@@ -28,3 +30,5 @@ venv
|
||||
*/mealie/.temp
|
||||
|
||||
model.crfmodel
|
||||
|
||||
crowdin.yml
|
||||
|
||||
8
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
8
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
@@ -12,7 +12,7 @@ body:
|
||||
Please confirm and check all the following prior to submission. If you do not do this, your
|
||||
issue may be closed.
|
||||
options:
|
||||
- label: This is not a feature request
|
||||
- label: This is not a feature request.
|
||||
required: true
|
||||
- label: I added a very descriptive title to this issue.
|
||||
required: true
|
||||
@@ -22,7 +22,7 @@ body:
|
||||
required: true
|
||||
- label: I already read the docs and didn't find an answer.
|
||||
required: true
|
||||
- label: This issue can be replicated on the demo site (https://demo.mealie.io/)
|
||||
- label: This issue can be replicated on the demo site (https://demo.mealie.io/).
|
||||
required: false
|
||||
- type: textarea
|
||||
id: description
|
||||
@@ -41,13 +41,15 @@ body:
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Please provide relevent logs
|
||||
label: Please provide relevant logs
|
||||
placeholder: For example from `docker-compose logs` or other system logs.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: Mealie Version
|
||||
placeholder: Docker image, as well as 'Build' tag from https://yourmealieurl/admin/site-settings, if UI is working
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
|
||||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,4 +1,4 @@
|
||||
contact_links:
|
||||
- name: Feature Requests
|
||||
url: https://github.com/hay-kot/mealie/discussions/new?category=feature-request
|
||||
about: Please add any Feature Requests as a Github Discussion using the for in this issue.
|
||||
url: https://github.com/mealie-recipes/mealie/discussions/new?category=feature-request
|
||||
about: Please add any Feature Requests as a Github Discussion using the form in this issue.
|
||||
|
||||
@@ -17,7 +17,7 @@ body:
|
||||
- label: |
|
||||
I have verified that this issue _is not_ related to the underlying library
|
||||
[hhyrsev/recipe-scrapers](https://github.com/hhursev/recipe-scrapers) by **1)** checking
|
||||
the [debugger](https://demo.mealie.io/recipe/create/debug) and data is returned, **2)**
|
||||
the [debugger](https://demo.mealie.io/g/home/r/create/debug) and data is returned, **2)**
|
||||
verifying that there _are_ errors in the log related to application level code, or
|
||||
**3)** verified that the site provides recipe data, or is otherwise supported by
|
||||
[hhyrsev/recipe-scrapers](https://github.com/hhursev/recipe-scrapers)
|
||||
|
||||
23
.github/pull_request_template.md
vendored
23
.github/pull_request_template.md
vendored
@@ -2,6 +2,15 @@
|
||||
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.
|
||||
If a section of the PR template does not apply to this PR, then delete that section.
|
||||
|
||||
PLEASE READ:
|
||||
-------------------------
|
||||
Mealie is moving to a regular, automatic release schedule. This means that all PRs should be in a
|
||||
stable state, ready for release. This includes:
|
||||
|
||||
- Ensuring new tests have been added to cover new features, or to prevent regressions.
|
||||
- Work is fully complete and usable
|
||||
|
||||
-->
|
||||
|
||||
## What type of PR is this?
|
||||
@@ -56,17 +65,3 @@ _(fill-in or delete this section)_
|
||||
<!--
|
||||
Describe how you tested this change.
|
||||
-->
|
||||
|
||||
## Release Notes
|
||||
|
||||
_(REQUIRED)_
|
||||
<!--
|
||||
If this PR makes user facing changes, please describe them here. This
|
||||
description will be copied into the release notes/changelog, whenever the
|
||||
next version is released. Keep this section short, and focus on high level
|
||||
changes.
|
||||
Put your text between the block. To omit notes, use NONE within the block.
|
||||
-->
|
||||
|
||||
```release-note
|
||||
```
|
||||
|
||||
5
.github/workflows/partial-builder.yml
vendored
5
.github/workflows/partial-builder.yml
vendored
@@ -44,3 +44,8 @@ jobs:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ghcr.io/${{ github.repository }}:${{ inputs.tag }}
|
||||
build-args: |
|
||||
COMMIT=${{ github.sha }}
|
||||
# https://docs.docker.com/build/ci/github-actions/cache/#github-cache
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
19
.github/workflows/release.yml
vendored
19
.github/workflows/release.yml
vendored
@@ -14,6 +14,9 @@ jobs:
|
||||
uses: ./.github/workflows/partial-frontend.yml
|
||||
|
||||
build-release:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
name: Build Tagged Release
|
||||
uses: ./.github/workflows/partial-builder.yml
|
||||
needs:
|
||||
@@ -25,22 +28,6 @@ jobs:
|
||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
publish-docs:
|
||||
name: Deploy docs
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build-release
|
||||
steps:
|
||||
- name: Checkout main
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Deploy docs
|
||||
uses: mhausenblas/mkdocs-deploy-gh-pages@master
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
CONFIG_FILE: docs/mkdocs.yml
|
||||
EXTRA_PACKAGES: build-base
|
||||
|
||||
notify-discord:
|
||||
name: Notify Discord
|
||||
needs:
|
||||
|
||||
11
.vscode/settings.json
vendored
11
.vscode/settings.json
vendored
@@ -36,13 +36,6 @@
|
||||
"i18n-ally.localesPaths": "frontend/lang/messages",
|
||||
"i18n-ally.sourceLanguage": "en-US",
|
||||
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
|
||||
"python.formatting.provider": "black",
|
||||
"python.linting.enabled": true,
|
||||
"python.linting.flake8Enabled": false,
|
||||
"python.linting.pylintEnabled": false,
|
||||
"python.linting.pylintArgs": [
|
||||
"--rcfile=${workspaceFolder}/.pylintrc"
|
||||
],
|
||||
"python.testing.autoTestDiscoverOnSaveEnabled": false,
|
||||
"python.testing.pytestArgs": [
|
||||
"tests"
|
||||
@@ -50,7 +43,6 @@
|
||||
"python.testing.pytestEnabled": true,
|
||||
"python.testing.unittestEnabled": false,
|
||||
"python.analysis.typeCheckingMode": "off",
|
||||
"python.linting.mypyEnabled": true,
|
||||
"search.mode": "reuseEditor",
|
||||
"python.testing.unittestArgs": [
|
||||
"-v",
|
||||
@@ -69,4 +61,7 @@
|
||||
"[vue]": {
|
||||
"editor.formatOnSave": false
|
||||
},
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "ms-python.black-formatter",
|
||||
},
|
||||
}
|
||||
|
||||
3
MAINTAINERS.md
Normal file
3
MAINTAINERS.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Maintainers Guide
|
||||
|
||||
See -> [/docs/docs/contributors/developers-guide/maintainers.md](/docs/docs/contributors/developers-guide/maintainers.md)
|
||||
@@ -4,7 +4,7 @@
|
||||
[![Issues][issues-shield]][issues-url]
|
||||
[![AGPL License][license-shield]][license-url]
|
||||
[![Docker Pulls][docker-pull]][docker-pull]
|
||||
[](https://www.codefactor.io/repository/github/hay-kot/mealie)
|
||||
[](https://www.codefactor.io/repository/github/mealie-recipes/mealie)
|
||||
|
||||
<!-- PROJECT LOGO -->
|
||||
<br />
|
||||
@@ -28,8 +28,7 @@
|
||||
·
|
||||
<a href="https://github.com/hay-kot/mealie/issues">Report Bug</a>
|
||||
·
|
||||
<a href="https://hub.docker.com/r/hkotel/mealie"> Docker Hub
|
||||
</a>
|
||||
<a href="https://github.com/mealie-recipes/mealie/pkgs/container/mealie">GitHub Container Registry</a>
|
||||
</p>
|
||||
|
||||
|
||||
@@ -39,7 +38,7 @@
|
||||
|
||||
# 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 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.
|
||||
|
||||
- [Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
|
||||
- [Documentation](https://nightly.mealie.io)
|
||||
@@ -48,7 +47,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
|
||||
<!-- CONTRIBUTING -->
|
||||
## Contributing
|
||||
|
||||
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base, you'll want to use the nightly documentation to ensure you get the latest information.
|
||||
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base, you'll want to use the nightly documentation to ensure you get the latest information.
|
||||
|
||||
- See the [Contributors Guide](https://nightly.mealie.io/contributors/developers-guide/code-contributions/) for help getting started.
|
||||
- We use [VSCode Dev Containers](https://code.visualstudio.com/docs/remote/containers) to make it easy for contributors to get started!
|
||||
|
||||
@@ -22,7 +22,15 @@ def populate_normalized_fields():
|
||||
bind = op.get_bind()
|
||||
session = orm.Session(bind=bind)
|
||||
|
||||
units = session.execute(select(IngredientUnitModel)).scalars().all()
|
||||
units = (
|
||||
session.execute(
|
||||
select(IngredientUnitModel).options(
|
||||
orm.load_only(IngredientUnitModel.name, IngredientUnitModel.abbreviation)
|
||||
)
|
||||
)
|
||||
.scalars()
|
||||
.all()
|
||||
)
|
||||
for unit in units:
|
||||
if unit.name is not None:
|
||||
unit.name_normalized = IngredientUnitModel.normalize(unit.name)
|
||||
@@ -32,7 +40,9 @@ def populate_normalized_fields():
|
||||
|
||||
session.add(unit)
|
||||
|
||||
foods = session.execute(select(IngredientFoodModel)).scalars().all()
|
||||
foods = (
|
||||
session.execute(select(IngredientFoodModel).options(orm.load_only(IngredientFoodModel.name))).scalars().all()
|
||||
)
|
||||
for food in foods:
|
||||
if food.name is not None:
|
||||
food.name_normalized = IngredientFoodModel.normalize(food.name)
|
||||
|
||||
@@ -5,15 +5,21 @@ Revises: 0341b154f79a
|
||||
Create Date: 2023-10-04 14:29:26.688065
|
||||
|
||||
"""
|
||||
from collections import defaultdict
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.orm import Session
|
||||
from pydantic import UUID4
|
||||
from sqlalchemy.orm import Session, load_only
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
from mealie.db.models._model_base import SqlAlchemyBase
|
||||
from mealie.db.models._model_utils.guid import GUID
|
||||
from mealie.db.models.group.shopping_list import ShoppingListItem
|
||||
from mealie.db.models.labels import MultiPurposeLabel
|
||||
from mealie.db.models.recipe.ingredient import IngredientFoodModel, IngredientUnitModel, RecipeIngredientModel
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "dded3119c1fe"
|
||||
@@ -37,6 +43,106 @@ def _is_postgres():
|
||||
return op.get_context().dialect.name == "postgresql"
|
||||
|
||||
|
||||
def _get_duplicates(session: Session, model: SqlAlchemyBase) -> defaultdict[str, list[str]]:
|
||||
duplicate_map: defaultdict[str, list[str]] = defaultdict(list)
|
||||
for obj in session.query(model).options(load_only(model.id, model.group_id, model.name)).all():
|
||||
key = f"{obj.group_id}$${obj.name}"
|
||||
duplicate_map[key].append(str(obj.id))
|
||||
|
||||
return duplicate_map
|
||||
|
||||
|
||||
def _resolve_duplicate_food(
|
||||
session: Session,
|
||||
keep_food: IngredientFoodModel,
|
||||
keep_food_id: UUID4,
|
||||
dupe_food_id: UUID4,
|
||||
):
|
||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(food_id=dupe_food_id).all():
|
||||
shopping_list_item.food_id = keep_food_id
|
||||
shopping_list_item.food = keep_food
|
||||
|
||||
session.commit()
|
||||
|
||||
for recipe_ingredient in (
|
||||
session.query(RecipeIngredientModel)
|
||||
.options(load_only(RecipeIngredientModel.id, RecipeIngredientModel.food_id))
|
||||
.filter_by(food_id=dupe_food_id)
|
||||
.all()
|
||||
):
|
||||
recipe_ingredient.food_id = keep_food_id
|
||||
recipe_ingredient.food = keep_food
|
||||
|
||||
session.commit()
|
||||
|
||||
session.query(IngredientFoodModel).options(load_only(IngredientFoodModel.id)).filter_by(id=dupe_food_id).delete()
|
||||
session.commit()
|
||||
|
||||
|
||||
def _resolve_duplicate_unit(
|
||||
session: Session,
|
||||
keep_unit: IngredientUnitModel,
|
||||
keep_unit_id: UUID4,
|
||||
dupe_unit_id: UUID4,
|
||||
):
|
||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(unit_id=dupe_unit_id).all():
|
||||
shopping_list_item.unit_id = keep_unit_id
|
||||
shopping_list_item.unit = keep_unit
|
||||
|
||||
session.commit()
|
||||
|
||||
for recipe_ingredient in session.query(RecipeIngredientModel).filter_by(unit_id=dupe_unit_id).all():
|
||||
recipe_ingredient.unit_id = keep_unit_id
|
||||
recipe_ingredient.unit = keep_unit
|
||||
|
||||
session.commit()
|
||||
|
||||
session.query(IngredientUnitModel).options(load_only(IngredientUnitModel.id)).filter_by(id=dupe_unit_id).delete()
|
||||
session.commit()
|
||||
|
||||
|
||||
def _resolve_duplicate_label(
|
||||
session: Session,
|
||||
keep_label: MultiPurposeLabel,
|
||||
keep_label_id: UUID4,
|
||||
dupe_label_id: UUID4,
|
||||
):
|
||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(label_id=dupe_label_id).all():
|
||||
shopping_list_item.label_id = keep_label_id
|
||||
shopping_list_item.label = keep_label
|
||||
|
||||
session.commit()
|
||||
|
||||
for ingredient_food in session.query(IngredientFoodModel).filter_by(label_id=dupe_label_id).all():
|
||||
ingredient_food.label_id = keep_label_id
|
||||
ingredient_food.label = keep_label
|
||||
|
||||
session.commit()
|
||||
|
||||
session.query(MultiPurposeLabel).options(load_only(MultiPurposeLabel.id)).filter_by(id=dupe_label_id).delete()
|
||||
session.commit()
|
||||
|
||||
|
||||
def _resolve_duplicate_foods_units_labels():
|
||||
bind = op.get_bind()
|
||||
session = Session(bind=bind)
|
||||
|
||||
for model, resolve_func in [
|
||||
(IngredientFoodModel, _resolve_duplicate_food),
|
||||
(IngredientUnitModel, _resolve_duplicate_unit),
|
||||
(MultiPurposeLabel, _resolve_duplicate_label),
|
||||
]:
|
||||
duplicate_map = _get_duplicates(session, model)
|
||||
for ids in duplicate_map.values():
|
||||
if len(ids) < 2:
|
||||
continue
|
||||
|
||||
keep_id = ids[0]
|
||||
keep_obj = session.query(model).options(load_only(model.id)).filter_by(id=keep_id).first()
|
||||
for dupe_id in ids[1:]:
|
||||
resolve_func(session, keep_obj, keep_id, dupe_id)
|
||||
|
||||
|
||||
def _remove_duplicates_from_m2m_table(session: Session, table_meta: TableMeta):
|
||||
if _is_postgres():
|
||||
default_pk = "CTID"
|
||||
@@ -69,9 +175,9 @@ def _remove_duplicates_from_m2m_tables(table_metas: list[TableMeta]):
|
||||
|
||||
|
||||
def upgrade():
|
||||
_resolve_duplicate_foods_units_labels()
|
||||
_remove_duplicates_from_m2m_tables(
|
||||
[
|
||||
# M2M
|
||||
TableMeta("cookbooks_to_categories", "cookbook_id", "category_id"),
|
||||
TableMeta("cookbooks_to_tags", "cookbook_id", "tag_id"),
|
||||
TableMeta("cookbooks_to_tools", "cookbook_id", "tool_id"),
|
||||
@@ -83,10 +189,6 @@ def upgrade():
|
||||
TableMeta("recipes_to_tools", "recipe_id", "tool_id"),
|
||||
TableMeta("users_to_favorites", "user_id", "recipe_id"),
|
||||
TableMeta("shopping_lists_multi_purpose_labels", "shopping_list_id", "label_id"),
|
||||
# Foods/Units/Labels
|
||||
TableMeta("ingredient_foods", "name", "group_id"),
|
||||
TableMeta("ingredient_units", "name", "group_id"),
|
||||
TableMeta("multi_purpose_labels", "name", "group_id"),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
"""added plural names and alias tables for foods and units
|
||||
|
||||
Revision ID: ba1e4a6cfe99
|
||||
Revises: dded3119c1fe
|
||||
Create Date: 2023-10-19 19:22:55.369319
|
||||
|
||||
"""
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "ba1e4a6cfe99"
|
||||
down_revision = "dded3119c1fe"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table(
|
||||
"ingredient_units_aliases",
|
||||
sa.Column("id", mealie.db.migration_types.GUID(), nullable=False),
|
||||
sa.Column("unit_id", mealie.db.migration_types.GUID(), nullable=False),
|
||||
sa.Column("name", sa.String(), nullable=False),
|
||||
sa.Column("name_normalized", sa.String(), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(), nullable=True),
|
||||
sa.Column("update_at", sa.DateTime(), nullable=True),
|
||||
sa.ForeignKeyConstraint(
|
||||
["unit_id"],
|
||||
["ingredient_units.id"],
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", "unit_id"),
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_units_aliases_created_at"), "ingredient_units_aliases", ["created_at"], unique=False
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_units_aliases_name_normalized"),
|
||||
"ingredient_units_aliases",
|
||||
["name_normalized"],
|
||||
unique=False,
|
||||
)
|
||||
op.create_table(
|
||||
"ingredient_foods_aliases",
|
||||
sa.Column("id", mealie.db.migration_types.GUID(), nullable=False),
|
||||
sa.Column("food_id", mealie.db.migration_types.GUID(), nullable=False),
|
||||
sa.Column("name", sa.String(), nullable=False),
|
||||
sa.Column("name_normalized", sa.String(), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(), nullable=True),
|
||||
sa.Column("update_at", sa.DateTime(), nullable=True),
|
||||
sa.ForeignKeyConstraint(
|
||||
["food_id"],
|
||||
["ingredient_foods.id"],
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", "food_id"),
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_foods_aliases_created_at"), "ingredient_foods_aliases", ["created_at"], unique=False
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_foods_aliases_name_normalized"),
|
||||
"ingredient_foods_aliases",
|
||||
["name_normalized"],
|
||||
unique=False,
|
||||
)
|
||||
op.add_column("ingredient_foods", sa.Column("plural_name", sa.String(), nullable=True))
|
||||
op.add_column("ingredient_foods", sa.Column("plural_name_normalized", sa.String(), nullable=True))
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_foods_plural_name_normalized"), "ingredient_foods", ["plural_name_normalized"], unique=False
|
||||
)
|
||||
op.add_column("ingredient_units", sa.Column("plural_name", sa.String(), nullable=True))
|
||||
op.add_column("ingredient_units", sa.Column("plural_name_normalized", sa.String(), nullable=True))
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_units_plural_name_normalized"), "ingredient_units", ["plural_name_normalized"], unique=False
|
||||
)
|
||||
op.add_column("ingredient_units", sa.Column("plural_abbreviation", sa.String(), nullable=True))
|
||||
op.add_column("ingredient_units", sa.Column("plural_abbreviation_normalized", sa.String(), nullable=True))
|
||||
op.create_index(
|
||||
op.f("ix_ingredient_units_plural_abbreviation_normalized"),
|
||||
"ingredient_units",
|
||||
["plural_abbreviation_normalized"],
|
||||
unique=False,
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_index(op.f("ix_ingredient_units_plural_abbreviation_normalized"), table_name="ingredient_units")
|
||||
op.drop_column("ingredient_units", "plural_abbreviation_normalized")
|
||||
op.drop_column("ingredient_units", "plural_abbreviation")
|
||||
op.drop_index(op.f("ix_ingredient_units_plural_name_normalized"), table_name="ingredient_units")
|
||||
op.drop_column("ingredient_units", "plural_name_normalized")
|
||||
op.drop_column("ingredient_units", "plural_name")
|
||||
op.drop_index(op.f("ix_ingredient_foods_plural_name_normalized"), table_name="ingredient_foods")
|
||||
op.drop_column("ingredient_foods", "plural_name_normalized")
|
||||
op.drop_column("ingredient_foods", "plural_name")
|
||||
op.drop_index(op.f("ix_ingredient_foods_aliases_name_normalized"), table_name="ingredient_foods_aliases")
|
||||
op.drop_index(op.f("ix_ingredient_foods_aliases_created_at"), table_name="ingredient_foods_aliases")
|
||||
op.drop_table("ingredient_foods_aliases")
|
||||
op.drop_index(op.f("ix_ingredient_units_aliases_name_normalized"), table_name="ingredient_units_aliases")
|
||||
op.drop_index(op.f("ix_ingredient_units_aliases_created_at"), table_name="ingredient_units_aliases")
|
||||
op.drop_table("ingredient_units_aliases")
|
||||
# ### end Alembic commands ###
|
||||
@@ -55,3 +55,20 @@ th {
|
||||
.md-button {
|
||||
padding: 0.2rem 0.75rem !important;
|
||||
}
|
||||
|
||||
.announce-left {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.announce-left > a {
|
||||
color: #e0e0e0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.announce-left > a:hover {
|
||||
color: var(--md-primary-fg-color);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
57
docs/docs/contributors/developers-guide/maintainers.md
Normal file
57
docs/docs/contributors/developers-guide/maintainers.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# Maintainers Guide
|
||||
|
||||
This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who whish to play a bigger part in the Mealie developers community may find this helpful.
|
||||
|
||||
## Managing Issues
|
||||
|
||||
If you are working on issues, it can be helpful to understand the workflow for our repository. When an issue comes in it is tagged with the `bug` and `triage` flags. This is to indicate that they need to be reviewed by a maintainer to determine validity.
|
||||
|
||||
After you've reviered an issue it will generally move into one of two states:
|
||||
|
||||
`bug:confirmed`
|
||||
: Your were able to verify the issue and we determined we need to fix it
|
||||
|
||||
|
||||
`needs more info`
|
||||
: The orignal post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed.
|
||||
|
||||
Once you've reviewed an issue and moved it into another category, you should remove the triage label.
|
||||
|
||||
### While going through issues try to keep the following in mind
|
||||
|
||||
- It is perfectly okay to ignore an issue if it is low quality
|
||||
- You should close any issues that ignore the standard report template and request they reopen the issue using the proper template
|
||||
- You should **not** try to reproduce issues that don't have clear reproduction steps, don't have a version provided, or are generally unclear.
|
||||
- Issues that are not bugs, should likely be converted to discussions.
|
||||
|
||||
## Drafting Releases
|
||||
|
||||
### Tags
|
||||
|
||||
Mealie is published via GitHub actions to the GitHub container registry with the follow tags:
|
||||
|
||||
`ghcr.io/mealie-recipes/mealie:nightly`
|
||||
: published with every push to `mealie-next` branch - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/nightly.yml)
|
||||
|
||||
`ghcr.io/mealie-recipes/mealie:latest`
|
||||
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
|
||||
|
||||
`ghcr.io/mealie-recipes/mealie:{version}`
|
||||
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
|
||||
|
||||
!!! note
|
||||
Both the latest, and {version} tags will be the same container on the release of a new version
|
||||
|
||||
### Process
|
||||
|
||||
Because we've built all our publishing effors on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release
|
||||
|
||||
1. Navigate to the [Github Release Page](https://github.com/mealie-recipes/mealie/releases) and click the 'Draft a new release' button.
|
||||
2. Choose a tag and increment the version according to the semver specification. i.e, **major** version for breaking changes, **minor** for feature updates, and **patch** for bug fixes.
|
||||
3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to higlight this would be a great place to do it.
|
||||
4. Click the "Generate release notes" button which will pull in all the Git Commits as a changelog. For bug fix only releases this is sufficient, however if there are major features, or good quality of life improvements it's good to provide those prior to listing the full changelog.
|
||||
|
||||
!!! tip
|
||||
Don't worry about setting the version number in the container or code, it's set during the build process and uses the tag you specified when drafting a new release.
|
||||
|
||||
You can see how this is done in the [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/partial-builder.yml#L35-L37)
|
||||
@@ -6,13 +6,16 @@ You can use bookmarklets to generate a bookmark that will take your current loca
|
||||
|
||||
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions.
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
!!! note
|
||||
There is no trailing `/` at the end of the url!
|
||||
|
||||
```js
|
||||
var url = document.URL;
|
||||
var mealie = "http://localhost:8080";
|
||||
var dest = mealie + "/recipe/create/url?recipe_import_url=" + url;
|
||||
var group_slug = "home" // Change this to your group slug. You can obtain this from your URL after logging-in to Mealie
|
||||
var use_keywords= "&use_keywords=1" // Optional - use keywords from recipe - update to "" if you don't want that
|
||||
var edity = "&edit=1" // Optional - keep in edit mode - update to "" if you don't want that
|
||||
|
||||
if (mealie.slice(-1) === "/") {
|
||||
mealie = mealie.slice(0, -1)
|
||||
}
|
||||
var dest = mealie + "/g/" + group_slug + "/r/create/url?recipe_import_url=" + url + use_keywords + edity;
|
||||
window.open(dest, "_blank");
|
||||
```
|
||||
|
||||
@@ -23,9 +23,9 @@ First, click the [link](https://www.icloud.com/shortcuts/cc568d1615bc4f998789f85
|
||||
|
||||

|
||||
|
||||
Next, you need to replace `url` and `port` with the information for your mealie instance.
|
||||
Next, you need to replace `url` and `port` with the information for your Mealie instance.
|
||||
|
||||
If you have a TLD that you use, put that here with no port. If you just run local, Then, you need to put in your mealie instance IP and the port of `9926`.
|
||||
If you have a domain that you use (e.g. `https://mealie.example.com`), put that here. If you just run local, then you need to put in your Mealie instance IP and the port you use (e.g. the default is `9925`).
|
||||
|
||||
|
||||

|
||||
@@ -36,4 +36,4 @@ Finally, you need to replace the word `keyhere` with your API token. Keep the wo
|
||||
|
||||

|
||||
|
||||
You should now be able to share a website to the shortcut and have mealie grab all the necessary information!
|
||||
You should now be able to share a website to the shortcut and have Mealie grab all the necessary information!
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Mealie offers two main ways to create recipes. You can use the integrated recipe-scraper to create recipes from hundreds of websites, or you can create recipes manually using the recipe editor.
|
||||
|
||||
[Creation Demo](https://demo.mealie.io/recipe/create/url){ .md-button .md-button--primary .align-right }
|
||||
[Creation Demo](https://demo.mealie.io/g/home/r/create/url){ .md-button .md-button--primary .align-right }
|
||||
|
||||
### Importing Recipes
|
||||
|
||||
@@ -34,13 +34,13 @@ Mealie has a robust and flexible recipe organization system with a few different
|
||||
|
||||
Categories are the overarching organizer for recipes. You can assign as many categories as you'd like to a recipe, but we recommend that you try to limit the categories you assign to a recipe to one or two. This helps keep categories as focused as possible while still allowing you to find recipes that are related to each other. For example, you might assign a recipe to the category **Breakfast**, **Lunch**, **Dinner**, or **Side**.
|
||||
|
||||
[Categories Demo](https://demo.mealie.io/recipes/categories){ .md-button .md-button--primary }
|
||||
[Categories Demo](https://demo.mealie.io/g/home/recipes/categories){ .md-button .md-button--primary }
|
||||
|
||||
#### Tags
|
||||
|
||||
Tags, are nearly identical to categories in function but play a secondary role in some cases. As such, we recommend that you use tags freely to help you organize your recipes by more specific topics. For example, if a recipe can be frozen or is a great left-over meal, you could assign the tags **frozen** and **left-over** and easily filter for those at a later time.
|
||||
|
||||
[Tags Demo](https://demo.mealie.io/recipes/tags){ .md-button .md-button--primary }
|
||||
[Tags Demo](https://demo.mealie.io/g/home/recipes/tags){ .md-button .md-button--primary }
|
||||
|
||||
#### Tools
|
||||
|
||||
@@ -48,7 +48,7 @@ Tools, are another way that some users like to organize their recipes. If a reci
|
||||
|
||||
Each of the above organizers can be filtered in searches, and have their own pages where you can view all the recipes that are associated with those organizers.
|
||||
|
||||
[Tools Demo](https://demo.mealie.io/recipes/tools){ .md-button .md-button--primary }
|
||||
[Tools Demo](https://demo.mealie.io/g/home/recipes/tools){ .md-button .md-button--primary }
|
||||
|
||||
#### Cookbooks
|
||||
|
||||
@@ -60,7 +60,7 @@ Mealie also has the concept of cookbooks. These can be created inside of a group
|
||||
- Pasta Sides: Recipes that have both the **Side** category and the **Pasta** tag
|
||||
- Dessert Breads: Recipes that have both the **Bread** category and the **Dessert** tag
|
||||
|
||||
[Cookbooks Demo](https://demo.mealie.io/group/cookbooks){ .md-button .md-button--primary }
|
||||
[Cookbooks Demo](https://demo.mealie.io/g/home/cookbooks){ .md-button .md-button--primary }
|
||||
|
||||
## Meal Planning
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
# Advanced Installation
|
||||
|
||||
!!! warning "Not Required"
|
||||
|
||||
The items below are completely optional and are not required to manage or install your Mealie instance.
|
||||
|
||||
### Custom Caddy File
|
||||
|
||||
The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`.
|
||||
|
||||
```
|
||||
{
|
||||
auto_https off
|
||||
admin off
|
||||
}
|
||||
|
||||
:80 {
|
||||
@proxied path /api/* /docs /openapi.json
|
||||
|
||||
root * /app/dist
|
||||
encode gzip
|
||||
uri strip_suffix /
|
||||
|
||||
handle_path /api/recipes/image/* {
|
||||
root * /app/data/img/
|
||||
file_server
|
||||
}
|
||||
|
||||
handle @proxied {
|
||||
reverse_proxy http://127.0.0.1:9000
|
||||
}
|
||||
|
||||
handle {
|
||||
try_files {path}.html {path} /
|
||||
file_server
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Deployed without Docker
|
||||
|
||||
!!! error "Unsupported Deployment"
|
||||
|
||||
If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK) is a better place to find support.
|
||||
|
||||
Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started.
|
||||
|
||||
There are three parts to the Mealie application
|
||||
|
||||
- Frontend/Static Files
|
||||
- Backend API
|
||||
- Proxy Server
|
||||
|
||||
### Frontend/ Static Files
|
||||
|
||||
The frontend static files are generated with `npm run build`. This is done during the build process with docker. If you choose to deploy this as a system application you must do this process yourself. In the project directory run `cd frontend` to change directories into the frontend directory and run `npm install` and then `npm run build`. This will generate the static files in a `dist` folder in the frontend directory.
|
||||
|
||||
### Backend API
|
||||
|
||||
The backend API is build with Python, FastAPI, and SQLite and requires Python 3.9, and Poetry. Once the requirements are installed, in the project directory you can run the command `poetry install` to create a python virtual environment and install the python dependencies.
|
||||
|
||||
Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000`
|
||||
|
||||
### Proxy Server
|
||||
|
||||
You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests.
|
||||
|
||||
[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
|
||||
@@ -9,13 +9,12 @@
|
||||
| PUID | 911 | UserID permissions between host OS and container |
|
||||
| PGID | 911 | GroupID permissions between host OS and container |
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| DEFAULT_EMAIL | changeme@example.com | The default username for the superuser |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally. |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
| ALLOW_SIGNUP | true | Allow user sign-up without token (should match frontend env) |
|
||||
| ALLOW_SIGNUP | true | Allow user sign-up without token |
|
||||
|
||||
### Security
|
||||
|
||||
@@ -75,3 +74,24 @@ Changing the webworker settings may cause unforeseen memory leak issues with Mea
|
||||
| LDAP_ID_ATTRIBUTE | uid | The LDAP attribute that maps to the user's id |
|
||||
| LDAP_NAME_ATTRIBUTE | name | The LDAP attribute that maps to the user's name |
|
||||
| LDAP_MAIL_ATTRIBUTE | mail | The LDAP attribute that maps to the user's email |
|
||||
|
||||
### Themeing
|
||||
|
||||
Setting the following environmental variables will change the theme of the frontend. Note that the themes are the same for all users. This is a break-change when migration from v0.x.x -> 1.x.x.
|
||||
|
||||
| Variables | Default | Description |
|
||||
| --------------------- | :-----: | --------------------------- |
|
||||
| THEME_LIGHT_PRIMARY | #E58325 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_ACCENT | #007A99 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_SECONDARY | #973542 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_SUCCESS | #43A047 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_INFO | #1976D2 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_WARNING | #FF6D00 | Light Theme Config Variable |
|
||||
| THEME_LIGHT_ERROR | #EF5350 | Light Theme Config Variable |
|
||||
| THEME_DARK_PRIMARY | #E58325 | Dark Theme Config Variable |
|
||||
| THEME_DARK_ACCENT | #007A99 | Dark Theme Config Variable |
|
||||
| THEME_DARK_SECONDARY | #973542 | Dark Theme Config Variable |
|
||||
| THEME_DARK_SUCCESS | #43A047 | Dark Theme Config Variable |
|
||||
| THEME_DARK_INFO | #1976D2 | Dark Theme Config Variable |
|
||||
| THEME_DARK_WARNING | #FF6D00 | Dark Theme Config Variable |
|
||||
| THEME_DARK_ERROR | #EF5350 | Dark Theme Config Variable |
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
To install Mealie on your server there are a few steps for proper configuration. Let's go through them.
|
||||
|
||||
!!! tip TLDR
|
||||
|
||||
Don't need step by step? Checkout the
|
||||
|
||||
- [SQLite docker-compose](./sqlite.md)
|
||||
- [Postgres docker-compose](./postgres.md)
|
||||
- [Single container docker-compose](./single-container.md)
|
||||
|
||||
## Pre-work
|
||||
|
||||
@@ -22,22 +22,23 @@ To deploy mealie on your local network it is highly recommended to use docker to
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
|
||||
|
||||
!!! warning "32bit Support"
|
||||
|
||||
Due to a build dependency limitation, Mealie is not supported on 32bit ARM systems. If you're running into this limitation on a newer Raspberry Pi, please consider upgrading to a 64bit operating system on the Raspberry Pi.
|
||||
|
||||
## Migrating From over V1 Versions
|
||||
## Migrating From Other V1 Versions
|
||||
|
||||
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers *or* the omni image) to the new nightly, there are a few things you need to do:
|
||||
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
||||
|
||||
1. Take a backup just in case!
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:nightly`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1`
|
||||
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
|
||||
4. Restart the container
|
||||
|
||||
For an example of what these changes look like, see the new [SQLite](./sqlite.md) or [PostgreSQL](./postgres.md) docker-compose examples. The container swap should be seemless, at least that's our hope!
|
||||
|
||||
## Step 1: Deployment Type
|
||||
|
||||
SQLite is a popular, open source, self-contained, zero-configuration database that is the ideal choice for Mealie when you have 1-20 Users and your concurrent write operations will be some-what limited.
|
||||
|
||||
PostgreSQL might be considered if you need to support many concurrent users. In addition, some features are only enabled on PostgreSQL, such as fuzzy search.
|
||||
@@ -51,15 +52,14 @@ You can find the relevant ready to use docker-compose files for supported instal
|
||||
|
||||
The following steps were tested on a Ubuntu 20.04 server, but should work for most other Linux distributions. These steps are not required, but is how I generally will setup services on my server.
|
||||
|
||||
|
||||
1. SSH into your server and navigate to the home directory of the user you want to run Mealie as. If that is your current user, you can use `cd ~` to ensure you're in the right directory.
|
||||
2. Create a directory called `docker` and navigate into it: `mkdir docker && cd docker` (this is optional, if you organizer your docker installs separate from everything else)
|
||||
3. Do the same for mealie: `mkdir mealie && cd mealie`
|
||||
4. Create a docker-compose.yaml file in the mealie directory: `touch docker-compose.yaml`
|
||||
5. Use the text editor or your choice to edit the file and copy the contents of the docker-compose template for the deployment type you want to use: `nano docker-compose.yaml` or `vi docker-compose.yaml`
|
||||
|
||||
|
||||
## Step 2: Customizing The `docker-compose.yaml` files.
|
||||
|
||||
After you've decided setup the files it's important to set a few ENV variables to ensure that you can use all the features of Mealie. I recommend that you verify and check that:
|
||||
|
||||
- [x] You've configured the relevant ENV variables for your database selection in the `docker-compose.yaml` files.
|
||||
@@ -68,6 +68,7 @@ After you've decided setup the files it's important to set a few ENV variables t
|
||||
- [x] You've set the `DEFAULT_EMAIL` and `DEFAULT_GROUP` variable.
|
||||
|
||||
## Step 3: Startup
|
||||
|
||||
After you've configured your database, and updated the `docker-compose.yaml` files, you can start Mealie by running the following command in the directory where you've added your `docker-compose.yaml`.
|
||||
|
||||
```bash
|
||||
@@ -91,6 +92,7 @@ You should see the containers start up without error. You should now be able to
|
||||
After the startup is complete you should see a login screen. Use the default credentials above to login and navigate to `/admin/site-settings`. Here you'll find a summary of your configuration details and their respective status. Before proceeding you should validate that the configuration is correct. For any warnings or errors the page will display an error and notify you of what you need to verify.
|
||||
|
||||
## Step 5: Backup
|
||||
|
||||
While v1.0.0 is a great step to data-stability and security, it's not a backup. Mealie provides a full site data backup mechanism through the UI.
|
||||
|
||||
These backups are just plain .zip files that you can download from the UI or access via the mounted volume on your system. For complete data protection you MUST store these backups somewhere safe, and outside of the server where they are deployed.
|
||||
@@ -99,10 +101,22 @@ These backups are just plain .zip files that you can download from the UI or acc
|
||||
|
||||
### Docker Tags
|
||||
|
||||
See all available tags on [GitHub](https://github.com/mealie-recipes/mealie/pkgs/container/mealie). We do not currently publish new images to Dockerhub.
|
||||
|
||||
`ghcr.io/mealie-recipes/mealie:nightly`
|
||||
|
||||
The nightly build are the latest and greatest builds that are built directly off of every commit to the `mealie-next` branch and as such may contain bugs. These are great to help the community catch bugs before they hit the stable release or if you like living on the edge.
|
||||
|
||||
`ghrc.io/mealie-recipes/mealie:<version>`
|
||||
|
||||
We also provide versioned containers that allow to pin to a specific release. Each time a new release is built a new tag will be pushed with the version. These are great to pin to a specific version and allows you to have absolute control on when you upgrade your container.
|
||||
|
||||
`ghrc.io/mealie-recipes/mealie:latest`
|
||||
|
||||
_Note: This tag is not yet available, it will be available with the v1 stable release_
|
||||
|
||||
The latest tag provides the latest released image of Mealie.
|
||||
|
||||
---
|
||||
|
||||
**These tags no are long updated**
|
||||
|
||||
@@ -11,7 +11,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
version: "3.7"
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:nightly
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1
|
||||
container_name: mealie
|
||||
ports:
|
||||
- "9925:9000"
|
||||
|
||||
@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||
version: "3.7"
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:nightly
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1
|
||||
container_name: mealie
|
||||
ports:
|
||||
- "9925:9000" # (1)
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
# About The Project
|
||||
|
||||
!!! warning "Mealie v1 Beta Release"
|
||||
|
||||
This documentation is for the Mealie v1 Beta release and is not final. As such, it may contain incomplete or incorrect information. You should understand that installing Mealie v1 Beta is a work in progress and while we've committed to maintaining the database schema and provided migrations, we are still in the process of adding new features, and robust testing to ensure the application works as expected.
|
||||
|
||||
You should likely find bugs, errors, and unfinished pages within the application. To find the current status of the release you can checkout the [project on github](https://github.com/hay-kot/mealie/projects/7) or reach out on discord.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
[Remember to join the Discord](https://discord.gg/QuStdQGSGK)
|
||||
|
||||
|
||||
## Key Features
|
||||
|
||||
- 🔍 Smart search, mix & match of "quoted literal searches" and keyword search. Fuzzy search ("is it brocolli or broccoli?") is also available when using a Postgres database.
|
||||
- 🏷️ Tag recipes with categories or tags for flexible sorting
|
||||
- 🕸 Import recipes from around the web by URL
|
||||
@@ -20,32 +20,35 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
|
||||
- 🛒 Generate shopping lists
|
||||
- 🐳 Easy setup with Docker
|
||||
- 🎨 Customize your interface with color themed layouts
|
||||
- 💾 Export all your data in any format with Jinja2 Templates, with easy data restoration from the user interface.
|
||||
- 🌍 localized in many languages
|
||||
- ➕ Plus tons more!
|
||||
- Flexible API
|
||||
- Custom key/value pairs for recipes
|
||||
- Webhook support
|
||||
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
|
||||
- Raw JSON Recipe Editor
|
||||
- Migration from other platforms
|
||||
- Chowdown
|
||||
- Nextcloud Cookbook
|
||||
- Random meal plan generation
|
||||
- Flexible API
|
||||
- Custom key/value pairs for recipes
|
||||
- Webhook support
|
||||
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
|
||||
- Raw JSON Recipe Editor
|
||||
- Migration from other platforms
|
||||
- Chowdown
|
||||
- Nextcloud Cookbook
|
||||
- Copy Me That
|
||||
- Paprika
|
||||
- Tandoor Recipes
|
||||
- Random meal plan generation
|
||||
- Advanced rule configuration to fine tune random recipes
|
||||
|
||||
## FAQ
|
||||
See the [Frequently Asked Questions page](./faq.md)
|
||||
|
||||
See the [Frequently Asked Questions page](./faq.md)
|
||||
|
||||
## Built With
|
||||
|
||||
* [Vue.js](https://vuejs.org/)
|
||||
* [Vuetify](https://vuetifyjs.com/en/)
|
||||
* [FastAPI](https://fastapi.tiangolo.com/)
|
||||
* [Docker](https://www.docker.com/)
|
||||
|
||||
- [Vue.js](https://vuejs.org/)
|
||||
- [Vuetify](https://vuetifyjs.com/en/)
|
||||
- [FastAPI](https://fastapi.tiangolo.com/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
|
||||
<!-- CONTRIBUTING -->
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are what make the open source community such an amazing place to learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Development Road Map
|
||||
|
||||
## Feature Requests
|
||||
[Please request new features on Github](https://github.com/hay-kot/mealie/issues/317)
|
||||
[Please request new features on Github](https://github.com/mealie-recipes/mealie/discussions/new?category=feature-request)
|
||||
|
||||
## Progress
|
||||
See the [Github Projects page](https://github.com/users/hay-kot/projects/2) to see what is currently being worked on
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,8 +1,8 @@
|
||||
{% extends "base.html" %} {% block analytics %}
|
||||
<script
|
||||
async
|
||||
defer
|
||||
data-domain="hay-kot.github.io/mealie"
|
||||
src="https://plausible.io/js/plausible.js"
|
||||
></script>
|
||||
{% extends "base.html" %}
|
||||
{% block announce %}
|
||||
<div class="announce-left">
|
||||
<a href="https://recipinned.com">
|
||||
Looking for a hosted solution? Explore Recipinned from the creator of Mealie
|
||||
</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -65,7 +65,6 @@ nav:
|
||||
- FAQ: "documentation/getting-started/faq.md"
|
||||
- API: "documentation/getting-started/api-usage.md"
|
||||
- Road Map: "documentation/getting-started/roadmap.md"
|
||||
- Advanced: "documentation/getting-started/installation/advanced.md"
|
||||
|
||||
- Installation:
|
||||
- Installation Checklist: "documentation/getting-started/installation/installation-checklist.md"
|
||||
@@ -91,6 +90,7 @@ nav:
|
||||
- Developers Guide:
|
||||
- Code Contributions: "contributors/developers-guide/code-contributions.md"
|
||||
- Dev Getting Started: "contributors/developers-guide/starting-dev-server.md"
|
||||
- Maintainers Guide: "contributors/developers-guide/maintainers.md"
|
||||
- Guides:
|
||||
- Improving Ingredient Parser: "contributors/guides/ingredient-parser.md"
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
.layout-leave-active {
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.layout-enter,
|
||||
.layout-leave-active {
|
||||
opacity: 0;
|
||||
@@ -16,15 +17,15 @@
|
||||
}
|
||||
|
||||
.theme--dark.v-application {
|
||||
background-color: var(--v-background-base, #121212) !important;
|
||||
background-color: var(--v-background-base, #1e1e1e) !important;
|
||||
}
|
||||
|
||||
.theme--dark.v-navigation-drawer {
|
||||
background-color: var(--v-background-base, #121212) !important;
|
||||
background-color: var(--v-background-base, #1e1e1e) !important;
|
||||
}
|
||||
|
||||
.theme--dark.v-card {
|
||||
background-color: #2b2b2b !important;
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
|
||||
.left-border {
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
class="mb-5 mx-1"
|
||||
:recipes="recipes"
|
||||
:query="{ cookbook: slug }"
|
||||
:group-slug="groupSlug"
|
||||
@sortRecipes="assignSorted"
|
||||
@replaceRecipes="replaceRecipes"
|
||||
@appendRecipes="appendRecipes"
|
||||
@@ -30,24 +29,20 @@
|
||||
import { useLazyRecipes } from "~/composables/recipes";
|
||||
import RecipeCardSection from "@/components/Domain/Recipe/RecipeCardSection.vue";
|
||||
import { useCookbook } from "~/composables/use-group-cookbooks";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
|
||||
export default defineComponent({
|
||||
components: { RecipeCardSection },
|
||||
props: {
|
||||
groupSlug: {
|
||||
type: String,
|
||||
default: undefined,
|
||||
}
|
||||
},
|
||||
setup(props) {
|
||||
setup() {
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => $auth.loggedIn);
|
||||
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(loggedIn.value ? null : props.groupSlug);
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||
const slug = route.value.params.slug;
|
||||
const { getOne } = useCookbook(loggedIn.value ? null : props.groupSlug);
|
||||
const { getOne } = useCookbook(isOwnGroup.value ? null : groupSlug.value);
|
||||
|
||||
const tab = ref(null);
|
||||
const book = getOne(slug);
|
||||
|
||||
145
frontend/components/Domain/Group/GroupMealPlanDayContextMenu.vue
Normal file
145
frontend/components/Domain/Group/GroupMealPlanDayContextMenu.vue
Normal file
@@ -0,0 +1,145 @@
|
||||
<template>
|
||||
<div class="text-center">
|
||||
<RecipeDialogAddToShoppingList
|
||||
v-if="shoppingLists"
|
||||
v-model="shoppingListDialog"
|
||||
:recipes="recipesWithScales"
|
||||
:shopping-lists="shoppingLists"
|
||||
/>
|
||||
<v-menu
|
||||
offset-y
|
||||
left
|
||||
:bottom="!menuTop"
|
||||
:nudge-bottom="!menuTop ? '5' : '0'"
|
||||
:top="menuTop"
|
||||
:nudge-top="menuTop ? '5' : '0'"
|
||||
allow-overflow
|
||||
close-delay="125"
|
||||
:open-on-hover="$vuetify.breakpoint.mdAndUp"
|
||||
content-class="d-print-none"
|
||||
>
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent>
|
||||
<v-icon>{{ icon }}</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list dense>
|
||||
<v-list-item v-for="(item, index) in menuItems" :key="index" @click="contextMenuEventHandler(item.event)">
|
||||
<v-list-item-icon>
|
||||
<v-icon :color="item.color"> {{ item.icon }} </v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.title }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, ref, toRefs, useContext } from "@nuxtjs/composition-api";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
import RecipeDialogAddToShoppingList from "~/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
|
||||
export interface ContextMenuItem {
|
||||
title: string;
|
||||
icon: string;
|
||||
color: string | undefined;
|
||||
event: string;
|
||||
isPublic: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeDialogAddToShoppingList,
|
||||
},
|
||||
props: {
|
||||
recipes: {
|
||||
type: Array as () => Recipe[],
|
||||
default: () => [],
|
||||
},
|
||||
menuTop: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
fab: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
default: "primary",
|
||||
},
|
||||
menuIcon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { $globals, i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
shoppingListDialog: false,
|
||||
menuItems: [
|
||||
{
|
||||
title: i18n.tc("recipe.add-to-list"),
|
||||
icon: $globals.icons.cartCheck,
|
||||
color: undefined,
|
||||
event: "shoppingList",
|
||||
isPublic: false,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const icon = props.menuIcon || $globals.icons.dotsVertical;
|
||||
|
||||
const shoppingLists = ref<ShoppingListSummary[]>();
|
||||
const recipesWithScales = computed(() => {
|
||||
return props.recipes.map((recipe) => {
|
||||
return {
|
||||
scale: 1,
|
||||
...recipe,
|
||||
};
|
||||
})
|
||||
})
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
if (data) {
|
||||
shoppingLists.value = data.items ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
const eventHandlers: { [key: string]: () => void | Promise<any> } = {
|
||||
shoppingList: () => {
|
||||
getShoppingLists();
|
||||
state.shoppingListDialog = true;
|
||||
},
|
||||
};
|
||||
|
||||
function contextMenuEventHandler(eventKey: string) {
|
||||
const handler = eventHandlers[eventKey];
|
||||
|
||||
if (handler && typeof handler === "function") {
|
||||
handler();
|
||||
state.loading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
context.emit(eventKey);
|
||||
state.loading = false;
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
contextMenuEventHandler,
|
||||
icon,
|
||||
recipesWithScales,
|
||||
shoppingLists,
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
@@ -70,7 +70,6 @@
|
||||
print: true,
|
||||
printPreferences: true,
|
||||
share: loggedIn,
|
||||
publicUrl: recipe.settings && loggedIn ? recipe.settings.public : false,
|
||||
}"
|
||||
@print="$emit('print')"
|
||||
/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div v-if="value.length > 0 || edit">
|
||||
<v-card class="mt-2">
|
||||
<v-card class="mt-4">
|
||||
<v-card-title class="py-2">
|
||||
{{ $t("asset.assets") }}
|
||||
</v-card-title>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
<slot name="actions">
|
||||
<v-card-actions class="px-1">
|
||||
<RecipeFavoriteBadge v-if="loggedIn" class="absolute" :slug="slug" show-always />
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup" class="absolute" :slug="slug" show-always />
|
||||
|
||||
<RecipeRating class="pb-1" :value="rating" :name="name" :slug="slug" :small="true" />
|
||||
<v-spacer></v-spacer>
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
<!-- If we're not logged-in, no items display, so we hide this menu -->
|
||||
<RecipeContextMenu
|
||||
v-if="loggedIn"
|
||||
v-if="isOwnGroup"
|
||||
color="grey darken-2"
|
||||
:slug="slug"
|
||||
:name="name"
|
||||
@@ -56,7 +56,6 @@
|
||||
print: false,
|
||||
printPreferences: false,
|
||||
share: true,
|
||||
publicUrl: false,
|
||||
}"
|
||||
@delete="$emit('delete', slug)"
|
||||
/>
|
||||
@@ -69,12 +68,13 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import RecipeFavoriteBadge from "./RecipeFavoriteBadge.vue";
|
||||
import RecipeChips from "./RecipeChips.vue";
|
||||
import RecipeContextMenu from "./RecipeContextMenu.vue";
|
||||
import RecipeCardImage from "./RecipeCardImage.vue";
|
||||
import RecipeRating from "./RecipeRating.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
|
||||
export default defineComponent({
|
||||
components: { RecipeFavoriteBadge, RecipeChips, RecipeContextMenu, RecipeRating, RecipeCardImage },
|
||||
@@ -83,10 +83,6 @@ export default defineComponent({
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
groupSlug: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
slug: {
|
||||
type: String,
|
||||
required: true,
|
||||
@@ -124,16 +120,16 @@ export default defineComponent({
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
const recipeRoute = computed<string>(() => {
|
||||
return loggedIn.value ? `/recipe/${props.slug}` : `/explore/recipes/${props.groupSlug}/${props.slug}`;
|
||||
return `/g/${groupSlug.value}/r/${props.slug}`;
|
||||
});
|
||||
|
||||
return {
|
||||
loggedIn,
|
||||
isOwnGroup,
|
||||
recipeRoute,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
</v-list-item-subtitle>
|
||||
<div class="d-flex flex-wrap justify-end align-center">
|
||||
<slot name="actions">
|
||||
<RecipeFavoriteBadge v-if="loggedIn" :slug="slug" show-always />
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup" :slug="slug" show-always />
|
||||
<v-rating
|
||||
color="secondary"
|
||||
:class="loggedIn ? 'ml-auto' : 'ml-auto pb-2'"
|
||||
:class="isOwnGroup ? 'ml-auto' : 'ml-auto pb-2'"
|
||||
background-color="secondary lighten-3"
|
||||
dense
|
||||
length="5"
|
||||
@@ -52,7 +52,7 @@
|
||||
<!-- If we're not logged-in, no items display, so we hide this menu -->
|
||||
<!-- We also add padding to the v-rating above to compensate -->
|
||||
<RecipeContextMenu
|
||||
v-if="loggedIn"
|
||||
v-if="isOwnGroup"
|
||||
:slug="slug"
|
||||
:menu-icon="$globals.icons.dotsHorizontal"
|
||||
:name="name"
|
||||
@@ -66,7 +66,6 @@
|
||||
print: false,
|
||||
printPreferences: false,
|
||||
share: true,
|
||||
publicUrl: false,
|
||||
}"
|
||||
@deleted="$emit('delete', slug)"
|
||||
/>
|
||||
@@ -80,10 +79,11 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import RecipeFavoriteBadge from "./RecipeFavoriteBadge.vue";
|
||||
import RecipeContextMenu from "./RecipeContextMenu.vue";
|
||||
import RecipeCardImage from "./RecipeCardImage.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -96,10 +96,6 @@ export default defineComponent({
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
groupSlug: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
slug: {
|
||||
type: String,
|
||||
required: true,
|
||||
@@ -136,16 +132,16 @@ export default defineComponent({
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
const recipeRoute = computed<string>(() => {
|
||||
return loggedIn.value ? `/recipe/${props.slug}` : `/explore/recipes/${props.groupSlug}/${props.slug}`;
|
||||
return `/g/${groupSlug.value}/r/${props.slug}`;
|
||||
});
|
||||
|
||||
return {
|
||||
loggedIn,
|
||||
isOwnGroup,
|
||||
recipeRoute,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -76,7 +76,6 @@
|
||||
<RecipeCard
|
||||
:name="recipe.name"
|
||||
:description="recipe.description"
|
||||
:group-slug="groupSlug"
|
||||
:slug="recipe.slug"
|
||||
:rating="recipe.rating"
|
||||
:image="recipe.image"
|
||||
@@ -100,7 +99,6 @@
|
||||
<RecipeCardMobile
|
||||
:name="recipe.name"
|
||||
:description="recipe.description"
|
||||
:group-slug="groupSlug"
|
||||
:slug="recipe.slug"
|
||||
:rating="recipe.rating"
|
||||
:image="recipe.image"
|
||||
@@ -128,12 +126,14 @@ import {
|
||||
toRefs,
|
||||
useAsync,
|
||||
useContext,
|
||||
useRoute,
|
||||
useRouter,
|
||||
watch,
|
||||
} from "@nuxtjs/composition-api";
|
||||
import { useThrottleFn } from "@vueuse/core";
|
||||
import RecipeCard from "./RecipeCard.vue";
|
||||
import RecipeCardMobile from "./RecipeCardMobile.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useAsyncKey } from "~/composables/use-utils";
|
||||
import { useLazyRecipes } from "~/composables/recipes";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
@@ -165,10 +165,6 @@ export default defineComponent({
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
groupSlug: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
recipes: {
|
||||
type: Array as () => Recipe[],
|
||||
default: () => [],
|
||||
@@ -191,9 +187,7 @@ export default defineComponent({
|
||||
};
|
||||
|
||||
const { $auth, $globals, $vuetify } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const useMobileCards = computed(() => {
|
||||
return $vuetify.breakpoint.smAndDown || preferences.value.useMobileCards;
|
||||
});
|
||||
@@ -206,12 +200,15 @@ export default defineComponent({
|
||||
sortLoading: false,
|
||||
});
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const router = useRouter();
|
||||
function navigateRandom() {
|
||||
if (props.recipes.length > 0) {
|
||||
const recipe = props.recipes[Math.floor(Math.random() * props.recipes.length)];
|
||||
if (recipe.slug !== undefined) {
|
||||
router.push(loggedIn.value ? `/recipe/${recipe.slug}` : `/explore/recipes/${props.groupSlug}/${recipe.slug}`);
|
||||
router.push(`/g/${groupSlug.value}/r/${recipe.slug}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -222,7 +219,7 @@ export default defineComponent({
|
||||
const ready = ref(false);
|
||||
const loading = ref(false);
|
||||
|
||||
const { fetchMore } = useLazyRecipes(loggedIn.value ? null : props.groupSlug);
|
||||
const { fetchMore } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||
|
||||
const queryFilter = computed(() => {
|
||||
const orderBy = props.query?.orderBy || preferences.value.orderBy;
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
color="accent"
|
||||
:small="small"
|
||||
dark
|
||||
:to=" loggedIn ? `/?${urlPrefix}=${category.id}` : undefined"
|
||||
:to="isOwnGroup ? `${baseRecipeRoute}?${urlPrefix}=${category.id}` : undefined"
|
||||
>
|
||||
{{ truncateText(category.name) }}
|
||||
</v-chip>
|
||||
@@ -17,7 +17,8 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/user";
|
||||
|
||||
export type UrlPrefixParam = "tags" | "categories" | "tools";
|
||||
@@ -55,9 +56,13 @@ export default defineComponent({
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn
|
||||
})
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
const baseRecipeRoute = computed<string>(() => {
|
||||
return `/g/${groupSlug.value}`
|
||||
});
|
||||
|
||||
function truncateText(text: string, length = 20, clamp = "...") {
|
||||
if (!props.truncate) return text;
|
||||
@@ -68,7 +73,8 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
return {
|
||||
loggedIn,
|
||||
baseRecipeRoute,
|
||||
isOwnGroup,
|
||||
truncateText,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -69,77 +69,12 @@
|
||||
></v-select>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog v-model="shoppingListDialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingLists"
|
||||
:key="list.id"
|
||||
hover
|
||||
class="my-2 left-border"
|
||||
@click="openShoppingListIngredientDialog(list)"
|
||||
>
|
||||
<v-card-title class="py-2">
|
||||
{{ list.name }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog
|
||||
v-model="shoppingListIngredientDialog"
|
||||
:title="selectedShoppingList ? selectedShoppingList.name : $t('recipe.add-to-list')"
|
||||
:icon="$globals.icons.cartCheck"
|
||||
width="70%"
|
||||
:submit-text="$tc('recipe.add-to-list')"
|
||||
@submit="addRecipeToList()"
|
||||
>
|
||||
<v-card
|
||||
elevation="0"
|
||||
height="fit-content"
|
||||
max-height="60vh"
|
||||
width="100%"
|
||||
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
||||
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(recipeIngredients.length / 2)}, min-content)` }"
|
||||
style="overflow-y: auto"
|
||||
>
|
||||
<v-list-item
|
||||
v-for="(ingredientData, i) in recipeIngredients"
|
||||
:key="'ingredient' + i"
|
||||
dense
|
||||
@click="recipeIngredients[i].checked = !recipeIngredients[i].checked"
|
||||
>
|
||||
<v-checkbox
|
||||
hide-details
|
||||
:input-value="ingredientData.checked"
|
||||
class="pt-0 my-auto py-auto"
|
||||
color="secondary"
|
||||
/>
|
||||
<v-list-item-content :key="ingredientData.ingredient.quantity">
|
||||
<RecipeIngredientListItem
|
||||
:ingredient="ingredientData.ingredient"
|
||||
:disable-amount="ingredientData.disableAmount"
|
||||
:scale="recipeScale" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
</v-card>
|
||||
<div class="d-flex justify-end mb-4 mt-2">
|
||||
<BaseButtonGroup
|
||||
:buttons="[
|
||||
{
|
||||
icon: $globals.icons.checkboxBlankOutline,
|
||||
text: $tc('shopping-list.uncheck-all-items'),
|
||||
event: 'uncheck',
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.checkboxOutline,
|
||||
text: $tc('shopping-list.check-all-items'),
|
||||
event: 'check',
|
||||
},
|
||||
]"
|
||||
@uncheck="bulkCheckIngredients(false)"
|
||||
@check="bulkCheckIngredients(true)"
|
||||
/>
|
||||
</div>
|
||||
</BaseDialog>
|
||||
<RecipeDialogAddToShoppingList
|
||||
v-if="shoppingLists && recipeRefWithScale"
|
||||
v-model="shoppingListDialog"
|
||||
:recipes="[recipeRefWithScale]"
|
||||
:shopping-lists="shoppingLists"
|
||||
/>
|
||||
<v-menu
|
||||
offset-y
|
||||
left
|
||||
@@ -170,18 +105,18 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, toRefs, useContext, useRouter, ref } from "@nuxtjs/composition-api";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import { computed, defineComponent, reactive, toRefs, useContext, useRoute, useRouter, ref } from "@nuxtjs/composition-api";
|
||||
import RecipeDialogAddToShoppingList from "./RecipeDialogAddToShoppingList.vue";
|
||||
import RecipeDialogPrintPreferences from "./RecipeDialogPrintPreferences.vue";
|
||||
import RecipeDialogShare from "./RecipeDialogShare.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { usePlanTypeOptions } from "~/composables/use-group-mealplan";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { PlanEntryType } from "~/lib/api/types/meal-plan";
|
||||
import { useAxiosDownloader } from "~/composables/api/use-axios-download";
|
||||
import { useCopy } from "~/composables/use-copy";
|
||||
|
||||
export interface ContextMenuIncludes {
|
||||
delete: boolean;
|
||||
@@ -192,7 +127,6 @@ export interface ContextMenuIncludes {
|
||||
print: boolean;
|
||||
printPreferences: boolean;
|
||||
share: boolean;
|
||||
publicUrl: boolean;
|
||||
}
|
||||
|
||||
export interface ContextMenuItem {
|
||||
@@ -205,9 +139,9 @@ export interface ContextMenuItem {
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeDialogAddToShoppingList,
|
||||
RecipeDialogPrintPreferences,
|
||||
RecipeDialogShare,
|
||||
RecipeIngredientListItem
|
||||
},
|
||||
props: {
|
||||
useItems: {
|
||||
@@ -222,7 +156,6 @@ export default defineComponent({
|
||||
print: true,
|
||||
printPreferences: true,
|
||||
share: true,
|
||||
publicUrl: false,
|
||||
}),
|
||||
},
|
||||
// Append items are added at the end of the useItems list
|
||||
@@ -281,7 +214,6 @@ export default defineComponent({
|
||||
recipeDeleteDialog: false,
|
||||
mealplannerDialog: false,
|
||||
shoppingListDialog: false,
|
||||
shoppingListIngredientDialog: false,
|
||||
recipeDuplicateDialog: false,
|
||||
recipeName: props.name,
|
||||
loading: false,
|
||||
@@ -291,10 +223,11 @@ export default defineComponent({
|
||||
pickerMenu: false,
|
||||
});
|
||||
|
||||
const { $auth, i18n, $globals } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { i18n, $auth, $globals } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
// ===========================================================================
|
||||
// Context Menu Setup
|
||||
@@ -363,26 +296,19 @@ export default defineComponent({
|
||||
event: "share",
|
||||
isPublic: false,
|
||||
},
|
||||
publicUrl: {
|
||||
title: i18n.tc("recipe.public-link"),
|
||||
icon: $globals.icons.contentCopy,
|
||||
color: undefined,
|
||||
event: "publicUrl",
|
||||
isPublic: true,
|
||||
},
|
||||
};
|
||||
|
||||
// Get Default Menu Items Specified in Props
|
||||
for (const [key, value] of Object.entries(props.useItems)) {
|
||||
if (value) {
|
||||
const item = defaultItems[key];
|
||||
if (item && (item.isPublic || loggedIn.value)) {
|
||||
if (item && (item.isPublic || isOwnGroup.value)) {
|
||||
state.menuItems.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add leading and Apppending Items
|
||||
// Add leading and Appending Items
|
||||
state.menuItems = [...state.menuItems, ...props.leadingItems, ...props.appendItems];
|
||||
|
||||
const icon = props.menuIcon || $globals.icons.dotsVertical;
|
||||
@@ -391,9 +317,8 @@ export default defineComponent({
|
||||
// Context Menu Event Handler
|
||||
|
||||
const shoppingLists = ref<ShoppingListSummary[]>();
|
||||
const selectedShoppingList = ref<ShoppingListSummary>();
|
||||
const recipeRef = ref<Recipe>(props.recipe);
|
||||
const recipeIngredients = ref<{ checked: boolean; ingredient: RecipeIngredient, disableAmount: boolean }[]>([]);
|
||||
const recipeRefWithScale = computed(() => recipeRef.value ? { scale: props.recipeScale, ...recipeRef.value } : undefined);
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
@@ -409,61 +334,6 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
async function openShoppingListIngredientDialog(list: ShoppingListSummary) {
|
||||
selectedShoppingList.value = list;
|
||||
if (!recipeRef.value) {
|
||||
await refreshRecipe();
|
||||
}
|
||||
|
||||
if (recipeRef.value?.recipeIngredient) {
|
||||
recipeIngredients.value = recipeRef.value.recipeIngredient.map((ingredient) => {
|
||||
return {
|
||||
checked: true,
|
||||
ingredient,
|
||||
disableAmount: recipeRef.value.settings?.disableAmount || false
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = true;
|
||||
}
|
||||
|
||||
function bulkCheckIngredients(value = true) {
|
||||
recipeIngredients.value.forEach((data) => {
|
||||
data.checked = value;
|
||||
});
|
||||
}
|
||||
|
||||
async function addRecipeToList() {
|
||||
if (!selectedShoppingList.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const ingredients: RecipeIngredient[] = [];
|
||||
recipeIngredients.value.forEach((data) => {
|
||||
if (data.checked) {
|
||||
ingredients.push(data.ingredient);
|
||||
}
|
||||
});
|
||||
|
||||
if (!ingredients.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.shopping.lists.addRecipe(
|
||||
selectedShoppingList.value.id,
|
||||
props.recipeId,
|
||||
props.recipeScale,
|
||||
ingredients
|
||||
);
|
||||
if (data) {
|
||||
alert.success(i18n.t("recipe.recipe-added-to-list") as string);
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
}
|
||||
}
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
async function deleteRecipe() {
|
||||
@@ -500,24 +370,7 @@ export default defineComponent({
|
||||
async function duplicateRecipe() {
|
||||
const { data } = await api.recipes.duplicateOne(props.slug, state.recipeName);
|
||||
if (data && data.slug) {
|
||||
router.push(`/recipe/${data.slug}`);
|
||||
}
|
||||
}
|
||||
|
||||
const { copyText } = useCopy();
|
||||
const groupSlug = ref<string>("");
|
||||
|
||||
async function setGroupSlug() {
|
||||
if (groupSlug.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.users.getSelfGroup();
|
||||
if (data) {
|
||||
groupSlug.value = data.slug;
|
||||
} else {
|
||||
// @ts-ignore this will either be a string or undefined
|
||||
groupSlug.value = $auth.user?.groupId
|
||||
router.push(`/g/${groupSlug.value}/r/${data.slug}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -526,7 +379,7 @@ export default defineComponent({
|
||||
delete: () => {
|
||||
state.recipeDeleteDialog = true;
|
||||
},
|
||||
edit: () => router.push(`/recipe/${props.slug}` + "?edit=true"),
|
||||
edit: () => router.push(`/g/${groupSlug.value}/r/${props.slug}` + "?edit=true"),
|
||||
download: handleDownloadEvent,
|
||||
duplicate: () => {
|
||||
state.recipeDuplicateDialog = true;
|
||||
@@ -541,22 +394,16 @@ export default defineComponent({
|
||||
state.printPreferencesDialog = true;
|
||||
},
|
||||
shoppingList: () => {
|
||||
getShoppingLists();
|
||||
const promises: Promise<void>[] = [getShoppingLists()];
|
||||
if (!recipeRef.value) {
|
||||
promises.push(refreshRecipe());
|
||||
}
|
||||
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
Promise.allSettled(promises).then(() => { state.shoppingListDialog = true });
|
||||
},
|
||||
share: () => {
|
||||
state.shareDialog = true;
|
||||
},
|
||||
publicUrl: async () => {
|
||||
await setGroupSlug();
|
||||
if (!groupSlug.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
copyText(`${window.location.origin}/explore/recipes/${groupSlug.value}/${props.slug}`);
|
||||
},
|
||||
};
|
||||
|
||||
function contextMenuEventHandler(eventKey: string) {
|
||||
@@ -577,28 +424,15 @@ export default defineComponent({
|
||||
return {
|
||||
...toRefs(state),
|
||||
recipeRef,
|
||||
recipeRefWithScale,
|
||||
shoppingLists,
|
||||
selectedShoppingList,
|
||||
openShoppingListIngredientDialog,
|
||||
addRecipeToList,
|
||||
bulkCheckIngredients,
|
||||
duplicateRecipe,
|
||||
contextMenuEventHandler,
|
||||
deleteRecipe,
|
||||
addRecipeToPlan,
|
||||
icon,
|
||||
planTypeOptions,
|
||||
recipeIngredients,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="css">
|
||||
.ingredient-grid {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
<template>
|
||||
<div>
|
||||
<BaseDialog
|
||||
v-model="dialog"
|
||||
:title="$t('data-pages.manage-aliases')"
|
||||
:icon="$globals.icons.edit"
|
||||
:submit-icon="$globals.icons.check"
|
||||
:submit-text="$tc('general.confirm')"
|
||||
@submit="saveAliases"
|
||||
@cancel="$emit('cancel')"
|
||||
>
|
||||
<v-card-text>
|
||||
<v-container>
|
||||
<v-row v-for="alias, i in aliases" :key="i">
|
||||
<v-col cols="10">
|
||||
<v-text-field
|
||||
v-model="alias.name"
|
||||
:label="$t('general.name')"
|
||||
:rules="[validators.required]"
|
||||
/>
|
||||
</v-col>
|
||||
<v-col cols="2">
|
||||
<BaseButtonGroup
|
||||
:buttons="[
|
||||
{
|
||||
icon: $globals.icons.delete,
|
||||
text: $tc('general.delete'),
|
||||
event: 'delete'
|
||||
}
|
||||
]"
|
||||
@delete="deleteAlias(i)"
|
||||
/>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card-text>
|
||||
<template #custom-card-action>
|
||||
<BaseButton edit @click="createAlias">{{ $t('data-pages.create-alias') }}
|
||||
<template #icon>
|
||||
{{ $globals.icons.create }}
|
||||
</template>
|
||||
</BaseButton>
|
||||
</template>
|
||||
</BaseDialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref } from "@nuxtjs/composition-api";
|
||||
import { whenever } from "@vueuse/core";
|
||||
import { validators } from "~/composables/use-validators";
|
||||
import { IngredientFood, IngredientUnit } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface GenericAlias {
|
||||
name: string;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
data: {
|
||||
type: Object as () => IngredientFood | IngredientUnit,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
// V-Model Support
|
||||
const dialog = computed({
|
||||
get: () => {
|
||||
return props.value;
|
||||
},
|
||||
set: (val) => {
|
||||
context.emit("input", val);
|
||||
},
|
||||
});
|
||||
|
||||
function createAlias() {
|
||||
aliases.value.push({
|
||||
"name": "",
|
||||
})
|
||||
}
|
||||
|
||||
function deleteAlias(index: number) {
|
||||
aliases.value.splice(index, 1);
|
||||
}
|
||||
|
||||
const aliases = ref<GenericAlias[]>(props.data.aliases || []);
|
||||
function initAliases() {
|
||||
aliases.value = [...props.data.aliases || []];
|
||||
if (!aliases.value.length) {
|
||||
createAlias();
|
||||
}
|
||||
}
|
||||
|
||||
initAliases();
|
||||
whenever(
|
||||
() => props.value,
|
||||
() => {
|
||||
initAliases();
|
||||
},
|
||||
)
|
||||
|
||||
function saveAliases() {
|
||||
const seenAliasNames: string[] = [];
|
||||
const keepAliases: GenericAlias[] = [];
|
||||
aliases.value.forEach((alias) => {
|
||||
if (
|
||||
!alias.name
|
||||
|| alias.name === props.data.name
|
||||
|| alias.name === props.data.pluralName
|
||||
// @ts-ignore only applies to units
|
||||
|| alias.name === props.data.abbreviation
|
||||
// @ts-ignore only applies to units
|
||||
|| alias.name === props.data.pluralAbbreviation
|
||||
|| seenAliasNames.includes(alias.name)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
keepAliases.push(alias);
|
||||
seenAliasNames.push(alias.name);
|
||||
})
|
||||
|
||||
aliases.value = keepAliases;
|
||||
context.emit("submit", keepAliases);
|
||||
}
|
||||
|
||||
return {
|
||||
aliases,
|
||||
createAlias,
|
||||
dialog,
|
||||
deleteAlias,
|
||||
saveAliases,
|
||||
validators,
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -18,7 +18,7 @@
|
||||
</tr>
|
||||
</template>
|
||||
<template #item.name="{ item }">
|
||||
<a :href="`/recipe/${item.slug}`" style="color: inherit; text-decoration: inherit; " @click="$emit('click')">{{ item.name }}</a>
|
||||
<a :href="`/r/${item.slug}`" style="color: inherit; text-decoration: inherit; " @click="$emit('click')">{{ item.name }}</a>
|
||||
</template>
|
||||
<template #item.tags="{ item }">
|
||||
<RecipeChip small :items="item.tags" :is-category="false" url-prefix="tags" />
|
||||
|
||||
@@ -0,0 +1,303 @@
|
||||
<template>
|
||||
<div v-if="dialog">
|
||||
<BaseDialog v-if="shoppingListDialog" v-model="dialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingLists"
|
||||
:key="list.id"
|
||||
hover
|
||||
class="my-2 left-border"
|
||||
@click="openShoppingListIngredientDialog(list)"
|
||||
>
|
||||
<v-card-title class="py-2">
|
||||
{{ list.name }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
<BaseDialog
|
||||
v-if="shoppingListIngredientDialog"
|
||||
v-model="dialog"
|
||||
:title="selectedShoppingList ? selectedShoppingList.name : $t('recipe.add-to-list')"
|
||||
:icon="$globals.icons.cartCheck"
|
||||
width="70%"
|
||||
:submit-text="$tc('recipe.add-to-list')"
|
||||
@submit="addRecipesToList()"
|
||||
>
|
||||
<div style="max-height: 70vh; overflow-y: auto">
|
||||
<v-card
|
||||
v-for="(section, sectionIndex) in recipeIngredientSections" :key="section.recipeId + sectionIndex"
|
||||
elevation="0"
|
||||
height="fit-content"
|
||||
width="100%"
|
||||
>
|
||||
<v-divider v-if="sectionIndex > 0" class="mt-3" />
|
||||
<v-card-title
|
||||
v-if="recipeIngredientSections.length > 1"
|
||||
class="justify-center"
|
||||
width="100%"
|
||||
>
|
||||
<v-container style="width: 100%;">
|
||||
<v-row no-gutters class="ma-0 pa-0">
|
||||
<v-col cols="12" align-self="center" class="text-center">
|
||||
{{ section.recipeName }}
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row v-if="section.recipeScale > 1" no-gutters class="ma-0 pa-0">
|
||||
<!-- TODO: make this editable in the dialog and visible on single-recipe lists -->
|
||||
<v-col cols="12" align-self="center" class="text-center">
|
||||
({{ $tc("recipe.quantity") }}: {{ section.recipeScale }})
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-card-title>
|
||||
<div
|
||||
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
||||
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(section.ingredients.length / 2)}, min-content)` }"
|
||||
>
|
||||
<v-list-item
|
||||
v-for="(ingredientData, i) in section.ingredients"
|
||||
:key="'ingredient' + i"
|
||||
dense
|
||||
@click="recipeIngredientSections[sectionIndex].ingredients[i].checked = !recipeIngredientSections[sectionIndex].ingredients[i].checked"
|
||||
>
|
||||
<v-checkbox
|
||||
hide-details
|
||||
:input-value="ingredientData.checked"
|
||||
class="pt-0 my-auto py-auto"
|
||||
color="secondary"
|
||||
/>
|
||||
<v-list-item-content :key="ingredientData.ingredient.quantity">
|
||||
<RecipeIngredientListItem
|
||||
:ingredient="ingredientData.ingredient"
|
||||
:disable-amount="ingredientData.disableAmount"
|
||||
:scale="section.recipeScale" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
</div>
|
||||
</v-card>
|
||||
</div>
|
||||
<div class="d-flex justify-end mb-4 mt-2">
|
||||
<BaseButtonGroup
|
||||
:buttons="[
|
||||
{
|
||||
icon: $globals.icons.checkboxBlankOutline,
|
||||
text: $tc('shopping-list.uncheck-all-items'),
|
||||
event: 'uncheck',
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.checkboxOutline,
|
||||
text: $tc('shopping-list.check-all-items'),
|
||||
event: 'check',
|
||||
},
|
||||
]"
|
||||
@uncheck="bulkCheckIngredients(false)"
|
||||
@check="bulkCheckIngredients(true)"
|
||||
/>
|
||||
</div>
|
||||
</BaseDialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { toRefs } from "@vueuse/core";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface RecipeWithScale extends Recipe {
|
||||
scale: number;
|
||||
}
|
||||
|
||||
export interface ShoppingListRecipeIngredient {
|
||||
checked: boolean;
|
||||
ingredient: RecipeIngredient;
|
||||
disableAmount: boolean;
|
||||
}
|
||||
|
||||
export interface ShoppingListRecipeIngredientSection {
|
||||
recipeId: string;
|
||||
recipeName: string;
|
||||
recipeScale: number;
|
||||
ingredients: ShoppingListRecipeIngredient[];
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
RecipeIngredientListItem,
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
recipes: {
|
||||
type: Array as () => RecipeWithScale[],
|
||||
default: undefined,
|
||||
},
|
||||
shoppingLists: {
|
||||
type: Array as () => ShoppingListSummary[],
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
|
||||
// v-model support
|
||||
const dialog = computed({
|
||||
get: () => {
|
||||
return props.value;
|
||||
},
|
||||
set: (val) => {
|
||||
context.emit("input", val);
|
||||
initState();
|
||||
},
|
||||
});
|
||||
|
||||
const state = reactive({
|
||||
shoppingListDialog: true,
|
||||
shoppingListIngredientDialog: false,
|
||||
});
|
||||
|
||||
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
|
||||
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
|
||||
|
||||
async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
const recipeSectionMap = new Map<string, ShoppingListRecipeIngredientSection>();
|
||||
for (const recipe of recipes) {
|
||||
if (!recipe.slug) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (recipeSectionMap.has(recipe.slug)) {
|
||||
// @ts-ignore not undefined, see above
|
||||
recipeSectionMap.get(recipe.slug).recipeScale += recipe.scale;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(recipe.id && recipe.name && recipe.recipeIngredient)) {
|
||||
const { data } = await api.recipes.getOne(recipe.slug);
|
||||
if (!data?.recipeIngredient?.length) {
|
||||
continue;
|
||||
}
|
||||
recipe.id = data.id || "";
|
||||
recipe.name = data.name || "";
|
||||
recipe.recipeIngredient = data.recipeIngredient;
|
||||
} else if (!recipe.recipeIngredient.length) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const shoppingListIngredients: ShoppingListRecipeIngredient[] = recipe.recipeIngredient.map((ing) => {
|
||||
return {
|
||||
checked: true,
|
||||
ingredient: ing,
|
||||
disableAmount: recipe.settings?.disableAmount || false,
|
||||
}
|
||||
});
|
||||
|
||||
recipeSectionMap.set(recipe.slug, {
|
||||
recipeId: recipe.id,
|
||||
recipeName: recipe.name,
|
||||
recipeScale: recipe.scale,
|
||||
ingredients: shoppingListIngredients,
|
||||
})
|
||||
}
|
||||
|
||||
recipeIngredientSections.value = Array.from(recipeSectionMap.values());
|
||||
}
|
||||
|
||||
function initState() {
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
recipeIngredientSections.value = [];
|
||||
selectedShoppingList.value = null;
|
||||
}
|
||||
|
||||
initState();
|
||||
|
||||
async function openShoppingListIngredientDialog(list: ShoppingListSummary) {
|
||||
if (!props.recipes?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
selectedShoppingList.value = list;
|
||||
await consolidateRecipesIntoSections(props.recipes);
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = true;
|
||||
}
|
||||
|
||||
function bulkCheckIngredients(value = true) {
|
||||
recipeIngredientSections.value.forEach((section) => {
|
||||
section.ingredients.forEach((ing) => {
|
||||
ing.checked = value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function addRecipesToList() {
|
||||
const promises: Promise<any>[] = [];
|
||||
recipeIngredientSections.value.forEach((section) => {
|
||||
if (!selectedShoppingList.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const ingredients: RecipeIngredient[] = [];
|
||||
section.ingredients.forEach((ing) => {
|
||||
if (ing.checked) {
|
||||
ingredients.push(ing.ingredient);
|
||||
}
|
||||
});
|
||||
|
||||
if (!ingredients.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
promises.push(api.shopping.lists.addRecipe(
|
||||
selectedShoppingList.value.id,
|
||||
section.recipeId,
|
||||
section.recipeScale,
|
||||
ingredients,
|
||||
));
|
||||
});
|
||||
|
||||
let success = true;
|
||||
const results = await Promise.allSettled(promises);
|
||||
results.forEach((result) => {
|
||||
if (result.status === "rejected") {
|
||||
success = false;
|
||||
}
|
||||
})
|
||||
|
||||
success ? alert.success(i18n.t("recipe.recipes-added-to-list") as string)
|
||||
: alert.error(i18n.t("failed-to-add-recipes-to-list") as string)
|
||||
|
||||
state.shoppingListDialog = false;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
dialog.value = false;
|
||||
}
|
||||
|
||||
return {
|
||||
dialog,
|
||||
...toRefs(state),
|
||||
addRecipesToList,
|
||||
bulkCheckIngredients,
|
||||
openShoppingListIngredientDialog,
|
||||
recipeIngredientSections,
|
||||
selectedShoppingList,
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="css">
|
||||
.ingredient-grid {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
@@ -31,7 +31,7 @@
|
||||
<div class="mr-auto">
|
||||
{{ $t("search.results") }}
|
||||
</div>
|
||||
<router-link to="/"> {{ $t("search.advanced-search") }} </router-link>
|
||||
<router-link :to="advancedSearchUrl"> {{ $t("search.advanced-search") }} </router-link>
|
||||
</v-card-actions>
|
||||
|
||||
<RecipeCardMobile
|
||||
@@ -54,11 +54,13 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, toRefs, reactive, ref, watch, useRoute } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, toRefs, reactive, ref, watch, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import RecipeCardMobile from "./RecipeCardMobile.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { RecipeSummary } from "~/lib/api/types/recipe";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { useRecipeSearch } from "~/composables/recipes/use-recipe-search";
|
||||
import { usePublicExploreApi } from "~/composables/api/api-client";
|
||||
const SELECTED_EVENT = "selected";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -66,6 +68,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
setup(_, context) {
|
||||
const { $auth } = useContext();
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
selectedIndex: -1,
|
||||
@@ -128,7 +131,9 @@ export default defineComponent({
|
||||
}
|
||||
});
|
||||
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const route = useRoute();
|
||||
const advancedSearchUrl = computed(() => `/g/${groupSlug.value}`)
|
||||
watch(route, close);
|
||||
|
||||
function open() {
|
||||
@@ -140,7 +145,8 @@ export default defineComponent({
|
||||
|
||||
// ===========================================================================
|
||||
// Basic Search
|
||||
const api = useUserApi();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const api = isOwnGroup.value ? useUserApi() : usePublicExploreApi(groupSlug.value).explore;
|
||||
const search = useRecipeSearch(api);
|
||||
|
||||
// Select Handler
|
||||
@@ -152,6 +158,7 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
advancedSearchUrl,
|
||||
dialog,
|
||||
open,
|
||||
close,
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, computed, toRefs, reactive, useContext } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, computed, toRefs, reactive, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useClipboard, useShare, whenever } from "@vueuse/core";
|
||||
import { RecipeShareToken } from "~/lib/api/types/recipe";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
@@ -105,6 +105,10 @@ export default defineComponent({
|
||||
}
|
||||
);
|
||||
|
||||
const { $auth, i18n } = useContext();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
// ============================================================
|
||||
// Token Actions
|
||||
|
||||
@@ -138,7 +142,6 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
const { i18n } = useContext();
|
||||
const { share, isSupported: shareIsSupported } = useShare();
|
||||
const { copy } = useClipboard();
|
||||
|
||||
@@ -147,7 +150,7 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
function getTokenLink(token: string) {
|
||||
return `${window.location.origin}/shared/recipes/${token}`;
|
||||
return `${window.location.origin}/g/${groupSlug.value}/shared/r/${token}`;
|
||||
}
|
||||
|
||||
async function copyTokenLink(token: string) {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
:items="categories"
|
||||
>
|
||||
<v-icon left>
|
||||
{{ $globals.icons.tags }}
|
||||
{{ $globals.icons.categories }}
|
||||
</v-icon>
|
||||
{{ $t("category.categories") }}
|
||||
</SearchFilter>
|
||||
@@ -40,7 +40,7 @@
|
||||
<!-- Tool Filter -->
|
||||
<SearchFilter v-if="tools" v-model="selectedTools" :require-all.sync="state.requireAllTools" :items="tools">
|
||||
<v-icon left>
|
||||
{{ $globals.icons.tools }}
|
||||
{{ $globals.icons.potSteam }}
|
||||
</v-icon>
|
||||
{{ $t("tool.tools") }}
|
||||
</SearchFilter>
|
||||
@@ -123,7 +123,6 @@
|
||||
class="mt-n5"
|
||||
:icon="$globals.icons.search"
|
||||
:title="$tc('search.results')"
|
||||
:group-slug="groupSlug"
|
||||
:recipes="recipes"
|
||||
:query="passedQuery"
|
||||
@replaceRecipes="replaceRecipes"
|
||||
@@ -134,9 +133,10 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { ref, defineComponent, useRouter, onMounted, useContext, computed, Ref } from "@nuxtjs/composition-api";
|
||||
import { ref, defineComponent, useRouter, onMounted, useContext, computed, Ref, useRoute } from "@nuxtjs/composition-api";
|
||||
import { watchDebounced } from "@vueuse/shared";
|
||||
import SearchFilter from "~/components/Domain/SearchFilter.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useCategoryStore, useFoodStore, useTagStore, useToolStore } from "~/composables/store";
|
||||
import RecipeCardSection from "~/components/Domain/Recipe/RecipeCardSection.vue";
|
||||
import { IngredientFood, RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/recipe";
|
||||
@@ -150,19 +150,11 @@ import { usePublicToolStore } from "~/composables/store/use-tool-store";
|
||||
|
||||
export default defineComponent({
|
||||
components: { SearchFilter, RecipeCardSection },
|
||||
props: {
|
||||
groupSlug: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const { $auth, $globals, i18n } = useContext();
|
||||
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const state = ref({
|
||||
auto: true,
|
||||
search: "",
|
||||
@@ -176,17 +168,20 @@ export default defineComponent({
|
||||
requireAllFoods: false,
|
||||
});
|
||||
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(loggedIn.value ? null : props.groupSlug);
|
||||
const categories = loggedIn.value ? useCategoryStore() : usePublicCategoryStore(props.groupSlug);
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||
const categories = isOwnGroup.value ? useCategoryStore() : usePublicCategoryStore(groupSlug.value);
|
||||
const selectedCategories = ref<NoUndefinedField<RecipeCategory>[]>([]);
|
||||
|
||||
const foods = loggedIn.value ? useFoodStore() : usePublicFoodStore(props.groupSlug);
|
||||
const foods = isOwnGroup.value ? useFoodStore() : usePublicFoodStore(groupSlug.value);
|
||||
const selectedFoods = ref<IngredientFood[]>([]);
|
||||
|
||||
const tags = loggedIn.value ? useTagStore() : usePublicTagStore(props.groupSlug);
|
||||
const tags = isOwnGroup.value ? useTagStore() : usePublicTagStore(groupSlug.value);
|
||||
const selectedTags = ref<NoUndefinedField<RecipeTag>[]>([]);
|
||||
|
||||
const tools = loggedIn.value ? useToolStore() : usePublicToolStore(props.groupSlug);
|
||||
const tools = isOwnGroup.value ? useToolStore() : usePublicToolStore(groupSlug.value);
|
||||
const selectedTools = ref<NoUndefinedField<RecipeTool>[]>([]);
|
||||
|
||||
const passedQuery = ref<RecipeSearchQuery | null>(null);
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
solo
|
||||
hide-details
|
||||
dense
|
||||
class="mx-1"
|
||||
type="number"
|
||||
:placeholder="$t('recipe.quantity')"
|
||||
@keypress="quantityFilter"
|
||||
@@ -89,7 +88,6 @@
|
||||
hide-details
|
||||
dense
|
||||
solo
|
||||
class="mx-1"
|
||||
:placeholder="$t('recipe.notes')"
|
||||
@click="$emit('clickIngredientField', 'note')"
|
||||
>
|
||||
@@ -100,7 +98,7 @@
|
||||
<BaseButtonGroup
|
||||
hover
|
||||
:large="false"
|
||||
class="my-auto"
|
||||
class="my-auto d-flex"
|
||||
:buttons="btns"
|
||||
@toggle-section="toggleTitle"
|
||||
@toggle-original="toggleOriginalText"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
:class="attrs.class.sheet"
|
||||
:style="tile ? 'max-width: 100%; width: fit-content;' : 'width: 100%;'"
|
||||
>
|
||||
<v-list-item :to="'/recipe/' + recipe.slug" :class="attrs.class.listItem">
|
||||
<v-list-item :to="'/g/' + groupSlug + '/r/' + recipe.slug" :class="attrs.class.listItem">
|
||||
<v-list-item-avatar :class="attrs.class.avatar">
|
||||
<v-icon :class="attrs.class.icon" dark :small="small"> {{ $globals.icons.primary }} </v-icon>
|
||||
</v-list-item-avatar>
|
||||
@@ -28,7 +28,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import DOMPurify from "dompurify";
|
||||
import { useFraction } from "~/composables/recipes/use-fraction";
|
||||
import { ShoppingListItemOut } from "~/lib/api/types/group";
|
||||
@@ -58,7 +58,10 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const { frac } = useFraction();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const attrs = computed(() => {
|
||||
return props.small ? {
|
||||
@@ -150,6 +153,7 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
attrs,
|
||||
groupSlug,
|
||||
listItemDescriptions,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, onMounted, reactive, toRefs, useRouter } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, ref, onMounted, reactive, toRefs, useContext, useRouter, computed, useRoute } from "@nuxtjs/composition-api";
|
||||
import { until } from "@vueuse/core";
|
||||
import { invoke } from "@vueuse/shared";
|
||||
import draggable from "vuedraggable";
|
||||
@@ -179,6 +179,10 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const router = useRouter();
|
||||
const api = useUserApi();
|
||||
|
||||
@@ -186,6 +190,8 @@ export default defineComponent({
|
||||
|
||||
const drag = ref(false);
|
||||
|
||||
const { i18n } = useContext();
|
||||
|
||||
const { recipeAssetPath } = useStaticRoutes();
|
||||
|
||||
function assetURL(assetName: string) {
|
||||
@@ -194,7 +200,7 @@ export default defineComponent({
|
||||
|
||||
const state = reactive({
|
||||
loading: true,
|
||||
loadingText: "Loading recipe...",
|
||||
loadingText: i18n.tc("general.loading-recipe"),
|
||||
tab: null,
|
||||
selectedRecipeField: "" as SelectedRecipeLeaves | "",
|
||||
canvasSelectedText: "",
|
||||
@@ -256,7 +262,7 @@ export default defineComponent({
|
||||
onMounted(() => {
|
||||
invoke(async () => {
|
||||
await until(props.recipe).not.toBeNull();
|
||||
state.loadingText = "Loading OCR data...";
|
||||
state.loadingText = i18n.tc("general.loading-ocr-data");
|
||||
|
||||
const assetName = props.recipe.assets[0].fileName;
|
||||
const imagesrc = assetURL(assetName);
|
||||
@@ -328,12 +334,12 @@ export default defineComponent({
|
||||
async function updateRecipe() {
|
||||
const { data } = await api.recipes.updateOne(props.recipe.slug, props.recipe);
|
||||
if (data?.slug) {
|
||||
router.push("/recipe/" + data.slug);
|
||||
router.push(`/g/${groupSlug.value}/r/${data.slug}`);
|
||||
}
|
||||
}
|
||||
|
||||
function closeEditor() {
|
||||
router.push("/recipe/" + props.recipe.slug);
|
||||
router.push(`/g/${groupSlug.value}/r/${props.recipe.slug}`);
|
||||
}
|
||||
|
||||
const canvasSetText = function () {
|
||||
|
||||
@@ -379,7 +379,7 @@ export default defineComponent({
|
||||
|
||||
const toolbarIcons = ref<ToolbarIcons<CanvasModes | SelectedTextSplitModes>>([
|
||||
{
|
||||
sectionTitle: "Toolbar",
|
||||
sectionTitle: i18n.tc("ocr-editor.toolbar"),
|
||||
eventHandler: switchCanvasMode,
|
||||
highlight: state.canvasMode,
|
||||
icons: [
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
<v-icon large left>
|
||||
{{ $globals.icons.help }}
|
||||
</v-icon>
|
||||
<v-toolbar-title class="headline"> Help </v-toolbar-title>
|
||||
<v-toolbar-title class="headline"> {{ $t("ocr-editor.help.help") }} </v-toolbar-title>
|
||||
<v-spacer></v-spacer>
|
||||
</v-app-bar>
|
||||
<v-card-text>
|
||||
<h1>Mouse modes</h1>
|
||||
<h1> {{ $t("ocr-editor.help.mouse-modes") }}</h1>
|
||||
<v-divider class="mb-2 mt-1" />
|
||||
<h2 class="my-2">
|
||||
<v-icon> {{ $globals.icons.selectMode }} </v-icon>{{ $t("ocr-editor.help.selection-mode") }}
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
<v-card>
|
||||
<v-app-bar dense dark color="primary mb-2">
|
||||
<v-icon large left class="mt-1">
|
||||
{{ itemType === Organizer.Tool ? $globals.icons.potSteam : $globals.icons.tags }}
|
||||
{{ itemType === Organizer.Tool ? $globals.icons.potSteam :
|
||||
itemType === Organizer.Category ? $globals.icons.categories :
|
||||
$globals.icons.tags }}
|
||||
</v-icon>
|
||||
|
||||
<v-toolbar-title class="headline">
|
||||
@@ -129,8 +131,8 @@ export default defineComponent({
|
||||
|
||||
async function select() {
|
||||
if (store) {
|
||||
// @ts-ignore - only property really required is the name
|
||||
await store.actions.createOne({ name: state.name });
|
||||
// @ts-expect-error the same state is used for different organizer types, which have different requirements
|
||||
await store.actions.createOne({ ...state });
|
||||
}
|
||||
|
||||
const newItem = store.items.value.find((item) => item.name === state.name);
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
|
||||
<BaseDialog v-if="updateTarget" v-model="dialogs.update" :title="$t('general.update')" @confirm="updateOne()">
|
||||
<v-card-text>
|
||||
<v-text-field v-model="updateTarget.name" label="Name"> </v-text-field>
|
||||
<v-text-field v-model="updateTarget.name" label="$t('general.name')"> </v-text-field>
|
||||
<v-checkbox v-if="itemType === Organizer.Tool" v-model="updateTarget.onHand" :label="$t('tool.on-hand')"></v-checkbox>
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
|
||||
@@ -48,7 +49,7 @@
|
||||
<BaseCardSectionTitle v-if="isTitle(key)" :title="key" />
|
||||
<v-row>
|
||||
<v-col v-for="(item, index) in itms" :key="'cat' + index" cols="12" :sm="12" :md="6" :lg="4" :xl="3">
|
||||
<v-card v-if="item" class="left-border" hover :to="`/?${itemType}=${item.id}`">
|
||||
<v-card v-if="item" class="left-border" hover :to="`/g/${groupSlug}?${itemType}=${item.id}`">
|
||||
<v-card-actions>
|
||||
<v-icon>
|
||||
{{ icon }}
|
||||
@@ -72,10 +73,10 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Fuse from "fuse.js";
|
||||
import { defineComponent, computed, ref, reactive } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, computed, ref, reactive, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useContextPresets } from "~/composables/use-context-presents";
|
||||
import RecipeOrganizerDialog from "~/components/Domain/Recipe/RecipeOrganizerDialog.vue";
|
||||
import { RecipeOrganizer } from "~/lib/api/types/non-generated";
|
||||
import { Organizer, RecipeOrganizer } from "~/lib/api/types/non-generated";
|
||||
import { useRouteQuery } from "~/composables/use-router";
|
||||
import { deepCopy } from "~/composables/use-utils";
|
||||
|
||||
@@ -83,6 +84,7 @@ interface GenericItem {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
onHand: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
@@ -119,6 +121,10 @@ export default defineComponent({
|
||||
},
|
||||
});
|
||||
|
||||
const { $auth } = useContext();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
// =================================================================
|
||||
// Context Menu
|
||||
|
||||
@@ -204,6 +210,7 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
return {
|
||||
groupSlug,
|
||||
isTitle,
|
||||
dialogs,
|
||||
confirmDelete,
|
||||
@@ -212,6 +219,7 @@ export default defineComponent({
|
||||
updateTarget,
|
||||
deleteOne,
|
||||
deleteTarget,
|
||||
Organizer,
|
||||
presets,
|
||||
itemsSorted,
|
||||
searchString,
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
deletable-chips
|
||||
item-text="name"
|
||||
multiple
|
||||
:prepend-inner-icon="selectorType === Organizer.Tool ? $globals.icons.potSteam : $globals.icons.tags"
|
||||
:prepend-inner-icon="selectorType === Organizer.Tool ? $globals.icons.potSteam :
|
||||
selectorType === Organizer.Category ? $globals.icons.categories :
|
||||
$globals.icons.tags"
|
||||
return-object
|
||||
v-bind="inputAttrs"
|
||||
>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
</div>
|
||||
|
||||
<RecipePageComments
|
||||
v-if="user.id && !recipe.settings.disableComments && !isEditForm && !isCookMode"
|
||||
v-if="isOwnGroup && !recipe.settings.disableComments && !isEditForm && !isCookMode"
|
||||
:recipe="recipe"
|
||||
class="px-1 my-4 d-print-none"
|
||||
/>
|
||||
@@ -89,6 +89,7 @@ import {
|
||||
ref,
|
||||
onMounted,
|
||||
onUnmounted,
|
||||
useRoute,
|
||||
} from "@nuxtjs/composition-api";
|
||||
import { invoke, until, useWakeLock } from "@vueuse/core";
|
||||
import RecipePageEditorToolbar from "./RecipePageParts/RecipePageEditorToolbar.vue";
|
||||
@@ -101,6 +102,7 @@ import RecipePageOrganizers from "./RecipePageParts/RecipePageOrganizers.vue";
|
||||
import RecipePageScale from "./RecipePageParts/RecipePageScale.vue";
|
||||
import RecipePageTitleContent from "./RecipePageParts/RecipePageTitleContent.vue";
|
||||
import RecipePageComments from "./RecipePageParts/RecipePageComments.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import RecipePrintContainer from "~/components/Domain/Recipe/RecipePrintContainer.vue";
|
||||
import { EditorMode, PageMode, usePageState, usePageUser } from "~/composables/recipe-page/shared-state";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
@@ -140,6 +142,11 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const router = useRouter();
|
||||
const api = useUserApi();
|
||||
const { pageMode, editMode, setMode, isEditForm, isEditJSON, isCookMode, isEditMode, toggleCookMode } =
|
||||
@@ -161,8 +168,8 @@ export default defineComponent({
|
||||
const isSame = JSON.stringify(props.recipe) === JSON.stringify(originalRecipe.value);
|
||||
if (isEditMode.value && !isSame && props.recipe?.slug !== undefined) {
|
||||
const save = window.confirm(
|
||||
"You have unsaved changes. Do you want to save before leaving?\n\nOkay to save, Cancel to discard changes."
|
||||
);
|
||||
i18n.tc("general.unsaved-changes"),
|
||||
);
|
||||
|
||||
if (save) {
|
||||
await api.recipes.updateOne(props.recipe.slug, props.recipe);
|
||||
@@ -226,21 +233,21 @@ export default defineComponent({
|
||||
const { data } = await api.recipes.updateOne(props.recipe.slug, props.recipe);
|
||||
setMode(PageMode.VIEW);
|
||||
if (data?.slug) {
|
||||
router.push("/recipe/" + data.slug);
|
||||
router.push(`/g/${groupSlug.value}/r/` + data.slug);
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteRecipe() {
|
||||
const { data } = await api.recipes.deleteOne(props.recipe.slug);
|
||||
if (data?.slug) {
|
||||
router.push("/");
|
||||
router.push(`/g/${groupSlug.value}`);
|
||||
}
|
||||
}
|
||||
|
||||
/** =============================================================
|
||||
* View Preferences
|
||||
*/
|
||||
const { $vuetify } = useContext();
|
||||
const { $vuetify, i18n } = useContext();
|
||||
|
||||
const landscape = computed(() => {
|
||||
const preferLandscape = props.recipe.settings.landscapeView;
|
||||
@@ -283,6 +290,7 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
user,
|
||||
isOwnGroup,
|
||||
api,
|
||||
scale: ref(1),
|
||||
EDITOR_OPTIONS,
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<v-card outlined class="flex-grow-1">
|
||||
<v-card-text class="pa-3 pb-0">
|
||||
<p class="">{{ comment.user.username }} • {{ $d(Date.parse(comment.createdAt), "medium") }}</p>
|
||||
{{ comment.text }}
|
||||
<SafeMarkdown :source="comment.text" />
|
||||
</v-card-text>
|
||||
<v-card-actions class="justify-end mt-0 pt-0">
|
||||
<v-btn
|
||||
@@ -60,11 +60,13 @@ import { Recipe, RecipeCommentOut } from "~/lib/api/types/recipe";
|
||||
import UserAvatar from "~/components/Domain/User/UserAvatar.vue";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
import { usePageUser } from "~/composables/recipe-page/shared-state";
|
||||
import SafeMarkdown from "~/components/global/SafeMarkdown.vue";
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
UserAvatar,
|
||||
},
|
||||
SafeMarkdown
|
||||
},
|
||||
props: {
|
||||
recipe: {
|
||||
type: Object as () => NoUndefinedField<Recipe>,
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
<AdvancedOnly>
|
||||
<v-card v-if="isEditForm" flat class="ma-2 mb-2">
|
||||
<v-card v-if="isEditForm" flat class="mb-2 mx-n2">
|
||||
<v-card-title> {{ $t('recipe.api-extras') }} </v-card-title>
|
||||
<v-divider class="mx-2"></v-divider>
|
||||
<v-divider class="ml-4"></v-divider>
|
||||
<v-card-text>
|
||||
{{ $t('recipe.api-extras-description') }}
|
||||
<v-row v-for="(_, key) in recipe.extras" :key="key" class="mt-1">
|
||||
<v-col cols="8">
|
||||
<v-col style="max-width: 400px;">
|
||||
<v-text-field v-model="recipe.extras[key]" dense :label="key">
|
||||
<template #prepend>
|
||||
<v-btn color="error" icon class="mt-n4" @click="removeApiExtra(key)">
|
||||
@@ -41,8 +41,8 @@
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
<v-card-actions class="d-flex">
|
||||
<div style="max-width: 200px">
|
||||
<v-card-actions class="d-flex ml-2 mt-n3">
|
||||
<div>
|
||||
<v-text-field v-model="apiNewKey" :label="$t('recipe.message-key')"></v-text-field>
|
||||
</div>
|
||||
<BaseButton create small class="ml-5" @click="createApiExtra" />
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<v-divider class="my-2"></v-divider>
|
||||
<SafeMarkdown :source="recipe.description" />
|
||||
<v-divider></v-divider>
|
||||
<div v-if="user.id" class="d-flex justify-center mt-5">
|
||||
<div v-if="isOwnGroup" class="d-flex justify-center mt-5">
|
||||
<RecipeLastMade
|
||||
v-model="recipe.lastMade"
|
||||
:recipe="recipe"
|
||||
@@ -45,9 +45,9 @@
|
||||
:recipe="recipe"
|
||||
:slug="recipe.slug"
|
||||
:recipe-scale="recipeScale"
|
||||
:locked="user.id !== recipe.userId && recipe.settings.locked"
|
||||
:locked="isOwnGroup && user.id !== recipe.userId && recipe.settings.locked"
|
||||
:name="recipe.name"
|
||||
:logged-in="$auth.loggedIn"
|
||||
:logged-in="isOwnGroup"
|
||||
:open="isEditMode"
|
||||
:recipe-id="recipe.id"
|
||||
:show-ocr-button="recipe.isOcrRecipe"
|
||||
@@ -64,7 +64,8 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, useContext, computed, ref, watch, useRouter } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, useContext, computed, ref, watch, useRouter, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import RecipeRating from "~/components/Domain/Recipe/RecipeRating.vue";
|
||||
import RecipeLastMade from "~/components/Domain/Recipe/RecipeLastMade.vue";
|
||||
import RecipeActionMenu from "~/components/Domain/Recipe/RecipeActionMenu.vue";
|
||||
@@ -95,17 +96,20 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth, $vuetify } = useContext();
|
||||
const { recipeImage } = useStaticRoutes();
|
||||
const { imageKey, pageMode, editMode, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug);
|
||||
const { user } = usePageUser();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const router = useRouter();
|
||||
|
||||
function printRecipe() {
|
||||
window.print();
|
||||
}
|
||||
|
||||
const { $vuetify } = useContext();
|
||||
|
||||
const hideImage = ref(false);
|
||||
const imageHeight = computed(() => {
|
||||
return $vuetify.breakpoint.xs ? "200" : "400";
|
||||
@@ -116,7 +120,7 @@ export default defineComponent({
|
||||
});
|
||||
|
||||
function goToOcrEditor() {
|
||||
router.push("/recipe/" + props.recipe.slug + "/ocr-editor");
|
||||
router.push(`/g/${groupSlug.value}/r/${props.recipe.slug}/ocr-editor`);
|
||||
}
|
||||
|
||||
watch(
|
||||
@@ -127,6 +131,7 @@ export default defineComponent({
|
||||
);
|
||||
|
||||
return {
|
||||
isOwnGroup,
|
||||
setMode,
|
||||
toggleEditMode,
|
||||
recipeImage,
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
</TransitionGroup>
|
||||
</draggable>
|
||||
<v-skeleton-loader v-else boilerplate elevation="2" type="list-item"> </v-skeleton-loader>
|
||||
<div class="d-flex flex-wrap justify-center justify-sm-end mt-2">
|
||||
<div class="d-flex flex-wrap justify-center justify-sm-end mt-3">
|
||||
<v-tooltip top color="accent">
|
||||
<template #activator="{ on, attrs }">
|
||||
<span v-on="on">
|
||||
@@ -34,7 +34,7 @@
|
||||
class="mb-1"
|
||||
:disabled="recipe.settings.disableAmount || hasFoodOrUnit"
|
||||
color="accent"
|
||||
:to="`${recipe.slug}/ingredient-parser`"
|
||||
:to="`/g/${groupSlug}/r/${recipe.slug}/ingredient-parser`"
|
||||
v-bind="attrs"
|
||||
>
|
||||
<template #icon>
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import draggable from "vuedraggable";
|
||||
import { computed, defineComponent, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { usePageState, usePageUser } from "~/composables/recipe-page/shared-state";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
@@ -76,10 +76,13 @@ export default defineComponent({
|
||||
setup(props) {
|
||||
const { user } = usePageUser();
|
||||
const { imageKey } = usePageState(props.recipe.slug);
|
||||
const { i18n } = useContext();
|
||||
const { $auth, i18n } = useContext();
|
||||
|
||||
const drag = ref(false);
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const hasFoodOrUnit = computed(() => {
|
||||
if (!props.recipe) {
|
||||
return false;
|
||||
@@ -139,6 +142,7 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
user,
|
||||
groupSlug,
|
||||
addIngredient,
|
||||
parserToolTip,
|
||||
hasFoodOrUnit,
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { usePageState, usePageUser } from "~/composables/recipe-page/shared-state";
|
||||
import { useToolStore } from "~/composables/store";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
@@ -47,12 +48,14 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const toolStore = useToolStore();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const toolStore = isOwnGroup.value ? useToolStore() : null;
|
||||
const { user } = usePageUser();
|
||||
const { isEditMode } = usePageState(props.recipe.slug);
|
||||
|
||||
function updateTool(index: number) {
|
||||
if (user.id) {
|
||||
if (user.id && toolStore) {
|
||||
toolStore.actions.updateOne(props.recipe.tools[index]);
|
||||
} else {
|
||||
console.log("no user, skipping server update");
|
||||
|
||||
@@ -49,11 +49,13 @@
|
||||
<v-card-actions>
|
||||
<BaseButton cancel @click="dialog = false"> </BaseButton>
|
||||
<v-spacer></v-spacer>
|
||||
<BaseButton color="info" @click="autoSetReferences">
|
||||
<template #icon> {{ $globals.icons.robot }}</template>
|
||||
{{ $t("recipe.auto") }}
|
||||
</BaseButton>
|
||||
<BaseButton save @click="setIngredientIds"> </BaseButton>
|
||||
<div class="d-flex flex-wrap justify-end">
|
||||
<BaseButton color="info" @click="autoSetReferences">
|
||||
<template #icon> {{ $globals.icons.robot }}</template>
|
||||
{{ $t("recipe.auto") }}
|
||||
</BaseButton>
|
||||
<BaseButton class="ml-2" save @click="setIngredientIds"> </BaseButton>
|
||||
</div>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
@@ -84,7 +86,7 @@
|
||||
<div v-for="(step, index) in value" :key="step.id" class="list-group-item">
|
||||
<v-app-bar
|
||||
v-if="step.id && showTitleEditor[step.id]"
|
||||
class="primary mx-1 mt-6"
|
||||
class="primary mt-6"
|
||||
style="cursor: pointer"
|
||||
dark
|
||||
dense
|
||||
@@ -219,6 +221,7 @@
|
||||
</div>
|
||||
</TransitionGroup>
|
||||
</draggable>
|
||||
<v-divider class="mt-10 d-flex d-md-none"/>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- Recipe Categories -->
|
||||
<v-card v-if="recipe.recipeCategory.length > 0 || isEditForm" class="mt-2">
|
||||
<v-card v-if="recipe.recipeCategory.length > 0 || isEditForm" :class="{'mt-10': !isEditForm}">
|
||||
<v-card-title class="py-2">
|
||||
{{ $t("recipe.categories") }}
|
||||
</v-card-title>
|
||||
@@ -19,7 +19,7 @@
|
||||
</v-card>
|
||||
|
||||
<!-- Recipe Tags -->
|
||||
<v-card v-if="recipe.tags.length > 0 || isEditForm" class="mt-2">
|
||||
<v-card v-if="recipe.tags.length > 0 || isEditForm" class="mt-4">
|
||||
<v-card-title class="py-2">
|
||||
{{ $t("tag.tags") }}
|
||||
</v-card-title>
|
||||
@@ -45,7 +45,7 @@
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
<RecipeNutrition v-if="recipe.settings.showNutrition" v-model="recipe.nutrition" class="mt-10" :edit="isEditForm" />
|
||||
<RecipeNutrition v-if="recipe.settings.showNutrition" v-model="recipe.nutrition" class="mt-4" :edit="isEditForm" />
|
||||
<RecipeAssets
|
||||
v-if="recipe.settings.showAssets"
|
||||
v-model="recipe.assets"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{{ recipe.name }}
|
||||
</v-card-title>
|
||||
<SafeMarkdown :source="recipe.description" />
|
||||
<div v-if="user.id" class="pb-2 d-flex justify-center flex-wrap">
|
||||
<div v-if="isOwnGroup" class="pb-2 d-flex justify-center flex-wrap">
|
||||
<RecipeLastMade
|
||||
v-model="recipe.lastMade"
|
||||
:recipe="recipe"
|
||||
@@ -50,6 +50,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { usePageState, usePageUser } from "~/composables/recipe-page/shared-state";
|
||||
import { validators } from "~/composables/use-validators";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
@@ -77,12 +78,14 @@ export default defineComponent({
|
||||
setup(props) {
|
||||
const { user } = usePageUser();
|
||||
const { imageKey, isEditMode } = usePageState(props.recipe.slug);
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
return {
|
||||
user,
|
||||
imageKey,
|
||||
validators,
|
||||
isEditMode,
|
||||
isOwnGroup,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div @click.prevent>
|
||||
<v-rating
|
||||
v-model="rating"
|
||||
:readonly="!loggedIn"
|
||||
:readonly="!isOwnGroup"
|
||||
color="secondary"
|
||||
background-color="secondary lighten-3"
|
||||
length="5"
|
||||
@@ -18,7 +18,8 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, ref } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -45,10 +46,7 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const rating = ref(props.value);
|
||||
|
||||
@@ -65,7 +63,7 @@ export default defineComponent({
|
||||
context.emit("input", val);
|
||||
}
|
||||
|
||||
return { loggedIn, rating, updateRating };
|
||||
return { isOwnGroup, rating, updateRating };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-divider class="mx-2" />
|
||||
<v-divider class="mx-2"/>
|
||||
<div
|
||||
v-if="timelineEvents.length"
|
||||
id="timeline-container"
|
||||
@@ -34,7 +34,7 @@
|
||||
{{ $t("recipe.timeline-is-empty") }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
<div v-if="loading" class="mb-3">
|
||||
<div v-if="loading" class="mb-3 text-center">
|
||||
<AppLoader :loading="loading" :waiting-text="$tc('general.loading-events')" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</template>
|
||||
<v-card
|
||||
hover
|
||||
:to="$listeners.selected || !recipe ? undefined : `/recipe/${recipe.slug}`"
|
||||
:to="$listeners.selected || !recipe ? undefined : `/g/${groupSlug}/r/${recipe.slug}`"
|
||||
class="elevation-12"
|
||||
@click="$emit('selected')"
|
||||
>
|
||||
@@ -85,7 +85,7 @@
|
||||
@error="hideImage = true"
|
||||
/>
|
||||
<div v-if="event.eventMessage" :class="useMobileFormat ? 'text-caption' : ''">
|
||||
{{ event.eventMessage }}
|
||||
<SafeMarkdown :source="event.eventMessage" />
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
@@ -95,15 +95,16 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import RecipeCardMobile from "./RecipeCardMobile.vue";
|
||||
import RecipeTimelineContextMenu from "./RecipeTimelineContextMenu.vue";
|
||||
import { useStaticRoutes } from "~/composables/api";
|
||||
import { Recipe, RecipeTimelineEventOut } from "~/lib/api/types/recipe"
|
||||
import UserAvatar from "~/components/Domain/User/UserAvatar.vue";
|
||||
import SafeMarkdown from "~/components/global/SafeMarkdown.vue";
|
||||
|
||||
export default defineComponent({
|
||||
components: { RecipeCardMobile, RecipeTimelineContextMenu, UserAvatar },
|
||||
components: { RecipeCardMobile, RecipeTimelineContextMenu, UserAvatar, SafeMarkdown },
|
||||
|
||||
props: {
|
||||
event: {
|
||||
@@ -121,10 +122,13 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
setup(props) {
|
||||
const { $globals, $vuetify } = useContext();
|
||||
const { $auth, $globals, $vuetify } = useContext();
|
||||
const { recipeTimelineEventImage } = useStaticRoutes();
|
||||
const timelineEvents = ref([] as RecipeTimelineEventOut[]);
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const useMobileFormat = computed(() => {
|
||||
return $vuetify.breakpoint.smAndDown;
|
||||
});
|
||||
@@ -187,6 +191,7 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
attrs,
|
||||
groupSlug,
|
||||
icon,
|
||||
eventImageUrl,
|
||||
hideImage,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
</template>
|
||||
<v-card width="400">
|
||||
<v-card-text>
|
||||
<v-text-field v-model="state.search" class="mb-2" hide-details dense label="Search" clearable />
|
||||
<v-text-field v-model="state.search" class="mb-2" hide-details dense :label="$tc('search.search')" clearable />
|
||||
<v-switch
|
||||
v-if="requireAll != undefined"
|
||||
v-model="requireAllValue"
|
||||
@@ -35,7 +35,7 @@
|
||||
</v-virtual-scroll>
|
||||
</v-card>
|
||||
<div v-else>
|
||||
<v-alert type="info" text> No results found </v-alert>
|
||||
<v-alert type="info" text> {{ $tc('search.no-results') }} </v-alert>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
v-model="sidebar"
|
||||
absolute
|
||||
:top-link="topLinks"
|
||||
:secondary-header="$t('sidebar.cookbooks')"
|
||||
:secondary-header-link="loggedIn ? '/group/cookbooks' : undefined"
|
||||
:secondary-header="cookbookLinks.length ? $tc('sidebar.cookbooks') : undefined"
|
||||
:secondary-header-link="isOwnGroup && cookbookLinks.length ? `/g/${groupSlug}/cookbooks` : undefined"
|
||||
:secondary-links="cookbookLinks || []"
|
||||
:bottom-links="isAdmin ? bottomLink : []"
|
||||
:bottom-links="isAdmin ? bottomLinks : []"
|
||||
>
|
||||
<v-menu offset-y nudge-bottom="5" close-delay="50" nudge-right="15">
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn v-if="loggedIn" rounded large class="ml-2 mt-3" v-bind="attrs" v-on="on">
|
||||
<v-btn v-if="isOwnGroup" rounded large class="ml-2 mt-3" v-bind="attrs" v-on="on">
|
||||
<v-icon left large color="primary">
|
||||
{{ $globals.icons.createAlt }}
|
||||
</v-icon>
|
||||
@@ -23,7 +23,7 @@
|
||||
<v-list dense class="my-0 py-0">
|
||||
<template v-for="(item, index) in createLinks">
|
||||
<v-divider v-if="item.insertDivider" :key="index" class="mx-2"></v-divider>
|
||||
<v-list-item v-if="!item.restricted || loggedIn" :key="item.title" :to="item.to" exact>
|
||||
<v-list-item v-if="!item.restricted || isOwnGroup" :key="item.title" :to="item.to" exact>
|
||||
<v-list-item-avatar>
|
||||
<v-icon>
|
||||
{{ item.icon }}
|
||||
@@ -64,7 +64,7 @@
|
||||
</template>
|
||||
</AppSidebar>
|
||||
|
||||
<AppHeader :menu="loggedIn">
|
||||
<AppHeader>
|
||||
<v-btn icon @click.stop="sidebar = !sidebar">
|
||||
<v-icon> {{ $globals.icons.menu }}</v-icon>
|
||||
</v-btn>
|
||||
@@ -79,6 +79,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, onMounted, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import AppHeader from "@/components/Layout/LayoutParts/AppHeader.vue";
|
||||
import AppSidebar from "@/components/Layout/LayoutParts/AppSidebar.vue";
|
||||
import { SidebarLinks } from "~/types/application-types";
|
||||
@@ -91,13 +92,12 @@
|
||||
components: { AppHeader, AppSidebar, LanguageDialog, TheSnackbar },
|
||||
setup() {
|
||||
const { $globals, $auth, $vuetify, i18n } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const isAdmin = computed(() => $auth.user?.admin);
|
||||
const loggedIn = computed(() => $auth.loggedIn);
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = route.value.params.groupSlug;
|
||||
const { cookbooks } = loggedIn.value ? useCookbooks() : usePublicCookbooks(groupSlug);
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const { cookbooks } = isOwnGroup.value ? useCookbooks() : usePublicCookbooks(groupSlug.value || "");
|
||||
|
||||
const toggleDark = useToggleDarkMode();
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
return {
|
||||
icon: $globals.icons.pages,
|
||||
title: cookbook.name,
|
||||
to: loggedIn.value ? `/cookbooks/${cookbook.slug as string}` : `/explore/cookbooks/${groupSlug}/${cookbook.slug as string}`,
|
||||
to: `/g/${groupSlug.value}/cookbooks/${cookbook.slug as string}`,
|
||||
};
|
||||
});
|
||||
});
|
||||
@@ -129,13 +129,13 @@
|
||||
restricted: boolean;
|
||||
}
|
||||
|
||||
const createLinks: Link[] = [
|
||||
const createLinks = computed<Link[]>(() => [
|
||||
{
|
||||
insertDivider: false,
|
||||
icon: $globals.icons.link,
|
||||
title: i18n.tc("general.import"),
|
||||
subtitle: i18n.tc("new-recipe.import-by-url"),
|
||||
to: "/recipe/create/url",
|
||||
to: `/g/${groupSlug.value}/r/create/url`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
@@ -143,7 +143,7 @@
|
||||
icon: $globals.icons.edit,
|
||||
title: i18n.tc("general.create"),
|
||||
subtitle: i18n.tc("new-recipe.create-manually"),
|
||||
to: "/recipe/create/new",
|
||||
to: `/g/${groupSlug.value}/r/create/new`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
@@ -151,24 +151,24 @@
|
||||
icon: $globals.icons.pages,
|
||||
title: i18n.tc("sidebar.cookbook"),
|
||||
subtitle: i18n.tc("sidebar.create-cookbook"),
|
||||
to: "/group/cookbooks",
|
||||
to: `/g/${groupSlug.value}/cookbooks`,
|
||||
restricted: true,
|
||||
},
|
||||
];
|
||||
]);
|
||||
|
||||
const bottomLinks: SidebarLinks = [
|
||||
const bottomLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.cog,
|
||||
title: i18n.tc("general.settings"),
|
||||
to: "/admin/site-settings",
|
||||
restricted: true,
|
||||
},
|
||||
];
|
||||
]);
|
||||
|
||||
const topLinks: SidebarLinks = [
|
||||
const topLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.search,
|
||||
to: "/",
|
||||
to: `/g/${groupSlug.value}`,
|
||||
title: i18n.tc("sidebar.search"),
|
||||
restricted: true,
|
||||
},
|
||||
@@ -187,30 +187,41 @@
|
||||
{
|
||||
icon: $globals.icons.timelineText,
|
||||
title: i18n.tc("recipe.timeline"),
|
||||
to: "/group/timeline",
|
||||
to: `/g/${groupSlug.value}/recipes/timeline`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: "/recipes/categories",
|
||||
icon: $globals.icons.categories,
|
||||
to: `/g/${groupSlug.value}/recipes/categories`,
|
||||
title: i18n.tc("sidebar.categories"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: "/recipes/tags",
|
||||
to: `/g/${groupSlug.value}/recipes/tags`,
|
||||
title: i18n.tc("sidebar.tags"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.potSteam,
|
||||
to: "/recipes/tools",
|
||||
to: `/g/${groupSlug.value}/recipes/tools`,
|
||||
title: i18n.tc("tool.tools"),
|
||||
restricted: true,
|
||||
},
|
||||
];
|
||||
]);
|
||||
|
||||
return { cookbookLinks, createLinks, bottomLink: bottomLinks, topLinks, isAdmin, loggedIn, languageDialog, toggleDark, sidebar };
|
||||
return {
|
||||
groupSlug,
|
||||
cookbookLinks,
|
||||
createLinks,
|
||||
bottomLinks,
|
||||
topLinks,
|
||||
isAdmin,
|
||||
isOwnGroup,
|
||||
languageDialog,
|
||||
toggleDark,
|
||||
sidebar,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<v-btn v-else icon @click="activateSearch">
|
||||
<v-icon> {{ $globals.icons.search }}</v-icon>
|
||||
</v-btn>
|
||||
<v-btn v-if="$auth.loggedIn" :text="$vuetify.breakpoint.smAndUp" :icon="$vuetify.breakpoint.xs" @click="$auth.logout()">
|
||||
<v-btn v-if="loggedIn" :text="$vuetify.breakpoint.smAndUp" :icon="$vuetify.breakpoint.xs" @click="$auth.logout()">
|
||||
<v-icon :left="$vuetify.breakpoint.smAndUp">{{ $globals.icons.logout }}</v-icon>
|
||||
{{ $vuetify.breakpoint.smAndUp ? $t("user.logout") : "" }}
|
||||
</v-btn>
|
||||
@@ -49,6 +49,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, onBeforeUnmount, onMounted, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import RecipeDialogSearch from "~/components/Domain/Recipe/RecipeDialogSearch.vue";
|
||||
|
||||
export default defineComponent({
|
||||
@@ -61,14 +62,11 @@ export default defineComponent({
|
||||
},
|
||||
setup() {
|
||||
const { $auth } = useContext();
|
||||
const { loggedIn } = useLoggedInState();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const loggedIn = computed(() => {
|
||||
return $auth.loggedIn;
|
||||
});
|
||||
|
||||
const groupSlug = route.value.params.groupSlug;
|
||||
const routerLink = !loggedIn.value && groupSlug ? `/explore/recipes/${groupSlug}` : "/"
|
||||
const routerLink = computed(() => groupSlug.value ? `/g/${groupSlug.value}` : "/");
|
||||
const domSearchDialog = ref<InstanceType<typeof RecipeDialogSearch> | null>(null);
|
||||
|
||||
function activateSearch() {
|
||||
@@ -95,6 +93,7 @@ export default defineComponent({
|
||||
activateSearch,
|
||||
domSearchDialog,
|
||||
routerLink,
|
||||
loggedIn,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<template>
|
||||
<v-navigation-drawer v-model="drawer" class="d-flex flex-column d-print-none" clipped app width="240px">
|
||||
<!-- User Profile -->
|
||||
<template v-if="$auth.user">
|
||||
<v-list-item two-line to="/user/profile" exact>
|
||||
<template v-if="loggedIn">
|
||||
<v-list-item two-line :to="userProfileLink" exact>
|
||||
<UserAvatar list :user-id="$auth.user.id" />
|
||||
|
||||
<v-list-item-content>
|
||||
<v-list-item-title class="pr-2"> {{ $auth.user.fullName }}</v-list-item-title>
|
||||
<v-list-item-subtitle>
|
||||
<v-btn class="px-2 pa-0" text :to="`/user/${$auth.user.id}/favorites`" small>
|
||||
<v-btn v-if="isOwnGroup" class="px-2 pa-0" text :to="userFavoritesLink" small>
|
||||
<v-icon left small>
|
||||
{{ $globals.icons.heart }}
|
||||
</v-icon>
|
||||
@@ -26,7 +26,7 @@
|
||||
<template v-if="topLink">
|
||||
<v-list nav dense>
|
||||
<template v-for="nav in topLink">
|
||||
<div v-if="!nav.restricted || loggedIn" :key="nav.title">
|
||||
<div v-if="!nav.restricted || isOwnGroup" :key="nav.title">
|
||||
<!-- Multi Items -->
|
||||
<v-list-group
|
||||
v-if="nav.children"
|
||||
@@ -69,13 +69,20 @@
|
||||
|
||||
<!-- Secondary Links -->
|
||||
<template v-if="secondaryLinks">
|
||||
<v-subheader v-if="secondaryHeader" :to="secondaryHeaderLink" class="pb-0">
|
||||
{{ secondaryHeader }}
|
||||
</v-subheader>
|
||||
<v-divider></v-divider>
|
||||
<router-link v-if="secondaryHeader && secondaryHeaderLink" :to="secondaryHeaderLink" style="text-decoration: none;">
|
||||
<v-subheader :to="secondaryHeaderLink" class="pb-0">
|
||||
{{ secondaryHeader }}
|
||||
</v-subheader>
|
||||
</router-link>
|
||||
<div v-else-if="secondaryHeader">
|
||||
<v-subheader :to="secondaryHeaderLink" class="pb-0">
|
||||
{{ secondaryHeader }}
|
||||
</v-subheader>
|
||||
</div>
|
||||
<v-divider v-if="secondaryHeader"></v-divider>
|
||||
<v-list nav dense exact>
|
||||
<template v-for="nav in secondaryLinks">
|
||||
<div v-if="!nav.restricted || loggedIn" :key="nav.title">
|
||||
<div v-if="!nav.restricted || isOwnGroup" :key="nav.title">
|
||||
<!-- Multi Items -->
|
||||
<v-list-group
|
||||
v-if="nav.children"
|
||||
@@ -116,7 +123,7 @@
|
||||
<v-list nav dense>
|
||||
<v-list-item-group v-model="bottomSelected" color="primary">
|
||||
<template v-for="nav in bottomLinks">
|
||||
<div v-if="!nav.restricted || loggedIn" :key="nav.title">
|
||||
<div v-if="!nav.restricted || isOwnGroup" :key="nav.title">
|
||||
<v-list-item
|
||||
:key="nav.title"
|
||||
exact
|
||||
@@ -141,6 +148,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, toRefs, useContext } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { SidebarLinks } from "~/types/application-types";
|
||||
import UserAvatar from "~/components/Domain/User/UserAvatar.vue";
|
||||
|
||||
@@ -198,7 +206,10 @@ export default defineComponent({
|
||||
});
|
||||
|
||||
const { $auth } = useContext();
|
||||
const loggedIn = computed(() => $auth.loggedIn);
|
||||
const { loggedIn, isOwnGroup } = useLoggedInState();
|
||||
|
||||
const userFavoritesLink = computed(() => $auth.user ? `/user/${$auth.user.id}/favorites` : undefined);
|
||||
const userProfileLink = computed(() => $auth.user ? "/user/profile" : undefined);
|
||||
|
||||
const state = reactive({
|
||||
dropDowns: {},
|
||||
@@ -210,8 +221,11 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
userFavoritesLink,
|
||||
userProfileLink,
|
||||
drawer,
|
||||
loggedIn,
|
||||
isOwnGroup,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -58,8 +58,12 @@
|
||||
</template>
|
||||
{{ $t("general.confirm") }}
|
||||
</BaseButton>
|
||||
<slot name="custom-card-action"></slot>
|
||||
<BaseButton v-if="$listeners.submit" type="submit" @click="submitEvent">
|
||||
{{ submitText }}
|
||||
<template v-if="submitIcon" #icon>
|
||||
{{ submitIcon }}
|
||||
</template>
|
||||
</BaseButton>
|
||||
</slot>
|
||||
</v-card-actions>
|
||||
@@ -109,6 +113,10 @@ export default defineComponent({
|
||||
default: null,
|
||||
type: Boolean,
|
||||
},
|
||||
submitIcon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
submitText: {
|
||||
type: String,
|
||||
default: function () {
|
||||
|
||||
@@ -14,33 +14,42 @@
|
||||
<!-- Model -->
|
||||
<v-list v-if="mode === MODES.model" dense>
|
||||
<v-list-item-group v-model="itemGroup">
|
||||
<v-list-item v-for="(item, index) in items" :key="index" @click="setValue(item)">
|
||||
<v-list-item-icon v-if="item.icon">
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
<template v-for="(item, index) in items">
|
||||
<v-list-item :key="index" @click="setValue(item)">
|
||||
<v-list-item-icon v-if="item.icon">
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</v-list-item-group>
|
||||
</v-list>
|
||||
<!-- Links -->
|
||||
<v-list v-else-if="mode === MODES.link" dense>
|
||||
<v-list-item-group v-model="itemGroup">
|
||||
<v-list-item v-for="(item, index) in items" :key="index" :to="item.to">
|
||||
<template v-for="(item, index) in items">
|
||||
<v-list-item :key="index" :to="item.to">
|
||||
<v-list-item-icon v-if="item.icon">
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
</v-list-item>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</template>
|
||||
</v-list-item-group>
|
||||
</v-list>
|
||||
<!-- Event -->
|
||||
<v-list v-else-if="mode === MODES.event" dense>
|
||||
<v-list-item v-for="(item, index) in items" :key="index" @click="$emit(item.event)">
|
||||
<v-list-item-icon v-if="item.icon">
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
<template v-for="(item, index) in items">
|
||||
<v-list-item :key="index" @click="$emit(item.event)">
|
||||
<v-list-item-icon v-if="item.icon">
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</template>
|
||||
@@ -64,6 +73,7 @@ export interface MenuItem {
|
||||
to?: string;
|
||||
value?: string;
|
||||
event?: string;
|
||||
divider?: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div ref="el" :class="isOverDropZone ? 'over' : ''">
|
||||
<div v-if="isOverDropZone" class="overlay"></div>
|
||||
<div v-if="isOverDropZone" class="absolute text-container">
|
||||
<p class="text-center drop-text">Drop Image</p>
|
||||
<p class="text-center drop-text"> {{ $t("recipe.drop-image") }} </p>
|
||||
</div>
|
||||
<slot></slot>
|
||||
</div>
|
||||
|
||||
@@ -37,8 +37,8 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
setup(_, context) {
|
||||
const router = useRouter();
|
||||
const { i18n } = useContext();
|
||||
const router = useRouter();
|
||||
|
||||
const headers = [
|
||||
{ text: i18n.t("category.category"), value: "category" },
|
||||
@@ -49,7 +49,7 @@ export default defineComponent({
|
||||
];
|
||||
|
||||
function handleRowClick(item: ReportSummary) {
|
||||
router.push("/group/reports/" + item.id);
|
||||
router.push(`/group/reports/${item.id}`);
|
||||
}
|
||||
|
||||
function capitalize(str: string) {
|
||||
|
||||
@@ -151,12 +151,12 @@ export function usePageUser(): { user: UserOut } {
|
||||
id: "",
|
||||
group: "",
|
||||
groupId: "",
|
||||
groupSlug: "",
|
||||
cacheKey: "",
|
||||
email: "",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
// @ts-expect-error - We know that the API always returns a UserOut, but I'm unsure how to type the $auth to know what type user is
|
||||
return { user: $auth.user as UserOut };
|
||||
return { user: $auth.user };
|
||||
}
|
||||
|
||||
@@ -48,4 +48,84 @@ describe(parseIngredientText.name, () => {
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).not.toContain("<script>");
|
||||
});
|
||||
|
||||
test("plural test : plural qty : use abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 2,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: true },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("2 tbsps diced onions");
|
||||
});
|
||||
|
||||
test("plural test : plural qty : not abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 2,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: false },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("2 tablespoons diced onions");
|
||||
});
|
||||
|
||||
test("plural test : single qty : use abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 1,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: true },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("1 tbsp diced onion");
|
||||
});
|
||||
|
||||
test("plural test : single qty : not abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 1,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: false },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("1 tablespoon diced onion");
|
||||
});
|
||||
|
||||
test("plural test : small qty : use abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 0.5,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: true },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("0.5 tbsp diced onion");
|
||||
});
|
||||
|
||||
test("plural test : small qty : not abbreviation", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 0.5,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: false },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("0.5 tablespoon diced onion");
|
||||
});
|
||||
|
||||
test("plural test : zero qty", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 0,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: false },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false)).toEqual("diced onions");
|
||||
});
|
||||
|
||||
test("plural test : single qty, scaled", () => {
|
||||
const ingredient = createRecipeIngredient({
|
||||
quantity: 1,
|
||||
unit: { id: "1", name: "tablespoon", pluralName: "tablespoons", abbreviation: "tbsp", pluralAbbreviation: "tbsps", useAbbreviation: false },
|
||||
food: { id: "1", name: "diced onion", pluralName: "diced onions" }
|
||||
});
|
||||
|
||||
expect(parseIngredientText(ingredient, false, 2)).toEqual("2 tablespoons diced onions");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import DOMPurify from "isomorphic-dompurify";
|
||||
import { useFraction } from "./use-fraction";
|
||||
import { RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import { CreateIngredientFood, CreateIngredientUnit, IngredientFood, IngredientUnit, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
const { frac } = useFraction();
|
||||
|
||||
export function sanitizeIngredientHTML(rawHtml: string) {
|
||||
@@ -10,6 +10,31 @@ export function sanitizeIngredientHTML(rawHtml: string) {
|
||||
});
|
||||
}
|
||||
|
||||
function useFoodName(food: CreateIngredientFood | IngredientFood | undefined, usePlural: boolean) {
|
||||
if (!food) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return (usePlural ? food.pluralName || food.name : food.name) || "";
|
||||
}
|
||||
|
||||
function useUnitName(unit: CreateIngredientUnit | IngredientUnit | undefined, usePlural: boolean) {
|
||||
if (!unit) {
|
||||
return "";
|
||||
}
|
||||
|
||||
let returnVal = "";
|
||||
if (unit.useAbbreviation) {
|
||||
returnVal = (usePlural ? unit.pluralAbbreviation || unit.abbreviation : unit.abbreviation) || "";
|
||||
}
|
||||
|
||||
if (!returnVal) {
|
||||
returnVal = (usePlural ? unit.pluralName || unit.name : unit.name) || "";
|
||||
}
|
||||
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
export function useParsedIngredientText(ingredient: RecipeIngredient, disableAmount: boolean, scale = 1, includeFormating = true) {
|
||||
if (disableAmount) {
|
||||
return {
|
||||
@@ -21,11 +46,11 @@ export function useParsedIngredientText(ingredient: RecipeIngredient, disableAmo
|
||||
}
|
||||
|
||||
const { quantity, food, unit, note } = ingredient;
|
||||
const usePluralUnit = quantity !== undefined && (quantity * scale > 1 || quantity * scale === 0);
|
||||
const usePluralFood = (!quantity) || quantity * scale > 1
|
||||
|
||||
let returnQty = "";
|
||||
|
||||
let unitDisplay = unit?.name;
|
||||
|
||||
// casting to number is required as sometimes quantity is a string
|
||||
if (quantity && Number(quantity) !== 0) {
|
||||
if (unit?.fraction) {
|
||||
@@ -42,16 +67,15 @@ export function useParsedIngredientText(ingredient: RecipeIngredient, disableAmo
|
||||
} else {
|
||||
returnQty = (quantity * scale).toString();
|
||||
}
|
||||
|
||||
if (unit?.useAbbreviation && unit.abbreviation) {
|
||||
unitDisplay = unit.abbreviation;
|
||||
}
|
||||
}
|
||||
|
||||
const unitName = useUnitName(unit, usePluralUnit);
|
||||
const foodName = useFoodName(food, usePluralFood);
|
||||
|
||||
return {
|
||||
quantity: returnQty ? sanitizeIngredientHTML(returnQty) : undefined,
|
||||
unit: unitDisplay ? sanitizeIngredientHTML(unitDisplay) : undefined,
|
||||
name: food?.name ? sanitizeIngredientHTML(food.name) : undefined,
|
||||
unit: unitName && quantity ? sanitizeIngredientHTML(unitName) : undefined,
|
||||
name: foodName ? sanitizeIngredientHTML(foodName) : undefined,
|
||||
note: note ? sanitizeIngredientHTML(note) : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Ref, ref } from "@nuxtjs/composition-api";
|
||||
import { watchDebounced } from "@vueuse/core";
|
||||
import { UserApi } from "~/lib/api";
|
||||
import { ExploreApi } from "~/lib/api/public/explore";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface UseRecipeSearchReturn {
|
||||
@@ -17,7 +18,7 @@ export interface UseRecipeSearchReturn {
|
||||
* on the query. Useful for searchable list views. For advanced
|
||||
* search, use the `useRecipeQuery` composable.
|
||||
*/
|
||||
export function useRecipeSearch(api: UserApi): UseRecipeSearchReturn {
|
||||
export function useRecipeSearch(api: UserApi | ExploreApi): UseRecipeSearchReturn {
|
||||
const query = ref("");
|
||||
const error = ref("");
|
||||
const loading = ref(false);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useAsync, ref } from "@nuxtjs/composition-api";
|
||||
import { useAsync, useRouter, ref } from "@nuxtjs/composition-api";
|
||||
import { useAsyncKey } from "../use-utils";
|
||||
import { usePublicExploreApi } from "~/composables/api/api-client";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
@@ -9,6 +9,8 @@ export const allRecipes = ref<Recipe[]>([]);
|
||||
export const recentRecipes = ref<Recipe[]>([]);
|
||||
|
||||
export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
|
||||
const router = useRouter();
|
||||
|
||||
// passing the group slug switches to using the public API
|
||||
const api = publicGroupSlug ? usePublicExploreApi(publicGroupSlug).explore : useUserApi();
|
||||
|
||||
@@ -23,7 +25,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
|
||||
queryFilter: string | null = null,
|
||||
) {
|
||||
|
||||
const { data } = await api.recipes.getAll(page, perPage, {
|
||||
const { data, error } = await api.recipes.getAll(page, perPage, {
|
||||
orderBy,
|
||||
orderDirection,
|
||||
paginationSeed: query?._searchSeed, // propagate searchSeed to stabilize random order pagination
|
||||
@@ -40,6 +42,11 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
|
||||
requireAllFoods: query?.requireAllFoods,
|
||||
queryFilter,
|
||||
});
|
||||
|
||||
if (error?.response?.status === 404) {
|
||||
router.push("/login");
|
||||
}
|
||||
|
||||
return data ? data.items : [];
|
||||
}
|
||||
|
||||
|
||||
@@ -3,117 +3,117 @@ export const LOCALES = [
|
||||
{
|
||||
name: "繁體中文 (Chinese traditional)",
|
||||
value: "zh-TW",
|
||||
progress: 26,
|
||||
progress: 28,
|
||||
},
|
||||
{
|
||||
name: "简体中文 (Chinese simplified)",
|
||||
value: "zh-CN",
|
||||
progress: 34,
|
||||
progress: 65,
|
||||
},
|
||||
{
|
||||
name: "Tiếng Việt (Vietnamese)",
|
||||
value: "vi-VN",
|
||||
progress: 0,
|
||||
progress: 2,
|
||||
},
|
||||
{
|
||||
name: "Українська (Ukrainian)",
|
||||
value: "uk-UA",
|
||||
progress: 100,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "Türkçe (Turkish)",
|
||||
value: "tr-TR",
|
||||
progress: 47,
|
||||
progress: 50,
|
||||
},
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 60,
|
||||
progress: 71,
|
||||
},
|
||||
{
|
||||
name: "српски (Serbian)",
|
||||
value: "sr-SP",
|
||||
progress: 2,
|
||||
progress: 4,
|
||||
},
|
||||
{
|
||||
name: "Slovenian",
|
||||
value: "sl-SI",
|
||||
progress: 47,
|
||||
progress: 49,
|
||||
},
|
||||
{
|
||||
name: "Slovak",
|
||||
value: "sk-SK",
|
||||
progress: 99,
|
||||
progress: 97,
|
||||
},
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 31,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "Română (Romanian)",
|
||||
value: "ro-RO",
|
||||
progress: 12,
|
||||
progress: 32,
|
||||
},
|
||||
{
|
||||
name: "Português (Portuguese)",
|
||||
value: "pt-PT",
|
||||
progress: 69,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "Português do Brasil (Brazilian Portuguese)",
|
||||
value: "pt-BR",
|
||||
progress: 97,
|
||||
progress: 98,
|
||||
},
|
||||
{
|
||||
name: "Polski (Polish)",
|
||||
value: "pl-PL",
|
||||
progress: 99,
|
||||
progress: 97,
|
||||
},
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 73,
|
||||
progress: 85,
|
||||
},
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 100,
|
||||
progress: 98,
|
||||
},
|
||||
{
|
||||
name: "Latvian",
|
||||
value: "lv-LV",
|
||||
progress: 0,
|
||||
progress: 1,
|
||||
},
|
||||
{
|
||||
name: "Lithuanian",
|
||||
value: "lt-LT",
|
||||
progress: 99,
|
||||
progress: 97,
|
||||
},
|
||||
{
|
||||
name: "한국어 (Korean)",
|
||||
value: "ko-KR",
|
||||
progress: 3,
|
||||
progress: 5,
|
||||
},
|
||||
{
|
||||
name: "日本語 (Japanese)",
|
||||
value: "ja-JP",
|
||||
progress: 9,
|
||||
progress: 11,
|
||||
},
|
||||
{
|
||||
name: "Italiano (Italian)",
|
||||
value: "it-IT",
|
||||
progress: 98,
|
||||
progress: 96,
|
||||
},
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 43,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "Croatian",
|
||||
value: "hr-HR",
|
||||
progress: 100,
|
||||
progress: 97,
|
||||
},
|
||||
{
|
||||
name: "עברית (Hebrew)",
|
||||
@@ -123,27 +123,27 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Galician",
|
||||
value: "gl-ES",
|
||||
progress: 0,
|
||||
progress: 1,
|
||||
},
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 100,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "French, Canada",
|
||||
value: "fr-CA",
|
||||
progress: 54,
|
||||
progress: 97,
|
||||
},
|
||||
{
|
||||
name: "Suomi (Finnish)",
|
||||
value: "fi-FI",
|
||||
progress: 31,
|
||||
progress: 95,
|
||||
},
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 59,
|
||||
progress: 76,
|
||||
},
|
||||
{
|
||||
name: "American English",
|
||||
@@ -153,46 +153,46 @@ export const LOCALES = [
|
||||
{
|
||||
name: "British English",
|
||||
value: "en-GB",
|
||||
progress: 2,
|
||||
progress: 4,
|
||||
},
|
||||
{
|
||||
name: "Ελληνικά (Greek)",
|
||||
value: "el-GR",
|
||||
progress: 33,
|
||||
progress: 35,
|
||||
},
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 100,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "Dansk (Danish)",
|
||||
value: "da-DK",
|
||||
progress: 90,
|
||||
progress: 100,
|
||||
},
|
||||
{
|
||||
name: "Čeština (Czech)",
|
||||
value: "cs-CZ",
|
||||
progress: 60,
|
||||
progress: 66,
|
||||
},
|
||||
{
|
||||
name: "Català (Catalan)",
|
||||
value: "ca-ES",
|
||||
progress: 54,
|
||||
progress: 61,
|
||||
},
|
||||
{
|
||||
name: "Bulgarian",
|
||||
value: "bg-BG",
|
||||
progress: 13,
|
||||
progress: 99,
|
||||
},
|
||||
{
|
||||
name: "العربية (Arabic)",
|
||||
value: "ar-SA",
|
||||
progress: 7,
|
||||
progress: 16,
|
||||
},
|
||||
{
|
||||
name: "Afrikaans (Afrikaans)",
|
||||
value: "af-ZA",
|
||||
progress: 0,
|
||||
progress: 96,
|
||||
},
|
||||
]
|
||||
|
||||
17
frontend/composables/use-logged-in-state.ts
Normal file
17
frontend/composables/use-logged-in-state.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { computed, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
|
||||
export const useLoggedInState = function () {
|
||||
const { $auth } = useContext();
|
||||
const route = useRoute();
|
||||
|
||||
const loggedIn = computed(() => $auth.loggedIn);
|
||||
const isOwnGroup = computed(() => {
|
||||
if (!route.value.params.groupSlug) {
|
||||
return loggedIn.value;
|
||||
} else {
|
||||
return loggedIn.value && $auth.user?.groupSlug === route.value.params.groupSlug;
|
||||
}
|
||||
});
|
||||
|
||||
return { loggedIn, isOwnGroup };
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "أحداث كتاب الطبخ",
|
||||
"tag-events": "أحداث الوسم",
|
||||
"category-events": "أحداث الفئة",
|
||||
"when-a-new-user-joins-your-group": "عندما ينضم مستخدم جديد إلى مجموعتك"
|
||||
"when-a-new-user-joins-your-group": "عندما ينضم مستخدم جديد إلى مجموعتك",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "إلغاء",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "كلمة مفتاحية",
|
||||
"link-copied": "تمّ نسْخ الرّابط",
|
||||
"loading-events": "جاري تحميل الأحداث",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "جار تحميل الوصفات",
|
||||
"message": "الرسائل النصية Sms",
|
||||
"monday": "الإثنين",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "لم يتم العثور على وصفة",
|
||||
"ok": "موافق",
|
||||
"options": "الخيارات:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "طباعة",
|
||||
"print-preferences": "إعدادات الطباعة",
|
||||
"random": "عشوائي",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "تصدير الكل",
|
||||
"refresh": "تحديث",
|
||||
"upload-file": "تحميل الملف",
|
||||
"created-on-date": "تم الإنشاء في {0}"
|
||||
"created-on-date": "تم الإنشاء في {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "هل انت متأكد من رغبتك في حذف <b>{groupName}<b/>؟",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "رقم تعريف المجموعة: {groupID}",
|
||||
"group-name": "اسم المجموعة",
|
||||
"group-not-found": "لم يتم العثور على المجموعة",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "المجموعة: {groupID}",
|
||||
"groups": "المجموعات",
|
||||
"manage-groups": "إدارة المجموعات",
|
||||
@@ -242,6 +248,7 @@
|
||||
"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.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"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 you 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.",
|
||||
"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": "قواعد الوصفات",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Add",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Password updated",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Esdeveniments dels llibres de receptes",
|
||||
"tag-events": "Esdeveniments de les etiquetes",
|
||||
"category-events": "Esdeveniments de les categories",
|
||||
"when-a-new-user-joins-your-group": "Quan un nou usuari s'afegeix al grup"
|
||||
"when-a-new-user-joins-your-group": "Quan un nou usuari s'afegeix al grup",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Anuŀla",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Paraula clau",
|
||||
"link-copied": "S'ha copiat l'enllaç",
|
||||
"loading-events": "Carregant esdeveniments",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Carregant les receptes",
|
||||
"message": "Missatge",
|
||||
"monday": "Dilluns",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "No s'han trobat receptes",
|
||||
"ok": "D'acord",
|
||||
"options": "Opcions:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Imprimiu",
|
||||
"print-preferences": "Imprimiu les preferències",
|
||||
"random": "Aleatori",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Exporta-ho tot",
|
||||
"refresh": "Actualitza",
|
||||
"upload-file": "Puja un fitxer",
|
||||
"created-on-date": "Creat el: {0}"
|
||||
"created-on-date": "Creat el: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Identificador del grup: {groupID}",
|
||||
"group-name": "Nom del grup",
|
||||
"group-not-found": "No s'ha trobat el grup",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Grup: {groupID}",
|
||||
"groups": "Grups",
|
||||
"manage-groups": "Gestiona els grups",
|
||||
@@ -242,7 +248,8 @@
|
||||
"general-preferences": "Preferències generals",
|
||||
"group-recipe-preferences": "Group Recipe Preferences",
|
||||
"report": "Report",
|
||||
"group-management": "Group Management",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Gestió de grups",
|
||||
"admin-group-management": "Gestió del grup d'administradors",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"group-id-value": "Group Id: {0}"
|
||||
@@ -250,8 +257,8 @@
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Crea un nou menú",
|
||||
"dinner-this-week": "Sopar d'esta setmana",
|
||||
"dinner-today": "Sopar per a hui",
|
||||
"dinner-tonight": "Sopar d'esta nit",
|
||||
"dinner-today": "Sopar per avui",
|
||||
"dinner-tonight": "Sopar d'aquesta nit",
|
||||
"edit-meal-plan": "Edita el menú",
|
||||
"end-date": "Data de finalització",
|
||||
"group": "Agrupa (en proves)",
|
||||
@@ -282,31 +289,31 @@
|
||||
"type-any": "Qualsevol",
|
||||
"day-any": "Qualsevol",
|
||||
"editor": "Editor",
|
||||
"meal-recipe": "Meal Recipe",
|
||||
"meal-title": "Meal Title",
|
||||
"meal-recipe": "Recepta del menú",
|
||||
"meal-title": "Títol del menú",
|
||||
"meal-note": "Meal Note",
|
||||
"note-only": "Note Only",
|
||||
"random-meal": "Random Meal",
|
||||
"random-dinner": "Random Dinner",
|
||||
"random-side": "Random Side",
|
||||
"random-meal": "Menú aleatori",
|
||||
"random-dinner": "Principal aleatori",
|
||||
"random-side": "Guarnició aleatòria",
|
||||
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "to all days",
|
||||
"to-all-days": "a tots els dies",
|
||||
"on-days": "on {0}s",
|
||||
"for-all-meal-types": "for all meal types",
|
||||
"for-all-meal-types": "per a tots els tipus de menús",
|
||||
"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 you 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.",
|
||||
"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-to-all-days": "Aplica a tots els dies",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "S'han suprimit les dades migrades",
|
||||
"new-migration": "New Migration",
|
||||
"no-file-selected": "No File Selected",
|
||||
"no-file-selected": "Cap fitxer seleccionat",
|
||||
"no-migration-data-available": "No hi han dades disponibles",
|
||||
"previous-migrations": "Previous Migrations",
|
||||
"recipe-migration": "Migració de receptes",
|
||||
@@ -316,12 +323,12 @@
|
||||
"title": "Chowdown"
|
||||
},
|
||||
"nextcloud": {
|
||||
"description": "Migreu les dades del Cookbook de Nextcloud",
|
||||
"description": "Migreu les dades des d'una instància de Nextcloud Cookbook",
|
||||
"description-long": "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.",
|
||||
"title": "Nextcloud Cookbook"
|
||||
},
|
||||
"copymethat": {
|
||||
"description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.",
|
||||
"description-long": "Mealie pot importar receptes de Copy Me That. Exporta les teves receptes en format HTML i llavors puja el fitxer .zip aquí sota.",
|
||||
"title": "Copy Me That Recipe Manager"
|
||||
},
|
||||
"paprika": {
|
||||
@@ -338,14 +345,18 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"choose-migration-type": "Elegeix un tipus de migració",
|
||||
"tag-all-recipes": "Etiqueta totes les receptes amb {tag-name}",
|
||||
"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.",
|
||||
"nextcloud-text": "Les receptes de Nextcloud poden ser importades d'un fitxer ZIP que contingui les dades emmagatzemades en Nextcloud. Segueix l'exemple d'estructura de directori de sota per assegurar que les receptes podran ser importades.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"recipe-1": "Recepta 1",
|
||||
"recipe-2": "Recepta 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."
|
||||
"paprika-text": "Mealie pot importar receptes des de l'aplicació Paprika. Exporta les teves receptes de Paprika, reanomena l'extensió de l'arxiu a .zip i penja'l aquí sota.",
|
||||
"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 pot importar receptes de Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Afegiu tot d'una",
|
||||
@@ -367,7 +378,7 @@
|
||||
"split-by-numbered-line-description": "Intenta separar per paràgrafs, utilitzant com a patró '1)' o '1.'",
|
||||
"import-by-url": "Importa per URL",
|
||||
"create-manually": "Crea una recepta manualment",
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
"make-recipe-image": "Fes-la la imatge de la recepta"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 - Pàgina no trobada",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "Format AAAA-MM-DD",
|
||||
"add-to-list": "Afegiu a la llista",
|
||||
"add-to-plan": "Afegiu al menú",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Afegir a la cronologia",
|
||||
"recipe-added-to-list": "Recepta afegida a la llista",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recepta afegida al menú",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "S'ha produït un error afegint la recepta al menú",
|
||||
"yield": "Racions",
|
||||
"quantity": "Quantitat",
|
||||
@@ -481,50 +494,51 @@
|
||||
"locked": "Bloquejat",
|
||||
"public-link": "Enllaç públic",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Temporitzador de cuina",
|
||||
"start-timer": "Iniciar temporitzador",
|
||||
"pause-timer": "Pausa el temporitzador",
|
||||
"resume-timer": "Reprèn el temporitzador",
|
||||
"stop-timer": "Atura el temporitzador"
|
||||
},
|
||||
"edit-timeline-event": "Edita l'esdeveniment de la cronologia",
|
||||
"timeline": "Cronologia",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-is-empty": "Encara no hi ha res a la cronologia. Prova de fer aquesta recepta!",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"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",
|
||||
"open-timeline": "Obrir la cronologia",
|
||||
"made-this": "Ho he fet",
|
||||
"how-did-it-turn-out": "Com ha sortit?",
|
||||
"user-made-this": "{user} ha fet això",
|
||||
"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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.",
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
"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",
|
||||
"edit-markdown": "Editar Markdown",
|
||||
"recipe-creation": "Creació d'una recepta",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Selecciona una de les diverses formes de crear una recepta",
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"import-with-url": "Importar amb l'URL",
|
||||
"create-recipe": "Crea la recepta",
|
||||
"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",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crea la recepta proporcionant-ne un nom. Totes les receptes han de tenir un nom únic.",
|
||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||
"scrape-recipe": "Scrape Recipe",
|
||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||
"stay-in-edit-mode": "Stay in Edit mode",
|
||||
"import-from-zip": "Import from Zip",
|
||||
"stay-in-edit-mode": "Segueix en el mode d'edició",
|
||||
"import-from-zip": "Importa des d'un ZIP",
|
||||
"import-from-zip-description": "Import a single recipe that was exported from another Mealie instance.",
|
||||
"zip-files-must-have-been-exported-from-mealie": ".zip files must have been exported from Mealie",
|
||||
"create-a-recipe-by-uploading-a-scan": "Create a recipe by uploading a scan.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Upload a png image from a recipe book",
|
||||
"recipe-bulk-importer": "Recipe Bulk Importer",
|
||||
"zip-files-must-have-been-exported-from-mealie": "Els fitxers .zip han d'haver sigut exportats des de Mealie",
|
||||
"create-a-recipe-by-uploading-a-scan": "Crea la recepta pujant-ne un escaneig.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Puja una imatge PNG d'un llibre de receptes",
|
||||
"recipe-bulk-importer": "Importador de receptes en massa",
|
||||
"recipe-bulk-importer-description": "The Bulk recipe importer allows you to import multiple recipes at once by queueing the sites on the backend and running the task in the background. This can be useful when initially migrating to Mealie, or when you want to import a large number of recipes.",
|
||||
"set-categories-and-tags": "Set Categories and Tags",
|
||||
"bulk-imports": "Bulk Imports",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Recipe Yield",
|
||||
"unit": "Unit",
|
||||
"upload-image": "Upload image",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Mantenir la pantalla encesa",
|
||||
"remove-image": "Esborrar la imatge"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Cerca avançada",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtra per etiqueta",
|
||||
"search-hint": "Prem '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Afegiu un nou tema",
|
||||
"admin-settings": "Opcions de l'administrador",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"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": "Restore successful",
|
||||
"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",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "S'ha actualitzat la contrasenya",
|
||||
"password": "Contrasenya",
|
||||
"password-strength": "Fortalesa de la contrasenya: {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registreu-vos",
|
||||
"reset-password": "Restableix la contrasenya",
|
||||
"sign-in": "Inicia sessió",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Nom d'usuari",
|
||||
"users-header": "USUARIS",
|
||||
"users": "Usuaris",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Hora del Webhook",
|
||||
"webhooks-enabled": "Webhooks habilitats",
|
||||
"you-are-not-allowed-to-create-a-user": "Vostè no està autoritzat per a crear un usuari",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduït",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Afegeix a la base de dades les unitats més comunes en el vostre idioma.",
|
||||
@@ -893,15 +922,20 @@
|
||||
"source-unit": "Source Unit",
|
||||
"target-unit": "Target Unit",
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"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",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Afegeix a la base de dades etiquetes comunes en el vostre idioma.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Dades d'exemple",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registre d'usuari",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Uneix-te a un grup",
|
||||
"create-a-new-group": "Crea un grup nou",
|
||||
"provide-registration-token-description": "Per favor, proporciona el token associat al grup al qual voleu afegir-vos. Podeu obtindre'l d'un altre membre del grup.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor OCR",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Mode de selecció",
|
||||
"pan-and-zoom-picture": "Amplia la imatge",
|
||||
"split-text": "Divideix el text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Dividiu per blocs de text",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Mode de selecció (predeterminat)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Benvingut, {0}",
|
||||
"description": "Manage your profile, recipes, and group settings.",
|
||||
"get-invite-link": "Get Invite Link",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Enllaç públic",
|
||||
"account-summary": "Account Summary",
|
||||
"account-summary-description": "Here's a summary of your group's information",
|
||||
"group-statistics": "Group Statistics",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Události kuchařky",
|
||||
"tag-events": "Události tagu",
|
||||
"category-events": "Události kategorie",
|
||||
"when-a-new-user-joins-your-group": "Když se nový uživatel připojí do vaší skupiny"
|
||||
"when-a-new-user-joins-your-group": "Když se nový uživatel připojí do vaší skupiny",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Zrušit",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Klíčové slovo",
|
||||
"link-copied": "Odkaz zkopírován",
|
||||
"loading-events": "Načítání událostí",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Načítám recepty",
|
||||
"message": "Zpráva",
|
||||
"monday": "Pondělí",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Nebyl nalezen žádný recept",
|
||||
"ok": "OK",
|
||||
"options": "Možnosti:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Tisk",
|
||||
"print-preferences": "Tisk předvoleb",
|
||||
"random": "Náhodný",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Exportovat vše",
|
||||
"refresh": "Obnovit",
|
||||
"upload-file": "Nahrát soubor",
|
||||
"created-on-date": "Vytvořeno dne: {0}"
|
||||
"created-on-date": "Vytvořeno dne: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Jste si jisti, že chcete smazat <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID skupiny: {groupID}",
|
||||
"group-name": "Název skupiny",
|
||||
"group-not-found": "Skupina nenalezena",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Skupina: {groupID}",
|
||||
"groups": "Skupiny",
|
||||
"manage-groups": "Spravovat skupiny",
|
||||
@@ -227,11 +233,11 @@
|
||||
"group-preferences": "Nastavení skupiny",
|
||||
"private-group": "Soukromá skupina",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
|
||||
"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": "Povolit uživatelům mimo vaši skupinu vidět vaše recepty",
|
||||
"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": "Zobrazit položky receptu",
|
||||
"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",
|
||||
@@ -242,9 +248,10 @@
|
||||
"general-preferences": "General Preferences",
|
||||
"group-recipe-preferences": "Group Recipe Preferences",
|
||||
"report": "Report",
|
||||
"group-management": "Group Management",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Správa skupin",
|
||||
"admin-group-management": "Admin Group Management",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"admin-group-management-text": "Změny v této skupině budou okamžitě zohledněny.",
|
||||
"group-id-value": "Group Id: {0}"
|
||||
},
|
||||
"meal-plan": {
|
||||
@@ -284,22 +291,22 @@
|
||||
"editor": "Editor",
|
||||
"meal-recipe": "Meal Recipe",
|
||||
"meal-title": "Meal Title",
|
||||
"meal-note": "Meal Note",
|
||||
"meal-note": "Poznámka k jídlu",
|
||||
"note-only": "Note Only",
|
||||
"random-meal": "Náhodné jídlo",
|
||||
"random-dinner": "Random Dinner",
|
||||
"random-dinner": "Náhodná večeře",
|
||||
"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-all-meal-types": "pro všechny druhy jídel",
|
||||
"for-type-meal-types": "for {0} meal types",
|
||||
"meal-plan-rules": "Meal Plan Rules",
|
||||
"new-rule": "Nové pravidlo",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for you 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.",
|
||||
"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-to-all-days": "Použije se na všechny dny",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Meal Plan Settings"
|
||||
},
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie může importovat recepty z aplikace Paprika. Exportujte své recepty z papriky, přejmenujte příponu exportovaného souboru na .zip a nahrajte jej níže.",
|
||||
"mealie-text": "V Mealie může importovat recepty z aplikace Mealie z v1.0 a starší. Exportujte své recepty ze staré verze a nahrajte zip soubor níže. Všimněte si, že lze importovat pouze recepty."
|
||||
"mealie-text": "V Mealie může importovat recepty z aplikace Mealie z v1.0 a starší. Exportujte své recepty ze staré verze a nahrajte zip soubor níže. Všimněte si, že lze importovat pouze recepty.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Hromadné přidání",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Přidat do jídelníčku",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recept byl přidán na seznam",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recept byl přidán do jídelníčku",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Přidání receptu do jídelníčku selhalo",
|
||||
"yield": "Úroda",
|
||||
"quantity": "Množství",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtr štítků",
|
||||
"search-hint": "Stiskněte '/'",
|
||||
"advanced": "Pokročilé",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Přidat nový motiv",
|
||||
"admin-settings": "Nastavení Správce",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Záloha vytvořena v {path}",
|
||||
"backup-deleted": "Záloha smazána",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Štítek zálohy",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Smazat zálohu",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Konfigurace",
|
||||
"docker-volume": "Volume dockeru",
|
||||
"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": "Volumy jsou špatně nakonfigurovány",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Volumy jsou nastaveny správně.",
|
||||
"status-unknown-try-running-a-validation": "Neznámý stav. Zkuste provést validaci.",
|
||||
"validate": "Validovat",
|
||||
"email-configuration-status": "Email Configuration Status",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Proběhlo úspěšně",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Heslo bylo změněno",
|
||||
"password": "Heslo",
|
||||
"password-strength": "Síla hesla: {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registrovat",
|
||||
"reset-password": "Obnovit heslo",
|
||||
"sign-in": "Přihlásit se",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Uživatelské jméno",
|
||||
"users-header": "UŽIVATELÉ",
|
||||
"users": "Uživatelé",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Čas Webhooku",
|
||||
"webhooks-enabled": "Povolené webhooky",
|
||||
"you-are-not-allowed-to-create-a-user": "Nemáte oprávnění k vytvoření uživatele",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Správa uživatelů",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "Uživatelské jméno",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "přeloženo",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Naplnit databázi s běžnými jednotkami používanými ve vašem jazyce.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Používat zkratky",
|
||||
"fraction": "Zlomek"
|
||||
"fraction": "Zlomek",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Naplnit databázi s běžnými popisky používanými ve vašem jazyce.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Smazat recepty",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Vybrat data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Sloupce",
|
||||
"combine": "Kombinovat"
|
||||
"combine": "Kombinovat",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registrace uživatele",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Připojit se ke skupině",
|
||||
"create-a-new-group": "Vytvořit novou skupinu",
|
||||
"provide-registration-token-description": "Prosím zadejte registrační token pro skupinu, ke které se chcete připojit. Tento token musíte získat od existujícího člena skupiny.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "OCR editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Režim výběru",
|
||||
"pan-and-zoom-picture": "Přiblížit a posunout obrázek",
|
||||
"split-text": "Rozdělit text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Rozdělit podle textového bloku",
|
||||
"flatten": "Zarovnat bez ohledu na původní formátování",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Režim výběru (výchozí)",
|
||||
"selection-mode-desc": "Režim výběru je hlavním režimem, který lze použít pro zadávání dat:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Kogebogs Begivenheder",
|
||||
"tag-events": "Tag Begivenheder",
|
||||
"category-events": "Kategori Begivenheder",
|
||||
"when-a-new-user-joins-your-group": "Når en ny bruger slutter sig til din gruppe"
|
||||
"when-a-new-user-joins-your-group": "Når en ny bruger slutter sig til din gruppe",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Annuller",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Nøgleord",
|
||||
"link-copied": "Link kopieret",
|
||||
"loading-events": "Indlæser hændelser",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Indlæser opskrifter",
|
||||
"message": "Besked",
|
||||
"monday": "Mandag",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Ingen opskrift fundet",
|
||||
"ok": "Ok",
|
||||
"options": "Valgmuligheder:",
|
||||
"plural-name": "Navn i flertal",
|
||||
"print": "Udskriv",
|
||||
"print-preferences": "Print indstillinger",
|
||||
"random": "Tilfældig",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Eksportér alle",
|
||||
"refresh": "Opdater",
|
||||
"upload-file": "Upload Fil",
|
||||
"created-on-date": "Oprettet den: {0}"
|
||||
"created-on-date": "Oprettet den: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Gruppe-ID: {groupID}",
|
||||
"group-name": "Gruppenavn",
|
||||
"group-not-found": "Gruppen blev ikke fundet",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Gruppe: {groupID}",
|
||||
"groups": "Grupper",
|
||||
"manage-groups": "Administrer grupper",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Generelle Indstillinger",
|
||||
"group-recipe-preferences": "Gruppe Indstillinger for opskrifter",
|
||||
"report": "Rapport",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Gruppe Håndtering",
|
||||
"admin-group-management": "Administrationsgruppe Håndtering",
|
||||
"admin-group-management-text": "Ændringer i denne gruppe vil træde i kraft øjeblikkeligt.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "for {0} måltidstyper",
|
||||
"meal-plan-rules": "Regler for madplanlægning",
|
||||
"new-rule": "Ny Regel",
|
||||
"meal-plan-rules-description": "Du kan oprette regler for automatisk valg af opskrifter for dine madplaner. Regler bruges til at bestemme hvike opskrifter, der kan vælges imellem, når du opretter madplanrr. Bemærk, at hvis reglerne har samme begrænsninger på dag eller type, så vil kategorierne af reglerne blive sammenflettet. I praksis er det unødvendigt at oprette flere regler, men det er muligt at gøre det.",
|
||||
"meal-plan-rules-description": "Du kan oprette regler for automatisk valg af opskrifter til dine måltidsplaner. Disse regler bruges af Mealie til at udvælge de opskrifter, som der skal vælges tilfældigt imellem, når du opretter madplaner. Bemærk, at hvis reglerne har samme dag/type begrænsninger, så vil kategorierne af reglerne blive sammenlagt. I praksis er det unødvendigt at skabe dobbelte regler, men det er muligt at gøre det.",
|
||||
"new-rule-description": "Når du opretter en ny regel for en madplan, kan du begrænse reglen til at være gældende for en bestemt dag i ugen og/eller en bestemt måltidstype. For at anvende en regel for alle dage eller alle måltider typer kan du indstille reglen til \"Any\", som vil anvende den til alle mulige værdier for dag og/eller måltid.",
|
||||
"recipe-rules": "Opskriftsregler",
|
||||
"applies-to-all-days": "Gælder for alle dage",
|
||||
@@ -333,8 +340,8 @@
|
||||
"title": "Mealie Pre v1.0"
|
||||
},
|
||||
"tandoor": {
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"title": "Tandoor Recipes"
|
||||
"description-long": "Mealie kan importere opskrifter fra Tandoor. Eksporter dine data i \"Standard\" format, og upload derefter Zip filen nedenfor.",
|
||||
"title": "Tandoor Opskrifter"
|
||||
},
|
||||
"recipe-data-migrations": "Migrering af opskrifter",
|
||||
"recipe-data-migrations-explanation": "Opskrifter kan migreres fra et andet understøttet program til Mealie. Dette er en fantastisk måde at komme i gang med Mealie.",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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.",
|
||||
"mealie-text": "Mealie kan importere opskrifter fra Mealie applikationen fra en pre v1.0 udgivelse. Eksporter dine opskrifter fra din gamle installation, og upload zip-filen nedenfor. Bemærk, at kun opskrifter kan importeres fra eksport."
|
||||
"mealie-text": "Mealie kan importere opskrifter fra Mealie applikationen fra en pre v1.0 udgivelse. Eksporter dine opskrifter fra din gamle installation, og upload zip-filen nedenfor. Bemærk, at kun opskrifter kan importeres fra eksport.",
|
||||
"plantoeat": {
|
||||
"title": "Planlæg at spise",
|
||||
"description-long": "Mealie kan importere opskrifter, der er markeret som \"Planlæg at spise\"."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Tilføj",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "ÅÅÅÅ-MM-DD format",
|
||||
"add-to-list": "Tilføj til liste",
|
||||
"add-to-plan": "Tilføj til madplan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Tilføj til tidslinje",
|
||||
"recipe-added-to-list": "Opskrift tilføjet til listen",
|
||||
"recipes-added-to-list": "Opskrifter tilføjet til listen",
|
||||
"recipe-added-to-mealplan": "Opskrift tilføjet til madplanen",
|
||||
"failed-to-add-recipes-to-list": "Kunne ikke tilføje opskrift til listen",
|
||||
"failed-to-add-recipe-to-mealplan": "Kunne ikke tilføje opskrift til madplanen",
|
||||
"yield": "Portioner",
|
||||
"quantity": "Antal",
|
||||
@@ -481,16 +494,16 @@
|
||||
"locked": "Låst",
|
||||
"public-link": "Offentligt link",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Køkken Ur",
|
||||
"start-timer": "Start timer",
|
||||
"pause-timer": "Sæt timer på pause",
|
||||
"resume-timer": "Genoptag Timer",
|
||||
"stop-timer": "Stop timer"
|
||||
},
|
||||
"edit-timeline-event": "Rediger tidslinjebegivenhed",
|
||||
"timeline": "Tidslinje",
|
||||
"timeline-is-empty": "Intet på tidslinjen endnu. Prøv at lave denne opskrift!",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"group-global-timeline": "{groupName} Global Tidslinje",
|
||||
"open-timeline": "Åbn tidslinje",
|
||||
"made-this": "Jeg har lavet denne",
|
||||
"how-did-it-turn-out": "Hvordan blev det?",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Beskednøgle",
|
||||
"parse": "Behandl data",
|
||||
"attach-images-hint": "Vedhæft billeder ved at trække dem ind i redigeringsværktøjet",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Aktiver mængde af ingredienser for at bruge denne funktion",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Opskrifter med enheder eller fødevarer defineret kan ikke fortolkes.",
|
||||
"parse-ingredients": "Fortolk ingredienser",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Udbytte af opskrift",
|
||||
"unit": "Enhed",
|
||||
"upload-image": "Upload billede",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Hold skærmen tændt",
|
||||
"remove-image": "Fjern billede"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Avanceret søgning",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tagfiler",
|
||||
"search-hint": "Tryk '/'",
|
||||
"advanced": "Avanceret",
|
||||
"auto-search": "Automatisk Søgning"
|
||||
"auto-search": "Automatisk Søgning",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Tilføj et nyt tema",
|
||||
"admin-settings": "Administratorindstillinger",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup oprettet ved {path}",
|
||||
"backup-deleted": "Backup slettet",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backupnavn",
|
||||
"create-heading": "Opret en backup",
|
||||
"delete-backup": "Slet backup",
|
||||
@@ -574,13 +591,13 @@
|
||||
"partial-backup": "Delvis backup",
|
||||
"unable-to-delete-backup": "Ude af stand til at slette backup.",
|
||||
"experimental-description": "Backups en samlet snapshots af databasen og datamappe på installationen. Dette omfatter alle data og kan ikke indstilles til at udelukke undergrupper af data. Du kan tænke på dette som et øjebliksbillede af Mealie på et bestemt tidspunkt. I øjeblikket, {not-crossed-version} (data migrationer er ikke udført automatisk). Disse fungerer som en database agnostisk måde at eksportere og importere data eller backup af webstedet til en ekstern placering.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"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",
|
||||
"backup-restore": "Backup / gendannelse",
|
||||
"back-restore-description": "Gendannelse af denne sikkerhedskopi vil overskrive alle de aktuelle data i din database og i datamappen og erstatte dem med indholdet af denne sikkerhedskopi. {cannot-be-undone} Hvis gendannelsen lykkes, vil du blive logget ud.",
|
||||
"cannot-be-undone": "Denne handling kan ikke fortrydes - brug med forsigtighed.",
|
||||
"postgresql-note": "Hvis du bruger PostGreSQL, så gennemse venligst {backup-restore-process} før du gendanner.",
|
||||
"backup-restore-process-in-the-documentation": "backup/restore proces i dokumentationen",
|
||||
"irreversible-acknowledgment": "Jeg forstår, at denne handling er irreversibel, destruktiv og kan forårsage tab af data",
|
||||
"restore-backup": "Restore Backup"
|
||||
"restore-backup": "Gendan sikkerhedskopi"
|
||||
},
|
||||
"backup-and-exports": "Backup og eksport",
|
||||
"change-password": "Skift kodeord",
|
||||
@@ -645,7 +662,7 @@
|
||||
"create-an-api-token": "Opret en API token",
|
||||
"token-name": "Tokennavn",
|
||||
"generate": "Generer",
|
||||
"you-have-token-count": "You have no active tokens.|You have one active token.|You have {count} active tokens."
|
||||
"you-have-token-count": "Du har ingen aktive tokens.|Du har en aktiv token.|Du har {count} aktive tokens."
|
||||
},
|
||||
"toolbox": {
|
||||
"assign-all": "Tildel alle",
|
||||
@@ -665,38 +682,40 @@
|
||||
"webhooks-caps": "WEBHOOKS",
|
||||
"webhooks": "Webhooks",
|
||||
"webhook-name": "Webhook navn",
|
||||
"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."
|
||||
"description": "Nedenstående webhooks vil blive afvikler, når et måltid er angivet for dagen. På det planlagte tidspunkt, afvikles webhooks med data fra den opskrift, der er planlagt til dagen. Bemærk, at webhook ikke afvikles nøjagtig på det planlagte tidspunkt. Webhooks afvikles med 5 minutters intervalerl, så webhooks vil blive udført inden for 5 +/- minutter fra den planlagte tid."
|
||||
},
|
||||
"bug-report": "Bug Report",
|
||||
"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.",
|
||||
"bug-report": "Fejlrapport",
|
||||
"bug-report-information": "Brug denne information til at rapportere en fejl. At give detaljer om din instans til udviklere er den bedste måde at få dine problemer løst hurtigt.",
|
||||
"tracker": "Tracker",
|
||||
"configuration": "Konfiguration",
|
||||
"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",
|
||||
"docker-volume-help": "Mealie kræver, at frontend og backend containere deler den samme docker mappe. Dette sikrer, at frontend container har adgang til billeder og øvrige lagret på disken.",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Docker mapper er korrekt konfigureret.",
|
||||
"status-unknown-try-running-a-validation": "Status Ukendt. Prøv at køre en validering.",
|
||||
"validate": "Validering",
|
||||
"email-configuration-status": "Status for konfiguration af e-mail",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Klar",
|
||||
"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}).",
|
||||
"mealie-is-up-to-date": "Mealie is up to date",
|
||||
"not-ready": "Ikke Klar - Kontroller konfigurationen",
|
||||
"succeeded": "Gennemført",
|
||||
"failed": "Mislykket",
|
||||
"general-about": "Om Mealie",
|
||||
"application-version": "Programversion",
|
||||
"application-version-error-text": "Din nuværende version ({0}) matcher ikke den seneste udgivelse. Du bør overveje at opdatere til den nyeste version ({1}).",
|
||||
"mealie-is-up-to-date": "Mealie er ajour",
|
||||
"secure-site": "Sikkert site",
|
||||
"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",
|
||||
"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.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"secure-site-error-text": "Tilgå via localhost eller med brug af https. Udklipsholder og yderligere browser API'er virker muligvis ikke.",
|
||||
"secure-site-success-text": "Webstedet tilgås via localhost eller https",
|
||||
"server-side-base-url": "Serverens URL",
|
||||
"server-side-base-url-error-text": "`BASE_URL` er anvendt som standardværdien på API Server. Dette kan medføre problemer med meddelelser, der indeholder links til serveren, f. eks. i e-mails, osv.",
|
||||
"server-side-base-url-success-text": "Serverens URL matcher ikke standarden",
|
||||
"ldap-ready": "LDAP Klar",
|
||||
"ldap-ready-error-text": "Ikke alle LDAP- værdier er konfigureret. Dette kan ignoreres, hvis du ikke bruger LDAP- godkendelse.",
|
||||
"ldap-ready-success-text": "Påkrævede LDAP-variabler er alle angivet.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Version på opskrift-indsamler"
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Alle lister",
|
||||
@@ -797,7 +816,7 @@
|
||||
"error-cannot-delete-super-user": "Fejl! Kan ikke slette super-brugeren",
|
||||
"existing-password-does-not-match": "Nuværende adgangskode matcher ikke",
|
||||
"full-name": "Fulde navn",
|
||||
"generate-password-reset-link": "Generate Password Reset Link",
|
||||
"generate-password-reset-link": "Generér link til nulstilling af adgangskode",
|
||||
"invite-only": "Kun inviterede",
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Linknavn",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Adgangskoden blev opdateret",
|
||||
"password": "Adgangskode",
|
||||
"password-strength": "Adgangskodestyrken er {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registrér",
|
||||
"reset-password": "Nulstil adgangskoden",
|
||||
"sign-in": "Log ind",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Brugernavn",
|
||||
"users-header": "BRUGERE",
|
||||
"users": "Brugere",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Tid",
|
||||
"webhooks-enabled": "Webhooks Aktiveret",
|
||||
"you-are-not-allowed-to-create-a-user": "Du har ikke rettigheder til at oprette en ny bruger",
|
||||
@@ -852,18 +873,24 @@
|
||||
"very-strong": "Meget stærk"
|
||||
},
|
||||
"user-management": "Brugeradministration",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"reset-locked-users": "Nulstil Låste Brugere",
|
||||
"admin-user-creation": "Opret administratorbruger",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Brugerdetaljer",
|
||||
"user-name": "Brugernavn",
|
||||
"authentication-method": "Authentication Method",
|
||||
"authentication-method": "Godkendelsesmetode",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Rettigheder",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Bruger kan invitere andre til gruppen",
|
||||
"user-can-manage-group": "Bruger kan administrere gruppen",
|
||||
"user-can-organize-group-data": "Bruger kan organisere gruppedata",
|
||||
"enable-advanced-features": "Aktiver avancerede funktioner"
|
||||
"enable-advanced-features": "Aktiver avancerede funktioner",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Det ser ud til, at det er første gang, at du logger ind.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vil du ikke længere se dette? Sørg for at ændre din e-mail i dine brugerindstillinger!",
|
||||
"forgot-password": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "oversat",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Opret fødevare",
|
||||
"food-label": "Etiket på fødevare",
|
||||
"edit-food": "Redigér fødevare",
|
||||
"food-data": "Oplysninger om fødevare"
|
||||
"food-data": "Oplysninger om fødevare",
|
||||
"example-food-singular": "fx.: grøntsag",
|
||||
"example-food-plural": "fx.: grøntsager"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Opret standard enheder i dit sprog.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Samler {0} med {1}",
|
||||
"create-unit": "Opret enhed",
|
||||
"abbreviation": "Forkortelse",
|
||||
"plural-abbreviation": "Forkortelse af flertal",
|
||||
"description": "Beskriveslse",
|
||||
"display-as-fraction": "Vis som brøk",
|
||||
"use-abbreviation": "Anvend forkortelse",
|
||||
"edit-unit": "Rediger enhed",
|
||||
"unit-data": "Enhedsoplysninger",
|
||||
"use-abbv": "Anvend forkortelse",
|
||||
"fraction": "Brøkdel"
|
||||
"fraction": "Brøkdel",
|
||||
"example-unit-singular": "fx.: teske",
|
||||
"example-unit-plural": "fx.: teskeer",
|
||||
"example-unit-abbreviation-singular": "fx.: tsk",
|
||||
"example-unit-abbreviation-plural": "fx.: tsk"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Opret standard etiketter på dit sprog.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Slet Opskrifter",
|
||||
"source-unit-will-be-deleted": "Kildeenhed vil blive slettet"
|
||||
},
|
||||
"create-alias": "Opret alias",
|
||||
"manage-aliases": "Administrer Aliaser",
|
||||
"seed-data": "Opret standard data",
|
||||
"seed": "Frø",
|
||||
"data-management": "Datastyring",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "vælg data",
|
||||
"select-language": "Vælg sprog",
|
||||
"columns": "Kolonner",
|
||||
"combine": "Kombinér"
|
||||
"combine": "Kombinér",
|
||||
"categories": {
|
||||
"edit-category": "Rediger kategori",
|
||||
"new-category": "Ny kategori",
|
||||
"category-data": "Kategoridata"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Nyt mærke",
|
||||
"edit-tag": "Rediger Mærke",
|
||||
"tag-data": "Mærke data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Nyt Værktøj",
|
||||
"edit-tool": "Redigér værktøjer",
|
||||
"tool-data": "Værktøjs Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Brugerregistrering",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Deltag i en gruppe",
|
||||
"create-a-new-group": "Opret en ny gruppe",
|
||||
"provide-registration-token-description": "Angiv venligst det registreringstoken, der er knyttet til den gruppe, du gerne vil deltage i. Du skal indhente dette fra et eksisterende gruppemedlem.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr redigering",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Markeringstilstand",
|
||||
"pan-and-zoom-picture": "Panorer og zoom på billede",
|
||||
"split-text": "Opdel tekst",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Opdelt efter tekstblok",
|
||||
"flatten": "Udjævn på trods af original formatering",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Markeringstilstand (standard)",
|
||||
"selection-mode-desc": "Markeringstilstanden er den primære tilstand, der kan benyttes til at indtaste data:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1051,17 +1106,17 @@
|
||||
"actions-title": "Handlinger"
|
||||
},
|
||||
"ingredients-natural-language-processor": "Ingredienser Naturlig Sprogprocessor",
|
||||
"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": "Mealie bruger Conditional Random Fields felter (CRF'er) til berarbejdning af ingredienser. Den model, der anvendes til ingredienser er baseret ud fra et datasæt på over 100.000 ingredienser fra et datasæt udarbejdet af New York Times. Bemærk, at da modellen kun er trænet på engelsk, kan du have forskellige resultater, når du bruger modellen på andre sprog. På denne side kan du teste modellen.",
|
||||
"ingredients-natural-language-processor-explanation-2": "Det er ikke perfekt, men giver generelt gode resultater og er et godt udgangspunkt for manuel redigering af ingredienser i individuelle felter. Alternativt kan du også bruge \"Brute\" metoden, der bruger en mønstermatchende teknik til at identificere ingredienser.",
|
||||
"nlp": "NLP",
|
||||
"brute": "Brute",
|
||||
"show-individual-confidence": "Show individual confidence",
|
||||
"show-individual-confidence": "Vis individual konfidensscore",
|
||||
"ingredient-text": "Ingredienstekst",
|
||||
"average-confident": "{0} Confident",
|
||||
"average-confident": "{0} konfidens",
|
||||
"try-an-example": "Prøv et eksempel",
|
||||
"parser": "Parser",
|
||||
"parser": "Behandler",
|
||||
"background-tasks": "Baggrundsopgaver",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"background-tasks-description": "Her kan du se status på alle opgaver, der afvikles i baggrunden",
|
||||
"no-logs-found": "Ingen logfiler fundet",
|
||||
"tasks": "Opgaver"
|
||||
},
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Velkommen, {0}",
|
||||
"description": "Administrer din profil, opskrifter og gruppeindstillinger.",
|
||||
"get-invite-link": "Få Invitationslink",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Offentligt link",
|
||||
"account-summary": "Konto oversigt",
|
||||
"account-summary-description": "Her er en oversigt over din gruppes oplysninger",
|
||||
"group-statistics": "Gruppestatistik",
|
||||
@@ -1101,13 +1156,13 @@
|
||||
"show-advanced-description": "Vis avancerede funktioner (API nøgler, Webhooks og Data Migrering)",
|
||||
"back-to-profile": "Tilbage til din profil",
|
||||
"looking-for-privacy-settings": "Leder du efter Privatlivsindstillinger?",
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
"manage-user-profile": "Manage User Profile",
|
||||
"manage-your-api-tokens": "Håndtér API Tokens",
|
||||
"manage-user-profile": "Administrer brugerprofil",
|
||||
"manage-cookbooks": "Administrer kogebøger",
|
||||
"manage-members": "Administrer medlemmer",
|
||||
"manage-webhooks": "Manage Webhooks",
|
||||
"manage-webhooks": "Administrér Webhooks",
|
||||
"manage-notifiers": "Administrer notifikationer",
|
||||
"manage-data-migrations": "Manage Data Migrations"
|
||||
"manage-data-migrations": "Administrer datamigreringer"
|
||||
},
|
||||
"cookbook": {
|
||||
"cookbooks": "Kogebøger",
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"category-filter": "Kategoriefilter",
|
||||
"category-update-failed": "Aktualisieren der Kategorie fehlgeschlagen",
|
||||
"category-updated": "Kategorie aktualisiert",
|
||||
"uncategorized-count": "{count} nicht kategorisierte",
|
||||
"uncategorized-count": "Nicht kategorisiert {count}",
|
||||
"create-a-category": "Eine Kategorie erstellen",
|
||||
"category-name": "Name der Kategorie",
|
||||
"category": "Kategorie"
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Kochbuch-Ereignisse",
|
||||
"tag-events": "Schlagwort-Ereignisse",
|
||||
"category-events": "Kategorie-Ereignisse",
|
||||
"when-a-new-user-joins-your-group": "Wenn ein neuer Benutzer deiner Gruppe beitritt"
|
||||
"when-a-new-user-joins-your-group": "Wenn ein neuer Benutzer deiner Gruppe beitritt",
|
||||
"recipe-events": "Rezept-Ereignisse"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Abbrechen",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Schlüsselwort",
|
||||
"link-copied": "Link kopiert",
|
||||
"loading-events": "Ereignisse werden geladen",
|
||||
"loading-recipe": "Lade Rezept...",
|
||||
"loading-ocr-data": "Lade OCR-Daten...",
|
||||
"loading-recipes": "Lade Rezepte",
|
||||
"message": "Nachricht",
|
||||
"monday": "Montag",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Kein Rezept gefunden",
|
||||
"ok": "OK",
|
||||
"options": "Optionen:",
|
||||
"plural-name": "Mehrzahl",
|
||||
"print": "Drucken",
|
||||
"print-preferences": "Druckeinstellungen",
|
||||
"random": "Zufall",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Alle exportieren",
|
||||
"refresh": "Aktualisieren",
|
||||
"upload-file": "Datei hochladen",
|
||||
"created-on-date": "Erstellt am: {0}"
|
||||
"created-on-date": "Erstellt am: {0}",
|
||||
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Bist du dir sicher, dass du die Gruppe <b>{groupName}<b/> löschen möchtest?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Gruppenkennung: {groupID}",
|
||||
"group-name": "Name der Gruppe",
|
||||
"group-not-found": "Gruppe nicht gefunden",
|
||||
"group-token": "Gruppen-Token",
|
||||
"group-with-value": "Gruppe: {groupID}",
|
||||
"groups": "Gruppen",
|
||||
"manage-groups": "Gruppen verwalten",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Allgemeine Einstellungen",
|
||||
"group-recipe-preferences": "Gruppen-Rezept-Einstellungen",
|
||||
"report": "Bericht",
|
||||
"report-with-id": "Bericht-ID: {id}",
|
||||
"group-management": "Gruppenverwaltung",
|
||||
"admin-group-management": "Admin: Gruppenverwaltung",
|
||||
"admin-group-management-text": "Änderungen an dieser Gruppe sind sofort wirksam.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "für {0}",
|
||||
"meal-plan-rules": "Essensplan Regeln",
|
||||
"new-rule": "Neue Regel",
|
||||
"meal-plan-rules-description": "Du kannst Regeln für die automatische Auswahl von Rezepten für deine Mahlzeiten erstellen. Anhand dieser Regeln wird das Programm zufällige Rezepte suchen, die bei der Erstellung von Essensplänen ausgewählt werden. Beachte, dass bei Regeln mit denselben Tag-/Mahlzeiten-Einschränkungen die Kategorien der Regeln zusammengeführt werden. In der Praxis ist es nicht notwendig, doppelte Regeln zu erstellen, aber es ist möglich.",
|
||||
"meal-plan-rules-description": "Du kannst Regeln für die automatische Auswahl von Rezepten für deine Mahlzeiten erstellen. Anhand dieser Regeln wird das Programm passende Rezepte suchen, die nach dem Zufallsprinzip bei der Erstellung von Essensplänen ausgewählt werden. Beachte, dass bei Regeln mit denselben Tag-/Mahlzeiten-Einschränkungen die Kategorien der Regeln zusammengeführt werden. In der Praxis ist es nicht notwendig, doppelte Regeln zu erstellen, aber es ist möglich.",
|
||||
"new-rule-description": "Wenn du eine neue Regel für einen Essensplan erstellst, kannst du die Regel für einen bestimmten Wochentag und/oder eine bestimmte Mahlzeit einschränken. Um eine Regel auf alle Tage oder alle Mahlzeiten anzuwenden, kannst du die Regel auf \"Alle\" setzen, damit sämtliche Tage und/oder Mahlzeiten berücksichtigt werden.",
|
||||
"recipe-rules": "Rezeptregeln",
|
||||
"applies-to-all-days": "Gilt an allen Tagen",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Rezept 1",
|
||||
"recipe-2": "Rezept 2",
|
||||
"paprika-text": "Mealie kann Rezepte aus der Paprika-App importieren. Exportiere deine Rezepte in Paprika, ändere die Endung der Export-Datei in .zip und lade sie unten hoch.",
|
||||
"mealie-text": "Mealie kann Rezepte aus der Mealie-App in einer Version vor v1.0 importieren. Exportiere deine Rezepte aus deiner alten Instanz und lade die Zip-Datei unten hoch. Bitte beachte, dass nur Rezepte aus dem Export importiert werden können."
|
||||
"mealie-text": "Mealie kann Rezepte aus der Mealie-App in einer Version vor v1.0 importieren. Exportiere deine Rezepte aus deiner alten Instanz und lade die Zip-Datei unten hoch. Bitte beachte, dass nur Rezepte aus dem Export importiert werden können.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie kann Rezepte von Plan to Eat importieren."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Mehrere hinzufügen",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Zum Essensplan hinzufügen",
|
||||
"add-to-timeline": "Zum Zeitstrahl hinzufügen",
|
||||
"recipe-added-to-list": "Rezept wurde zur Einkaufsliste hinzugefügt",
|
||||
"recipes-added-to-list": "Rezepte wurden zur Einkaufsliste hinzugefügt",
|
||||
"recipe-added-to-mealplan": "Rezept zum Essensplan hinzugefügt",
|
||||
"failed-to-add-recipes-to-list": "Fehler beim Hinzufügen des Rezepts zur Einkaufsliste",
|
||||
"failed-to-add-recipe-to-mealplan": "Fehler beim Hinzufügen des Rezepts zum Essensplan",
|
||||
"yield": "Portionsangabe",
|
||||
"quantity": "Menge",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Nachrichten-Schlüssel",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Bilder durch Ziehen & Ablegen in den Editor hinzufügen",
|
||||
"drop-image": "Bild hier ablegen",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Aktiviere Zutatenmengen, um diese Funktion zu nutzen",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Rezepte mit gesondert definierten Einheiten oder Lebensmitteln können nicht analysiert werden.",
|
||||
"parse-ingredients": "Zutaten parsen",
|
||||
@@ -538,7 +552,7 @@
|
||||
"recipe-yield": "Portionsangabe",
|
||||
"unit": "Maßeinheit",
|
||||
"upload-image": "Bild hochladen",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"screen-awake": "Bildschirm nicht abschalten",
|
||||
"remove-image": "Bild entfernen"
|
||||
},
|
||||
"search": {
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Schlagwortfilter",
|
||||
"search-hint": "'/' drücken",
|
||||
"advanced": "Erweitert",
|
||||
"auto-search": "Automatische Suche"
|
||||
"auto-search": "Automatische Suche",
|
||||
"no-results": "Keine Ergebnisse gefunden"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Neues Thema hinzufügen",
|
||||
"admin-settings": "Admin Einstellungen",
|
||||
"backup": {
|
||||
"backup-created": "Sicherung erfolgreich erstellt",
|
||||
"backup-created-at-response-export_path": "Sicherung erstellt unter {path}",
|
||||
"backup-deleted": "Sicherung gelöscht",
|
||||
"restore-success": "Wiederherstellung erfolgreich",
|
||||
"backup-tag": "Sicherungsbeschreibung",
|
||||
"create-heading": "Sicherung erstellen",
|
||||
"delete-backup": "Sicherung löschen",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Konfiguration",
|
||||
"docker-volume": "Docker Volume",
|
||||
"docker-volume-help": "Mealie setzt voraus, dass sich der Frontend-Container und das Backend das gleiche Docker-Volume oder den gleichen Speicher teilen. Dadurch wird sichergestellt, dass der Frontend-Container auf die Bilder und Assets auf der Festplatte zugreifen kann.",
|
||||
"volumes-are-misconfigured": "Volumes sind falsch konfiguriert",
|
||||
"volumes-are-misconfigured": "Volumes sind falsch konfiguriert.",
|
||||
"volumes-are-configured-correctly": "Volumes sind korrekt konfiguriert.",
|
||||
"status-unknown-try-running-a-validation": "Status unbekannt. Führe eine Überprüfung aus.",
|
||||
"validate": "Überprüfen",
|
||||
"email-configuration-status": "E-Mail Konfigurationsstatus",
|
||||
"email-configured": "E-Mail konfiguriert",
|
||||
"email-test-results": "E-Mail Test-Ergebnis",
|
||||
"ready": "Bereit",
|
||||
"not-ready": "Nicht bereit - bitte Konfiguration überprüfen",
|
||||
"succeeded": "Erfolgreich",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Passwort aktualisiert",
|
||||
"password": "Passwort",
|
||||
"password-strength": "Das Passwort ist {strength}",
|
||||
"please-enter-password": "Bitte gib dein neues Passwort ein.",
|
||||
"register": "Registrieren",
|
||||
"reset-password": "Passwort zurücksetzen",
|
||||
"sign-in": "Einloggen",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Benutzername",
|
||||
"users-header": "BENUTZER",
|
||||
"users": "Benutzer",
|
||||
"user-not-found": "Benutzer nicht gefunden",
|
||||
"webhook-time": "Webhook Zeit",
|
||||
"webhooks-enabled": "Webhooks aktiviert",
|
||||
"you-are-not-allowed-to-create-a-user": "Du bist nicht berechtigt, einen Benutzer anzulegen",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Benutzerverwaltung",
|
||||
"reset-locked-users": "Gesperrte Benutzer zurücksetzen",
|
||||
"admin-user-creation": "Benutzer erstellen",
|
||||
"admin-user-management": "Administrator Benutzerverwaltung",
|
||||
"user-details": "Benutzerdetails",
|
||||
"user-name": "Benutzername",
|
||||
"authentication-method": "Authentifizierungsmethode",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "Benutzer kann andere in Gruppe einladen",
|
||||
"user-can-manage-group": "Benutzer kann Gruppe verwalten",
|
||||
"user-can-organize-group-data": "Benutzer kann Gruppendaten bearbeiten",
|
||||
"enable-advanced-features": "Erweiterte Funktionen aktivieren"
|
||||
"enable-advanced-features": "Erweiterte Funktionen aktivieren",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Es sieht so aus, als ob du dich zum ersten Mal anmeldest.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Möchtest du das hier nicht mehr sehen? Bitte ändere deine E-Mail in den Benutzereinstellungen!",
|
||||
"forgot-password": "Passwort vergessen",
|
||||
"forgot-password-text": "Bitte gib Deine E-Mail-Adresse ein. Wir werden Dir eine E-Mail zusenden, damit Du Dein Passwort zurücksetzen kannst.",
|
||||
"changes-reflected-immediately": "Änderungen an diesem Benutzer sind sofort wirksam."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "übersetzt",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Lebensmittel erstellen",
|
||||
"food-label": "Lebensmittel Etikett",
|
||||
"edit-food": "Lebensmittel bearbeiten",
|
||||
"food-data": "Lebensmitteldaten"
|
||||
"food-data": "Lebensmitteldaten",
|
||||
"example-food-singular": "z.B. Zwiebel",
|
||||
"example-food-plural": "z.B. Zwiebeln"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Füllt die Datenbank mit gängigen Maßeinheiten basierend auf deiner Sprache.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "{0} wird in {1} zusammengeführt",
|
||||
"create-unit": "Einheit erstellen",
|
||||
"abbreviation": "Abkürzung",
|
||||
"plural-abbreviation": "Mehrzahl Abkürzung",
|
||||
"description": "Beschreibung",
|
||||
"display-as-fraction": "Als Bruchzahl anzeigen",
|
||||
"use-abbreviation": "Abkürzungen verwenden",
|
||||
"edit-unit": "Einheit bearbeiten",
|
||||
"unit-data": "Einheitendaten",
|
||||
"use-abbv": "Verwende Abk.",
|
||||
"fraction": "Bruchzahl"
|
||||
"fraction": "Bruchzahl",
|
||||
"example-unit-singular": "z.B. gehäufter Teelöffel",
|
||||
"example-unit-plural": "z.B. gehäufte Teelöffel",
|
||||
"example-unit-abbreviation-singular": "z.B. geh. TL",
|
||||
"example-unit-abbreviation-plural": "z.B. geh. TL"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Füllt die Datenbank mit gängigen Etiketten basierend auf deiner Sprache.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Rezepte löschen",
|
||||
"source-unit-will-be-deleted": "Quell-Einheit wird gelöscht"
|
||||
},
|
||||
"create-alias": "Alias erstellen",
|
||||
"manage-aliases": "Aliasse verwalten",
|
||||
"seed-data": "Musterdaten",
|
||||
"seed": "Musterdaten",
|
||||
"data-management": "Datenverwaltung",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Daten auswählen",
|
||||
"select-language": "Sprache wählen",
|
||||
"columns": "Spalten",
|
||||
"combine": "Zusammenführen"
|
||||
"combine": "Zusammenführen",
|
||||
"categories": {
|
||||
"edit-category": "Kategorie bearbeiten",
|
||||
"new-category": "Neue Kategorie",
|
||||
"category-data": "Kategorien-Daten"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Neues Schlagwort",
|
||||
"edit-tag": "Schlagwort bearbeiten",
|
||||
"tag-data": "Schlagworte-Daten"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Neues Utensil",
|
||||
"edit-tool": "Utensil bearbeiten",
|
||||
"tool-data": "Utensilien-Daten"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Benutzerregistrierung",
|
||||
"registration-success": "Registrierung erfolgreich",
|
||||
"join-a-group": "Gruppe beitreten",
|
||||
"create-a-new-group": "Neue Gruppe erstellen",
|
||||
"provide-registration-token-description": "Bitte gib den Registrierungstoken für die Gruppe ein, der du beitreten möchtest. Du kannst ihn von einem bestehenden Gruppenmitglied erhalten.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "OCR Editor",
|
||||
"toolbar": "Werkzeugleiste",
|
||||
"selection-mode": "Auswahlmodus",
|
||||
"pan-and-zoom-picture": "Bild verschieben und zoomen",
|
||||
"split-text": "Text aufteilen",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Nach Textblöcken aufteilen",
|
||||
"flatten": "Ursprüngliche Formatierung verwerfen",
|
||||
"help": {
|
||||
"help": "Hilfe",
|
||||
"mouse-modes": "Maus-Modus",
|
||||
"selection-mode": "Auswahlmodus (Standard)",
|
||||
"selection-mode-desc": "Der Auswahlmodus ist die Standardmethode, um Daten hinzuzufügen:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Willkommen, {0}",
|
||||
"description": "Verwalte dein Profil, Rezepte und Gruppeneinstellungen.",
|
||||
"get-invite-link": "Einladungslink erzeugen",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Öffentlichen Link abrufen",
|
||||
"account-summary": "Kontoübersicht",
|
||||
"account-summary-description": "Hier ist eine Übersicht der Informationen deiner Gruppe",
|
||||
"group-statistics": "Gruppenstatistik",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"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"
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Άκυρο",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Λέξη-κλειδί",
|
||||
"link-copied": "Ο Σύνδεσμος Αντιγράφηκε",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Φόρτωση Συνταγών",
|
||||
"message": "Μήνυμα",
|
||||
"monday": "Δευτέρα",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Δεν βρέθηκαν συνταγές",
|
||||
"ok": "ΟΚ",
|
||||
"options": "Επιλογές:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Εκτύπωση",
|
||||
"print-preferences": "Προτιμήσεις Εκτύπωσης",
|
||||
"random": "Τυχαίο",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Εξαγωγή όλων",
|
||||
"refresh": "Ανανέωση",
|
||||
"upload-file": "Μεταφόρτωση αρχείου",
|
||||
"created-on-date": "Δημιουργήθηκε στις: {0}"
|
||||
"created-on-date": "Δημιουργήθηκε στις: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{groupName}<b/>;",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Αναγνωριστικό ομάδας: {groupID}",
|
||||
"group-name": "Όνομα Ομάδας",
|
||||
"group-not-found": "Η Ομάδα δεν βρέθηκε",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Ομάδα: {groupID}",
|
||||
"groups": "Ομάδες",
|
||||
"manage-groups": "Διαχείριση Ομάδων",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Γενικές προτιμήσεις",
|
||||
"group-recipe-preferences": "Προτιμήσεις Συνταγών Ομάδας",
|
||||
"report": "Αναφορά",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Διαχείριση ομάδων",
|
||||
"admin-group-management": "Διαχείριση Ομάδας Διαχειριστών",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "for {0} meal types",
|
||||
"meal-plan-rules": "Κανόνες Προγράμματος Γευμάτων",
|
||||
"new-rule": "Νέος κανόνας",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for you 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.",
|
||||
"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",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Μαζική Προσθήκη",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Φίλτρο Ετικέτας",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Προσθήκη νέου θέματος",
|
||||
"admin-settings": "Ρυθμίσεις Διαχειριστή",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Αντίγραφο ασφαλείας αποθηκεύτηκαν στο: {path}",
|
||||
"backup-deleted": "Το Αντίγραφο διαγράφηκε",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Αντίγραφο Ετικέτας",
|
||||
"create-heading": "Δημιουργία αντιγράφου ασφαλείας",
|
||||
"delete-backup": "Διαγραφή Αντιγράφου Ασφαλείας",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
||||
"password": "Κωδικός",
|
||||
"password-strength": "Ο κωδικός είναι {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Εγγραφή",
|
||||
"reset-password": "Επαναφορά Κωδικού",
|
||||
"sign-in": "Είσοδος",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Όνομα Χρήστη",
|
||||
"users-header": "ΧΡΗΣΤΕΣ",
|
||||
"users": "Χρήστες",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Χρόνος Webhook",
|
||||
"webhooks-enabled": "Το webhook είναι ενεργό",
|
||||
"you-are-not-allowed-to-create-a-user": "Δεν επιτρέπεται να δημιουργήσετε ένα χρήστη",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "μεταφρασμένο",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"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"
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancel",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Keyword",
|
||||
"link-copied": "Link Copied",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Loading Recipes",
|
||||
"message": "Message",
|
||||
"monday": "Monday",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "No Recipe Found",
|
||||
"ok": "OK",
|
||||
"options": "Options:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Print",
|
||||
"print-preferences": "Print Preferences",
|
||||
"random": "Random",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "Upload File",
|
||||
"created-on-date": "Created on: {0}"
|
||||
"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."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"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",
|
||||
@@ -242,6 +248,7 @@
|
||||
"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.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"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 you 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.",
|
||||
"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",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Add",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
@@ -573,7 +590,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups a 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 off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"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 off 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",
|
||||
"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.",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Password updated",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"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"
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancel",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Keyword",
|
||||
"link-copied": "Link Copied",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Loading Recipes",
|
||||
"message": "Message",
|
||||
"monday": "Monday",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "No Recipe Found",
|
||||
"ok": "OK",
|
||||
"options": "Options:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Print",
|
||||
"print-preferences": "Print Preferences",
|
||||
"random": "Random",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "Upload File",
|
||||
"created-on-date": "Created on: {0}"
|
||||
"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."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"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",
|
||||
@@ -242,6 +248,7 @@
|
||||
"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.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"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 you 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.",
|
||||
"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",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Add",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create A Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Password updated",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Eventos del recetario",
|
||||
"tag-events": "Eventos de etiqueta",
|
||||
"category-events": "Eventos de Categoría",
|
||||
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo"
|
||||
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancelar",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Etiqueta",
|
||||
"link-copied": "Enlace copiado",
|
||||
"loading-events": "Cargando Eventos",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Cargando recetas",
|
||||
"message": "Mensaje",
|
||||
"monday": "Lunes",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Receta no encontrada",
|
||||
"ok": "Aceptar",
|
||||
"options": "Opciones:",
|
||||
"plural-name": "Nombre en plural",
|
||||
"print": "Imprimir",
|
||||
"print-preferences": "Preferencias de impresión",
|
||||
"random": "Aleatorio",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Exportar todo",
|
||||
"refresh": "Actualizar",
|
||||
"upload-file": "Subir Archivo",
|
||||
"created-on-date": "Creado el {0}"
|
||||
"created-on-date": "Creado el {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Por favor, confirma que deseas eliminar <b>{groupName}<b/>",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID del Grupo: {groupID}",
|
||||
"group-name": "Nombre del Grupo",
|
||||
"group-not-found": "Grupo no encontrado",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Grupo: {groupID}",
|
||||
"groups": "Grupos",
|
||||
"manage-groups": "Administrar grupos",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Opciones generales",
|
||||
"group-recipe-preferences": "Preferencias de grupo de las recetas",
|
||||
"report": "Informe",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Administración de grupos",
|
||||
"admin-group-management": "Gestión del grupo administrador",
|
||||
"admin-group-management-text": "Los cambios en este grupo se reflejarán inmediatamente.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "para {0} tipos de comida",
|
||||
"meal-plan-rules": "Reglas del Plan de Comida",
|
||||
"new-rule": "Nueva Regla",
|
||||
"meal-plan-rules-description": "Puede crear reglas para la selección automática de recetas para sus planes de comidas. Estas reglas son utilizadas por el servidor para determinar el conjunto aleatorio de recetas para seleccionar al crear planes de comidas. Tenga en cuenta que si las reglas tienen las mismas restricciones de día/tipo, las categorías de las reglas se fusionarán. En la práctica, no es necesario crear reglas duplicadas, pero es posible hacerlo.",
|
||||
"meal-plan-rules-description": "Puedes crear reglas para la selección automática de recetas para tus planes de comida. Estas reglas son usadas por el servidor para determinar el conjunto aleatorio de recetas para crear planes de comidas. Ten en cuenta que si las reglas tienen las mismas restricciones diarias/tipos, las categorías de las reglas se fusionaran. En la práctica, no es necesario crear reglas duplicadas, pero es posible.",
|
||||
"new-rule-description": "Al crear una nueva regla para un plan de comidas, puede restringir la regla para que se aplique a un día específico de la semana y/o un tipo específico de comida. Para aplicar una regla a todos los días o a todos los tipos de comida, puede establecer la regla en \"Cualquiera\", lo que la aplicará a todos los valores posibles para el día y/o el tipo de comida.",
|
||||
"recipe-rules": "Reglas de Recetas",
|
||||
"applies-to-all-days": "Aplica para todos los días",
|
||||
@@ -322,30 +329,34 @@
|
||||
},
|
||||
"copymethat": {
|
||||
"description-long": "Mealie puede importar recetas desde Copie Me That. Exporta tus recetas en formato HTML, luego sube el archivo .zip.",
|
||||
"title": "Copy Me That Recipe Manager"
|
||||
"title": "Copiar ese gestor de receta"
|
||||
},
|
||||
"paprika": {
|
||||
"description-long": "Mealie puede importar recetas de la aplicación Paprika. Exporta tus recetas de paprika, renombra la extensión del fichero a .zip y súbala a continuación.",
|
||||
"title": "Paprika Recipe Manager"
|
||||
"title": "Gestor de recetas de Paprika"
|
||||
},
|
||||
"mealie-pre-v1": {
|
||||
"description-long": "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.",
|
||||
"description-long": "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.",
|
||||
"title": "Mealie Pre v1.0"
|
||||
},
|
||||
"tandoor": {
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"description-long": "Mealie puede importar recetas de Tandoor. Exporta tus datos en el formato \"Por defecto\" y luego sube el archivo .zip.",
|
||||
"title": "Recetas de Tandoor"
|
||||
},
|
||||
"recipe-data-migrations": "Migración de recetas",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"recipe-data-migrations-explanation": "Las recetas pueden migrarse desde otra aplicación soportada a Mealie. Esta es una excelente manera de empezar con Mealie.",
|
||||
"choose-migration-type": "Elegir tipo de migración",
|
||||
"tag-all-recipes": "Etiqueta todas las recetas con la etiqueta {tag-name}",
|
||||
"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",
|
||||
"nextcloud-text": "Las recetas Nextcloud se pueden importar desde un archivo zip que contiene los datos almacenados en Nextcloud. Consulte la estructura de carpetas de ejemplo a continuación para asegurarse de que sus recetas pueden ser importadas.",
|
||||
"chowdown-text": "Mealie soporta nativamente el formato de repositorio chowdown. Descarga el código del repositorio como un archivo .zip y súbelo a continuación",
|
||||
"recipe-1": "Receta 1",
|
||||
"recipe-2": "Receta 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."
|
||||
"paprika-text": "Mealie puede importar recetas de la aplicación Paprika. Exporta tus recetas de paprika, renombra la extensión del fichero a .zip y súbelo a continuación.",
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Añadir en masa",
|
||||
@@ -365,7 +376,7 @@
|
||||
"trim-whitespace-description": "Eliminar espacios en blanco iniciales y finales así como líneas en blanco",
|
||||
"trim-prefix-description": "Eliminar el primer carácter de cada línea",
|
||||
"split-by-numbered-line-description": "Intenta dividir un párrafo utilizando los patrones '1)' o '1.'",
|
||||
"import-by-url": "Importar una receta por URL",
|
||||
"import-by-url": "Importar una receta desde URL",
|
||||
"create-manually": "Crear receta manualmente",
|
||||
"make-recipe-image": "Haz de esta la imagen de la receta"
|
||||
},
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "Formato AAA-MM-DD",
|
||||
"add-to-list": "Agregar a la lista",
|
||||
"add-to-plan": "Agregar al menú",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Añadir al cronograma",
|
||||
"recipe-added-to-list": "Receta añadida a la lista",
|
||||
"recipes-added-to-list": "Recetas añadidas a la lista",
|
||||
"recipe-added-to-mealplan": "Receta añadida al menú",
|
||||
"failed-to-add-recipes-to-list": "Error al añadir las recetas a la lista",
|
||||
"failed-to-add-recipe-to-mealplan": "Error al añadir receta al menú",
|
||||
"yield": "Raciones",
|
||||
"quantity": "Cantidad",
|
||||
@@ -481,11 +494,11 @@
|
||||
"locked": "Bloqueada",
|
||||
"public-link": "Enlace público",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Temporizador de cocina",
|
||||
"start-timer": "Iniciar Temporizador",
|
||||
"pause-timer": "Pausar Temporizador",
|
||||
"resume-timer": "Reanudar Temporizador",
|
||||
"stop-timer": "Detener temporizador"
|
||||
},
|
||||
"edit-timeline-event": "Editar evento en la cronología",
|
||||
"timeline": "Cronología",
|
||||
@@ -496,10 +509,11 @@
|
||||
"how-did-it-turn-out": "¿Cómo resultó esto?",
|
||||
"user-made-this": "{user} hizo esto",
|
||||
"last-made-date": "Cocinado por última vez el {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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.",
|
||||
"api-extras-description": "Los extras de las recetas son una característica clave de la API de Mealie. Permiten crear pares json clave/valor personalizados dentro de una receta para acceder desde aplicaciones de terceros. Puede utilizar estas claves para almacenar información, para activar la automatización o mensajes personalizados para transmitir al dispositivo deseado.",
|
||||
"message-key": "Clave de mensaje",
|
||||
"parse": "Analizar",
|
||||
"attach-images-hint": "Adjuntar imágenes arrastrando y soltando en el editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Habilitar la cantidad de ingredientes para usar esta característica",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Las recetas con unidades o alimentos definidos no pueden ser analizadas.",
|
||||
"parse-ingredients": "Analizar ingredientes",
|
||||
@@ -516,7 +530,7 @@
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crear una receta proporcionando el nombre. Todas las recetas deben tener nombres únicos.",
|
||||
"new-recipe-names-must-be-unique": "El nombre de la receta debe ser único",
|
||||
"scrape-recipe": "Analiza receta",
|
||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||
"scrape-recipe-description": "Importa una receta por URL. Proporcione la URL para el sitio que desea importar, y Mealie intentará importar la receta de ese sitio y añadirla a su colección.",
|
||||
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
|
||||
"stay-in-edit-mode": "Permanecer en modo edición",
|
||||
"import-from-zip": "Importar desde zip",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Porciones",
|
||||
"unit": "Unidades",
|
||||
"upload-image": "Subir imagen",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Mantener la pantalla encendida",
|
||||
"remove-image": "Eliminar imagen"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Búsqueda avanzada",
|
||||
@@ -548,8 +562,8 @@
|
||||
"include": "Incluir",
|
||||
"max-results": "Resultados máximos",
|
||||
"or": "O",
|
||||
"has-any": "Has Any",
|
||||
"has-all": "Has All",
|
||||
"has-any": "Tiene alguna",
|
||||
"has-all": "Tiene todo",
|
||||
"results": "Resultados",
|
||||
"search": "Buscar",
|
||||
"search-mealie": "Buscar Mealie (presione /)",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtro de Etiquetas",
|
||||
"search-hint": "Presione '/'",
|
||||
"advanced": "Avanzado",
|
||||
"auto-search": "Búsqueda automática"
|
||||
"auto-search": "Búsqueda automática",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Añadir un nuevo tema",
|
||||
"admin-settings": "Opciones del adminstrador",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Copia de seguridad creada en {path}",
|
||||
"backup-deleted": "Copia de seguridad eliminada",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Etiqueta de la copia de seguridad",
|
||||
"create-heading": "Crear una copia de seguridad",
|
||||
"delete-backup": "Eliminar copia de seguridad",
|
||||
@@ -648,14 +665,14 @@
|
||||
"you-have-token-count": "Usted no tiene tokens activos.|Usted tiene un token activo.|Usted tiene {count} tokens activos."
|
||||
},
|
||||
"toolbox": {
|
||||
"assign-all": "Asignar todos los",
|
||||
"assign-all": "Asignar todos",
|
||||
"bulk-assign": "Asignar en masa",
|
||||
"new-name": "Nombre Nuevo",
|
||||
"new-name": "Nuevo Nombre",
|
||||
"no-unused-items": "No hay elementos sin usar",
|
||||
"recipes-affected": "Ninguna receta afectada | Una receta afectada |{count} recetas afectadas",
|
||||
"remove-unused": "Eliminar los no usados",
|
||||
"recipes-affected": "Ninguna receta afectada|Una receta afectada|{count} recetas afectadas",
|
||||
"remove-unused": "Eliminar los no utilizados",
|
||||
"title-case-all": "Primera letra en mayúscula",
|
||||
"toolbox": "Herramientas",
|
||||
"toolbox": "Utensilios",
|
||||
"unorganized": "Sin organizar"
|
||||
},
|
||||
"webhooks": {
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuración",
|
||||
"docker-volume": "Volumen de Docker",
|
||||
"docker-volume-help": "Mealie requiere que los contenedores de frontend y backend compartan el mismo volumen o almacenamiento en docker. Esto asegura que el contenedor del frontend pueda acceder adecuadamente a las imágenes y los activos almacenados en el disco.",
|
||||
"volumes-are-misconfigured": "Los volúmenes están mal configurados",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Los volúmenes se configuran correctamente.",
|
||||
"status-unknown-try-running-a-validation": "Estado desconocido. Intente ejecutar una validación.",
|
||||
"validate": "Validar",
|
||||
"email-configuration-status": "Estado de la Configuración del Correo Electrónico",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Listo",
|
||||
"not-ready": "No Listo - Comprobar variables de ambiente",
|
||||
"succeeded": "Logrado",
|
||||
@@ -739,7 +758,7 @@
|
||||
"search": "Buscar",
|
||||
"site-settings": "Ajustes",
|
||||
"tags": "Etiquetas",
|
||||
"toolbox": "Herramientas",
|
||||
"toolbox": "Utensilios",
|
||||
"language": "Idioma",
|
||||
"maintenance": "Mantenimiento",
|
||||
"background-tasks": "Tareas en Segundo Plano",
|
||||
@@ -777,7 +796,7 @@
|
||||
"tool-name": "Nombre del utensilio",
|
||||
"create-new-tool": "Crear nuevo utensilio",
|
||||
"on-hand-checkbox-label": "Mostrar como disponible (marcado)",
|
||||
"required-tools": "Herramientas necesarias"
|
||||
"required-tools": "Utensilios necesarios"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Administrador/a",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Contraseña actualizada",
|
||||
"password": "Contraseña",
|
||||
"password-strength": "Fortaleza de la contraseña: {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registrarse",
|
||||
"reset-password": "Restablecer contraseña",
|
||||
"sign-in": "Iniciar sesión",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Usuario",
|
||||
"users-header": "USUARIOS",
|
||||
"users": "Usuarios",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Tiempo de Webhook",
|
||||
"webhooks-enabled": "Webhooks habilitados",
|
||||
"you-are-not-allowed-to-create-a-user": "No tiene permisos para crear usuarios",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Gestión de Usuarios",
|
||||
"reset-locked-users": "Restablecer usuarios bloqueados",
|
||||
"admin-user-creation": "Creación de Usuario Administrador",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Detalles de usuario",
|
||||
"user-name": "Nombre de usuario",
|
||||
"authentication-method": "Método de autenticación",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "El usuario puede invitar a otros al grupo",
|
||||
"user-can-manage-group": "El usuario puede administrar el grupo",
|
||||
"user-can-organize-group-data": "El usuario puede organizar los datos del grupo",
|
||||
"enable-advanced-features": "Habilitar Características Avanzadas"
|
||||
"enable-advanced-features": "Habilitar Características Avanzadas",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traducido",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Crear Alimento",
|
||||
"food-label": "Etiqueta de Alimento",
|
||||
"edit-food": "Editar Alimento",
|
||||
"food-data": "Datos de Alimento"
|
||||
"food-data": "Datos de Alimento",
|
||||
"example-food-singular": "ej: Cebolla",
|
||||
"example-food-plural": "ej: Cebollas"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Añade a la base de datos unidades comunes basadas en su idioma local.",
|
||||
@@ -894,53 +923,76 @@
|
||||
"target-unit": "Target Unit",
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"description": "Description",
|
||||
"abbreviation": "Abreviatura",
|
||||
"plural-abbreviation": "Abreviatura en plural",
|
||||
"description": "Descripción",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"use-abbreviation": "Usar Abreviaturas",
|
||||
"edit-unit": "Editar unidad",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"use-abbv": "Usar Abr.",
|
||||
"fraction": "Fracción",
|
||||
"example-unit-singular": "ej: Cucharada",
|
||||
"example-unit-plural": "ej: Cucharadas",
|
||||
"example-unit-abbreviation-singular": "ej: Cda",
|
||||
"example-unit-abbreviation-plural": "ej: Cdas"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Añade a la base de datos etiquetas comunes basadas en su idioma local.",
|
||||
"edit-label": "Edit Label",
|
||||
"new-label": "New Label",
|
||||
"labels": "Labels"
|
||||
"edit-label": "Editar etiqueta",
|
||||
"new-label": "Nueva etiqueta",
|
||||
"labels": "Etiquetas"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Purge Exports",
|
||||
"are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?",
|
||||
"purge-exports": "Limpiar exportaciones",
|
||||
"are-you-sure-you-want-to-delete-all-export-data": "¿Está seguro de que desea eliminar todos sus datos de exportación?",
|
||||
"confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.",
|
||||
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
|
||||
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
|
||||
"recipe-data": "Recipe Data",
|
||||
"recipe-data": "Datos de la receta",
|
||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||
"recipe-columns": "Recipe Columns",
|
||||
"data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.",
|
||||
"data-exports": "Data Exports",
|
||||
"tag": "Tag",
|
||||
"categorize": "Categorize",
|
||||
"update-settings": "Update Settings",
|
||||
"tag-recipes": "Tag Recipes",
|
||||
"categorize-recipes": "Categorize Recipes",
|
||||
"export-recipes": "Export Recipes",
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"data-exports": "Exportación de datos",
|
||||
"tag": "Etiqueta",
|
||||
"categorize": "Clasificar",
|
||||
"update-settings": "Actualizar configuración",
|
||||
"tag-recipes": "Etiquetar Recetas",
|
||||
"categorize-recipes": "Categorizar recetas",
|
||||
"export-recipes": "Exportar recetas",
|
||||
"delete-recipes": "Borrar Recetas",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Crear un Alias",
|
||||
"manage-aliases": "Administrar Alias",
|
||||
"seed-data": "Datos de ejemplo",
|
||||
"seed": "Seed",
|
||||
"seed": "Semilla",
|
||||
"data-management": "Data Management",
|
||||
"data-management-description": "Select which data set you want to make changes to.",
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"select-data": "Seleccionar datos",
|
||||
"select-language": "Seleccionar idioma",
|
||||
"columns": "Columnas",
|
||||
"combine": "Combinar",
|
||||
"categories": {
|
||||
"edit-category": "Editar Categoría",
|
||||
"new-category": "Nueva Categoría",
|
||||
"category-data": "Datos de la categoría"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Nueva Etiqueta",
|
||||
"edit-tag": "Editar Etiqueta",
|
||||
"tag-data": "Etiquetar Datos"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Nuevo Utensilio",
|
||||
"edit-tool": "Editar Utensilio",
|
||||
"tool-data": "Datos Utensilio"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registro de usuario",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Unirse a un grupo",
|
||||
"create-a-new-group": "Crear un grupo nuevo",
|
||||
"provide-registration-token-description": "Por favor, proporcione el token de registro asociado con el grupo al que desea unirse. Necesitará obtenerlo de un miembro del grupo.",
|
||||
@@ -954,7 +1006,7 @@
|
||||
"group-name-is-taken": "El nombre de grupo ya está en uso",
|
||||
"username-is-taken": "El nombre de usuario ya está en uso",
|
||||
"email-is-taken": "Este correo ya está en uso",
|
||||
"this-field-is-required": "This Field is Required"
|
||||
"this-field-is-required": "Este campo es obligatorio"
|
||||
},
|
||||
"export": {
|
||||
"export": "Exportar",
|
||||
@@ -987,13 +1039,16 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor de OCR",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Modo de selección",
|
||||
"pan-and-zoom-picture": "Desplazar y hacer zoom en la imagen",
|
||||
"split-text": "Split text",
|
||||
"preserve-line-breaks": "Preserve original line breaks",
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1020,13 +1075,13 @@
|
||||
"page-title": "Site Maintenance",
|
||||
"summary-title": "Summary",
|
||||
"button-label-get-summary": "Get Summary",
|
||||
"button-label-open-details": "Details",
|
||||
"button-label-open-details": "Detalles",
|
||||
"info-description-data-dir-size": "Data Directory Size",
|
||||
"info-description-log-file-size": "Log File Size",
|
||||
"info-description-cleanable-directories": "Cleanable Directories",
|
||||
"info-description-cleanable-images": "Cleanable Images",
|
||||
"storage": {
|
||||
"title-temporary-directory": "Temporary Directory (.temp)",
|
||||
"title-temporary-directory": "Directorio temporal (.temp)",
|
||||
"title-backups-directory": "Backups Directory (backups)",
|
||||
"title-groups-directory": "Groups Directory (groups)",
|
||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
||||
@@ -1036,19 +1091,19 @@
|
||||
"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-temporary-files-name": "Eliminar archivos temporales",
|
||||
"action-clean-temporary-files-description": "Eliminar todos los archivos y carpetas del directorio .temp",
|
||||
"action-clean-images-name": "Limpiar imágenes",
|
||||
"action-clean-images-description": "Elimina todas las imágenes que no terminan con .webp",
|
||||
"actions-description": "Las acciones de mantenimiento son {destructive_in_bold} y deben utilizarse con precaución. Realizar cualquiera de estas acciones es {irreversible_in_bold}.",
|
||||
"actions-description-destructive": "destructivas",
|
||||
"actions-description-irreversible": "irreversible",
|
||||
"logs-action-refresh": "Refresh Logs",
|
||||
"logs-page-title": "Mealie Logs",
|
||||
"logs-tail-lines-label": "Tail Lines"
|
||||
"logs-action-refresh": "Actualizar Logs",
|
||||
"logs-page-title": "Logs de Mealie",
|
||||
"logs-tail-lines-label": "Últimas Líneas"
|
||||
},
|
||||
"mainentance": {
|
||||
"actions-title": "Actions"
|
||||
"actions-title": "Acciones"
|
||||
},
|
||||
"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.",
|
||||
@@ -1059,28 +1114,28 @@
|
||||
"ingredient-text": "Ingredient Text",
|
||||
"average-confident": "{0} Confident",
|
||||
"try-an-example": "Try an example",
|
||||
"parser": "Parser",
|
||||
"background-tasks": "Background Tasks",
|
||||
"parser": "Procesador",
|
||||
"background-tasks": "Tareas en Segundo Plano",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tareas"
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
"description": "Manage your profile, recipes, and group settings.",
|
||||
"get-invite-link": "Get Invite Link",
|
||||
"get-public-link": "Get Public Link",
|
||||
"account-summary": "Account Summary",
|
||||
"account-summary-description": "Here's a summary of your group's information",
|
||||
"welcome-user": "👋 Hola, {0}",
|
||||
"description": "Administra tu perfil, recetas y ajustes de grupo.",
|
||||
"get-invite-link": "Obtener enlace de invitación",
|
||||
"get-public-link": "Obtener enlace público",
|
||||
"account-summary": "Información de la cuenta",
|
||||
"account-summary-description": "Este es un resumen de la información de tu grupo",
|
||||
"group-statistics": "Group Statistics",
|
||||
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
|
||||
"storage-capacity": "Storage Capacity",
|
||||
"storage-capacity": "Capacidad de almacenamiento",
|
||||
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
||||
"personal": "Personal",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users",
|
||||
"user-settings": "User Settings",
|
||||
"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": "Ajustes de usuario",
|
||||
"user-settings-description": "Administrar preferencias, cambiar contraseña y actualizar correo electrónico",
|
||||
"api-tokens-description": "Administra tus API Tokens para acceder desde aplicaciones externas",
|
||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
||||
"group-settings": "Group Settings",
|
||||
"group-settings-description": "Manage your common group settings like mealplan and privacy settings.",
|
||||
@@ -1104,22 +1159,22 @@
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
"manage-user-profile": "Manage User Profile",
|
||||
"manage-cookbooks": "Manage Cookbooks",
|
||||
"manage-members": "Manage Members",
|
||||
"manage-members": "Gestionar miembros",
|
||||
"manage-webhooks": "Manage Webhooks",
|
||||
"manage-notifiers": "Manage Notifiers",
|
||||
"manage-data-migrations": "Manage Data Migrations"
|
||||
"manage-data-migrations": "Administrar Migraciones de Datos"
|
||||
},
|
||||
"cookbook": {
|
||||
"cookbooks": "Cookbooks",
|
||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.",
|
||||
"public-cookbook": "Public Cookbook",
|
||||
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
||||
"filter-options": "Filter Options",
|
||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
||||
"require-all-categories": "Require All Categories",
|
||||
"require-all-tags": "Require All Tags",
|
||||
"require-all-tools": "Require All Tools",
|
||||
"cookbook-name": "Cookbook Name",
|
||||
"cookbook-with-name": "Cookbook {0}"
|
||||
"cookbooks": "Recetarios",
|
||||
"description": "Los recetarios son otra forma de organizar recetas creando secciones cruzadas de recetas y etiquetas. Crear un recetario añadirá una entrada a la barra lateral y todas las recetas con las etiquetas y categorías elegidas se mostrarán en el recetario.",
|
||||
"public-cookbook": "Recetario público",
|
||||
"public-cookbook-description": "Los recetarios públicos se pueden compartir con usuarios externos y se mostrarán en su página de grupos.",
|
||||
"filter-options": "Opciones de filtro",
|
||||
"filter-options-description": "Cuando \"Requerir todo\" esté seleccionado, el recetario solo incluirá recetas que tengan todos los elementos seleccionados. Esto se aplica a cada subconjunto de selectores y no a una sección de los elementos seleccionados.",
|
||||
"require-all-categories": "Requerir todas las categorías",
|
||||
"require-all-tags": "Requerir todas las etiquetas",
|
||||
"require-all-tools": "Requiere todos los utensilios",
|
||||
"cookbook-name": "Nombre del recetario",
|
||||
"cookbook-with-name": "Recetario {0}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Keittokirjatapahtumat",
|
||||
"tag-events": "Valitse tapahtumat",
|
||||
"category-events": "Luokkatapahtumat",
|
||||
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen"
|
||||
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Peruuta",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Hakusana",
|
||||
"link-copied": "Linkki kopioitu",
|
||||
"loading-events": "Ladataan tapahtumia",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Ladataan reseptejä",
|
||||
"message": "Viesti",
|
||||
"monday": "Maanantai",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Reseptiä ei löytynyt",
|
||||
"ok": "OK",
|
||||
"options": "Valinnat:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Tulosta",
|
||||
"print-preferences": "Tulosta asetukset",
|
||||
"random": "Satunnainen",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Vie kaikki",
|
||||
"refresh": "Päivitä",
|
||||
"upload-file": "Tuo tiedosto",
|
||||
"created-on-date": "Luotu {0}"
|
||||
"created-on-date": "Luotu {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Haluatko varmasti poistaa ryhmän <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Ryhmän ID: {groupID}",
|
||||
"group-name": "Ryhmän nimi",
|
||||
"group-not-found": "Ryhmää ei löytynyt",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Ryhmä: {groupID}",
|
||||
"groups": "Ryhmät",
|
||||
"manage-groups": "Hallitse ryhmiä",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Yleiset Asetukset",
|
||||
"group-recipe-preferences": "Ryhmän reseptiasetukset",
|
||||
"report": "Raportti",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Ryhmien hallinta",
|
||||
"admin-group-management": "Ylläpitoryhmien hallinta",
|
||||
"admin-group-management-text": "Muutokset tähän ryhmään tulevat näkymään välittömästi.",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Resepti 1",
|
||||
"recipe-2": "Resepti 2",
|
||||
"paprika-text": "Mealie voi tuoda reseptejä Paprika-sovelluksesta. Vie reseptisi ohjelmasta ulos, nimeä tiedoston pääte uudelleen .zip ja lataa se alla.",
|
||||
"mealie-text": "Mealie voi tuoda reseptejä Mealie sovelluksesta ennen v1.0 julkaisua. Vie reseptisi vanhasta asennuksesta ja lataa zip-tiedosto. Huomaa, että viennistä voidaan tuoda vain reseptejä."
|
||||
"mealie-text": "Mealie voi tuoda reseptejä Mealie sovelluksesta ennen v1.0 julkaisua. Vie reseptisi vanhasta asennuksesta ja lataa zip-tiedosto. Huomaa, että viennistä voidaan tuoda vain reseptejä.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealieen voi tuoda reseptejä Plan to Eat -sovelluksesta."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Lisää useita kerralla",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "VVVV-KK-PP-muoto",
|
||||
"add-to-list": "Lisää listalle",
|
||||
"add-to-plan": "Lisää suunnitelmaan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Lisää aikajanalle",
|
||||
"recipe-added-to-list": "Resepti lisätty listalle",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Resepti lisätty ateriasuunnitelmaan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan",
|
||||
"yield": "Sato",
|
||||
"quantity": "Määrä",
|
||||
@@ -481,11 +494,11 @@
|
||||
"locked": "Lukittu",
|
||||
"public-link": "Julkinen Linkki",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Munakello",
|
||||
"start-timer": "Käynnistä ajastin",
|
||||
"pause-timer": "Keskeytä ajastin",
|
||||
"resume-timer": "Jatka ajastusta",
|
||||
"stop-timer": "Pysäytä ajastin"
|
||||
},
|
||||
"edit-timeline-event": "Muokkaa Aikajanan Tapahtumaa",
|
||||
"timeline": "Aikajana",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Viestiavain",
|
||||
"parse": "Jäsennä",
|
||||
"attach-images-hint": "Liitä kuvia vetämällä ja pudottamalla ne editoriin",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Käytä ainesosan määriä käyttääksesi tätä ominaisuutta",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Reseptejä, joissa on yksiköitä tai elintarvikkeita, ei voida jäsentää.",
|
||||
"parse-ingredients": "Jäsennä ainekset",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Reseptin tekijä",
|
||||
"unit": "Yksikkö",
|
||||
"upload-image": "Lataa kuva",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Pidä näyttö aina päällä",
|
||||
"remove-image": "Poista kuva"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Tarkennettu haku",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tunnisteen mukaan suodatus",
|
||||
"search-hint": "Paina '/'",
|
||||
"advanced": "Lisäasetukset",
|
||||
"auto-search": "Automaattinen Haku"
|
||||
"auto-search": "Automaattinen Haku",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Lisää uusi teema",
|
||||
"admin-settings": "Ylläpitäjän asetukset",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Varmuuskopio luotu sijaintiin {path}",
|
||||
"backup-deleted": "Varmuuskopio poistettu",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Varmuuskopion tunniste",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Poista varmuuskopio",
|
||||
@@ -573,7 +590,7 @@
|
||||
"import-summary": "Tuo yhteenveto",
|
||||
"partial-backup": "Osittainen varmuuskopiointi",
|
||||
"unable-to-delete-backup": "Varmuuskopiota ei voi poistaa.",
|
||||
"experimental-description": "Backups a 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 off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Varmuuskopiot ovat kokonaisia tilannekuvia sivuston tietokannasta ja tietohakemistosta. Tämä sisältää kaikki tiedot, eikä sitä voida asettaa sulkemaan pois tietojen osajoukkoja. Voit ajatella tätä tilannekuvana Mealiesta tiettynä ajankohtana. Nämä toimivat tietokannan agnostisena tapana viedä ja tuoda tietoja tai varmuuskopioida sivusto ulkoiseen sijaintiin.",
|
||||
"backup-restore": "Varmuuskopion palautus",
|
||||
"back-restore-description": "Tämän varmuuskopion palauttaminen korvaa kaikki tietokannassasi ja tietokannassasi olevat tiedot ja korvaa ne tämän varmuuskopion sisällöllä. {cannot-be-undone} Jos palautus onnistuu, sinut kirjataan ulos.",
|
||||
"cannot-be-undone": "Tätä toimintoa ei voi kumota - käytä varoen.",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Konfigurointi",
|
||||
"docker-volume": "Docker-kontin tiedostojärjestelmä",
|
||||
"docker-volume-help": "Mealie vaatii, että frontend-kontti ja backend jakaa saman dockerin tiedostojärjestelmän tai varaston. Näin varmistetaan, että frontend-kontti pääsee kunnolla käsiksi levylle tallennettuihin kuviin ja resursseihin.",
|
||||
"volumes-are-misconfigured": "Tiedostojärjestelmän on väärin konfiguroitu",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Tiedostojärjestelmät ovat oikein konfiguroitu.",
|
||||
"status-unknown-try-running-a-validation": "Tila tuntematon. Yritä suorittaa validointi.",
|
||||
"validate": "Vahvista",
|
||||
"email-configuration-status": "Sähköpostin varmistuksen tila",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Valmis",
|
||||
"not-ready": "Ei Valmis - Tarkista Ympäristömuuttujat",
|
||||
"succeeded": "Onnistui",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Salasana päivitetty",
|
||||
"password": "Salasana",
|
||||
"password-strength": "Salasana on {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Rekisteröidy",
|
||||
"reset-password": "Palauta salasana",
|
||||
"sign-in": "Kirjaudu",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Käyttäjänimi",
|
||||
"users-header": "KÄYTTÄJÄT",
|
||||
"users": "Käyttäjät",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook-aika",
|
||||
"webhooks-enabled": "Webhookit käytössä",
|
||||
"you-are-not-allowed-to-create-a-user": "Sinulla ei ole oikeutta luoda käyttäjää",
|
||||
@@ -854,16 +875,22 @@
|
||||
"user-management": "Käyttäjien Hallinta",
|
||||
"reset-locked-users": "Nollaa Lukitut Käyttäjät",
|
||||
"admin-user-creation": "Ylläpitokäyttäjän Luonti",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Käyttäjän tiedot",
|
||||
"user-name": "Käyttäjänimi",
|
||||
"authentication-method": "Todentamistapa",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"authentication-method-hint": "Tämä määrittelee, miten käyttäjä todentaa Mealien. Jos et ole varma, valitse 'Mealie'",
|
||||
"permissions": "Käyttöoikeudet",
|
||||
"administrator": "Ylläpitäjä",
|
||||
"user-can-invite-other-to-group": "Käyttäjä voi kutsua muita ryhmään",
|
||||
"user-can-manage-group": "Käyttäjä voi hallita ryhmää",
|
||||
"user-can-organize-group-data": "Käyttäjä voi järjestellä ryhmän tietoja",
|
||||
"enable-advanced-features": "Salli edistyneemmät ominaisuudet"
|
||||
"enable-advanced-features": "Salli edistyneemmät ominaisuudet",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "käännetty",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Luo elintarvike",
|
||||
"food-label": "Elintarvikkeiden nimike",
|
||||
"edit-food": "Muokkaa elintarviketta",
|
||||
"food-data": "Elintarvikkeiden tiedot"
|
||||
"food-data": "Elintarvikkeiden tiedot",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Lisää tietokantaan yksiköt paikallisen kielen perusteella.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Yhdistä {0} ja {1} yhdeksi",
|
||||
"create-unit": "Luo yksikkö",
|
||||
"abbreviation": "Lyhenne",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Kuvaus",
|
||||
"display-as-fraction": "Näytä murtolukuna",
|
||||
"use-abbreviation": "Käytä Lyhennettä",
|
||||
"edit-unit": "Muokkaa yksiköitä",
|
||||
"unit-data": "Yksikkötiedot",
|
||||
"use-abbv": "Käytä lyhennettä.",
|
||||
"fraction": "Murtoluku"
|
||||
"fraction": "Murtoluku",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Lisää tietokantaan yleiset tunnisteet paikallisen kielen perusteella.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Poista Reseptit",
|
||||
"source-unit-will-be-deleted": "Lähdeyksikkö poistetaan"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Tietokannan pohjadata",
|
||||
"seed": "Lisää pohjadata",
|
||||
"data-management": "Tietojen hallinta",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Valitse Tiedot",
|
||||
"select-language": "Valitse kieli",
|
||||
"columns": "Sarakkeet",
|
||||
"combine": "Yhdistä"
|
||||
"combine": "Yhdistä",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Käyttäjien rekisteröinti",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Liity ryhmään",
|
||||
"create-a-new-group": "Luo uusi ryhmä",
|
||||
"provide-registration-token-description": "Ole hyvä ja anna rekisteröintitunnus liittyäksesi ryhmään, johon haluat liittyä. Sinun täytyy saada tämä olemassa olevalta ryhmän jäseneltä.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr- editori",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Valintatila",
|
||||
"pan-and-zoom-picture": "Käännä ja zoomaus kuva",
|
||||
"split-text": "Jaa teksti",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Jaa tekstilohkon mukaan",
|
||||
"flatten": "Tasaa alkuperäisestä muotoilusta riippumatta",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Valintatila (oletus)",
|
||||
"selection-mode-desc": "Valintatila on päätila, jota voidaan käyttää tietojen syöttämiseen:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Tervetuloa, {0}",
|
||||
"description": "Hallitse profiiliasi, reseptejäsi ja ryhmäasetuksiasi.",
|
||||
"get-invite-link": "Hanki Kutsulinkki",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Julkinen linkki",
|
||||
"account-summary": "Tilin Yhteenveto",
|
||||
"account-summary-description": "Tässä on yhteenveto ryhmäsi tiedoista",
|
||||
"group-statistics": "Ryhmätilastot",
|
||||
@@ -1087,9 +1142,9 @@
|
||||
"cookbooks-description": "Hallinnoi reseptikategorioiden kokoelmaa ja luo sivuja niitä varten.",
|
||||
"members": "Jäsenet",
|
||||
"members-description": "Katso ketä on ryhmässäsi ja hallitse heidän käyttöoikeuksiaan.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"webhooks-description": "Aseta Webhookit, jotka käynistävät niinä päivinä, jolloin sinulla on ateriasuunnitelma ajastettuna.",
|
||||
"notifiers": "Ilmoitukset",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"notifiers-description": "Määritä sähköposti- ja push-ilmoitukset, jotka käynnistävät tiettyjä tapahtumia.",
|
||||
"manage-data": "Hallinnoi tietoja",
|
||||
"manage-data-description": "Hallinnoi elintarvikkeita ja yksiköitä (lisää vaihtoehtoja tulossa pian)",
|
||||
"data-migrations": "Tietojen migraatiot",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Événements du livre de recettes",
|
||||
"tag-events": "Événements des mots-clés",
|
||||
"category-events": "Événements de catégories",
|
||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe"
|
||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||
"recipe-events": "Événements de recette"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Annuler",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Mot-clé",
|
||||
"link-copied": "Lien copié",
|
||||
"loading-events": "Chargement des événements",
|
||||
"loading-recipe": "Chargement de la recette...",
|
||||
"loading-ocr-data": "Chargement des données OCR...",
|
||||
"loading-recipes": "Chargement des recettes",
|
||||
"message": "Message",
|
||||
"monday": "Lundi",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Aucune recette trouvée",
|
||||
"ok": "OK",
|
||||
"options": "Options :",
|
||||
"plural-name": "Nom au pluriel",
|
||||
"print": "Imprimer",
|
||||
"print-preferences": "Préférences d'impression",
|
||||
"random": "Aléatoire",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Exporter tout",
|
||||
"refresh": "Actualiser",
|
||||
"upload-file": "Transférer un fichier",
|
||||
"created-on-date": "Créé le {0}"
|
||||
"created-on-date": "Créé le {0}",
|
||||
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir ? OK pour enregistrer, Annuler pour ignorer les modifications."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Êtes-vous certain de vouloir supprimer <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID groupe : {groupID}",
|
||||
"group-name": "Nom du groupe",
|
||||
"group-not-found": "Groupe non trouvé",
|
||||
"group-token": "Jeton de groupe",
|
||||
"group-with-value": "Groupe : {groupID}",
|
||||
"groups": "Groupes",
|
||||
"manage-groups": "Gérer les groupes",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Préférences générales",
|
||||
"group-recipe-preferences": "Préférences de recette du groupe",
|
||||
"report": "Rapport",
|
||||
"report-with-id": "Identifiant du rapport : {id}",
|
||||
"group-management": "Gestion des groupes",
|
||||
"admin-group-management": "Administration des groupes",
|
||||
"admin-group-management-text": "Les modifications apportées à ce groupe seront immédiatement prises en compte.",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Recette 1",
|
||||
"recipe-2": "Recette 2",
|
||||
"paprika-text": "Mealie peut importer des recettes depuis l'application Paprika. Exportez vos recettes de paprika, renommez l'extension d'exportation en .zip et téléchargez-les ci-dessous.",
|
||||
"mealie-text": "Mealie peut importer des recettes depuis l'application Mealie depuis une version antérieure à 1.0. Exportez vos recettes depuis votre ancienne instance, et téléchargez le fichier zip ci-dessous. Notez que seules les recettes peuvent être importées à partir de l'exportation."
|
||||
"mealie-text": "Mealie peut importer des recettes depuis l'application Mealie depuis une version antérieure à 1.0. Exportez vos recettes depuis votre ancienne instance, et téléchargez le fichier zip ci-dessous. Notez que seules les recettes peuvent être importées à partir de l'exportation.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie peut importer des recettes depuis Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Ajouter en masse",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "Format AAAA-MM-JJ",
|
||||
"add-to-list": "Ajouter à la liste",
|
||||
"add-to-plan": "Ajouter à la planification des repas",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Ajouter à l’historique",
|
||||
"recipe-added-to-list": "Recette ajoutée à la liste",
|
||||
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
||||
"recipe-added-to-mealplan": "Recette ajoutée à la planification des repas",
|
||||
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
||||
"failed-to-add-recipe-to-mealplan": "Échec de l'ajout de la recette à la planification des repas",
|
||||
"yield": "Rendement",
|
||||
"quantity": "Quantité",
|
||||
@@ -481,11 +494,11 @@
|
||||
"locked": "Verrouillé",
|
||||
"public-link": "Lien public",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Minuteur",
|
||||
"start-timer": "Démarrer le minuteur",
|
||||
"pause-timer": "Mettre en pause le minuteur",
|
||||
"resume-timer": "Reprendre le minuteur",
|
||||
"stop-timer": "Arrêter le minuteur"
|
||||
},
|
||||
"edit-timeline-event": "Modifier l’événement dans l’historique",
|
||||
"timeline": "Historique",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Clé de message",
|
||||
"parse": "Analyser",
|
||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||
"drop-image": "Déposer l'image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Les recettes avec des unités ou des aliments définis ne peuvent pas être analysées.",
|
||||
"parse-ingredients": "Analyser les ingrédients",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Nombre de parts",
|
||||
"unit": "Unité",
|
||||
"upload-image": "Envoyer une image",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Garder l’écran allumé",
|
||||
"remove-image": "Supprimer l’image"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Recherche avancée",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtre par mots-clés",
|
||||
"search-hint": "Appuyez sur « /»",
|
||||
"advanced": "Avancé",
|
||||
"auto-search": "Recherche automatique"
|
||||
"auto-search": "Recherche automatique",
|
||||
"no-results": "Aucun résultat trouvé"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||
"admin-settings": "Paramètres d'administration",
|
||||
"backup": {
|
||||
"backup-created": "Sauvegarde créée avec succès",
|
||||
"backup-created-at-response-export_path": "Sauvegarde créée dans {path}",
|
||||
"backup-deleted": "Sauvegarde supprimée",
|
||||
"restore-success": "Restauration réussie",
|
||||
"backup-tag": "Tag de la sauvegarde",
|
||||
"create-heading": "Créer une sauvegarde",
|
||||
"delete-backup": "Supprimer la sauvegarde",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Paramètres",
|
||||
"docker-volume": "Volume Docker",
|
||||
"docker-volume-help": "Mealie exige que le conteneur frontend et le backend partagent le même volume docker ou le même stockage. Cela garantit que le conteneur frontend peut accéder correctement aux images et aux ressources stockées sur le disque.",
|
||||
"volumes-are-misconfigured": "Les volumes sont mal configurés",
|
||||
"volumes-are-misconfigured": "Les volumes sont mal configurés.",
|
||||
"volumes-are-configured-correctly": "Les volumes sont configurés correctement.",
|
||||
"status-unknown-try-running-a-validation": "Statut inconnu. Essayez de lancer une validation.",
|
||||
"validate": "Valider",
|
||||
"email-configuration-status": "État de la configuration e-mail",
|
||||
"email-configured": "E-mail configuré",
|
||||
"email-test-results": "Résultats des tests e-mail",
|
||||
"ready": "Prêt",
|
||||
"not-ready": "Pas prêt - Vérifier les variables d'environnement",
|
||||
"succeeded": "Réussite",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Mot de passe mis à jour",
|
||||
"password": "Mot de passe",
|
||||
"password-strength": "Robustesse du mot de passe : {strength}",
|
||||
"please-enter-password": "Veuillez entrer votre nouveau mot de passe.",
|
||||
"register": "S'inscrire",
|
||||
"reset-password": "Réinitialiser le mot de passe",
|
||||
"sign-in": "Se connecter",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Nom d'utilisateur",
|
||||
"users-header": "UTILISATEURS",
|
||||
"users": "Utilisateurs",
|
||||
"user-not-found": "Utilisateur introuvable",
|
||||
"webhook-time": "Heure du Webhook",
|
||||
"webhooks-enabled": "Webhooks activés",
|
||||
"you-are-not-allowed-to-create-a-user": "Vous n'avez pas le droit de créer un utilisateur",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Gestion des utilisateurs",
|
||||
"reset-locked-users": "Réinitialiser les utilisateurs verrouillés",
|
||||
"admin-user-creation": "Création d'un utilisateur admin",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Détails de l'utilisateur",
|
||||
"user-name": "Nom d'utilisateur",
|
||||
"authentication-method": "Méthode d'authentification",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "L'utilisateur peut inviter quelqu'un au groupe",
|
||||
"user-can-manage-group": "L'utilisateur peut gérer le groupe",
|
||||
"user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe",
|
||||
"enable-advanced-features": "Activer les fonctions avancées"
|
||||
"enable-advanced-features": "Activer les fonctions avancées",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Il semble que ce soit votre première connexion.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vous ne voulez plus voir cela? Assurez-vous de changer votre adresse courriel dans vos paramètres d'utilisateur!",
|
||||
"forgot-password": "Mot de passe oublié",
|
||||
"forgot-password-text": "Veuillez entrer votre adresse e-mail. Un e-mail vous sera envoyé afin de réinitialiser votre mot de passe.",
|
||||
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Créer un aliment",
|
||||
"food-label": "Étiquette de l'aliment",
|
||||
"edit-food": "Modifier Aliment",
|
||||
"food-data": "Données de l'aliment"
|
||||
"food-data": "Données de l'aliment",
|
||||
"example-food-singular": "ex : Oignon",
|
||||
"example-food-plural": "ex : Oignons"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Initialisez la base de données avec des unités communes basées sur votre langue locale.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Fusion de {0} dans {1}",
|
||||
"create-unit": "Créer une unité",
|
||||
"abbreviation": "Abréviation",
|
||||
"plural-abbreviation": "Abréviation au pluriel",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Afficher sous forme de fraction",
|
||||
"use-abbreviation": "Utiliser l'abréviation",
|
||||
"edit-unit": "Modifier l'unité",
|
||||
"unit-data": "Données de l'unité",
|
||||
"use-abbv": "Utiliser abr.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex : Cuillère à soupe",
|
||||
"example-unit-plural": "ex : Cuillères à soupe",
|
||||
"example-unit-abbreviation-singular": "ex : CàS",
|
||||
"example-unit-abbreviation-plural": "ex : CàS"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Initialisez la base de données avec des étiquettes communes basées sur votre langue locale.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Supprimer les recettes",
|
||||
"source-unit-will-be-deleted": "L'unité source sera supprimée"
|
||||
},
|
||||
"create-alias": "Créer un alias",
|
||||
"manage-aliases": "Gérer les alias",
|
||||
"seed-data": "Initialiser les données",
|
||||
"seed": "Initialiser",
|
||||
"data-management": "Gestion des données",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Sélectionner les données",
|
||||
"select-language": "Sélectionnez une langue",
|
||||
"columns": "Colonnes",
|
||||
"combine": "Combiner"
|
||||
"combine": "Combiner",
|
||||
"categories": {
|
||||
"edit-category": "Modifier la catégorie",
|
||||
"new-category": "Nouvelle catégorie",
|
||||
"category-data": "Données de catégorie"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Nouvelle étiquette",
|
||||
"edit-tag": "Modifier l'étiquette",
|
||||
"tag-data": "Données de l'étiquette"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Nouvel outil",
|
||||
"edit-tool": "Modifier l'outil",
|
||||
"tool-data": "Données de l'outil"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Inscription d’utilisateur",
|
||||
"registration-success": "Inscription réussie",
|
||||
"join-a-group": "Rejoindre un groupe",
|
||||
"create-a-new-group": "Créer un nouveau groupe",
|
||||
"provide-registration-token-description": "Veuillez fournir le jeton d’enregistrement associé au groupe que vous souhaitez rejoindre. Vous devrez l’obtenir auprès d’un membre existant du groupe.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Éditeur OCR",
|
||||
"toolbar": "Barre d’outils",
|
||||
"selection-mode": "Mode de sélection",
|
||||
"pan-and-zoom-picture": "Déplacer et zoomer dans l’image",
|
||||
"split-text": "Découper le texte",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Séparer par bloc de texte",
|
||||
"flatten": "Aplatir quel que soit le formatage original",
|
||||
"help": {
|
||||
"help": "Aide",
|
||||
"mouse-modes": "Modes de souris",
|
||||
"selection-mode": "Mode de sélection (Par défaut)",
|
||||
"selection-mode-desc": "Le mode de sélection est le mode principal qui peut être utilisé pour saisir des données :",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Bienvenue, {0}",
|
||||
"description": "Gérez votre profil, les recettes et les paramètres de groupe.",
|
||||
"get-invite-link": "Obtenir un lien d'invitation",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Voir le lien public",
|
||||
"account-summary": "Aperçu du compte",
|
||||
"account-summary-description": "Voici un résumé des informations de votre groupe",
|
||||
"group-statistics": "Statistiques du groupe",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Événements du livre de recettes",
|
||||
"tag-events": "Événements des mots-clés",
|
||||
"category-events": "Événements de catégories",
|
||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe"
|
||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||
"recipe-events": "Événements de recette"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Annuler",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Mot-clé",
|
||||
"link-copied": "Lien copié",
|
||||
"loading-events": "Chargement des événements",
|
||||
"loading-recipe": "Chargement de la recette...",
|
||||
"loading-ocr-data": "Chargement des données OCR...",
|
||||
"loading-recipes": "Chargement des recettes",
|
||||
"message": "Message",
|
||||
"monday": "Lundi",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Aucune recette trouvée",
|
||||
"ok": "OK",
|
||||
"options": "Options :",
|
||||
"plural-name": "Nom au pluriel",
|
||||
"print": "Imprimer",
|
||||
"print-preferences": "Préférences d'impression",
|
||||
"random": "Aléatoire",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Exporter tout",
|
||||
"refresh": "Actualiser",
|
||||
"upload-file": "Transférer un fichier",
|
||||
"created-on-date": "Créé le {0}"
|
||||
"created-on-date": "Créé le {0}",
|
||||
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir ? OK pour enregistrer, Annuler pour ignorer les modifications."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Voulez-vous vraiment supprimer <b>{groupName}<b/> ?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID groupe : {groupID}",
|
||||
"group-name": "Nom du groupe",
|
||||
"group-not-found": "Groupe non trouvé",
|
||||
"group-token": "Jeton de groupe",
|
||||
"group-with-value": "Groupe : {groupID}",
|
||||
"groups": "Groupes",
|
||||
"manage-groups": "Gérer les groupes",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Préférences générales",
|
||||
"group-recipe-preferences": "Préférences de recette du groupe",
|
||||
"report": "Rapport",
|
||||
"report-with-id": "Identifiant du rapport : {id}",
|
||||
"group-management": "Gestion des groupes",
|
||||
"admin-group-management": "Administration des groupes",
|
||||
"admin-group-management-text": "Les modifications apportées à ce groupe seront immédiatement prises en compte.",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Recette 1",
|
||||
"recipe-2": "Recette 2",
|
||||
"paprika-text": "Mealie peut importer des recettes depuis l'application Paprika. Exportez vos recettes de paprika, renommez l'extension d'exportation en .zip et téléchargez-les ci-dessous.",
|
||||
"mealie-text": "Mealie peut importer des recettes depuis l'application Mealie depuis une version antérieure à 1.0. Exportez vos recettes depuis votre ancienne instance, et téléchargez le fichier zip ci-dessous. Notez que seules les recettes peuvent être importées à partir de l'exportation."
|
||||
"mealie-text": "Mealie peut importer des recettes depuis l'application Mealie depuis une version antérieure à 1.0. Exportez vos recettes depuis votre ancienne instance, et téléchargez le fichier zip ci-dessous. Notez que seules les recettes peuvent être importées à partir de l'exportation.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie peut importer des recettes depuis Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Ajouter en masse",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "Format AAAA-MM-JJ",
|
||||
"add-to-list": "Ajouter à la liste",
|
||||
"add-to-plan": "Ajouter au menu",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Ajouter à l’historique",
|
||||
"recipe-added-to-list": "Recette ajoutée à la liste",
|
||||
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
||||
"recipe-added-to-mealplan": "Recette ajoutée au menu",
|
||||
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
||||
"failed-to-add-recipe-to-mealplan": "Échec de l’ajout de la recette au menu",
|
||||
"yield": "Nombre de portions",
|
||||
"quantity": "Quantité",
|
||||
@@ -481,11 +494,11 @@
|
||||
"locked": "Verrouillé",
|
||||
"public-link": "Lien public",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Minuteur",
|
||||
"start-timer": "Démarrer le minuteur",
|
||||
"pause-timer": "Mettre en pause le minuteur",
|
||||
"resume-timer": "Reprendre le minuteur",
|
||||
"stop-timer": "Arrêter le minuteur"
|
||||
},
|
||||
"edit-timeline-event": "Modifier l’événement dans l’historique",
|
||||
"timeline": "Historique",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Clé de message",
|
||||
"parse": "Analyser",
|
||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||
"drop-image": "Déposer l'image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Activez les quantités d'ingrédients pour utiliser cette fonctionnalité",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Les recettes avec des unités ou des aliments définis ne peuvent pas être analysées.",
|
||||
"parse-ingredients": "Analyser les ingrédients",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "Nombre de parts",
|
||||
"unit": "Unité",
|
||||
"upload-image": "Envoyer une image",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Garder l’écran allumé",
|
||||
"remove-image": "Supprimer l’image"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Recherche avancée",
|
||||
@@ -548,8 +562,8 @@
|
||||
"include": "Inclure",
|
||||
"max-results": "Résultats max",
|
||||
"or": "Ou",
|
||||
"has-any": "A n'importe quel",
|
||||
"has-all": "A tout",
|
||||
"has-any": "Requiert au moins",
|
||||
"has-all": "Requiert tout",
|
||||
"results": "Résultats",
|
||||
"search": "Rechercher",
|
||||
"search-mealie": "Rechercher dans Mealie (appuyez sur /)",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtre par mots-clés",
|
||||
"search-hint": "Appuyez sur « /»",
|
||||
"advanced": "Avancé",
|
||||
"auto-search": "Recherche automatique"
|
||||
"auto-search": "Recherche automatique",
|
||||
"no-results": "Aucun résultat trouvé"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||
"admin-settings": "Paramètres d’administration",
|
||||
"backup": {
|
||||
"backup-created": "Sauvegarde créée avec succès",
|
||||
"backup-created-at-response-export_path": "Sauvegarde créée dans {path}",
|
||||
"backup-deleted": "Sauvegarde supprimée",
|
||||
"restore-success": "Restauration réussie",
|
||||
"backup-tag": "Tag de la sauvegarde",
|
||||
"create-heading": "Créer une sauvegarde",
|
||||
"delete-backup": "Supprimer la sauvegarde",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Paramètres",
|
||||
"docker-volume": "Volume Docker",
|
||||
"docker-volume-help": "Mealie exige que le conteneur frontend et le backend partagent le même volume docker ou le même stockage. Cela garantit que le conteneur frontend peut accéder correctement aux images et aux ressources stockées sur le disque.",
|
||||
"volumes-are-misconfigured": "Les volumes sont mal configurés",
|
||||
"volumes-are-misconfigured": "Les volumes sont mal configurés.",
|
||||
"volumes-are-configured-correctly": "Les volumes sont configurés correctement.",
|
||||
"status-unknown-try-running-a-validation": "Statut inconnu. Essayez de lancer une validation.",
|
||||
"validate": "Valider",
|
||||
"email-configuration-status": "État de la configuration e-mail",
|
||||
"email-configured": "E-mail configuré",
|
||||
"email-test-results": "Résultats des tests e-mail",
|
||||
"ready": "Prêt",
|
||||
"not-ready": "Pas prêt - Vérifier les variables d'environnement",
|
||||
"succeeded": "Réussite",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Mot de passe mis à jour",
|
||||
"password": "Mot de passe",
|
||||
"password-strength": "Robustesse du mot de passe : {strength}",
|
||||
"please-enter-password": "Veuillez entrer votre nouveau mot de passe.",
|
||||
"register": "S’inscrire",
|
||||
"reset-password": "Réinitialiser le mot de passe",
|
||||
"sign-in": "Se connecter",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Nom d’utilisateur",
|
||||
"users-header": "UTILISATEURS",
|
||||
"users": "Utilisateurs",
|
||||
"user-not-found": "Utilisateur introuvable",
|
||||
"webhook-time": "Heure du Webhook",
|
||||
"webhooks-enabled": "Webhooks activés",
|
||||
"you-are-not-allowed-to-create-a-user": "Vous n’avez pas le droit de créer un utilisateur",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Gestion des utilisateurs",
|
||||
"reset-locked-users": "Réinitialiser les utilisateurs verrouillés",
|
||||
"admin-user-creation": "Création d'un utilisateur admin",
|
||||
"admin-user-management": "Administration des utilisateurs",
|
||||
"user-details": "Détails de l'utilisateur",
|
||||
"user-name": "Nom d'utilisateur",
|
||||
"authentication-method": "Méthode d'authentification",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "L'utilisateur peut inviter quelqu'un au groupe",
|
||||
"user-can-manage-group": "L'utilisateur peut gérer le groupe",
|
||||
"user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe",
|
||||
"enable-advanced-features": "Activer les fonctions avancées"
|
||||
"enable-advanced-features": "Activer les fonctions avancées",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Il semble que ce soit votre première connexion.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vous ne voulez plus voir cela ? Assurez-vous de changer votre adresse e-mail dans vos paramètres d'utilisateur !",
|
||||
"forgot-password": "Mot de passe oublié",
|
||||
"forgot-password-text": "Veuillez entrer votre adresse e-mail. Un e-mail vous sera envoyé afin de réinitialiser votre mot de passe.",
|
||||
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Créer un aliment",
|
||||
"food-label": "Étiquette de l'aliment",
|
||||
"edit-food": "Modifier Aliment",
|
||||
"food-data": "Données de l'aliment"
|
||||
"food-data": "Données de l'aliment",
|
||||
"example-food-singular": "ex : Oignon",
|
||||
"example-food-plural": "ex : Oignons"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Initialisez la base de données avec des unités communes basées sur votre langue locale.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Fusion de {0} dans {1}",
|
||||
"create-unit": "Créer une unité",
|
||||
"abbreviation": "Abréviation",
|
||||
"plural-abbreviation": "Abréviation au pluriel",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Afficher sous forme de fraction",
|
||||
"use-abbreviation": "Utiliser l'abréviation",
|
||||
"edit-unit": "Modifier l'unité",
|
||||
"unit-data": "Données de l'unité",
|
||||
"use-abbv": "Utiliser abr.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex : Cuillère à soupe",
|
||||
"example-unit-plural": "ex : Cuillères à soupe",
|
||||
"example-unit-abbreviation-singular": "ex : CàS",
|
||||
"example-unit-abbreviation-plural": "ex : CàS"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Initialisez la base de données avec des étiquettes communes basées sur votre langue locale.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Supprimer les recettes",
|
||||
"source-unit-will-be-deleted": "L'unité source sera supprimée"
|
||||
},
|
||||
"create-alias": "Créer un alias",
|
||||
"manage-aliases": "Gérer les alias",
|
||||
"seed-data": "Initialiser les données",
|
||||
"seed": "Initialiser",
|
||||
"data-management": "Gestion des données",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Sélectionner les données",
|
||||
"select-language": "Sélectionnez une langue",
|
||||
"columns": "Colonnes",
|
||||
"combine": "Combiner"
|
||||
"combine": "Combiner",
|
||||
"categories": {
|
||||
"edit-category": "Modifier la catégorie",
|
||||
"new-category": "Nouvelle catégorie",
|
||||
"category-data": "Données de catégorie"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Nouveau mot-clé",
|
||||
"edit-tag": "Modifier le mot-clé",
|
||||
"tag-data": "Données du mot-clé"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Nouvel ustensile",
|
||||
"edit-tool": "Modifier l'ustensile",
|
||||
"tool-data": "Données de l'ustensile"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Inscription d’utilisateur",
|
||||
"registration-success": "Inscription réussie",
|
||||
"join-a-group": "Rejoindre un groupe",
|
||||
"create-a-new-group": "Créer un nouveau groupe",
|
||||
"provide-registration-token-description": "Veuillez fournir le jeton d’enregistrement associé au groupe que vous souhaitez rejoindre. Vous devrez l’obtenir auprès d’un membre existant du groupe.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Éditeur OCR",
|
||||
"toolbar": "Barre d’outils",
|
||||
"selection-mode": "Mode de sélection",
|
||||
"pan-and-zoom-picture": "Déplacer et zoomer dans l’image",
|
||||
"split-text": "Découper le texte",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Séparer par bloc de texte",
|
||||
"flatten": "Aplatir quel que soit le formatage original",
|
||||
"help": {
|
||||
"help": "Aide",
|
||||
"mouse-modes": "Modes de souris",
|
||||
"selection-mode": "Mode de sélection (Par défaut)",
|
||||
"selection-mode-desc": "Le mode de sélection est le mode principal qui peut être utilisé pour saisir des données :",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 Bienvenue, {0}",
|
||||
"description": "Gérez votre profil, les recettes et les paramètres de groupe.",
|
||||
"get-invite-link": "Obtenir un lien d'invitation",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "Voir le lien public",
|
||||
"account-summary": "Aperçu du compte",
|
||||
"account-summary-description": "Voici un résumé des informations de votre groupe",
|
||||
"group-statistics": "Statistiques du groupe",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"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"
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancel",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Keyword",
|
||||
"link-copied": "Link Copied",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Loading Recipes",
|
||||
"message": "Message",
|
||||
"monday": "Monday",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "No Recipe Found",
|
||||
"ok": "OK",
|
||||
"options": "Options:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Print",
|
||||
"print-preferences": "Print Preferences",
|
||||
"random": "Random",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "Upload File",
|
||||
"created-on-date": "Created on: {0}"
|
||||
"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."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"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",
|
||||
@@ -242,6 +248,7 @@
|
||||
"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.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"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 you 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.",
|
||||
"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",
|
||||
@@ -345,7 +352,11 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Add",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create A Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Password updated",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"demo-status": "מצב הדגמה",
|
||||
"development": "פיתוח",
|
||||
"docs": "תיעוד",
|
||||
"download-log": "הורדת יומן",
|
||||
"download-log": "הורדת לוגים",
|
||||
"download-recipe-json": "הJSON האחרון שנקרא",
|
||||
"github": "גיטהאב",
|
||||
"log-lines": "שורות לוג",
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "אירועי ספרי בישול",
|
||||
"tag-events": "אירועי תגיות",
|
||||
"category-events": "אירועי קטגוריות",
|
||||
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה"
|
||||
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "ביטול",
|
||||
@@ -113,7 +114,9 @@
|
||||
"json": "JSON",
|
||||
"keyword": "מילת מפתח",
|
||||
"link-copied": "קישור הועתק",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-events": "טוען",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "מתכונים בטעינה",
|
||||
"message": "הודעה",
|
||||
"monday": "שני",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "לא נמצא מתכון",
|
||||
"ok": "אישור",
|
||||
"options": "אפשרויות:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "הדפסה",
|
||||
"print-preferences": "העדפות הדפסה",
|
||||
"random": "אקראי",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "ייצא הכל",
|
||||
"refresh": "רענן",
|
||||
"upload-file": "העלאת קבצים",
|
||||
"created-on-date": "נוצר ב-{0}"
|
||||
"created-on-date": "נוצר ב-{0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "האם את/ה בטוח/ה שברצונך למחוק את <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "מזהה קבוצה: {groupID}",
|
||||
"group-name": "שם קבוצה",
|
||||
"group-not-found": "קבוצה לא נמצאה",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "קבוצה: {groupID}",
|
||||
"groups": "קבוצות",
|
||||
"manage-groups": "ניהול קבוצות",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "העדפות כלליות",
|
||||
"group-recipe-preferences": "העדפות קבוצה",
|
||||
"report": "דיווח",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "ניהול קבוצה",
|
||||
"admin-group-management": "ניהול קבוצת מנהל",
|
||||
"admin-group-management-text": "השינויים לקבוצה זו יתבצעו מיידית.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "לכל סוגי הארוחות {0}",
|
||||
"meal-plan-rules": "חוקי תכנון ארוחות",
|
||||
"new-rule": "חוק חדש",
|
||||
"meal-plan-rules-description": "אפשר ליצור חוקים להוספה אוטומטית למתכנן ארוחות. נעשה שימוש בחוקים האלה ע״י השרת כדי להחליט על קבוצה של מתכונים רנדומליים ליצירת תכנון ארוחות. יש לשים לב שאם החוקים מכילים את אותן הגדרות סוג או יום הקטגוריות של החוקים ימוזגו. בכללי, אין סיבה ליצור חוקים כפולים, אבל זה כן אפשרי.",
|
||||
"meal-plan-rules-description": "אתה יכול ליצור כללים לבחירה אוטומטית של מתכונים עבור תוכניות הארוחות שלך. כללים אלה משמשים את השרת כדי לקבוע את מאגר המתכונים האקראי לבחירה בעת יצירת תוכניות ארוחות. שימו לב שאם לכללים יש אילוצי יום/סוג זהים אז הקטגוריות של הכללים ימוזגו. בפועל, מיותר ליצור חוקים כפולים, אבל אפשר לעשות זאת.",
|
||||
"new-rule-description": "ביצירת חוק חדש עבור תוכנית ארוחות ניתן להגביל את החוק עבור יום בשבוע או סוג של ארוחה. בכדי שהחוק יכסה את כל הימים והארוחות יש לבחור ב- \"הכל\", מה שיכלול את כל הימים והארוחות.",
|
||||
"recipe-rules": "חוקי מתכון",
|
||||
"applies-to-all-days": "החל על כל הימים",
|
||||
@@ -333,8 +340,8 @@
|
||||
"title": "מילי לפני V1.0"
|
||||
},
|
||||
"tandoor": {
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"title": "Tandoor Recipes"
|
||||
"description-long": "Mealie יכול לייבא מתכונים מ-Tandoor, תייצא את המתכון בפורמט הדיפולטיבי ולאחר מכן העלאה אותם בחזרה בפורמט zip.",
|
||||
"title": "מתכוני Tandoor"
|
||||
},
|
||||
"recipe-data-migrations": "מגרציית מידע מתכונים",
|
||||
"recipe-data-migrations-explanation": "ניתן לייבא מתכונים מאפליקציות תומכות אחרות אל Mealie. זו דרך מעולה להתחיל במילי.",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "מתכון 1",
|
||||
"recipe-2": "מתכון 2",
|
||||
"paprika-text": "מילי יכולה לייבא מתכונים מאפליקציית Paprika. ייצא את המתכונים מהאפליקציה, שנה את סיומת הקובץ ל- zip והעלה אותו למטה.",
|
||||
"mealie-text": "Mealie יכול לייבא מתכונים מגרסאות ישנות של Mealie מתחת ל- v1.0. ייצא את המתכונים מהסביבה הישנה והעלה את קובץ ה- zip למטה. ניתן לייבא רק מתכונים מתהליך הייצוא."
|
||||
"mealie-text": "Mealie יכול לייבא מתכונים מגרסאות ישנות של Mealie מתחת ל- v1.0. ייצא את המתכונים מהסביבה הישנה והעלה את קובץ ה- zip למטה. ניתן לייבא רק מתכונים מתהליך הייצוא.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie יכולה לייבא מתכונים מהאתר- Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "הוספה כמותית",
|
||||
@@ -408,7 +419,7 @@
|
||||
"grams": "גרם",
|
||||
"ingredient": "מרכיב",
|
||||
"ingredients": "מרכיבים",
|
||||
"insert-ingredient": "Insert Ingredient",
|
||||
"insert-ingredient": "הוסף מרכיב",
|
||||
"insert-section": "הוסף מקטע",
|
||||
"instructions": "הוראות",
|
||||
"key-name-required": "שם מפתח נדרש",
|
||||
@@ -456,9 +467,11 @@
|
||||
"date-format-hint-yyyy-mm-dd": "פורמט YYYY-MM-DD",
|
||||
"add-to-list": "הוסף לרשימה",
|
||||
"add-to-plan": "הוספה לתכנית",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "הוסף לציר הזמן",
|
||||
"recipe-added-to-list": "מתכון נוסף לרשימה",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "מתכון נוסף לתכנון ארוחות",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "הוספת מתכון לתכנון ארוחות נכשלה",
|
||||
"yield": "תשואה",
|
||||
"quantity": "כמות",
|
||||
@@ -481,16 +494,16 @@
|
||||
"locked": "נעול",
|
||||
"public-link": "כתובת פומבית",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "טיימר למטבח",
|
||||
"start-timer": "התחל את הטיימר",
|
||||
"pause-timer": "השהה את הטיימר",
|
||||
"resume-timer": "המשך את הטיימר",
|
||||
"stop-timer": "עצור את הטיימר"
|
||||
},
|
||||
"edit-timeline-event": "עריכת אירוע ציר זמן",
|
||||
"timeline": "ציר זמן",
|
||||
"timeline-is-empty": "אין כלום בציר הזמן. נסה לעשות את המתכון הזה!",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"group-global-timeline": "{groupName} ציר זמן גלובלי",
|
||||
"open-timeline": "פתח ציר זמן",
|
||||
"made-this": "הכנתי את זה",
|
||||
"how-did-it-turn-out": "איך יצא?",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "מפתח הודעה",
|
||||
"parse": "ניתוח",
|
||||
"attach-images-hint": "הוסף תמונות ע\"י גרירה ושחרור אל תוך העורך",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "אפשר לכמות המרכיבים להשתמש בפונקציה",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "לא ניתן לפענך מתכונים בהם יחידות או אוכל מוגדרים.",
|
||||
"parse-ingredients": "חילוץ רכיבים",
|
||||
@@ -538,8 +552,8 @@
|
||||
"recipe-yield": "תשואת מתכון",
|
||||
"unit": "יחידה",
|
||||
"upload-image": "העלה תמונה",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "השאר את המסך פעיל",
|
||||
"remove-image": "האם למחוק את התמונה?"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "חיפוש מתקדם",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "סינון תגית",
|
||||
"search-hint": "לחץ '/'",
|
||||
"advanced": "מתקדם",
|
||||
"auto-search": "חיפוש אוטומטי"
|
||||
"auto-search": "חיפוש אוטומטי",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "הוסף ערכת נושא חדשה",
|
||||
"admin-settings": "הגדרות מנהל",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "גיבוי נוצר ב {path}",
|
||||
"backup-deleted": "גיבוי נמחק",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "תגית גיבוי",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "מחיקת גיבוי",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "הגדרות",
|
||||
"docker-volume": "Docker Volume",
|
||||
"docker-volume-help": "מילי דורשת שקונטיינר הקצה הקדמי והקצה האחורי חולקים את באותו כונן / שטח אחסון בדוקר.\nכל זאת כל מנת לוודא שלקונטיינר תהיה גישה לתמונות הגיבוי או לנכסים בדיסק.",
|
||||
"volumes-are-misconfigured": "כוננים אינם מוגדרים בצורה תקינה",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "ה-Volumeים מוגדרים תקין.",
|
||||
"status-unknown-try-running-a-validation": "מצב לא ידוע. נסה להריץ אימות.",
|
||||
"validate": "אימות",
|
||||
"email-configuration-status": "מצב הגדרות דוא״ל",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "מוכן",
|
||||
"not-ready": "לא מוכן - בדוק משתני סביבה",
|
||||
"succeeded": "הצליח",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "הסיסמה עודכנה",
|
||||
"password": "סיסמה",
|
||||
"password-strength": "חוזק הסיסמה {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "הרשמה",
|
||||
"reset-password": "איפוס סיסמה",
|
||||
"sign-in": "התחברות",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "שם משתמש",
|
||||
"users-header": "משתמשים",
|
||||
"users": "משתמשים",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "זמן Webhook",
|
||||
"webhooks-enabled": "הפעלת Webhooks",
|
||||
"you-are-not-allowed-to-create-a-user": "אין הרשאה ליצור משתמש",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "ניהול משתמשים",
|
||||
"reset-locked-users": "אתחל משתמשים נעולים",
|
||||
"admin-user-creation": "יצירת משתמש אדמין",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "פרטי משתמש",
|
||||
"user-name": "שם משתמש",
|
||||
"authentication-method": "שיטת אימות",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "משתמש יכול להזמין אחרים לקבוצה",
|
||||
"user-can-manage-group": "משתמש יכול לנהל קבוצה",
|
||||
"user-can-organize-group-data": "משתמש יכול לשנות מידע של קבוצה",
|
||||
"enable-advanced-features": "אפשר אפשרויות מתקדמות"
|
||||
"enable-advanced-features": "אפשר אפשרויות מתקדמות",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "תורגם",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "צור אוכל",
|
||||
"food-label": "תוית אוכל",
|
||||
"edit-food": "עריכת מזון",
|
||||
"food-data": "נתוני אוכל"
|
||||
"food-data": "נתוני אוכל",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "אכלס את מסד הנתונים עם יחידות מדידה בהתאם לשפה המקומית שלך.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "ממזג את {0} לתוך {1}",
|
||||
"create-unit": "יצירת יחידה",
|
||||
"abbreviation": "קיצור",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "תיאור",
|
||||
"display-as-fraction": "הצגה כשבר",
|
||||
"use-abbreviation": "השתמש בקיצור",
|
||||
"edit-unit": "עריכת יחידה",
|
||||
"unit-data": "נתוני יחידה",
|
||||
"use-abbv": "השתמש בקיצור",
|
||||
"fraction": "שבר"
|
||||
"fraction": "שבר",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "אכלס את מסד הנתונים בתגיות נפוצות בהתאם לשפה המקומית שלך.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "מחיקת מתכונים",
|
||||
"source-unit-will-be-deleted": "יחידת המקור תמחק"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "אכלס נתונים",
|
||||
"seed": "אכלס",
|
||||
"data-management": "ניהול מידע",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "בחר נתונים",
|
||||
"select-language": "בחירת שפה",
|
||||
"columns": "עמודות",
|
||||
"combine": "שילוב"
|
||||
"combine": "שילוב",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "רישום משתמשים",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "הצטרפות לקבוצה",
|
||||
"create-a-new-group": "יצירת קבוצה חדשה",
|
||||
"provide-registration-token-description": "ספק בבקשה את טוקן הרישום המשוייך לקבוצה אליה ברצונך להצטרף. בכדי לקבל אותו יהיה צורך להשיג אותו מאחד מחברה הקבוצה הקיימים.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "עורך סריקת תווים",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "מצב בחירה",
|
||||
"pan-and-zoom-picture": "סובב והגדל תמונה",
|
||||
"split-text": "פיצול טקסט",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "פצל לפי מבנה המלל",
|
||||
"flatten": "שטח בלי קשר למבנה המקורי",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "מצב בחירה (ברירת מחדל)",
|
||||
"selection-mode-desc": "מצב בחירה זה הינו הראשי אשר ישמש להכנסת מידע:",
|
||||
"selection-mode-steps": {
|
||||
@@ -1069,7 +1124,7 @@
|
||||
"welcome-user": "👋 שלום, {0}",
|
||||
"description": "ניהול פרופיל, מתכונים והגדרות קבוצה.",
|
||||
"get-invite-link": "קבלת קישור להזמנה",
|
||||
"get-public-link": "Get Public Link",
|
||||
"get-public-link": "כתובת פומבית",
|
||||
"account-summary": "פירוט משתמש",
|
||||
"account-summary-description": "סיכום המידע של הקבוצות שלך",
|
||||
"group-statistics": "נתונים סטטיסטיים של קבוצה",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Događaji Zbirke recepata",
|
||||
"tag-events": "Događaji Oznaka",
|
||||
"category-events": "Događaji Kategorija",
|
||||
"when-a-new-user-joins-your-group": "Kada se novi korisnik pridruži vašoj grupi"
|
||||
"when-a-new-user-joins-your-group": "Kada se novi korisnik pridruži vašoj grupi",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Odustani",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Ključna riječ",
|
||||
"link-copied": "Poveznica kopirana",
|
||||
"loading-events": "Učitavanje događaja",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Učitavanje Recepata",
|
||||
"message": "Poruka",
|
||||
"monday": "Ponedjeljak",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Nije Pronađen Recept",
|
||||
"ok": "OK",
|
||||
"options": "Opcije:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Ispiši",
|
||||
"print-preferences": "Postavke ispisa",
|
||||
"random": "Nasumično",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Izvezi Sve",
|
||||
"refresh": "Osvježi",
|
||||
"upload-file": "Prenesi Datoteku",
|
||||
"created-on-date": "Kreirano dana: {0}"
|
||||
"created-on-date": "Kreirano dana: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Jeste li sigurni da želite izbrisati <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID grupe: {groupID}",
|
||||
"group-name": "Naziv Grupe",
|
||||
"group-not-found": "Grupa nije pronađena",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Grupa: {groupID}",
|
||||
"groups": "Grupe",
|
||||
"manage-groups": "Upravljaj Grupama",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Opće postavke",
|
||||
"group-recipe-preferences": "Postavke Recepata Grupe",
|
||||
"report": "Izvješće",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Upravljanje Grupom",
|
||||
"admin-group-management": "Upravljanje Grupom od strane Administratora",
|
||||
"admin-group-management-text": "Promjene u ovoj grupi će se odmah odraziti.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "za {0} vrste obroka",
|
||||
"meal-plan-rules": "Pravila Plana Obroka",
|
||||
"new-rule": "Novo Pravilo",
|
||||
"meal-plan-rules-description": "Možete kreirati pravila za automatski odabir recepata za vaš plan obroka. Ta pravila koristi server kako bi odredio slučajni skup recepata za odabir prilikom kreiranja plana obroka. Napomena: Ako pravila imaju ista ograničenja za dane/vrste, kategorije pravila će biti spojene. U praksi, nije potrebno stvarati duplicirana pravila, iako je to moguće.",
|
||||
"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": "Prilikom stvaranja novog pravila za plan obroka možete ograničiti primjenu pravila na određeni dan u tjednu i/ili određenu vrstu obroka. Da biste primijenili pravilo na sve dane ili sve vrste obroka, možete postaviti pravilo na \"Bilo koji\" (\"Any\"), što će ga primijeniti na sve moguće vrijednosti za dan i/ili vrstu obroka.",
|
||||
"recipe-rules": "Pravila Recepata",
|
||||
"applies-to-all-days": "Primjeni na sve dane",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie može uvesti recepte iz aplikacije Paprika. Izvezite svoje recepte iz Paprike, preimenujte ekstenziju izvoza u .zip i učitajte je u nastavku.",
|
||||
"mealie-text": "Mealie može uvesti recepte iz Mealie aplikacije iz verzije prije v1.0. Izvezite svoje recepte iz starog primjerka i učitajte zip datoteku u nastavku. Napomena: Samo recepti mogu biti uvezeni iz izvoza."
|
||||
"mealie-text": "Mealie može uvesti recepte iz Mealie aplikacije iz verzije prije v1.0. Izvezite svoje recepte iz starog primjerka i učitajte zip datoteku u nastavku. Napomena: Samo recepti mogu biti uvezeni iz izvoza.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Dodajte više recepata odjednom",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Dodaj u Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recept je dodan na popis",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Recept je dodan u Plan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Nije uspjelo dodavanje recepta u plan obroka",
|
||||
"yield": "Konačna Količina",
|
||||
"quantity": "Količina",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Ključ poruke",
|
||||
"parse": "Razluči (parsiraj)",
|
||||
"attach-images-hint": "Priložite slike povlačenjem i ispuštanjem u uređivaču",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Omogući korištenje količina sastojaka za ovu značajku",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recepti s definiranim jedinicama ili namirnicama ne mogu se razlučiti (parsirati).",
|
||||
"parse-ingredients": "Razluči (parsiraj) sastojke",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filter Oznaka",
|
||||
"search-hint": "Pritisni '/'",
|
||||
"advanced": "Napredno",
|
||||
"auto-search": "Auto Pretraga"
|
||||
"auto-search": "Auto Pretraga",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Dodaj Novu Temu",
|
||||
"admin-settings": "Admin Postavke",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Sigurnosna Kopija Kreirana na lokaciji {path}",
|
||||
"backup-deleted": "Sigurnosna kopija izbrisana",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Sigurnosna kopija Oznake",
|
||||
"create-heading": "Kreiraj sigurnosnu kopiju",
|
||||
"delete-backup": "Izbriši sigurnosnu kopiju",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Konfiguracija",
|
||||
"docker-volume": "Docker Volumen",
|
||||
"docker-volume-help": "Mealie zahtijeva da frontend kontejner i backend dijele isti Docker volumen ili pohranu. To osigurava da frontend kontejner pravilno pristupa slikama i resursima pohranjenim na disku.",
|
||||
"volumes-are-misconfigured": "Volumeni su neispravno konfigurirani",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Volumeni su ispravno konfigurirani.",
|
||||
"status-unknown-try-running-a-validation": "Status nepoznat. Pokušajte pokrenuti provjeru valjanosti.",
|
||||
"validate": "Valjanost",
|
||||
"email-configuration-status": "Status E-mail Konfiguracije",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Spremno",
|
||||
"not-ready": "Nije spremno - Provjerite Okolišne Varijable ili eng.: \"Environmental Variables\"",
|
||||
"succeeded": "Uspijelo je",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Zaporka je ažurirana",
|
||||
"password": "Zaporka",
|
||||
"password-strength": "Snaga zaporke je {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registracija",
|
||||
"reset-password": "Resetiraj Zaporku",
|
||||
"sign-in": "Prijava",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Korisničko ime",
|
||||
"users-header": "KORISNICI",
|
||||
"users": "Korisnici",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Vrijeme Web-dojavnika",
|
||||
"webhooks-enabled": "Web-dojavnik Omogućen",
|
||||
"you-are-not-allowed-to-create-a-user": "Nije Vam dopušteno kreiranje novog korisnika",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Upravljanje Korisnicima",
|
||||
"reset-locked-users": "Poništi Zaključane Korisnike",
|
||||
"admin-user-creation": "Kreiranje Administratorskog Korisnika",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Podaci o Korisniku",
|
||||
"user-name": "Korisničko Ime",
|
||||
"authentication-method": "Metoda provjere Autentičnosti",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "Korisnik može pozvati druge u grupu",
|
||||
"user-can-manage-group": "Korisnik može upravljati grupom",
|
||||
"user-can-organize-group-data": "Korisnik može organizirati podatke grupe",
|
||||
"enable-advanced-features": "Omogućite napredne značajke"
|
||||
"enable-advanced-features": "Omogućite napredne značajke",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "prevedeno",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Kreiraj Namirnicu",
|
||||
"food-label": "Prehrambena oznaka",
|
||||
"edit-food": "Uredi Namirnicu",
|
||||
"food-data": "Podaci o Namirnici"
|
||||
"food-data": "Podaci o Namirnici",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Popunite bazu podataka uobičajenim jedinicama na temelju vašeg lokalnog jezika.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Spajanje {0} u {1}",
|
||||
"create-unit": "Kreiraj Jedinicu",
|
||||
"abbreviation": "Oznaka Jedinice",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Opis",
|
||||
"display-as-fraction": "Prikaži kao razlomak",
|
||||
"use-abbreviation": "Koristi oznaku Jedinice",
|
||||
"edit-unit": "Uredi Jedinicu",
|
||||
"unit-data": "Podaci Jedinice",
|
||||
"use-abbv": "Koristi Skraćenu oznaku.",
|
||||
"fraction": "Razlomak"
|
||||
"fraction": "Razlomak",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Popunite bazu podataka uobičajenim oznakama na temelju vašeg lokalnog jezika.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Obriši Recepte",
|
||||
"source-unit-will-be-deleted": "Izvorna jedinica će biti izbrisana"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Unesi Podatke",
|
||||
"seed": "Seed",
|
||||
"data-management": "Upravljanje Podacima",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Označite Podatke",
|
||||
"select-language": "Odaberite Jezik",
|
||||
"columns": "Stupci",
|
||||
"combine": "Kombiniraj"
|
||||
"combine": "Kombiniraj",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registracija Korisnika",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Pridružite se Grupi",
|
||||
"create-a-new-group": "Kreiraj Novu Grupu",
|
||||
"provide-registration-token-description": "Molim vas da pružite registracijski token povezan s grupom kojoj želite pristupiti. Registracijski token možete dobiti od postojećeg člana grupe.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor količina",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Odabrani način rada",
|
||||
"pan-and-zoom-picture": "Pomakni i zumiraj sliku",
|
||||
"split-text": "Razdvoji tekst",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Razdvoji prema bloku teksta",
|
||||
"flatten": "Izravnaj bez obzira na izvornu formatiranost",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Način odabira (zadano)",
|
||||
"selection-mode-desc": "Način odabira je glavni način koji se može koristiti za unos podataka:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -70,13 +70,14 @@
|
||||
"enable-notifier": "Értesítés engedélyezése",
|
||||
"what-events": "Milyen eseményekre figyeljen ez az értesítés?",
|
||||
"user-events": "Felhasználói Események",
|
||||
"mealplan-events": "Étkezési tervező események",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Ha egy felhasználó a csoportodban egy új étkezési tervet készít",
|
||||
"mealplan-events": "Menütervező események",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Ha egy felhasználó a csoportodban egy új menütervet készít",
|
||||
"shopping-list-events": "Bevásárlólista események",
|
||||
"cookbook-events": "Szakácskönyv események",
|
||||
"tag-events": "Címke események",
|
||||
"category-events": "Kategória események",
|
||||
"when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba"
|
||||
"when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Mégsem",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Kulcsszó",
|
||||
"link-copied": "Hivatkozás másolva",
|
||||
"loading-events": "Események betöltése",
|
||||
"loading-recipe": "Recept betöltése...",
|
||||
"loading-ocr-data": "OCR adatok betöltése...",
|
||||
"loading-recipes": "Receptek betöltése",
|
||||
"message": "Üzenet",
|
||||
"monday": "Hétfő",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Nem található recept",
|
||||
"ok": "OK",
|
||||
"options": "Opciók:",
|
||||
"plural-name": "Név többes számban",
|
||||
"print": "Nyomtatás",
|
||||
"print-preferences": "Nyomtatási beállítások",
|
||||
"random": "Véletlenszerű",
|
||||
@@ -160,7 +164,7 @@
|
||||
"wednesday": "Szerda",
|
||||
"yes": "Igen",
|
||||
"foods": "Alapanyagok",
|
||||
"units": "Mértékegységek",
|
||||
"units": "Mennyiségi egységek",
|
||||
"back": "Vissza",
|
||||
"next": "Következő",
|
||||
"toggle-view": "Nézet váltása",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Összes exportálása",
|
||||
"refresh": "Frissít",
|
||||
"upload-file": "Fájl feltöltése",
|
||||
"created-on-date": "Létrehozva: {0}"
|
||||
"created-on-date": "Létrehozva: {0}",
|
||||
"unsaved-changes": "El nem mentett módosításai vannak. Szeretné elmenteni, mielőtt kilép? A mentéshez kattintson az Ok, a módosítások elvetéséhez a Mégsem gombra."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Biztosan törölni szeretnéd ezt: <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "Csoport azonosító: {groupID}",
|
||||
"group-name": "Csoport neve",
|
||||
"group-not-found": "A csoport nem található",
|
||||
"group-token": "Csoport token",
|
||||
"group-with-value": "Csoport: {groupID}",
|
||||
"groups": "Csoportok",
|
||||
"manage-groups": "Csoportok kezelése",
|
||||
@@ -237,38 +243,39 @@
|
||||
"default-to-landscape-view-description": "Ha engedélyezve van, a receptfejléc fekvő nézetben jelenik meg",
|
||||
"disable-users-from-commenting-on-recipes": "Letiltja a felhasználóknak, hogy megjegyzéseket fűzzenek a receptekhez",
|
||||
"disable-users-from-commenting-on-recipes-description": "Elrejti a megjegyzéseket a receptoldalon és letiltja a megjegyzéseket",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "A recept hozzávalók egységenkénti és ételenkénti rendszerezésének letiltása",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Elrejti a hozzávalók Élelmiszer, Egység és Mennyiség mezőit és egyszerű szöveges mezőként kezeli az összetevőket.",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "A recept hozzávalók mennyiségi egységenkénti és alapanyagonkénti rendszerezésének letiltása",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Elrejti a hozzávalók Alapanyag, Mennyiségi Egység és Mennyiség mezőit és egyszerű szöveges mezőként kezeli a hozzávalókat.",
|
||||
"general-preferences": "Általános beállítások",
|
||||
"group-recipe-preferences": "Csoportos recept beállítások",
|
||||
"report": "Jelentés",
|
||||
"report-with-id": "Jelentésazonosító: {id}",
|
||||
"group-management": "Csoport kezelése",
|
||||
"admin-group-management": "Admin csoport kezelése",
|
||||
"admin-group-management-text": "A csoporthoz tartozó változtatások azonnal megjelennek.",
|
||||
"group-id-value": "Csoport azonosító: {0}"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Étkezési terv létrehozása",
|
||||
"create-a-new-meal-plan": "Menüterv létrehozása",
|
||||
"dinner-this-week": "Vacsora ezen a héten",
|
||||
"dinner-today": "Vacsora ma",
|
||||
"dinner-tonight": "Vacsora ma",
|
||||
"edit-meal-plan": "Étkezési terv szerkesztése",
|
||||
"edit-meal-plan": "Menüterv szerkesztése",
|
||||
"end-date": "Befejezés dátuma",
|
||||
"group": "Csoportosítás (Béta)",
|
||||
"main": "Főétel",
|
||||
"meal-planner": "Éktezési tervező",
|
||||
"meal-plans": "Étkezési tervek",
|
||||
"mealplan-categories": "ÉTKEZÉSI TERV KATEGÓRIÁK",
|
||||
"mealplan-created": "Étkezési terv létrehozva",
|
||||
"mealplan-creation-failed": "Étkezési terv létrehozása sikertelen",
|
||||
"mealplan-deleted": "Étkezési terv törölve",
|
||||
"mealplan-deletion-failed": "Étkezési terv törlése sikertelen",
|
||||
"mealplan-settings": "Étkezési terv beállítások",
|
||||
"mealplan-update-failed": "Étkezési terv módosítása sikertelen",
|
||||
"mealplan-updated": "Étkezési terv módosítva",
|
||||
"no-meal-plan-defined-yet": "Nincs még étkezési terv létrehozva",
|
||||
"no-meal-planned-for-today": "Nincs mára étkezési terv",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Az étkezési tervben csak a következő kategóriához tartozó receptek kerülnek felhasználásra",
|
||||
"meal-planner": "Menütervező",
|
||||
"meal-plans": "Menütervek",
|
||||
"mealplan-categories": "MENÜTERV KATEGÓRIÁK",
|
||||
"mealplan-created": "Menüterv létrehozva",
|
||||
"mealplan-creation-failed": "Menüterv létrehozása sikertelen",
|
||||
"mealplan-deleted": "Menüterv törölve",
|
||||
"mealplan-deletion-failed": "Menüterv törlése sikertelen",
|
||||
"mealplan-settings": "Menütervező beállításai",
|
||||
"mealplan-update-failed": "Menüterv módosítása sikertelen",
|
||||
"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",
|
||||
"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",
|
||||
"side": "Köret",
|
||||
@@ -283,36 +290,36 @@
|
||||
"day-any": "Bármely",
|
||||
"editor": "Szerkesztő",
|
||||
"meal-recipe": "Ételrecept",
|
||||
"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}.",
|
||||
"meal-title": "Étel neve",
|
||||
"meal-note": "Ételjegyzet",
|
||||
"note-only": "Csak jegyzet",
|
||||
"random-meal": "Étkezés találomra",
|
||||
"random-dinner": "Vacsora találomra",
|
||||
"random-side": "Kisétkezés találomra",
|
||||
"this-rule-will-apply": "Ez a szabály a következőkre vonatkozik:{dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "minden napra",
|
||||
"on-days": "on {0}s",
|
||||
"on-days": "minden {0}-on/en/ön",
|
||||
"for-all-meal-types": "minden étkezésfajtához",
|
||||
"for-type-meal-types": "{0} étkezés fajtához",
|
||||
"meal-plan-rules": "Étkezési terv szabályok",
|
||||
"meal-plan-rules": "Menüterv szabályok",
|
||||
"new-rule": "Új szabály",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for you 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.",
|
||||
"meal-plan-rules-description": "A menütervekhez szükséges receptek automatikus kiválasztásához létrehozhat szabályokat. Ezeket a szabályokat a kiszolgáló arra használja, hogy meghatározza a receptek véletlenszerű választékát, amelyből a menütervek létrehozásakor választani fog. Vegye figyelembe, hogy ha a szabályoknak azonos nap/típus megkötései vannak, akkor a szabályok kategóriái összevonásra kerülnek. A gyakorlatban nem szükséges duplikált szabályokat létrehozni, de lehetséges.",
|
||||
"new-rule-description": "Amikor új szabályt hoz létre egy menütervhez, korlátozhatja a szabályt, hogy a hét egy adott napjára és/vagy egy adott típusú étkezésre vonatkozzon. Ha egy szabályt minden napra vagy étkezési típusra alkalmazni szeretne, akkor a szabályt \"Bármely\" értékre állíthatja be, amely azt az adott nap és/vagy étkezési típus összes lehetséges értékére alkalmazza.",
|
||||
"recipe-rules": "Recept szabályok",
|
||||
"applies-to-all-days": "Minden napra vonatkozóan",
|
||||
"applies-on-days": "Applies on {0}s",
|
||||
"meal-plan-settings": "Étkezési terv beállítások"
|
||||
"applies-on-days": "Érvényes {0}-ként",
|
||||
"meal-plan-settings": "Menütervező beállításai"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migrációs adatok eltávolítva",
|
||||
"new-migration": "New Migration",
|
||||
"new-migration": "Új migráció",
|
||||
"no-file-selected": "Nincs fájl kiválasztva",
|
||||
"no-migration-data-available": "Nincs elérhető migrációs adat",
|
||||
"previous-migrations": "Previous Migrations",
|
||||
"previous-migrations": "Előző migráció",
|
||||
"recipe-migration": "Recept migrálás",
|
||||
"chowdown": {
|
||||
"description": "Adat migrálása Chowdown-ból",
|
||||
"description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"description-long": "Mealie natívan támogatja a chowdown repository formátumot. Töltse le a kódtárat .zip fájlként, és töltse fel a lenti helyen.",
|
||||
"title": "Chowdown"
|
||||
},
|
||||
"nextcloud": {
|
||||
@@ -339,13 +346,17 @@
|
||||
"recipe-data-migrations": "Receptadatok migrációja",
|
||||
"recipe-data-migrations-explanation": "A receptek átemelhetők más támogatott alkalmazásból Mealie-be. Ez egy remek módja a Mealie használatának elkezdésére.",
|
||||
"choose-migration-type": "Válassza ki a migrációs típusát",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"tag-all-recipes": "Az összes recept címkézése a {tag-name} címkével",
|
||||
"nextcloud-text": "A Nextcloud-receptek importálhatók a Nextcloudban tárolt adatokat tartalmazó zip-fájlból. Tekintse meg az alábbi példamappaszerkezetet, hogy receptjei biztosan importálhatók legyenek.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natívan támogatja a chowdown repository formátumot. Töltse le a kódtárat .zip fájlként, és töltse fel alább",
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 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."
|
||||
"paprika-text": "Mealie képes recepteket importálni a Paprika alkalmazásból. Exportálja a receptjeit a Paprikából, nevezze át az export kiterjesztést .zip-re, és töltse fel alább.",
|
||||
"mealie-text": "Mealie képes a v1.0 előtti kiadású Mealie alkalmazásból származó receptek importálására. Exportálja a receptjeit a régi példányából, és töltse fel a zip fájlt alább. Vegye figyelembe, hogy az exportból csak receptek importálhatók.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie képes recepteket importálni a Plan to Eat alkalmazásból."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Tömeges hozzáadás",
|
||||
@@ -402,7 +413,7 @@
|
||||
"disable-comments": "Megjegyzések letiltása",
|
||||
"duplicate": "Recept duplikálása",
|
||||
"duplicate-name": "Az új recept neve",
|
||||
"edit-scale": "Edit Scale",
|
||||
"edit-scale": "Méretezés módosítása",
|
||||
"fat-content": "Zsír",
|
||||
"fiber-content": "Rostok",
|
||||
"grams": "gramm",
|
||||
@@ -450,16 +461,18 @@
|
||||
"no-recipe": "Nincs recept",
|
||||
"locked-by-owner": "A tulajdonos által zárolva",
|
||||
"join-the-conversation": "Csatlakozzon a beszélgetéshez",
|
||||
"add-recipe-to-mealplan": "Recept hozzáadása Étkezési tervhez",
|
||||
"entry-type": "Entry Type",
|
||||
"add-recipe-to-mealplan": "Recept hozzáadása menütervhez",
|
||||
"entry-type": "Bejegyzés típusa",
|
||||
"date-format-hint": "HH/NN/ÉÉÉÉ formátum",
|
||||
"date-format-hint-yyyy-mm-dd": "ÉÉÉÉ-HH-NN formátum",
|
||||
"add-to-list": "Hozzáadás listához",
|
||||
"add-to-plan": "Hozzáadás az étkezési tervhez",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Hozzáadás idővonalhoz",
|
||||
"recipe-added-to-list": "Recept hozzáadva listához",
|
||||
"recipe-added-to-mealplan": "Recept hozzáadva Étkezési tervhez",
|
||||
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet az Étkezési tervhez",
|
||||
"recipes-added-to-list": "Recept hozzáadva listához",
|
||||
"recipe-added-to-mealplan": "Recept hozzáadva menütervhez",
|
||||
"failed-to-add-recipes-to-list": "Nem sikerült hozzáadni a receptet a listához",
|
||||
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet a menütervhez",
|
||||
"yield": "Adag",
|
||||
"quantity": "Mennyiség",
|
||||
"choose-unit": "Válasszon mennyiségi egységet",
|
||||
@@ -469,44 +482,45 @@
|
||||
"toggle-section": "Szakaszcím megjelenítése/kikapcsolása",
|
||||
"see-original-text": "Eredeti szöveg megjelenítése",
|
||||
"original-text-with-value": "Eredeti szöveg: {originalText}",
|
||||
"ingredient-linker": "Hozzávaló összekapcsoló",
|
||||
"ingredient-linker": "Hozzávaló összekötő",
|
||||
"linked-to-other-step": "Egy másik lépéssel összekapcsolva",
|
||||
"auto": "Automatikus",
|
||||
"cook-mode": "Főzési mód",
|
||||
"link-ingredients": "Hozzávalók összekapcsolása",
|
||||
"merge-above": "Összevonás a fentivel",
|
||||
"reset-scale": "Skála alaphelyzetbe állítása",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
"decrease-scale-label": "Skála csökkentése 1-gyel",
|
||||
"increase-scale-label": "Skála növelése 1-gyel",
|
||||
"locked": "Zárolt",
|
||||
"public-link": "Nyilvános link",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"kitchen-timer": "Konyhai időzítő",
|
||||
"start-timer": "Időzítő elindítása",
|
||||
"pause-timer": "Időzítő megállítása",
|
||||
"resume-timer": "Időzítő folytatása",
|
||||
"stop-timer": "Időzítő leállítása"
|
||||
},
|
||||
"edit-timeline-event": "Idővonal-esemény szerkesztése",
|
||||
"timeline": "Idővonal",
|
||||
"timeline-is-empty": "Az idővonalon még semmi sincs. Próbálja meg elkészíteni ezt a receptet!",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"group-global-timeline": "{groupName} Globális idővonal",
|
||||
"open-timeline": "Idővonal megnyitása",
|
||||
"made-this": "Elkészítettem ezt",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"how-did-it-turn-out": "Hogyan sikerült?",
|
||||
"user-made-this": "ezt {user} készítette el",
|
||||
"last-made-date": "Utoljára elkészítve {date}",
|
||||
"api-extras-description": "A receptek extrák a Mealie API egyik legfontosabb jellemzője. Lehetővé teszik, hogy egyéni json kulcs/érték párokat hozzon létre egy receptben, amelyekre 3. féltől származó alkalmazásokból hivatkozhat. Ezeket a kulcsokat arra használhatja, hogy automatizmusokat indítsanak el vagy küldjenek egyéni üzenetek a meghatározott eszközéhez.",
|
||||
"message-key": "Üzenetkulcs",
|
||||
"parse": "Parse",
|
||||
"parse": "Előkészítés",
|
||||
"attach-images-hint": "Képek csatolása a szerkesztőbe történő húzásával és ejtésével",
|
||||
"drop-image": "Dobd ide a képet",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Engedélyezze az összetevők mennyiségét a funkció használatához",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "A külön meghatározott mértékegységeket vagy alapanyagokat tartalmazó receptek nem elemezhetők.",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "A külön meghatározott mennyiségi egységeket vagy alapanyagokat tartalmazó receptek nem elemezhetők.",
|
||||
"parse-ingredients": "Hozzávalók elemzése",
|
||||
"edit-markdown": "Edit Markdown",
|
||||
"edit-markdown": "Markdown szerkesztése",
|
||||
"recipe-creation": "Recept létrehozása",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Válasszon egyet a recept létrehozásának különböző módjai közül",
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"looking-for-migrations": "Migrációt keres?",
|
||||
"import-with-url": "Importálás URL-címről",
|
||||
"create-recipe": "Recept létrehozása",
|
||||
"import-with-zip": "Importálás .zip formátummal",
|
||||
@@ -534,12 +548,12 @@
|
||||
"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.",
|
||||
"debug": "Hibakeresés",
|
||||
"tree-view": "Tree View",
|
||||
"recipe-yield": "Recipe Yield",
|
||||
"unit": "Mértékegység",
|
||||
"tree-view": "Fa nézet",
|
||||
"recipe-yield": "Adagonkénti információk",
|
||||
"unit": "Mennyiségi egység",
|
||||
"upload-image": "Kép feltöltése",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image"
|
||||
"screen-awake": "Képernyő ébren tartása",
|
||||
"remove-image": "Kép etávolítása"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Részletes keresés",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Címke szűrő",
|
||||
"search-hint": "Üsse be '/'",
|
||||
"advanced": "Haladó mód",
|
||||
"auto-search": "Automatikus keresés"
|
||||
"auto-search": "Automatikus keresés",
|
||||
"no-results": "Nincs találat"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Új téma hozzáadása",
|
||||
"admin-settings": "Admin beállítások",
|
||||
"backup": {
|
||||
"backup-created": "Biztonsági mentés sikeresen létrehozva",
|
||||
"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",
|
||||
"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",
|
||||
@@ -574,13 +591,13 @@
|
||||
"partial-backup": "Részleges biztonsági mentés",
|
||||
"unable-to-delete-backup": "Nem lehetett létrehozni a biztonsági mentést.",
|
||||
"experimental-description": "Backups a 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 off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"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"
|
||||
"backup-restore": "Biztonsági Mentés/Visszaállítás",
|
||||
"back-restore-description": "A biztonsági mentés visszaállítása felülírja az adatbázisban és az adatkönyvtárban lévő összes aktuális adatot, és a biztonsági mentés tartalmával helyettesíti azokat. {cannot-be-undone} Ha a visszaállítás sikeres, akkor a rendszer kilépteti Önt.",
|
||||
"cannot-be-undone": "Ezt a műveletet visszavonható - óvatosan használja.",
|
||||
"postgresql-note": "Ha PostGreSQL-t használ, kérjük, a visszaállítás előtt tekintse át a {backup-restore-process}-t.",
|
||||
"backup-restore-process-in-the-documentation": "biztonsági mentés/visszaállítás folyamata a dokumentációban",
|
||||
"irreversible-acknowledgment": "Tudomásul veszem, hogy ez a művelet visszafordíthatatlan, helyrehozhatatlan, és adatvesztéssel járhat",
|
||||
"restore-backup": "Biztonsági mentés visszaállítása"
|
||||
},
|
||||
"backup-and-exports": "Biztonsági mentések",
|
||||
"change-password": "Jelszó megváltoztatása",
|
||||
@@ -644,8 +661,8 @@
|
||||
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Másold ezt a tokent hogy a külső alkalmazásban használhasd. Ez a token többet nem jelenik meg.",
|
||||
"create-an-api-token": "API token létrehozása",
|
||||
"token-name": "Token neve",
|
||||
"generate": "Generate",
|
||||
"you-have-token-count": "You have no active tokens.|You have one active token.|You have {count} active tokens."
|
||||
"generate": "Létrehozás",
|
||||
"you-have-token-count": "Nincsenek aktív tokenjei.|Egy aktív tokenje van.| {count} aktív tokenje van."
|
||||
},
|
||||
"toolbox": {
|
||||
"assign-all": "Mindet hozzárendel",
|
||||
@@ -660,37 +677,39 @@
|
||||
},
|
||||
"webhooks": {
|
||||
"test-webhooks": "Webhook tesztelése",
|
||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "A lenti URL egy webhook hivást fog kapni, az étkezési tervhez tartozó recept adataival a megadott napon. Jelenleg a Webook az alábbi időpontban hajtódik végre",
|
||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "A lenti URL egy webhook hívást fog kapni, a menütervhez tartozó recept adataival a megadott napon. Aktuálisan a Webook az alábbi időpontban lesz végrehajtva",
|
||||
"webhook-url": "Webhook URL",
|
||||
"webhooks-caps": "WEBHOOKOK",
|
||||
"webhooks": "Webhook-ok",
|
||||
"webhook-name": "Webhook neve",
|
||||
"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."
|
||||
"description": "Az alábbiakban meghatározott webhookok akkor kerülnek végrehajtásra, amikor az adott napra étkezés kerül beállításra. A tervezett időpontban a webhookok elküldésre kerülnek az adott napra tervezett recept adataival. Vegye figyelembe, hogy a webhookok végrehajtása nem pontos. A webhookok 5 perces időközönként kerülnek végrehajtásra, így a webhookok a tervezett időponthoz képest 5 +/- percen belül fognak végrehajtásra kerülni."
|
||||
},
|
||||
"bug-report": "Hibajelentés",
|
||||
"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.",
|
||||
"bug-report-information": "Ezt az információt hiba bejelentéséhez használhatja. A fejlesztők számára az Ön példányára vonatkozó adatok megadása a legjobb módja annak, hogy problémái gyorsan megoldódjanak.",
|
||||
"tracker": "Tracker",
|
||||
"configuration": "Beállítás",
|
||||
"docker-volume": "Docker Kötet",
|
||||
"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": "A kötetek rosszul beállítottak",
|
||||
"docker-volume-help": "A Mealie megköveteli, hogy a frontend konténer és a backend ugyanazt a docker kötetet vagy tárolót használja. Ez biztosítja, hogy a frontend konténer megfelelően hozzáférjen a lemezen tárolt képekhez és eszközökhöz.",
|
||||
"volumes-are-misconfigured": "A kötetek rosszul beállítottak.",
|
||||
"volumes-are-configured-correctly": "A kötetek helyesen beállítottak.",
|
||||
"status-unknown-try-running-a-validation": "Ismeretlen státusz. Próbáljon meg egy érvényesítést futtatni.",
|
||||
"validate": "Érvényesítés",
|
||||
"email-configuration-status": "Levelezés beállításI státusza",
|
||||
"email-configured": "Email beállítva",
|
||||
"email-test-results": "Email teszt eredménye",
|
||||
"ready": "Kész",
|
||||
"not-ready": "Nem kész - Ellenőrizze a környezeti változókat",
|
||||
"succeeded": "Sikeres",
|
||||
"failed": "Sikertelen ",
|
||||
"general-about": "General About",
|
||||
"general-about": "Általános információk",
|
||||
"application-version": "Alkalmazás verziója",
|
||||
"application-version-error-text": "Az aktuális verzió ({0}) nem felel meg a legújabb kiadásnak. Fontolja meg a frissítést a legújabb verzióra ({1}).",
|
||||
"mealie-is-up-to-date": "Mealie naprakész",
|
||||
"secure-site": "Secure Site",
|
||||
"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",
|
||||
"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.",
|
||||
"secure-site": "Biztonságos oldal",
|
||||
"secure-site-error-text": "Kiszolgálás localhoston keresztül vagy https-szel biztosítva. A vágólap és a további böngésző API-k nem feltétlenül működnek.",
|
||||
"secure-site-success-text": "Az oldal localhoston vagy Https-en keresztül elérve",
|
||||
"server-side-base-url": "Szerver oldali bázis URL",
|
||||
"server-side-base-url-error-text": "A 'BASE_URL` továbbra is az alapértelmezett érték az API-kiszolgálón. Ez problémákat okoz az e-mailekhez stb. a szerveren generált értesítési linkeknél.",
|
||||
"server-side-base-url-success-text": "A kiszolgálóoldali URL nem egyezik az alapértelmezettel",
|
||||
"ldap-ready": "LDAP-kész",
|
||||
"ldap-ready-error-text": "Nem minden LDAP-érték van beállítva. Ezt figyelmen kívül lehet hagyni, ha nem használ LDAP-hitelesítést.",
|
||||
@@ -710,21 +729,21 @@
|
||||
"food": "Étel",
|
||||
"note": "Megjegyzés",
|
||||
"label": "Címke",
|
||||
"linked-item-warning": "Ez a tétel egy vagy több recepthez kapcsolódik. A mértékegységek vagy az alapanyagok beá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": "Toggle Food",
|
||||
"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",
|
||||
"are-you-sure-you-want-to-delete-this-item": "Biztosan törli ezt az elemet?",
|
||||
"copy-as-text": "Másolás szövegként",
|
||||
"copy-as-markdown": "Másolás Markdown szövegként",
|
||||
"delete-checked": "Delete Checked",
|
||||
"toggle-label-sort": "Toggle Label Sort",
|
||||
"reorder-labels": "Reorder Labels",
|
||||
"uncheck-all-items": "Uncheck All Items",
|
||||
"check-all-items": "Check All Items",
|
||||
"linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes",
|
||||
"items-checked-count": "No items checked|One item checked|{count} items checked",
|
||||
"delete-checked": "Kijelöltek törlése",
|
||||
"toggle-label-sort": "Címke rendezés váltása",
|
||||
"reorder-labels": "Címkék újrarendezése",
|
||||
"uncheck-all-items": "Kijelölés megszüntetése",
|
||||
"check-all-items": "Minden tétel kijelölése",
|
||||
"linked-recipes-count": "Nincs összekapcsolt recept|Egy összekapcsolt recept|{count} összekapcsolt recept",
|
||||
"items-checked-count": "Nincs ellenőrzött tétel|Egy ellenőrzött tétel|{count} ellenőrzött tétel",
|
||||
"no-label": "Nincs címke",
|
||||
"completed-on": "Completed on {date}"
|
||||
"completed-on": "Teljesítve {date}"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Minden recept",
|
||||
@@ -743,7 +762,7 @@
|
||||
"language": "Nyelv",
|
||||
"maintenance": "Karbantartás",
|
||||
"background-tasks": "Háttér műveletek",
|
||||
"parser": "Parser",
|
||||
"parser": "Szintaxis elemző",
|
||||
"developer": "Fejlesztő",
|
||||
"cookbook": "Szakácskönyv",
|
||||
"create-cookbook": "Szakácskönyv létrehozása"
|
||||
@@ -772,11 +791,11 @@
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Eszközök",
|
||||
"on-hand": "On Hand",
|
||||
"create-a-tool": "Create a Tool",
|
||||
"tool-name": "Tool Name",
|
||||
"create-new-tool": "Create New Tool",
|
||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||
"on-hand": "Rendelkezésre álló",
|
||||
"create-a-tool": "Eszköz létrehozása",
|
||||
"tool-name": "Eszköz neve",
|
||||
"create-new-tool": "Új eszköz létrehozása",
|
||||
"on-hand-checkbox-label": "Készleten lévőnek mutatni (Ellenőrizve)",
|
||||
"required-tools": "Szükséges eszközök"
|
||||
},
|
||||
"user": {
|
||||
@@ -812,10 +831,11 @@
|
||||
"password-updated": "Jelszó megváltoztatva",
|
||||
"password": "Jelszó",
|
||||
"password-strength": "Jelszó erőssége: {strength}",
|
||||
"please-enter-password": "Kérjük adja meg az új jelszavát.",
|
||||
"register": "Regisztráció",
|
||||
"reset-password": "Jelszó visszaállítása",
|
||||
"sign-in": "Bejelentkezés",
|
||||
"total-mealplans": "Összes étkezési terv",
|
||||
"total-mealplans": "Összes menüterv",
|
||||
"total-users": "Összes Felhasználó",
|
||||
"upload-photo": "Fotó feltöltése",
|
||||
"use-8-characters-or-more-for-your-password": "Használj 8 vagy több karaktert a jelszóhoz",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Felhasználónév",
|
||||
"users-header": "FELHASZNÁLÓK",
|
||||
"users": "Felhasználók",
|
||||
"user-not-found": "A felhasználó nem található",
|
||||
"webhook-time": "Webhook ideje",
|
||||
"webhooks-enabled": "Webhookok engedélyezve",
|
||||
"you-are-not-allowed-to-create-a-user": "Nem hozhatsz létre új felhasználót",
|
||||
@@ -843,17 +864,18 @@
|
||||
"remember-me": "Emlékezz rám",
|
||||
"please-enter-your-email-and-password": "Kérjük, adja meg e-mail-címét és jelszavát",
|
||||
"invalid-credentials": "Érvénytelen hitelesítő adatok",
|
||||
"account-locked-please-try-again-later": "Account Locked. Please try again later",
|
||||
"user-favorites": "User Favorites",
|
||||
"account-locked-please-try-again-later": "Fiók zárolva. Kérjük próbálja meg később",
|
||||
"user-favorites": "Felhasználó kedvencei",
|
||||
"password-strength-values": {
|
||||
"weak": "Gyenge",
|
||||
"good": "Jó",
|
||||
"strong": "Erős",
|
||||
"very-strong": "Nagyon Erős"
|
||||
},
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"user-management": "Felhasználók kezelése",
|
||||
"reset-locked-users": "Zárolt felhasználók feloldása",
|
||||
"admin-user-creation": "Admin felhasználó létrehozása",
|
||||
"admin-user-management": "Admin felhasználó kezelése",
|
||||
"user-details": "Felhasználói információk",
|
||||
"user-name": "Felhasználó neve",
|
||||
"authentication-method": "Hitelesítési módszer",
|
||||
@@ -862,8 +884,13 @@
|
||||
"administrator": "Adminisztrátor",
|
||||
"user-can-invite-other-to-group": "A felhasználó meghívhat másokat a csoportba",
|
||||
"user-can-manage-group": "A felhasználó csoportot kezelhet",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"user-can-organize-group-data": "Felhasználó szerkesztheti a csoport adatait",
|
||||
"enable-advanced-features": "Haladó funkciók engedélyezése",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Úgy tűnik, most jelentkezik be először.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nem akarja ezt többé látni? Mindenképpen változtassa meg az e-mail címét a felhasználói beállítások között!",
|
||||
"forgot-password": "Elfelejtett jelszó",
|
||||
"forgot-password-text": "Írja be e-mail címét és mi küldünk egy linket a jelszó visszaállításához.",
|
||||
"changes-reflected-immediately": "Ehhez a felhasználóhoz tartozó változtatások azonnal megjelennek."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "lefordítva",
|
||||
@@ -874,37 +901,44 @@
|
||||
},
|
||||
"data-pages": {
|
||||
"foods": {
|
||||
"merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.",
|
||||
"merge-food-example": "Merging {food1} into {food2}",
|
||||
"seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.",
|
||||
"seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.",
|
||||
"combine-food": "Combine Food",
|
||||
"source-food": "Source Food",
|
||||
"target-food": "Target Food",
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"merge-dialog-text": "A kiválasztott alapanyagok egyesítésével a forrásalapanyag és a célalapanyag egyetlen alapanyag lesz. A forrásalapanyag törlésre kerül, és a forrásalapanyagra vonatkozó összes hivatkozás frissül, hogy a célalapanyagra mutasson.",
|
||||
"merge-food-example": "{food1} összevonása {food2}-ba/be",
|
||||
"seed-dialog-text": "Töltse be az adatbázist a helyi nyelvű alapanyagokkal. Ezáltal több mint 200 közös alapanyagot hoz létre, amelyek segítségével rendszerezheti az adatbázisát. Az alapanyagok fordítása közösségi összefogással történik.",
|
||||
"seed-dialog-warning": "Már van néhány elem az adatbázisban. Ez a művelet nem egyezteti a másodpéldányokat, ezeket manuálisan kell kezelnie.",
|
||||
"combine-food": "Ételek egyesítése",
|
||||
"source-food": "Kiinduló étel",
|
||||
"target-food": "Cél étel",
|
||||
"create-food": "Étel készítése",
|
||||
"food-label": "Étel címke",
|
||||
"edit-food": "Étel szerkesztése",
|
||||
"food-data": "Étel adatai",
|
||||
"example-food-singular": "pl. Hagyma",
|
||||
"example-food-plural": "pl. Hagymák"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
"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",
|
||||
"seed-dialog-text": "Töltse be az Ön nyelve szerinti közös mennyiségi egységet tartalmazó adatbázist.",
|
||||
"combine-unit-description": "A kiválasztott mennyiségi egységek egyesítésével a Forrás mennyiségi egység és a Cél mennyiségi egység egyetlen mennyiségi egységgé egyesül. A {source-unit-will-be-deleted} és a Forrás mennyiségi egységre való összes hivatkozás frissül, hogy a Cél mennyiségi egységre mutasson.",
|
||||
"combine-unit": "Mennyiségi egységek egyesítése",
|
||||
"source-unit": "Forrás mennyiségi egység",
|
||||
"target-unit": "Cél mennyiségi egység",
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Mértékegység létrehozása",
|
||||
"merging-unit-into-unit": "{0} összevonása {1}-zel/zal",
|
||||
"create-unit": "Mennyiségi egység létrehozása",
|
||||
"abbreviation": "Rövidítés",
|
||||
"plural-abbreviation": "Többes szám rövidítése",
|
||||
"description": "Megnevezés",
|
||||
"display-as-fraction": "Törtként való megjelenítés",
|
||||
"use-abbreviation": "Rövidítés használata",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"edit-unit": "Mennyiségi egység szerkesztése",
|
||||
"unit-data": "Mennyiségi egység adatok",
|
||||
"use-abbv": "Rövidítés haszn.",
|
||||
"fraction": "Tört",
|
||||
"example-unit-singular": "pl. Evőkanál",
|
||||
"example-unit-plural": "pl. Evőkanalak",
|
||||
"example-unit-abbreviation-singular": "pl. ek",
|
||||
"example-unit-abbreviation-plural": "pl. ek"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
"seed-dialog-text": "Töltse be az Ön nyelve szerinti közös címkélet tartalmazó adatbázist.",
|
||||
"edit-label": "Címke szerkesztése",
|
||||
"new-label": "Új címke",
|
||||
"labels": "Címkék"
|
||||
@@ -922,32 +956,50 @@
|
||||
"data-exports-description": "Ez a szakasz a letölthető, rendelkezésre álló exportok linkjeit tartalmazza. Ezek az exportok érvényessége le fog járni, ezért mindenképpen szerezze be őket, amíg még elérhetők.",
|
||||
"data-exports": "Adatok exportálása",
|
||||
"tag": "Címke",
|
||||
"categorize": "Categorize",
|
||||
"categorize": "Kategorizálás",
|
||||
"update-settings": "Beállítások frissítése",
|
||||
"tag-recipes": "Tag Recipes",
|
||||
"categorize-recipes": "Categorize Recipes",
|
||||
"tag-recipes": "Receptek címkézése",
|
||||
"categorize-recipes": "Receptek kategorizálása",
|
||||
"export-recipes": "Receptek exportálása",
|
||||
"delete-recipes": "Receptek törlése",
|
||||
"source-unit-will-be-deleted": "A forrás mértékegység törlésre kerül"
|
||||
"source-unit-will-be-deleted": "A forrás mennyiségi egység törlésre kerül"
|
||||
},
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"create-alias": "Alias készítése",
|
||||
"manage-aliases": "Alias kezelése",
|
||||
"seed-data": "Kezdőérték adat",
|
||||
"seed": "Kezdőérték",
|
||||
"data-management": "Adatmenedzsment",
|
||||
"data-management-description": "Válassza ki, hogy melyik adatkészletet szeretné módosítani.",
|
||||
"select-data": "Válassza ki az adatot",
|
||||
"select-language": "Nyelv kiválasztása",
|
||||
"columns": "Oszlopok",
|
||||
"combine": "Combine"
|
||||
"combine": "Összevonás",
|
||||
"categories": {
|
||||
"edit-category": "Kategória szerkesztése",
|
||||
"new-category": "Új kategória",
|
||||
"category-data": "Kategória adatai"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Új címke",
|
||||
"edit-tag": "Címke szerkesztése",
|
||||
"tag-data": "Címke adatok"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Új eszköz",
|
||||
"edit-tool": "Eszköz szerkesztése",
|
||||
"tool-data": "Eszköz adatai"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Felhasználó regisztráció",
|
||||
"registration-success": "Sikeres regisztráció",
|
||||
"join-a-group": "Csatlakozás egy csoporthoz",
|
||||
"create-a-new-group": "Új csoport létrehozása",
|
||||
"provide-registration-token-description": "Kérjük, adja meg a csatlakozni kívánt csoporthoz tartozó regisztrációs tokent. Ezt egy meglévő csoporttagtól kell megkapnia.",
|
||||
"group-details": "Csoport részletek",
|
||||
"group-details-description": "Mielőtt létrehozna egy fiókot, létre kell hoznia egy csoportot. A csoportodban csak te leszel, de később másokat is meghívhatsz. A csoportod tagjai étkezési terveket, bevásárlólistákat, recepteket és még sok mást is megoszthatnak egymással!",
|
||||
"use-seed-data": "Use Seed Data",
|
||||
"use-seed-data-description": "Mealie az alapanyagok, a mértékegységek és a címkék gyűjteményét tartalmazza, amelyek megoszthatók a csoporttal és hasznos adataival segítségül szolgálhat a receptek szervezéséhez.",
|
||||
"group-details-description": "Mielőtt létrehozna egy fiókot, létre kell hoznia egy csoportot. A csoportban csak ön lesz, de később másokat is meghívhat. A csoport tagjai menüterveket, bevásárlólistákat, recepteket és még sok mást is megoszthatnak egymással!",
|
||||
"use-seed-data": "Mintaadatok használata",
|
||||
"use-seed-data-description": "Mealie az alapanyagok, a mennyiségi egységek és a címkék gyűjteményét tartalmazza, amelyek megoszthatók a csoporttal és hasznos adataival segítségül szolgálhat a receptek szervezéséhez.",
|
||||
"account-details": "A fiók részletei"
|
||||
},
|
||||
"validation": {
|
||||
@@ -965,20 +1017,20 @@
|
||||
"recipe-share": {
|
||||
"expiration-date": "Lejárati dátum",
|
||||
"share-recipe": "Recept megosztása",
|
||||
"default-30-days": "Default 30 Days",
|
||||
"default-30-days": "Alapértelmezetten 30 nap",
|
||||
"expires-at": "Lejárat ekkor",
|
||||
"recipe-link-copied-message": "Recipe link copied to clipboard"
|
||||
"recipe-link-copied-message": "Recept linkje a vágólapra másolva"
|
||||
},
|
||||
"banner-experimental": {
|
||||
"title": "Experimental Feature",
|
||||
"description": "This page contains experimental or still-baking features. Please excuse the mess.",
|
||||
"issue-link-text": "Track our progress here"
|
||||
"title": "Kísérleti funkció",
|
||||
"description": "Ez az oldal kísérleti vagy még készülő funkciókat tartalmaz. Elnézést a rendetlenségért.",
|
||||
"issue-link-text": "Itt követheti nyomon a fejlődésünket"
|
||||
},
|
||||
"form": {
|
||||
"quantity-label-abbreviated": "Menny"
|
||||
},
|
||||
"markdown-editor": {
|
||||
"preview-markdown-button-label": "Preview Markdown"
|
||||
"preview-markdown-button-label": "Markdown előnézet"
|
||||
},
|
||||
"demo": {
|
||||
"info_message_with_version": "Ez egy demó ehhez a verzióhoz: {version}",
|
||||
@@ -986,139 +1038,142 @@
|
||||
"demo_password": "Jelszó: {password}"
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
"preserve-line-breaks": "Preserve original line breaks",
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"ocr-editor": "OCR szerkesztő",
|
||||
"toolbar": "Eszköztár",
|
||||
"selection-mode": "Kiválasztás mód",
|
||||
"pan-and-zoom-picture": "Kép mozgatása és nagyítása",
|
||||
"split-text": "Szöveg felbontása",
|
||||
"preserve-line-breaks": "Eredeti sortörések megőrzése",
|
||||
"split-by-block": "Szövegblokkok szerinti bontás",
|
||||
"flatten": "Eredeti formázás elvetése",
|
||||
"help": {
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"help": "Súgó",
|
||||
"mouse-modes": "Egér üzemmódok",
|
||||
"selection-mode": "Kiválasztási mód (alapértelmezett)",
|
||||
"selection-mode-desc": "A kiválasztási mód a fő mód, amely az adatok megadására használható:",
|
||||
"selection-mode-steps": {
|
||||
"draw": "Draw a rectangle on the text you want to select.",
|
||||
"click": "Click on any field on the right and then click back on the rectangle above the image.",
|
||||
"result": "The selected text will appear inside the previously selected field."
|
||||
"draw": "Rajzoljon téglalapot a kijelölendő szövegre.",
|
||||
"click": "Kattintson bármelyik mezőre a jobb oldalon, majd kattintson vissza a kép feletti téglalapra.",
|
||||
"result": "A kiválasztott szöveg a korábban kiválasztott mezőben jelenik meg."
|
||||
},
|
||||
"pan-and-zoom-mode": "Pan and Zoom Mode",
|
||||
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.",
|
||||
"split-text-mode": "Split Text modes",
|
||||
"split-text-mode": "Szöveg felosztási módok",
|
||||
"split-modes": {
|
||||
"line-mode": "Line mode (default)",
|
||||
"line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.",
|
||||
"block-mode": "Block mode",
|
||||
"block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.",
|
||||
"flat-mode": "Flat mode",
|
||||
"line-mode": "Vonal mód (alapértelmezett)",
|
||||
"line-mode-desc": "Sor módban a szöveg az eredeti sortörések megtartásával kerül továbbításra. Ez az mód akkor hasznos, ha a hozzávalók listájának tömeges felvitelét használja, ahol egy hozzávaló egy sort jelent.",
|
||||
"block-mode": "Doboz mód",
|
||||
"block-mode-desc": "Blokk módban a szöveg blokkokra tagolódik. Ez az üzemmód akkor hasznos, ha tömegesen adunk hozzá elkészítési leírásokat, amelyeket általában bekezdésekbe írunk.",
|
||||
"flat-mode": "Lapos mód",
|
||||
"flat-mode-desc": "Folyamatos szöveg módban a szöveg sortörés nélkül kerül át a kiválasztott receptmezőbe."
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": {
|
||||
"maintenance": {
|
||||
"storage-details": "Storage Details",
|
||||
"page-title": "Site Maintenance",
|
||||
"storage-details": "Tároló részletei",
|
||||
"page-title": "Oldal karbantartása",
|
||||
"summary-title": "Összegzés",
|
||||
"button-label-get-summary": "Összegzés lekérése",
|
||||
"button-label-open-details": "Részletek",
|
||||
"info-description-data-dir-size": "Data Directory Size",
|
||||
"info-description-log-file-size": "Log File Size",
|
||||
"info-description-cleanable-directories": "Cleanable Directories",
|
||||
"info-description-cleanable-images": "Cleanable Images",
|
||||
"info-description-data-dir-size": "Adatkönyvtár mérete",
|
||||
"info-description-log-file-size": "Log fájl mérete",
|
||||
"info-description-cleanable-directories": "Tisztítható könyvtárak",
|
||||
"info-description-cleanable-images": "Tisztítható képek",
|
||||
"storage": {
|
||||
"title-temporary-directory": "Ideiglenes könyvtár (.temp)",
|
||||
"title-backups-directory": "Backups Directory (backups)",
|
||||
"title-backups-directory": "Biztonsági mentések könyvtára (biztonsági mentések)",
|
||||
"title-groups-directory": "Csoportok könyvtára (csoportok)",
|
||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
||||
"title-user-directory": "User Directory (user)"
|
||||
"title-recipes-directory": "Receptek könyvtár (receptek)",
|
||||
"title-user-directory": "Felhasználó könyvtár (felhasználó)"
|
||||
},
|
||||
"action-delete-log-files-name": "Naplófájlok törlése",
|
||||
"action-delete-log-files-description": "Deletes all the log files",
|
||||
"action-delete-log-files-description": "Minden log fájl törlése",
|
||||
"action-clean-directories-name": "Könyvtárak tisztítása",
|
||||
"action-clean-directories-description": "Minden nem érvényes UUID-jű receptmappa eltávolítása",
|
||||
"action-clean-temporary-files-name": "Ideiglenes fájlok tisztítása",
|
||||
"action-clean-temporary-files-description": "Minden fájl és mappa eltávolítása a .temp könyvtárból",
|
||||
"action-clean-images-name": "Képek tisztítása",
|
||||
"action-clean-images-description": "Minden nem .webp kiterjesztésű kép eltávolítása",
|
||||
"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",
|
||||
"actions-description": "A karbantartási műveletek {destructive_in_bold} és óvatosan használandók. Ezen műveletek bármelyikének végrehajtása {irreversible_in_bold}.",
|
||||
"actions-description-destructive": "romboló",
|
||||
"actions-description-irreversible": "visszafordíthatatlan",
|
||||
"logs-action-refresh": "Refresh Logs",
|
||||
"logs-page-title": "Mealie Logs",
|
||||
"logs-tail-lines-label": "Tail Lines"
|
||||
"logs-action-refresh": "Logok frissítése",
|
||||
"logs-page-title": "Mealie logok",
|
||||
"logs-tail-lines-label": "Határvonalak"
|
||||
},
|
||||
"mainentance": {
|
||||
"actions-title": "Actions"
|
||||
"actions-title": "Műveletek"
|
||||
},
|
||||
"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.",
|
||||
"ingredients-natural-language-processor-explanation": "A Mealie feltételes véletlenszerű mezőt (CRF) használ az hozzávalók elemzéséhez és feldolgozásához. A hozzávalókra használt modell a New York Times által összeállított, több mint 100 000 hozzávalóból álló adathalmazon alapul. Vegye figyelembe, hogy mivel a modell csak angol nyelvre készült, a modell más nyelveken történő használatakor eltérő eredményekre számíthat. Ez az oldal a modell tesztelésének a játéktere.",
|
||||
"ingredients-natural-language-processor-explanation-2": "Nem tökéletes, de általában nagyszerű eredményeket ad, és jó kiindulópont a hozzávalók kézi elemzésére az egyedi mezőkbe. Alternatívaként használhatja a \"Brute\" feldolgozót is, amely egy mintaillesztési technikát használ a hozzávalók azonosítására.",
|
||||
"nlp": "NLP",
|
||||
"brute": "Brute",
|
||||
"show-individual-confidence": "Show individual confidence",
|
||||
"ingredient-text": "Ingredient Text",
|
||||
"show-individual-confidence": "",
|
||||
"ingredient-text": "Hozzávaló szöveg",
|
||||
"average-confident": "{0} Confident",
|
||||
"try-an-example": "Try an example",
|
||||
"parser": "Parser",
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"try-an-example": "Próbáld ki",
|
||||
"parser": "Szintaxis elemző",
|
||||
"background-tasks": "Háttér folyamatok",
|
||||
"background-tasks-description": "Itt megtekintheti az összes futó háttérfeladatot és azok állapotát",
|
||||
"no-logs-found": "Nem található napló",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Feladatok"
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Üdvözöljük, {0}",
|
||||
"description": "Manage your profile, recipes, and group settings.",
|
||||
"get-invite-link": "Get Invite Link",
|
||||
"get-public-link": "Get Public Link",
|
||||
"description": "Profiljának, receptjeinek és csoportbeállításainak kezelése.",
|
||||
"get-invite-link": "Meghívó link beszerzése",
|
||||
"get-public-link": "Nyilvánon link beszerzése",
|
||||
"account-summary": "Fiók áttekintése",
|
||||
"account-summary-description": "Itt egy áttekintés a csoportja információiról",
|
||||
"group-statistics": "Csoportstatisztikák",
|
||||
"group-statistics-description": "Az Ön csoportstatisztikái betekintést nyújtanak abba, hogyan használja a Mealie-t.",
|
||||
"storage-capacity": "Tárhely mérete",
|
||||
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
||||
"storage-capacity-description": "A tárhely kapacitása az Ön által feltöltött képek és eszközök számításából adódik.",
|
||||
"personal": "Személyes",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users",
|
||||
"personal-description": "Ezek a beállítások az Ön személyes beállításai. Az itt végzett változtatások nincsenek hatással más felhasználókra",
|
||||
"user-settings": "Felhasználói beállítások",
|
||||
"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",
|
||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
||||
"user-settings-description": "Beállításainak kezelése, jelszavának módosítása és e-mail címének frissítése",
|
||||
"api-tokens-description": "API tokenek kezelése külső alkalmazásokon keresztül történő hozzáféréshez",
|
||||
"group-description": "Ezek az elemek a csoporton belül megosztottak. Az egyik szerkesztése az egész csoport számára megváltoztatja azt!",
|
||||
"group-settings": "Csoport beállításai",
|
||||
"group-settings-description": "Közös csoportbeállítások, például az étkezési terv és az adatvédelmi beállítások, kezelése.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"group-settings-description": "Közös csoportbeállítások, például menüterv és adatvédelmi beállítások kezelése.",
|
||||
"cookbooks-description": "Kezelje a receptkategóriák gyűjteményét, és hozzon létre oldalakat számukra.",
|
||||
"members": "Tagok",
|
||||
"members-description": "See who's in your group and manage their permissions.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"notifiers": "Notifiers",
|
||||
"members-description": "Láthatja, hogy kik vannak a csoportjában, és kezelheti az ő jogosultságaikat.",
|
||||
"webhooks-description": "Állítson be webhookokat, amelyek azokon a napokon lépnek működésbe, amikorra a menüterveket ütemezte.",
|
||||
"notifiers": "Értesítések",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"manage-data": "Adatok kezelése",
|
||||
"manage-data-description": "Manage your Food and Units (more options coming soon)",
|
||||
"data-migrations": "Data Migrations",
|
||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown",
|
||||
"manage-data-description": "Alapanyagainak és mennyiségi egységeinek kezelése (további opciók hamarosan)",
|
||||
"data-migrations": "Adat migráció",
|
||||
"data-migrations-description": "Migrálja meglévő adatait más alkalmazásokból, például a Nextcloud Recipes és a Chowdown",
|
||||
"email-sent": "E-mail elküldve",
|
||||
"error-sending-email": "Hiba történt az e-Mail küldésénél",
|
||||
"personal-information": "Personal Information",
|
||||
"preferences": "Preferences",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"personal-information": "Személyes adatok",
|
||||
"preferences": "Beállítások",
|
||||
"show-advanced-description": "Haladó funkciók megjelenítése (API-kulcsok, Webhookok és adatkezelés)",
|
||||
"back-to-profile": "Vissza a profilhoz",
|
||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
"manage-user-profile": "Manage User Profile",
|
||||
"manage-cookbooks": "Manage Cookbooks",
|
||||
"looking-for-privacy-settings": "Az adatvédelmi beállításokat keresi?",
|
||||
"manage-your-api-tokens": "API tokenjeinek kezelése",
|
||||
"manage-user-profile": "Felhasználói profil kezelése",
|
||||
"manage-cookbooks": "Szakácskönyvek kezelése",
|
||||
"manage-members": "Tagok Kezelése",
|
||||
"manage-webhooks": "Manage Webhooks",
|
||||
"manage-notifiers": "Manage Notifiers",
|
||||
"manage-data-migrations": "Manage Data Migrations"
|
||||
"manage-webhooks": "Webhookok kezelése",
|
||||
"manage-notifiers": "Értesítések kezelése",
|
||||
"manage-data-migrations": "Adatok migrációjának kezelése"
|
||||
},
|
||||
"cookbook": {
|
||||
"cookbooks": "Szakácskönyvek",
|
||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.",
|
||||
"description": "A szakácskönyvek egy másik módja a receptek rendszerezésének a receptek és címkék metszeteinek összeállításával. Egy szakácskönyv létrehozása egy bejegyzést ad az oldalsávhoz, és a kiválasztott címkékkel és kategóriákkal rendelkező összes recept megjelenik a szakácskönyvben.",
|
||||
"public-cookbook": "Nyilvános szakácskönyv",
|
||||
"public-cookbook-description": "A nyilvános szakácskönyvek megoszthatók a nem mealie felhasználókkal, és megjelennek a csoportod oldalán.",
|
||||
"filter-options": "Szűrési beállítások",
|
||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
||||
"require-all-categories": "Require All Categories",
|
||||
"require-all-tags": "Require All Tags",
|
||||
"require-all-tools": "Require All Tools",
|
||||
"filter-options-description": "Ha az összes kívánt elem ki van jelölve, a szakácskönyv csak azokat a recepteket tartalmazza, amelyekben az adott elemek mindegyike szerepel. Ez a kiválasztottak minden egyes részhalmazára vonatkozik, nem pedig a kiválasztott elemek egy metszetére.",
|
||||
"require-all-categories": "Minden kategória szükséges",
|
||||
"require-all-tags": "Minden címke szükséges",
|
||||
"require-all-tools": "Minden szükséges eszköz",
|
||||
"cookbook-name": "Szakácskönyv neve",
|
||||
"cookbook-with-name": "Szakácskönyv {0}"
|
||||
}
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "Eventi Del Ricettario",
|
||||
"tag-events": "Tag Eventi",
|
||||
"category-events": "Categoria Eventi",
|
||||
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo"
|
||||
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancella",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "Parola chiave",
|
||||
"link-copied": "Link Copiato",
|
||||
"loading-events": "Caricamento eventi",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "Caricamento Ricette",
|
||||
"message": "Messaggio",
|
||||
"monday": "Lunedì",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "Nessuna Ricetta Trovata",
|
||||
"ok": "OK",
|
||||
"options": "Opzioni:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "Stampa",
|
||||
"print-preferences": "Preferenze Di Stampa",
|
||||
"random": "Casuale",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Esporta tutto",
|
||||
"refresh": "Ricarica",
|
||||
"upload-file": "Carica file",
|
||||
"created-on-date": "Creato il: {0}"
|
||||
"created-on-date": "Creato il: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Sei sicuro di volerlo eliminare <b>{groupName}<b/>'?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "ID Gruppo:{groupID}",
|
||||
"group-name": "Nome Gruppo",
|
||||
"group-not-found": "Gruppo non trovato",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Gruppo: {groupID}",
|
||||
"groups": "Gruppi",
|
||||
"manage-groups": "Gestisci Gruppi",
|
||||
@@ -242,6 +248,7 @@
|
||||
"general-preferences": "Impostazioni Generali",
|
||||
"group-recipe-preferences": "Impostazioni per le ricette del gruppo",
|
||||
"report": "Report",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Gestione Gruppo",
|
||||
"admin-group-management": "Gestione Gruppo Amministratore",
|
||||
"admin-group-management-text": "Le modifiche a questo gruppo si rifletteranno immediatamente.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"for-type-meal-types": "per {0} tipi di pasto",
|
||||
"meal-plan-rules": "Regole del piano alimentare",
|
||||
"new-rule": "Nuova regola",
|
||||
"meal-plan-rules-description": "È possibile creare regole per la selezione automatica delle ricette per il piano alimentare. Queste regole sono usate dal server per determinare l'insieme casuale delle ricette fra le quali selezionare quando si creano dei piani alimentari. Si noti che se le regole hanno gli stessi vincoli di giorno/tipo, le categorie delle regole saranno unite. In pratica, non è necessario creare regole duplicate, ma è possibile farlo.",
|
||||
"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": "Quando si crea una nuova regola per un piano alimentare è possibile limitare la sua applicazione ad un giorno specifico della settimana e/o un tipo specifico di pasto. Per applicare una regola a tutti i giorni o a tutti i tipi di pasto, è possibile impostare la regola a \"Qualsiasi\", applicandola a tutti i possibili valori per il tipo di giorno e/o di pasto.",
|
||||
"recipe-rules": "Regole per le ricette",
|
||||
"applies-to-all-days": "Si applica a ogni giorno",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "Ricetta 1",
|
||||
"recipe-2": "Ricetta 2",
|
||||
"paprika-text": "Mealie può importare ricette dall'applicazione Paprika. Esporta le tue ricette da paprika, rinomina l'estensione di esportazione in .zip e caricala qui sotto.",
|
||||
"mealie-text": "Mealie può importare ricette dall'applicazione Mealie da un versione pre v1.0. Esporta le tue ricette dalla tua vecchia istanza e carica il file zip qui sotto. Nota che solo le ricette possono essere importate dall'esportazione."
|
||||
"mealie-text": "Mealie può importare ricette dall'applicazione Mealie da un versione pre v1.0. Esporta le tue ricette dalla tua vecchia istanza e carica il file zip qui sotto. Nota che solo le ricette possono essere importate dall'esportazione.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Inserimento Multiplo",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Aggiungi al piano giornaliero",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Ricetta aggiunta alla lista",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "Ricetta aggiunta al piano alimentare",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare",
|
||||
"yield": "Porzioni",
|
||||
"quantity": "Quantità",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Chiave Messaggio",
|
||||
"parse": "Analizza",
|
||||
"attach-images-hint": "Allega immagini trascinandole nell'editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Abilita le quantità degli ingredienti per utilizzare questa funzione",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Le ricette con unità o alimenti definiti non possono essere analizzate.",
|
||||
"parse-ingredients": "Analizza ingredienti",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Filtro Tag",
|
||||
"search-hint": "Premi '/'",
|
||||
"advanced": "Ricerca Avanzata",
|
||||
"auto-search": "Ricerca automatica"
|
||||
"auto-search": "Ricerca automatica",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Aggiungi un Nuovo Tema",
|
||||
"admin-settings": "Impostazioni Amministratore",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Creato in {path}",
|
||||
"backup-deleted": "Backup eliminato",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Tag Backup",
|
||||
"create-heading": "Crea un Backup",
|
||||
"delete-backup": "Elimina Backup",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configurazione",
|
||||
"docker-volume": "Docker Volume",
|
||||
"docker-volume-help": "Mealie richiede che il frontend e il backend condividano lo stesso volume docker o archiviazione. Ciò assicura che il frontend possa accedere correttamente alle immagini e alle risorse memorizzate sul disco.",
|
||||
"volumes-are-misconfigured": "I volumi sono mal configurati",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "I volumi sono stati configurati correttamente.",
|
||||
"status-unknown-try-running-a-validation": "Stato sconosciuto. Prova ad eseguire una convalida.",
|
||||
"validate": "Convalida",
|
||||
"email-configuration-status": "Configurazione e-mail",
|
||||
"email-configured": "Email Configured",
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Pronto",
|
||||
"not-ready": "Non Pronto - Verifica Variabili Di Ambiente",
|
||||
"succeeded": "Operazione riuscita",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "Password aggiornata",
|
||||
"password": "Password",
|
||||
"password-strength": "La password è {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Registrati",
|
||||
"reset-password": "Reimposta Password",
|
||||
"sign-in": "Accedi",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Nome Utente",
|
||||
"users-header": "UTENTI",
|
||||
"users": "Utenti",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Ora Webhook",
|
||||
"webhooks-enabled": "Webhooks Abilitati",
|
||||
"you-are-not-allowed-to-create-a-user": "Non sei autorizzato per la creazione di utenti",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "Gestione Utenti",
|
||||
"reset-locked-users": "Ripristina Utenti Bloccati",
|
||||
"admin-user-creation": "Creazione Utente Amministratore",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "Dettagli Utente",
|
||||
"user-name": "Nome Utente",
|
||||
"authentication-method": "Metodo di autenticazione",
|
||||
@@ -863,7 +885,12 @@
|
||||
"user-can-invite-other-to-group": "L'utente può invitare altri al gruppo",
|
||||
"user-can-manage-group": "L'utente può gestire il gruppo",
|
||||
"user-can-organize-group-data": "L'utente può organizzare i dati del gruppo",
|
||||
"enable-advanced-features": "Abilita funzionalità avanzate"
|
||||
"enable-advanced-features": "Abilita funzionalità avanzate",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tradotto",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Crea Alimento",
|
||||
"food-label": "Etichetta Alimento",
|
||||
"edit-food": "Modifica Alimento",
|
||||
"food-data": "Dati Alimento"
|
||||
"food-data": "Dati Alimento",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Riempie il database con unità comuni basate sulla lingua.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Unione di {0} in {1}",
|
||||
"create-unit": "Crea Unità",
|
||||
"abbreviation": "Abbreviazione",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Descrizione",
|
||||
"display-as-fraction": "Mostra come Frazione",
|
||||
"use-abbreviation": "Usa Abbreviazione",
|
||||
"edit-unit": "Modifica Unità",
|
||||
"unit-data": "Dati Unità",
|
||||
"use-abbv": "Utilizzare Abbrev.",
|
||||
"fraction": "Frazione"
|
||||
"fraction": "Frazione",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Riempie il database con etichette comuni basate sulla lingua.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Elimina Ricette",
|
||||
"source-unit-will-be-deleted": "L'unità di origine verrà eliminata"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Dati Predefiniti",
|
||||
"seed": "Inizializza",
|
||||
"data-management": "Gestione Dati",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Seleziona Dati",
|
||||
"select-language": "Seleziona Lingua",
|
||||
"columns": "Colonne",
|
||||
"combine": "Unisci"
|
||||
"combine": "Unisci",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registrazione Utente",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Unisciti a un Gruppo",
|
||||
"create-a-new-group": "Crea un Nuovo Gruppo",
|
||||
"provide-registration-token-description": "Fornisci il token di registrazione associato al gruppo a cui desideri partecipare. Dovrai ottenerlo da un membro di gruppo esistente.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor Ocr",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Modalità di selezione",
|
||||
"pan-and-zoom-picture": "Sposta e Ingrandisci l'immagine",
|
||||
"split-text": "Dividi testo",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Dividi per blocco di testo",
|
||||
"flatten": "Appiattire indipendentemente dalla formattazione originale",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Modalità di Selezione (Predefinito)",
|
||||
"selection-mode-desc": "La modalità di selezione è la modalità principale per inserire i dati:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"production": "Production",
|
||||
"support": "お問い合わせ",
|
||||
"version": "バージョン",
|
||||
"unknown-version": "unknown",
|
||||
"unknown-version": "不明",
|
||||
"sponsor": "Sponsor"
|
||||
},
|
||||
"asset": {
|
||||
@@ -57,11 +57,11 @@
|
||||
"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-version": "New version available!",
|
||||
"new-version": "新しいバージョンがあります!",
|
||||
"notification": "通知",
|
||||
"refresh": "Refresh",
|
||||
"scheduled": "Scheduled",
|
||||
"something-went-wrong": "Something Went Wrong!",
|
||||
"something-went-wrong": "問題が発生しました",
|
||||
"subscribed-events": "Subscribed Events",
|
||||
"test-message-sent": "Test Message Sent",
|
||||
"new-notification": "新着通知",
|
||||
@@ -76,7 +76,8 @@
|
||||
"cookbook-events": "料理本イベント",
|
||||
"tag-events": "タグイベント",
|
||||
"category-events": "カテゴリイベント",
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group"
|
||||
"when-a-new-user-joins-your-group": "新しいユーザーがあなたのグループに参加する際",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "キャンセル",
|
||||
@@ -90,11 +91,11 @@
|
||||
"custom": "カスタム",
|
||||
"dashboard": "ダッシュボード",
|
||||
"delete": "削除",
|
||||
"disabled": "Disabled",
|
||||
"disabled": "無効",
|
||||
"download": "ダウンロード",
|
||||
"duplicate": "複製",
|
||||
"edit": "編集",
|
||||
"enabled": "Enabled",
|
||||
"enabled": "有効",
|
||||
"exception": "Exception",
|
||||
"failed-count": "Failed: {count}",
|
||||
"failure-uploading-file": "Failure uploading file",
|
||||
@@ -114,6 +115,8 @@
|
||||
"keyword": "キーワード",
|
||||
"link-copied": "リンクをコピーしました。",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "レシピを読み込み中",
|
||||
"message": "メッセージ",
|
||||
"monday": "月曜日",
|
||||
@@ -124,6 +127,7 @@
|
||||
"no-recipe-found": "レシピが見つかりません。",
|
||||
"ok": "OK",
|
||||
"options": "Options:",
|
||||
"plural-name": "Plural Name",
|
||||
"print": "印刷",
|
||||
"print-preferences": "印刷設定",
|
||||
"random": "ランダム",
|
||||
@@ -156,10 +160,10 @@
|
||||
"updated": "更新しました",
|
||||
"upload": "アップロード",
|
||||
"url": "URL",
|
||||
"view": "View",
|
||||
"view": "表示",
|
||||
"wednesday": "水曜日",
|
||||
"yes": "はい",
|
||||
"foods": "Foods",
|
||||
"foods": "食材",
|
||||
"units": "Units",
|
||||
"back": "戻る",
|
||||
"next": "次へ",
|
||||
@@ -192,7 +196,8 @@
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "ファイルのアップロード",
|
||||
"created-on-date": "Created on: {0}"
|
||||
"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."
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||
@@ -207,6 +212,7 @@
|
||||
"group-id-with-value": "グループID: {groupID}",
|
||||
"group-name": "グループ名",
|
||||
"group-not-found": "グループが見つかりませんでした。",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "グループ: {groupID}",
|
||||
"groups": "グループ",
|
||||
"manage-groups": "Manage Groups",
|
||||
@@ -242,6 +248,7 @@
|
||||
"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.",
|
||||
@@ -296,7 +303,7 @@
|
||||
"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 you 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.",
|
||||
"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",
|
||||
@@ -345,7 +352,11 @@
|
||||
"recipe-1": "レシピ1",
|
||||
"recipe-2": "レシピ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."
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Bulk Add",
|
||||
@@ -458,7 +469,9 @@
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"recipe-added-to-mealplan": "レシピを献立に追加しました。",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "レシピを献立に追加する事に失敗しました。",
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
@@ -500,6 +513,7 @@
|
||||
"message-key": "Message Key",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "Drop image",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||
"parse-ingredients": "Parse ingredients",
|
||||
@@ -557,14 +571,17 @@
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search"
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
@@ -673,11 +690,13 @@
|
||||
"configuration": "Configuration",
|
||||
"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-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",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
@@ -812,6 +831,7 @@
|
||||
"password-updated": "パスワードを更新しました",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
@@ -832,6 +852,7 @@
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
@@ -854,6 +875,7 @@
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
@@ -863,7 +885,12 @@
|
||||
"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",
|
||||
"enable-advanced-features": "Enable advanced features"
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"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": "Forgot Password",
|
||||
"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."
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
@@ -884,7 +911,9 @@
|
||||
"create-food": "Create Food",
|
||||
"food-label": "Food Label",
|
||||
"edit-food": "Edit Food",
|
||||
"food-data": "Food Data"
|
||||
"food-data": "Food Data",
|
||||
"example-food-singular": "ex: Onion",
|
||||
"example-food-plural": "ex: Onions"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Seed the database with common units based on your local language.",
|
||||
@@ -895,13 +924,18 @@
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"create-unit": "Create Unit",
|
||||
"abbreviation": "Abbreviation",
|
||||
"plural-abbreviation": "Plural Abbreviation",
|
||||
"description": "Description",
|
||||
"display-as-fraction": "Display as Fraction",
|
||||
"use-abbreviation": "Use Abbreviation",
|
||||
"edit-unit": "Edit Unit",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction"
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Seed the database with common labels based on your local language.",
|
||||
@@ -930,6 +964,8 @@
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
@@ -937,10 +973,26 @@
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine"
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
"provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.",
|
||||
@@ -987,6 +1039,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -994,6 +1047,8 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-steps": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user