mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-01-03 03:48:28 -05:00
Compare commits
198 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54b8760d15 | ||
|
|
187e0300a0 | ||
|
|
c398316b55 | ||
|
|
eb093a755b | ||
|
|
2e982fad82 | ||
|
|
f5570bf9b2 | ||
|
|
ddd7ee0696 | ||
|
|
f1b5b999b9 | ||
|
|
47892f84be | ||
|
|
18002351b6 | ||
|
|
9605c448e7 | ||
|
|
9499c2942c | ||
|
|
f04bd7b777 | ||
|
|
710708ea68 | ||
|
|
bb196da83b | ||
|
|
d500fbf0b4 | ||
|
|
ca94ca973c | ||
|
|
454d1eff1c | ||
|
|
280be88fc5 | ||
|
|
e24c37957b | ||
|
|
46b069ba71 | ||
|
|
2caed5e192 | ||
|
|
406f44e6a7 | ||
|
|
f6787f18ba | ||
|
|
1d64f428db | ||
|
|
77906da9f1 | ||
|
|
35d470f5ea | ||
|
|
d7cdcfa734 | ||
|
|
bfbdf76c2d | ||
|
|
7cc0fafbaa | ||
|
|
5b65ceda93 | ||
|
|
07ecd88685 | ||
|
|
8f1ce1a1c3 | ||
|
|
3146e99b03 | ||
|
|
fe53cc28ba | ||
|
|
d85635997b | ||
|
|
1ca29df52e | ||
|
|
ee5de10ffb | ||
|
|
201ab4b8ac | ||
|
|
45af609161 | ||
|
|
c4a3068492 | ||
|
|
6d4f573526 | ||
|
|
3c14df453e | ||
|
|
9826f3483e | ||
|
|
caf0f5f441 | ||
|
|
b599de9c22 | ||
|
|
fd7aa44c13 | ||
|
|
82b7bacdb7 | ||
|
|
84f86c2682 | ||
|
|
527edb1a92 | ||
|
|
6e11b92e74 | ||
|
|
3f5b25a30e | ||
|
|
662d06b5a8 | ||
|
|
9003d0f1d1 | ||
|
|
1cf7e37ada | ||
|
|
930c92365d | ||
|
|
6f1fee5511 | ||
|
|
f5de126d86 | ||
|
|
725dae41b1 | ||
|
|
39e919526a | ||
|
|
1978ad2c96 | ||
|
|
23e8dc1941 | ||
|
|
96b408a661 | ||
|
|
20a9a94770 | ||
|
|
b280e2d1a0 | ||
|
|
735162d042 | ||
|
|
60d9294861 | ||
|
|
ff42964537 | ||
|
|
bb67d993a0 | ||
|
|
7bb0f0801a | ||
|
|
3a4875a54f | ||
|
|
0371874670 | ||
|
|
3d177566ed | ||
|
|
14e87918fb | ||
|
|
ac75b0254d | ||
|
|
7f2927600b | ||
|
|
5e8c4a6cee | ||
|
|
a460c32674 | ||
|
|
973cd5ab02 | ||
|
|
ac355c1071 | ||
|
|
3a617cd3c3 | ||
|
|
3c874c2f85 | ||
|
|
fb3be73163 | ||
|
|
14b783852e | ||
|
|
75616d66b8 | ||
|
|
01713b0416 | ||
|
|
123a8b99f8 | ||
|
|
6732fcd696 | ||
|
|
5fcbfbf361 | ||
|
|
1318998bc9 | ||
|
|
0947212271 | ||
|
|
92ac5c6253 | ||
|
|
5f96f4b47f | ||
|
|
dbcd430425 | ||
|
|
4c9164594b | ||
|
|
e5a13f8b43 | ||
|
|
726ad10c7e | ||
|
|
df53310f2e | ||
|
|
82bf5c1bae | ||
|
|
c70a63f0ff | ||
|
|
14bfa6bcae | ||
|
|
adbafef157 | ||
|
|
62d52f53e4 | ||
|
|
4370319fec | ||
|
|
15908d190d | ||
|
|
fcb909e072 | ||
|
|
8e532af4d9 | ||
|
|
831cb6dd17 | ||
|
|
089bb24c0f | ||
|
|
107dfc34de | ||
|
|
144d4caea6 | ||
|
|
b3db81b9a4 | ||
|
|
dc2bbdc494 | ||
|
|
8f17a08923 | ||
|
|
f6209bff54 | ||
|
|
33865285d1 | ||
|
|
e226b9b1d5 | ||
|
|
201c63d1e4 | ||
|
|
a242f567ad | ||
|
|
67ead2e8a1 | ||
|
|
7b273b77e2 | ||
|
|
b4cd095360 | ||
|
|
a9bb27c782 | ||
|
|
9df1523911 | ||
|
|
0c8a1ae608 | ||
|
|
7d54404bf0 | ||
|
|
8bbe70d245 | ||
|
|
6c87f7fe33 | ||
|
|
7e168eb75b | ||
|
|
64d481b4fc | ||
|
|
a9926557bc | ||
|
|
2a908c0dd2 | ||
|
|
c64a0dc769 | ||
|
|
7ce9c35ef5 | ||
|
|
0acca2021d | ||
|
|
5de0b48aa9 | ||
|
|
ffe199c083 | ||
|
|
215a18be42 | ||
|
|
a1b065e5d1 | ||
|
|
d660d89a1b | ||
|
|
ade1f797a9 | ||
|
|
192872b9ec | ||
|
|
25ebcb1a05 | ||
|
|
89d95ca5e1 | ||
|
|
b705652af3 | ||
|
|
b0c78de2da | ||
|
|
c4b1f9fd01 | ||
|
|
2b0d8227f4 | ||
|
|
42517e9f8a | ||
|
|
37c97c8aba | ||
|
|
64d36a2608 | ||
|
|
563defe074 | ||
|
|
f5ffb760d3 | ||
|
|
3118a0c0cf | ||
|
|
444beb68f9 | ||
|
|
49a97ebc0e | ||
|
|
6f682b742e | ||
|
|
32d4d22bb8 | ||
|
|
71d86489f4 | ||
|
|
a95eaf3d2e | ||
|
|
414af989e7 | ||
|
|
b7b191a5ee | ||
|
|
5620370ade | ||
|
|
d333d47e34 | ||
|
|
b34b1c9be3 | ||
|
|
8c5010148d | ||
|
|
a17b0e329e | ||
|
|
8ab69a7d7a | ||
|
|
f4ecf74b91 | ||
|
|
ba9d816f64 | ||
|
|
6895b49543 | ||
|
|
fffe7b05e0 | ||
|
|
1271e0e49b | ||
|
|
478054b724 | ||
|
|
57d259a7a3 | ||
|
|
a4a6d4dfb1 | ||
|
|
f7b4f79312 | ||
|
|
434d312f7c | ||
|
|
bda460b49e | ||
|
|
d3e1c48655 | ||
|
|
b2a3430f2c | ||
|
|
3d792d9333 | ||
|
|
2e028d7e12 | ||
|
|
c63932e8b3 | ||
|
|
3ba2227bc7 | ||
|
|
67af391c6b | ||
|
|
70ae0dac25 | ||
|
|
e15a9c3c9f | ||
|
|
9d40d60b3b | ||
|
|
e2760f7247 | ||
|
|
83bf21b947 | ||
|
|
d1824affff | ||
|
|
4827e1092f | ||
|
|
7db767b075 | ||
|
|
afdd0b15dc | ||
|
|
37c9166a77 | ||
|
|
ba0b9d4cd9 | ||
|
|
9fd99a86b8 |
@@ -8,28 +8,13 @@ FROM mcr.microsoft.com/devcontainers/python:${VARIANT}
|
||||
ARG NODE_VERSION="none"
|
||||
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
|
||||
|
||||
# install poetry - respects $POETRY_VERSION & $POETRY_HOME
|
||||
|
||||
RUN echo "export PROMPT_COMMAND='history -a'" >> /home/vscode/.bashrc \
|
||||
&& echo "export HISTFILE=~/commandhistory/.bash_history" >> /home/vscode/.bashrc \
|
||||
&& chown vscode:vscode -R /home/vscode/
|
||||
|
||||
RUN npm install -g @go-task/cli
|
||||
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
PYTHONDONTWRITEBYTECODE=1 \
|
||||
PIP_NO_CACHE_DIR=off \
|
||||
PIP_DISABLE_PIP_VERSION_CHECK=on \
|
||||
PIP_DEFAULT_TIMEOUT=100 \
|
||||
POETRY_HOME="/opt/poetry" \
|
||||
POETRY_VIRTUALENVS_IN_PROJECT=true
|
||||
|
||||
# prepend poetry and venv to path
|
||||
ENV PATH="$POETRY_HOME/bin:$PATH"
|
||||
|
||||
RUN curl -sSL https://install.python-poetry.org | python3 -
|
||||
# RUN poetry config virtualenvs.create false
|
||||
|
||||
# Install additional OS packages
|
||||
RUN apt-get update \
|
||||
&& apt-get install --no-install-recommends -y \
|
||||
curl \
|
||||
@@ -39,5 +24,9 @@ RUN apt-get update \
|
||||
libsasl2-dev libldap2-dev libssl-dev \
|
||||
gnupg gnupg2 gnupg1
|
||||
|
||||
# create directory used for Docker Secrets
|
||||
# Install uv
|
||||
RUN pip install uv
|
||||
ENV UV_LINK_MODE=copy
|
||||
|
||||
# Create directory for Docker Secrets
|
||||
RUN mkdir -p /run/secrets
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
],
|
||||
// Use 'onCreateCommand' to run commands at the end of container creation.
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"onCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules /home/vscode/commandhistory && task setup",
|
||||
"onCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules /home/vscode/commandhistory && task setup --force",
|
||||
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||
"remoteUser": "vscode",
|
||||
"features": {
|
||||
@@ -56,5 +56,8 @@
|
||||
"dockerDashComposeVersion": "v2"
|
||||
}
|
||||
},
|
||||
"appPort": 3000
|
||||
"appPort": [
|
||||
"3000:3000",
|
||||
"9000:9000"
|
||||
]
|
||||
}
|
||||
|
||||
9
.github/workflows/build-package.yml
vendored
9
.github/workflows/build-package.yml
vendored
@@ -70,13 +70,8 @@ jobs:
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Install Poetry
|
||||
uses: snok/install-poetry@v1
|
||||
with:
|
||||
virtualenvs-create: true
|
||||
virtualenvs-in-project: true
|
||||
plugins: |
|
||||
poetry-plugin-export
|
||||
- name: Install uv
|
||||
run: pip install uv
|
||||
|
||||
- name: Retrieve built frontend
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
21
.github/workflows/locale-sync.yml
vendored
21
.github/workflows/locale-sync.yml
vendored
@@ -25,24 +25,21 @@ jobs:
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Install Poetry
|
||||
uses: snok/install-poetry@v1
|
||||
with:
|
||||
virtualenvs-create: true
|
||||
virtualenvs-in-project: true
|
||||
- name: Install uv
|
||||
run: pip install uv
|
||||
|
||||
- name: Load cached venv
|
||||
id: cached-poetry-dependencies
|
||||
id: cached-python-dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .venv
|
||||
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}
|
||||
key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }}
|
||||
|
||||
- name: Check venv cache
|
||||
id: cache-validate
|
||||
if: steps.cached-poetry-dependencies.outputs.cache-hit == 'true'
|
||||
if: steps.cached-python-dependencies.outputs.cache-hit == 'true'
|
||||
run: |
|
||||
echo "import fastapi;print('venv good?')" > test.py && poetry run python test.py && echo "cache-hit-success=true" >> $GITHUB_OUTPUT
|
||||
echo "import fastapi;print('venv good?')" > test.py && uv run python test.py && echo "cache-hit-success=true" >> $GITHUB_OUTPUT
|
||||
rm test.py
|
||||
continue-on-error: true
|
||||
|
||||
@@ -50,13 +47,13 @@ jobs:
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
|
||||
poetry install
|
||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
|
||||
uv sync --group dev
|
||||
if: steps.cached-python-dependencies.outputs.cache-hit != 'true'
|
||||
|
||||
- name: Run locale generation
|
||||
run: |
|
||||
cd dev/code-generation
|
||||
poetry run python main.py locales
|
||||
uv run python main.py locales
|
||||
env:
|
||||
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
|
||||
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -77,7 +77,7 @@ jobs:
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||
sed -i 's/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' pyproject.toml
|
||||
sed -i 's/^\s*"version": "[^"]*"/"version": "${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
sed -i 's/\("version": "\)[^"]*"/\1${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
|
||||
22
.github/workflows/test-backend.yml
vendored
22
.github/workflows/test-backend.yml
vendored
@@ -49,24 +49,21 @@ jobs:
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Install Poetry
|
||||
uses: snok/install-poetry@v1
|
||||
with:
|
||||
virtualenvs-create: true
|
||||
virtualenvs-in-project: true
|
||||
- name: Install uv
|
||||
run: pip install uv
|
||||
|
||||
- name: Load cached venv
|
||||
id: cached-poetry-dependencies
|
||||
id: cached-python-dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .venv
|
||||
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}
|
||||
key: venv-${{ runner.os }}-${{ hashFiles('**/uv.lock') }}
|
||||
|
||||
- name: Check venv cache
|
||||
id: cache-validate
|
||||
if: steps.cached-poetry-dependencies.outputs.cache-hit == 'true'
|
||||
if: steps.cached-python-dependencies.outputs.cache-hit == 'true'
|
||||
run: |
|
||||
echo "import fastapi;print('venv good?')" > test.py && poetry run python test.py && echo "cache-hit-success=true" >> $GITHUB_OUTPUT
|
||||
echo "import fastapi;print('venv good?')" > test.py && uv run python test.py && echo "cache-hit-success=true" >> $GITHUB_OUTPUT
|
||||
rm test.py
|
||||
continue-on-error: true
|
||||
|
||||
@@ -74,13 +71,12 @@ jobs:
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
|
||||
poetry install
|
||||
poetry add "psycopg2-binary==2.9.9"
|
||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true'
|
||||
uv sync --group dev --extra pgsql
|
||||
if: steps.cached-python-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true'
|
||||
|
||||
- name: Formatting (Ruff)
|
||||
run: |
|
||||
poetry run ruff format . --check
|
||||
uv run ruff format . --check
|
||||
|
||||
- name: Lint (Ruff)
|
||||
run: |
|
||||
|
||||
2
.github/workflows/test-frontend.yml
vendored
2
.github/workflows/test-frontend.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
||||
working-directory: "frontend"
|
||||
|
||||
- name: Run linter 👀
|
||||
run: yarn lint
|
||||
run: yarn lint --max-warnings=0
|
||||
working-directory: "frontend"
|
||||
|
||||
- name: Run tests 🧪
|
||||
|
||||
@@ -12,7 +12,7 @@ repos:
|
||||
exclude: ^tests/data/
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.13.1
|
||||
rev: v0.14.7
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
|
||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -55,7 +55,7 @@
|
||||
"explorer.fileNesting.enabled": true,
|
||||
"explorer.fileNesting.patterns": {
|
||||
"package.json": "package-lock.json, yarn.lock, .eslintrc.js, tsconfig.json, .prettierrc, .editorconfig",
|
||||
"pyproject.toml": "poetry.lock, alembic.ini, .pylintrc",
|
||||
"pyproject.toml": "uv.lock, alembic.ini, .pylintrc",
|
||||
"netlify.toml": "runtime.txt",
|
||||
"README.md": "LICENSE, SECURITY.md"
|
||||
},
|
||||
|
||||
48
Taskfile.yml
48
Taskfile.yml
@@ -28,7 +28,7 @@ tasks:
|
||||
docs:gen:
|
||||
desc: runs the API documentation generator
|
||||
cmds:
|
||||
- poetry run python dev/code-generation/gen_docs_api.py
|
||||
- uv run python dev/code-generation/gen_docs_api.py
|
||||
|
||||
docs:
|
||||
desc: runs the documentation server
|
||||
@@ -36,7 +36,7 @@ tasks:
|
||||
deps:
|
||||
- docs:gen
|
||||
cmds:
|
||||
- poetry run python -m mkdocs serve
|
||||
- uv run python -m mkdocs serve
|
||||
|
||||
setup:ui:
|
||||
desc: setup frontend dependencies
|
||||
@@ -54,10 +54,10 @@ tasks:
|
||||
desc: setup python dependencies
|
||||
run: once
|
||||
cmds:
|
||||
- poetry install --with main,dev,postgres
|
||||
- poetry run pre-commit install
|
||||
- uv sync --extra pgsql --group dev
|
||||
- uv run pre-commit install
|
||||
sources:
|
||||
- poetry.lock
|
||||
- uv.lock
|
||||
- pyproject.toml
|
||||
- .pre-commit-config.yaml
|
||||
|
||||
@@ -70,7 +70,7 @@ tasks:
|
||||
dev:generate:
|
||||
desc: run code generators
|
||||
cmds:
|
||||
- poetry run python dev/code-generation/main.py {{ .CLI_ARGS }}
|
||||
- uv run python dev/code-generation/main.py {{ .CLI_ARGS }}
|
||||
- task: docs:gen
|
||||
- task: py:format
|
||||
|
||||
@@ -96,22 +96,22 @@ tasks:
|
||||
py:mypy:
|
||||
desc: runs python type checking
|
||||
cmds:
|
||||
- poetry run mypy mealie
|
||||
- uv run mypy mealie
|
||||
|
||||
py:test:
|
||||
desc: runs python tests (support args after '--')
|
||||
cmds:
|
||||
- poetry run pytest {{ .CLI_ARGS }}
|
||||
- uv run pytest {{ .CLI_ARGS }}
|
||||
|
||||
py:format:
|
||||
desc: runs python code formatter
|
||||
cmds:
|
||||
- poetry run ruff format .
|
||||
- uv run ruff format .
|
||||
|
||||
py:lint:
|
||||
desc: runs python linter
|
||||
cmds:
|
||||
- poetry run ruff check mealie
|
||||
- uv run ruff check mealie
|
||||
|
||||
py:check:
|
||||
desc: runs all linters, type checkers, and formatters
|
||||
@@ -124,10 +124,10 @@ tasks:
|
||||
py:coverage:
|
||||
desc: runs python coverage and generates html report
|
||||
cmds:
|
||||
- poetry run pytest
|
||||
- poetry run coverage report -m
|
||||
- poetry run coveragepy-lcov
|
||||
- poetry run coverage html
|
||||
- uv run pytest
|
||||
- uv run coverage report -m
|
||||
- uv run coveragepy-lcov
|
||||
- uv run coverage html
|
||||
- open htmlcov/index.html
|
||||
|
||||
py:package:copy-frontend:
|
||||
@@ -147,17 +147,17 @@ tasks:
|
||||
desc: Generate requirements file to pin all packages, effectively a "pip freeze" before installation begins
|
||||
internal: true
|
||||
cmds:
|
||||
- poetry export -n --only=main --extras=pgsql --output=dist/requirements.txt
|
||||
- uv export --no-editable --no-emit-project --extra pgsql --format requirements-txt --output-file dist/requirements.txt
|
||||
# Include mealie in the requirements, hashing the package that was just built to ensure it's the one installed
|
||||
- echo "mealie[pgsql]=={{.MEALIE_VERSION}} \\" >> dist/requirements.txt
|
||||
- poetry run pip hash dist/mealie-{{.MEALIE_VERSION}}-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt
|
||||
- pip hash dist/mealie-{{.MEALIE_VERSION}}-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt
|
||||
- echo " \\" >> dist/requirements.txt
|
||||
- poetry run pip hash dist/mealie-{{.MEALIE_VERSION}}.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
- pip hash dist/mealie-{{.MEALIE_VERSION}}.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
vars:
|
||||
MEALIE_VERSION:
|
||||
sh: poetry version --short
|
||||
sh: python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])"
|
||||
sources:
|
||||
- poetry.lock
|
||||
- uv.lock
|
||||
- pyproject.toml
|
||||
- dist/mealie-*.whl
|
||||
- dist/mealie-*.tar.gz
|
||||
@@ -184,13 +184,13 @@ tasks:
|
||||
deps:
|
||||
- py:package:deps
|
||||
cmds:
|
||||
- poetry build -n --output=dist
|
||||
- uv build --out-dir dist
|
||||
- task: py:package:generate-requirements
|
||||
|
||||
py:
|
||||
desc: runs the backend server
|
||||
cmds:
|
||||
- poetry run python mealie/app.py
|
||||
- uv run python mealie/app.py
|
||||
|
||||
py:postgres:
|
||||
desc: runs the backend server configured for containerized postgres
|
||||
@@ -202,12 +202,12 @@ tasks:
|
||||
POSTGRES_PORT: 5432
|
||||
POSTGRES_DB: mealie
|
||||
cmds:
|
||||
- poetry run python mealie/app.py
|
||||
- uv run python mealie/app.py
|
||||
|
||||
py:migrate:
|
||||
desc: generates a new database migration file e.g. task py:migrate -- "add new column"
|
||||
cmds:
|
||||
- poetry run alembic --config mealie/alembic/alembic.ini revision --autogenerate -m "{{ .CLI_ARGS }}"
|
||||
- uv run alembic --config mealie/alembic/alembic.ini revision --autogenerate -m "{{ .CLI_ARGS }}"
|
||||
- task: py:format
|
||||
|
||||
ui:build:
|
||||
@@ -228,7 +228,7 @@ tasks:
|
||||
desc: runs the frontend linter
|
||||
dir: frontend
|
||||
cmds:
|
||||
- yarn lint
|
||||
- yarn lint --max-warnings=0
|
||||
|
||||
ui:test:
|
||||
desc: runs the frontend tests
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import json
|
||||
from datetime import UTC, datetime
|
||||
from typing import Any
|
||||
|
||||
from fastapi import FastAPI
|
||||
from freezegun import freeze_time
|
||||
|
||||
from mealie.app import app
|
||||
from mealie.core.config import determine_data_dir
|
||||
@@ -37,14 +38,43 @@ HTML_TEMPLATE = """<!-- Custom HTML site displayed as the Home chapter -->
|
||||
"""
|
||||
|
||||
HTML_PATH = DATA_DIR.parent.parent.joinpath("docs/docs/overrides/api.html")
|
||||
CONSTANT_DT = datetime(2025, 10, 24, 15, 53, 0, 0, tzinfo=UTC)
|
||||
|
||||
|
||||
def normalize_timestamps(s: dict[str, Any]) -> dict[str, Any]:
|
||||
field_format = s.get("format")
|
||||
is_timestamp = field_format in ["date-time", "date", "time"]
|
||||
has_default = s.get("default")
|
||||
|
||||
if not is_timestamp:
|
||||
for k, v in s.items():
|
||||
if isinstance(v, dict):
|
||||
s[k] = normalize_timestamps(v)
|
||||
elif isinstance(v, list):
|
||||
s[k] = [normalize_timestamps(i) if isinstance(i, dict) else i for i in v]
|
||||
|
||||
return s
|
||||
elif not has_default:
|
||||
return s
|
||||
|
||||
if field_format == "date-time":
|
||||
s["default"] = CONSTANT_DT.isoformat()
|
||||
elif field_format == "date":
|
||||
s["default"] = CONSTANT_DT.date().isoformat()
|
||||
elif field_format == "time":
|
||||
s["default"] = CONSTANT_DT.time().isoformat()
|
||||
|
||||
return s
|
||||
|
||||
|
||||
def generate_api_docs(my_app: FastAPI):
|
||||
openapi_schema = my_app.openapi()
|
||||
openapi_schema = normalize_timestamps(openapi_schema)
|
||||
|
||||
with open(HTML_PATH, "w") as fd:
|
||||
text = HTML_TEMPLATE.replace("MY_SPECIFIC_TEXT", json.dumps(my_app.openapi()))
|
||||
text = HTML_TEMPLATE.replace("MY_SPECIFIC_TEXT", json.dumps(openapi_schema))
|
||||
fd.write(text)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
with freeze_time("2024-01-20T17:00:55Z"):
|
||||
generate_api_docs(app)
|
||||
generate_api_docs(app)
|
||||
|
||||
@@ -113,8 +113,8 @@ def main():
|
||||
{"children": all_children},
|
||||
)
|
||||
|
||||
subprocess.run(["poetry", "run", "ruff", "check", str(out_path), "--fix"])
|
||||
subprocess.run(["poetry", "run", "ruff", "format", str(out_path)])
|
||||
subprocess.run(["uv", "run", "ruff", "check", str(out_path), "--fix"])
|
||||
subprocess.run(["uv", "run", "ruff", "format", str(out_path)])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -100,8 +100,8 @@ def main() -> None:
|
||||
render_python_template(template, template_path, {"module": module})
|
||||
|
||||
path_args = (str(p) for p in template_paths)
|
||||
subprocess.run(["poetry", "run", "ruff", "check", *path_args, "--fix"])
|
||||
subprocess.run(["poetry", "run", "ruff", "format", *path_args])
|
||||
subprocess.run(["uv", "run", "ruff", "check", *path_args, "--fix"])
|
||||
subprocess.run(["uv", "run", "ruff", "format", *path_args])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
###############################################
|
||||
# Frontend Build
|
||||
###############################################
|
||||
FROM node:22@sha256:4973262386dc1cb70f7d6fc48a855027d8f12d2d3b1fe559b9db9a4fcb74668f \
|
||||
FROM node:24@sha256:aa648b387728c25f81ff811799bbf8de39df66d7e2d9b3ab55cc6300cb9175d9 \
|
||||
AS frontend-builder
|
||||
|
||||
WORKDIR /frontend
|
||||
@@ -50,40 +50,29 @@ RUN apt-get update \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV POETRY_HOME="/opt/poetry" \
|
||||
POETRY_NO_INTERACTION=1
|
||||
|
||||
# prepend poetry to path
|
||||
ENV PATH="$POETRY_HOME/bin:$PATH"
|
||||
|
||||
# install poetry - respects $POETRY_VERSION & $POETRY_HOME
|
||||
ENV POETRY_VERSION=2.0.1
|
||||
RUN curl -sSL https://install.python-poetry.org | python3 -
|
||||
|
||||
# install poetry plugins needed to build the package
|
||||
RUN poetry self add "poetry-plugin-export>=1.9"
|
||||
RUN pip install uv
|
||||
|
||||
WORKDIR /mealie
|
||||
|
||||
# copy project files here to ensure they will be cached.
|
||||
COPY poetry.lock pyproject.toml ./
|
||||
COPY uv.lock pyproject.toml ./
|
||||
COPY mealie ./mealie
|
||||
|
||||
# Copy frontend to package it into the wheel
|
||||
COPY --from=frontend-builder /frontend/dist ./mealie/frontend
|
||||
|
||||
# Build the source and binary package
|
||||
RUN poetry build --output=dist
|
||||
RUN uv build --out-dir dist
|
||||
|
||||
# Create the requirements file, which is used to install the built package and
|
||||
# its pinned dependencies later. mealie is included to ensure the built one is
|
||||
# what's installed.
|
||||
RUN export MEALIE_VERSION=$(poetry version --short) \
|
||||
&& poetry export --only=main --extras=pgsql --output=dist/requirements.txt \
|
||||
&& echo "mealie[pgsql]==$MEALIE_VERSION \\" >> dist/requirements.txt \
|
||||
&& poetry run pip hash dist/mealie-$MEALIE_VERSION-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt \
|
||||
RUN uv export --no-editable --no-emit-project --extra pgsql --format requirements-txt --output-file dist/requirements.txt \
|
||||
&& MEALIE_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])") \
|
||||
&& echo "mealie[pgsql]==${MEALIE_VERSION} \\" >> dist/requirements.txt \
|
||||
&& pip hash dist/mealie-${MEALIE_VERSION}-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt \
|
||||
&& echo " \\" >> dist/requirements.txt \
|
||||
&& poetry run pip hash dist/mealie-$MEALIE_VERSION.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
&& pip hash dist/mealie-${MEALIE_VERSION}.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
|
||||
###############################################
|
||||
# Package Container
|
||||
|
||||
@@ -12,13 +12,13 @@ yarnpkg generate
|
||||
popd
|
||||
rm -r mealie/frontend
|
||||
cp -a frontend/dist mealie/frontend
|
||||
poetry build
|
||||
poetry export -n --only=main --extras=pgsql --output=dist/requirements.txt
|
||||
MEALIE_VERSION=$(poetry version --short)
|
||||
uv build --out-dir dist
|
||||
uv export --no-editable --no-emit-project --extra pgsql --format requirements-txt --output-file dist/requirements.txt
|
||||
MEALIE_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
||||
echo "mealie[pgsql]==${MEALIE_VERSION} \\" >> dist/requirements.txt
|
||||
poetry run pip hash dist/mealie-${MEALIE_VERSION}-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt
|
||||
pip hash dist/mealie-${MEALIE_VERSION}-py3-none-any.whl | tail -n1 | tr -d '\n' >> dist/requirements.txt
|
||||
echo " \\" >> dist/requirements.txt
|
||||
poetry run pip hash dist/mealie-${MEALIE_VERSION}.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
pip hash dist/mealie-${MEALIE_VERSION}.tar.gz | tail -n1 >> dist/requirements.txt
|
||||
```
|
||||
|
||||
The Python package can be installed with all of its dependencies pinned to the versions tested by the developers with:
|
||||
|
||||
@@ -33,7 +33,7 @@ Make sure the VSCode Dev Containers extension is installed, then select "Dev Con
|
||||
### Prerequisites
|
||||
|
||||
- [Python 3.12](https://www.python.org/downloads/)
|
||||
- [Poetry](https://python-poetry.org/docs/#installation)
|
||||
- [uv](https://docs.astral.sh/uv/)
|
||||
- [Node](https://nodejs.org/en/)
|
||||
- [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable)
|
||||
- [task](https://taskfile.dev/#/installation)
|
||||
|
||||
@@ -22,6 +22,7 @@ Mealie supports importing recipes from a few other sources besides websites. Cur
|
||||
- Recipe Keeper
|
||||
- Copy Me That
|
||||
- My Recipe Box
|
||||
- DVO Cook'n X3
|
||||
|
||||
You can access these options on your installation at the `/group/migrations` page on your installation. If you'd like to see another source added, feel free to request so on Github.
|
||||
|
||||
|
||||
@@ -4,22 +4,22 @@
|
||||
|
||||
### General
|
||||
|
||||
| Variables | Default | Description |
|
||||
| ----------------------------- | :-------------------: | -------------------------------------------------------------------------------------------------- |
|
||||
| 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_HOUSEHOLD | Family | The default household for users in each group |
|
||||
| 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<super>\*</super> | false | Allow user sign-up without token |
|
||||
| ALLOW_PASSWORD_LOGIN | true | Whether or not to display the username+password input fields. Keep set to true unless you use OIDC authentication |
|
||||
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
|
||||
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug) |
|
||||
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, *not* UTC |
|
||||
| Variables | Default | Description |
|
||||
| ----------------------------- | :-------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 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_HOUSEHOLD | Family | The default household for users in each group |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid. Must be <= 9600 (400 days, in hours). |
|
||||
| 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<super>\*</super> | false | Allow user sign-up without token |
|
||||
| ALLOW_PASSWORD_LOGIN | true | Whether or not to display the username+password input fields. Keep set to true unless you use OIDC authentication |
|
||||
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
|
||||
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug) |
|
||||
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, *not* UTC |
|
||||
|
||||
<super>\*</super> Starting in v1.4.0 this was changed to default to `false` as part of a security review of the application.
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
|
||||
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:v3.2.1`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.5.0`
|
||||
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
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.2.1 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.5.0 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.2.1 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.5.0 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -28,6 +28,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
|
||||
- Copy Me That
|
||||
- Paprika
|
||||
- Tandoor Recipes
|
||||
- DVO Cook'n X3
|
||||
- Random Meal Plan generation
|
||||
- Advanced rule configuration to fine tune random recipes
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -165,7 +165,7 @@
|
||||
>
|
||||
<template #activator="{ props: activatorProps }">
|
||||
<v-text-field
|
||||
v-model="field.value"
|
||||
:model-value="field.value ? $d(new Date(field.value + 'T00:00:00')) : null"
|
||||
persistent-hint
|
||||
:prepend-icon="$globals.icons.calendar"
|
||||
variant="underlined"
|
||||
|
||||
@@ -28,11 +28,12 @@
|
||||
<v-list-item-title class="pl-2">
|
||||
{{ item.name }}
|
||||
</v-list-item-title>
|
||||
<v-list-item-action>
|
||||
<template #append>
|
||||
<v-btn
|
||||
v-if="!edit"
|
||||
color="primary"
|
||||
icon
|
||||
size="small"
|
||||
:href="assetURL(item.fileName ?? '')"
|
||||
target="_blank"
|
||||
top
|
||||
@@ -43,6 +44,7 @@
|
||||
<v-btn
|
||||
color="error"
|
||||
icon
|
||||
size="small"
|
||||
top
|
||||
@click="model.splice(i, 1)"
|
||||
>
|
||||
@@ -53,7 +55,7 @@
|
||||
:copy-text="assetEmbed(item.fileName ?? '')"
|
||||
/>
|
||||
</div>
|
||||
</v-list-item-action>
|
||||
</template>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
@@ -90,13 +92,12 @@
|
||||
item-value="name"
|
||||
class="mr-2"
|
||||
>
|
||||
<template #item="{ item }">
|
||||
<v-avatar>
|
||||
<v-icon class="mr-auto">
|
||||
{{ item.raw.icon }}
|
||||
</v-icon>
|
||||
</v-avatar>
|
||||
{{ item.title }}
|
||||
<template #item="{ item, props: itemProps }">
|
||||
<v-list-item v-bind="itemProps">
|
||||
<template #prepend>
|
||||
<v-icon>{{ item.raw.icon }}</v-icon>
|
||||
</template>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</v-select>
|
||||
<AppButtonUpload
|
||||
|
||||
@@ -49,7 +49,6 @@
|
||||
>
|
||||
<RecipeFavoriteBadge
|
||||
v-if="isOwnGroup"
|
||||
class="absolute"
|
||||
:recipe-id="recipeId"
|
||||
show-always
|
||||
/>
|
||||
|
||||
@@ -90,6 +90,14 @@
|
||||
<v-list-item-title>{{ $t("general.last-made") }}</v-list-item-title>
|
||||
</div>
|
||||
</v-list-item>
|
||||
<v-list-item @click="sortRecipes(EVENTS.shuffle)">
|
||||
<div class="d-flex align-center flex-nowrap">
|
||||
<v-icon class="mr-2" inline>
|
||||
{{ $globals.icons.diceMultiple }}
|
||||
</v-icon>
|
||||
<v-list-item-title>{{ $t("general.random") }}</v-list-item-title>
|
||||
</div>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<ContextMenu
|
||||
@@ -223,6 +231,7 @@ const displayTitleIcon = computed(() => {
|
||||
});
|
||||
|
||||
const sortLoading = ref(false);
|
||||
const randomSeed = ref(Date.now().toString());
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||
@@ -256,13 +265,18 @@ const queryFilter = computed(() => {
|
||||
async function fetchRecipes(pageCount = 1) {
|
||||
const orderDir = props.query?.orderDirection || preferences.value.orderDirection;
|
||||
const orderByNullPosition = props.query?.orderByNullPosition || orderDir === "asc" ? "first" : "last";
|
||||
const orderBy = props.query?.orderBy || preferences.value.orderBy;
|
||||
const localQuery = { ...props.query };
|
||||
if (orderBy === "random") {
|
||||
localQuery._searchSeed = randomSeed.value;
|
||||
}
|
||||
return await fetchMore(
|
||||
page.value,
|
||||
perPage * pageCount,
|
||||
props.query?.orderBy || preferences.value.orderBy,
|
||||
orderBy,
|
||||
orderDir,
|
||||
orderByNullPosition,
|
||||
props.query,
|
||||
localQuery,
|
||||
// we use a computed queryFilter to filter out recipes that have a null value for the property we're sorting by
|
||||
queryFilter.value,
|
||||
);
|
||||
@@ -288,6 +302,9 @@ watch(
|
||||
);
|
||||
|
||||
async function initRecipes() {
|
||||
if (preferences.value.orderBy === "random") {
|
||||
randomSeed.value = Date.now().toString();
|
||||
}
|
||||
page.value = 1;
|
||||
hasMore.value = true;
|
||||
|
||||
@@ -380,6 +397,15 @@ async function sortRecipes(sortType: string) {
|
||||
true,
|
||||
);
|
||||
break;
|
||||
case EVENTS.shuffle:
|
||||
setter(
|
||||
"random",
|
||||
$globals.icons.diceMultiple,
|
||||
$globals.icons.diceMultiple, // icon in asc and desc is the same for random
|
||||
);
|
||||
// We update the seed value to have a different order
|
||||
randomSeed.value = Date.now().toString();
|
||||
break;
|
||||
default:
|
||||
console.log("Unknown Event", sortType);
|
||||
return;
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
>
|
||||
<template #activator="{ props: activatorProps }">
|
||||
<v-text-field
|
||||
v-model="newMealdateString"
|
||||
:model-value="$d(newMealdate)"
|
||||
:label="$t('general.date')"
|
||||
:prepend-icon="$globals.icons.calendar"
|
||||
v-bind="activatorProps"
|
||||
@@ -377,11 +377,14 @@ async function deleteRecipe() {
|
||||
const download = useDownloader();
|
||||
|
||||
async function handleDownloadEvent() {
|
||||
const { data } = await api.recipes.getZipToken(props.slug);
|
||||
|
||||
if (data) {
|
||||
download(api.recipes.getZipRedirectUrl(props.slug, data.token), `${props.slug}.zip`);
|
||||
const { data: shareToken } = await api.recipes.share.createOne({ recipeId: props.recipeId });
|
||||
if (!shareToken) {
|
||||
console.error("No share token received");
|
||||
alert.error(i18n.t("events.something-went-wrong"));
|
||||
return;
|
||||
}
|
||||
|
||||
download(api.recipes.share.getZipRedirectUrl(shareToken.id), `${props.slug}.zip`);
|
||||
}
|
||||
|
||||
async function addRecipeToPlan() {
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<template #[`item.dateAdded`]="{ item }">
|
||||
{{ formatDate(item.dateAdded!) }}
|
||||
{{ item.dateAdded ? $d(new Date(item.dateAdded)) : '' }}
|
||||
</template>
|
||||
</v-data-table>
|
||||
</template>
|
||||
@@ -153,15 +153,6 @@ const headers = computed(() => {
|
||||
return hdrs;
|
||||
});
|
||||
|
||||
function formatDate(date: string) {
|
||||
try {
|
||||
return i18n.d(Date.parse(date), "medium");
|
||||
}
|
||||
catch {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// ============
|
||||
// Group Members
|
||||
const api = useUserApi();
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
color="secondary"
|
||||
density="compact"
|
||||
/>
|
||||
<div :key="`${ingredientData.ingredient.quantity || 'no-qty'}-${i}`" class="pa-auto my-auto">
|
||||
<div :key="`${ingredientData.ingredient?.quantity || 'no-qty'}-${i}`" class="pa-auto my-auto">
|
||||
<RecipeIngredientListItem
|
||||
:ingredient="ingredientData.ingredient"
|
||||
:scale="recipeSection.recipeScale"
|
||||
@@ -287,12 +287,35 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const shoppingListIngredients: ShoppingListIngredient[] = recipe.recipeIngredient.map((ing) => {
|
||||
const householdsWithFood = (ing.food?.householdsWithIngredientFood || []);
|
||||
return {
|
||||
checked: !householdsWithFood.includes(userHousehold.value),
|
||||
ingredient: ing,
|
||||
};
|
||||
const shoppingListIngredients: ShoppingListIngredient[] = [];
|
||||
function flattenRecipeIngredients(ing: RecipeIngredient, parentTitle = ""): ShoppingListIngredient[] {
|
||||
const householdsWithFood = ing.food?.householdsWithIngredientFood || [];
|
||||
if (ing.referencedRecipe) {
|
||||
// Recursively flatten all ingredients in the referenced recipe
|
||||
return (ing.referencedRecipe.recipeIngredient ?? []).flatMap((subIng) => {
|
||||
const calculatedQty = (ing.quantity || 1) * (subIng.quantity || 1);
|
||||
// Pass the referenced recipe name as the section title
|
||||
return flattenRecipeIngredients(
|
||||
{ ...subIng, quantity: calculatedQty },
|
||||
"",
|
||||
);
|
||||
});
|
||||
}
|
||||
else {
|
||||
// Regular ingredient
|
||||
return [{
|
||||
checked: !householdsWithFood.includes(userHousehold.value),
|
||||
ingredient: {
|
||||
...ing,
|
||||
title: ing.title || parentTitle,
|
||||
},
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
recipe.recipeIngredient.forEach((ing) => {
|
||||
const flattened = flattenRecipeIngredients(ing, "");
|
||||
shoppingListIngredients.push(...flattened);
|
||||
});
|
||||
|
||||
let currentTitle = "";
|
||||
@@ -301,6 +324,9 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
if (ing.ingredient.title) {
|
||||
currentTitle = ing.ingredient.title;
|
||||
}
|
||||
else if (ing.ingredient.referencedRecipe?.name) {
|
||||
currentTitle = ing.ingredient.referencedRecipe.name;
|
||||
}
|
||||
|
||||
// If this is the first item in the section, create a new section
|
||||
if (sections.length === 0 || currentTitle !== sections[sections.length - 1].sectionName) {
|
||||
@@ -316,7 +342,7 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
}
|
||||
|
||||
// Store the on-hand ingredients for later
|
||||
const householdsWithFood = (ing.ingredient.food?.householdsWithIngredientFood || []);
|
||||
const householdsWithFood = (ing.ingredient?.food?.householdsWithIngredientFood || []);
|
||||
if (householdsWithFood.includes(userHousehold.value)) {
|
||||
onHandIngs.push(ing);
|
||||
return sections;
|
||||
|
||||
@@ -141,6 +141,13 @@ function save() {
|
||||
dialog.value = false;
|
||||
}
|
||||
|
||||
function open() {
|
||||
dialog.value = true;
|
||||
}
|
||||
function close() {
|
||||
dialog.value = false;
|
||||
}
|
||||
|
||||
const i18n = useI18n();
|
||||
|
||||
const utilities = [
|
||||
@@ -160,4 +167,10 @@ const utilities = [
|
||||
action: splitByNumberedLine,
|
||||
},
|
||||
];
|
||||
|
||||
// Expose functions to parent components
|
||||
defineExpose({
|
||||
open,
|
||||
close,
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -69,7 +69,14 @@
|
||||
:label="$t('recipe.nutrition')"
|
||||
/>
|
||||
</v-row>
|
||||
<v-row no-gutters />
|
||||
<v-row no-gutters>
|
||||
<v-switch
|
||||
v-model="preferences.expandChildRecipes"
|
||||
hide-details
|
||||
color="primary"
|
||||
:label="$t('recipe.include-linked-recipe-ingredients')"
|
||||
/>
|
||||
</v-row>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
>
|
||||
<template #activator="{ props: activatorProps }">
|
||||
<v-text-field
|
||||
v-model="expirationDateString"
|
||||
:model-value="$d(expirationDate)"
|
||||
:label="$t('recipe-share.expiration-date')"
|
||||
:hint="$t('recipe-share.default-30-days')"
|
||||
persistent-hint
|
||||
@@ -59,11 +59,8 @@
|
||||
|
||||
<div class="pl-3 flex-grow-1">
|
||||
<v-list-item-title>
|
||||
{{ $t("recipe-share.expires-at") }}
|
||||
{{ $t("recipe-share.expires-at") + ' ' + $d(new Date(token.expiresAt!), "short") }}
|
||||
</v-list-item-title>
|
||||
<v-list-item-subtitle>
|
||||
{{ $d(new Date(token.expiresAt!), "long") }}
|
||||
</v-list-item-subtitle>
|
||||
</div>
|
||||
|
||||
<v-btn
|
||||
@@ -111,10 +108,6 @@ const datePickerMenu = ref(false);
|
||||
const expirationDate = ref(new Date(Date.now() - new Date().getTimezoneOffset() * 60000));
|
||||
const tokens = ref<RecipeShareToken[]>([]);
|
||||
|
||||
const expirationDateString = computed(() => {
|
||||
return expirationDate.value.toISOString().substring(0, 10);
|
||||
});
|
||||
|
||||
whenever(
|
||||
() => dialog.value,
|
||||
() => {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
v-bind="props"
|
||||
>
|
||||
<v-icon :start="!$vuetify.display.xs">
|
||||
{{ state.orderDirection === "asc" ? $globals.icons.sortAscending : $globals.icons.sortDescending }}
|
||||
{{ state.orderDirection === "asc" ? $globals.icons.sortDescending : $globals.icons.sortAscending }}
|
||||
</v-icon>
|
||||
{{ $vuetify.display.xs ? null : sortText }}
|
||||
</v-btn>
|
||||
@@ -42,7 +42,7 @@
|
||||
<v-list-item
|
||||
slim
|
||||
density="comfortable"
|
||||
:prepend-icon="state.orderDirection === 'asc' ? $globals.icons.sortDescending : $globals.icons.sortAscending"
|
||||
:prepend-icon="state.orderDirection === 'asc' ? $globals.icons.sortAscending : $globals.icons.sortDescending"
|
||||
:title="state.orderDirection === 'asc' ? $t('general.sort-descending') : $t('general.sort-ascending')"
|
||||
@click="toggleOrderDirection"
|
||||
/>
|
||||
@@ -53,10 +53,23 @@
|
||||
:active="state.orderBy === v.value"
|
||||
slim
|
||||
density="comfortable"
|
||||
:prepend-icon="v.icon"
|
||||
:title="v.name"
|
||||
@click="setOrderBy(v.value)"
|
||||
/>
|
||||
@click="v.value === 'random' ? setRandomOrderByWrapper() : setOrderBy(v.value)"
|
||||
>
|
||||
<template #prepend>
|
||||
<v-icon>{{ v.icon }}</v-icon>
|
||||
</template>
|
||||
|
||||
<template #title>
|
||||
<span>{{ v.name }}</span>
|
||||
<v-icon
|
||||
v-if="v.value === 'random' && showRandomLoading"
|
||||
size="small"
|
||||
class="ml-3"
|
||||
>
|
||||
{{ $globals.icons.refreshCircle }}
|
||||
</v-icon>
|
||||
</template>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
</v-menu>
|
||||
@@ -131,6 +144,7 @@ const $auth = useMealieAuth();
|
||||
const route = useRoute();
|
||||
const { $globals } = useNuxtApp();
|
||||
const i18n = useI18n();
|
||||
const showRandomLoading = ref(false);
|
||||
|
||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||
|
||||
@@ -141,6 +155,7 @@ const {
|
||||
reset,
|
||||
toggleOrderDirection,
|
||||
setOrderBy,
|
||||
setRandomOrderBy,
|
||||
filterItems,
|
||||
initialize,
|
||||
} = useRecipeExplorerSearch(groupSlug);
|
||||
@@ -205,6 +220,14 @@ const input: Ref<any> = ref(null);
|
||||
function hideKeyboard() {
|
||||
input.value?.blur();
|
||||
}
|
||||
|
||||
// function to show refresh icon
|
||||
async function setRandomOrderByWrapper() {
|
||||
if (!showRandomLoading.value) {
|
||||
showRandomLoading.value = true;
|
||||
}
|
||||
await setRandomOrderBy();
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -20,18 +20,36 @@
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-card width="400">
|
||||
<v-card-title class="headline flex mb-0">
|
||||
<v-card-title class="headline flex-wrap mb-0">
|
||||
<div>
|
||||
{{ $t("recipe.recipe-image") }}
|
||||
</div>
|
||||
<AppButtonUpload
|
||||
class="ml-auto"
|
||||
url="none"
|
||||
file-name="image"
|
||||
:text-btn="false"
|
||||
:post="false"
|
||||
@uploaded="uploadImage"
|
||||
/>
|
||||
<div class="d-flex gap-2">
|
||||
<AppButtonUpload
|
||||
url="none"
|
||||
file-name="image"
|
||||
:text-btn="false"
|
||||
:post="false"
|
||||
@uploaded="uploadImage"
|
||||
/>
|
||||
<BaseButton
|
||||
class="ml-2"
|
||||
delete
|
||||
@click="dialogDeleteImage = true"
|
||||
/>
|
||||
<BaseDialog
|
||||
v-model="dialogDeleteImage"
|
||||
:title="$t('recipe.delete-image')"
|
||||
:icon="$globals.icons.alertCircle"
|
||||
color="error"
|
||||
can-delete
|
||||
@delete="deleteImage"
|
||||
>
|
||||
<v-card-text>
|
||||
{{ $t("recipe.delete-image-confirmation") }}
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
</div>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-n5">
|
||||
<div>
|
||||
@@ -62,38 +80,58 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
|
||||
const REFRESH_EVENT = "refresh";
|
||||
const UPLOAD_EVENT = "upload";
|
||||
const DELETE_EVENT = "delete";
|
||||
|
||||
const props = defineProps<{ slug: string }>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
refresh: [];
|
||||
upload: [fileObject: File];
|
||||
delete: [];
|
||||
}>();
|
||||
|
||||
const i18n = useI18n();
|
||||
const api = useUserApi();
|
||||
|
||||
const url = ref("");
|
||||
const loading = ref(false);
|
||||
const menu = ref(false);
|
||||
const dialogDeleteImage = ref(false);
|
||||
|
||||
function uploadImage(fileObject: File) {
|
||||
emit(UPLOAD_EVENT, fileObject);
|
||||
menu.value = false;
|
||||
}
|
||||
|
||||
const api = useUserApi();
|
||||
async function deleteImage() {
|
||||
loading.value = true;
|
||||
try {
|
||||
await api.recipes.deleteImage(props.slug);
|
||||
emit(DELETE_EVENT);
|
||||
menu.value = false;
|
||||
}
|
||||
catch (e) {
|
||||
alert.error(i18n.t("events.something-went-wrong"));
|
||||
console.error("Failed to delete image", e);
|
||||
}
|
||||
finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function getImageFromURL() {
|
||||
loading.value = true;
|
||||
if (await api.recipes.updateImagebyURL(props.slug, url.value)) {
|
||||
emit(REFRESH_EVENT);
|
||||
emit(DELETE_EVENT);
|
||||
}
|
||||
loading.value = false;
|
||||
menu.value = false;
|
||||
}
|
||||
|
||||
const i18n = useI18n();
|
||||
const messages = computed(() =>
|
||||
props.slug ? [""] : [i18n.t("recipe.save-recipe-before-use")],
|
||||
);
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
</v-text-field>
|
||||
</v-col>
|
||||
<v-col
|
||||
v-if="!state.isRecipe"
|
||||
sm="12"
|
||||
md="3"
|
||||
cols="12"
|
||||
@@ -97,6 +98,7 @@
|
||||
|
||||
<!-- Foods Input -->
|
||||
<v-col
|
||||
v-if="!state.isRecipe"
|
||||
m="12"
|
||||
md="3"
|
||||
cols="12"
|
||||
@@ -151,6 +153,35 @@
|
||||
</template>
|
||||
</v-autocomplete>
|
||||
</v-col>
|
||||
<!-- Recipe Input -->
|
||||
<v-col
|
||||
v-if="state.isRecipe"
|
||||
m="12"
|
||||
md="6"
|
||||
cols="12"
|
||||
class=""
|
||||
>
|
||||
<v-autocomplete
|
||||
ref="search.query"
|
||||
v-model="model.referencedRecipe"
|
||||
v-model:search="search.query.value"
|
||||
auto-select-first
|
||||
hide-details
|
||||
density="compact"
|
||||
variant="solo"
|
||||
return-object
|
||||
:items="search.data.value || []"
|
||||
item-title="name"
|
||||
class="mx-1 py-0"
|
||||
:placeholder="$t('search.type-to-search')"
|
||||
clearable
|
||||
:label="!model.referencedRecipe ? $t('recipe.choose-recipe') : ''"
|
||||
@click="search.trigger()"
|
||||
@focus="search.trigger()"
|
||||
>
|
||||
<template #prepend />
|
||||
</v-autocomplete>
|
||||
</v-col>
|
||||
<v-col
|
||||
sm="12"
|
||||
md=""
|
||||
@@ -173,6 +204,7 @@
|
||||
class="my-auto d-flex"
|
||||
:buttons="btns"
|
||||
@toggle-section="toggleTitle"
|
||||
@toggle-subrecipe="toggleIsRecipe"
|
||||
@insert-above="$emit('insert-above')"
|
||||
@insert-below="$emit('insert-below')"
|
||||
@delete="$emit('delete')"
|
||||
@@ -195,6 +227,8 @@ import { useI18n } from "vue-i18n";
|
||||
import { useFoodStore, useFoodData, useUnitStore, useUnitData } from "~/composables/store";
|
||||
import { useNuxtApp } from "#app";
|
||||
import type { RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
import { useRecipeSearch } from "~/composables/recipes/use-recipe-search";
|
||||
|
||||
// defineModel replaces modelValue prop
|
||||
const model = defineModel<RecipeIngredient>({ required: true });
|
||||
@@ -204,6 +238,10 @@ const props = defineProps({
|
||||
type: String,
|
||||
default: "body",
|
||||
},
|
||||
isRecipe: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
unitError: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
@@ -247,6 +285,7 @@ const { $globals } = useNuxtApp();
|
||||
|
||||
const state = reactive({
|
||||
showTitle: false,
|
||||
isRecipe: props.isRecipe,
|
||||
});
|
||||
|
||||
const contextMenuOptions = computed(() => {
|
||||
@@ -255,6 +294,10 @@ const contextMenuOptions = computed(() => {
|
||||
text: i18n.t("recipe.toggle-section"),
|
||||
event: "toggle-section",
|
||||
},
|
||||
{
|
||||
text: i18n.t("recipe.toggle-recipe"),
|
||||
event: "toggle-subrecipe",
|
||||
},
|
||||
{
|
||||
text: i18n.t("recipe.insert-above"),
|
||||
event: "insert-above",
|
||||
@@ -303,6 +346,25 @@ async function createAssignFood() {
|
||||
foodAutocomplete.value?.blur();
|
||||
}
|
||||
|
||||
// Recipes
|
||||
const route = useRoute();
|
||||
const $auth = useMealieAuth();
|
||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const api = isOwnGroup.value ? useUserApi() : usePublicExploreApi(groupSlug.value).explore;
|
||||
const search = useRecipeSearch(api);
|
||||
const loading = ref(false);
|
||||
const selectedIndex = ref(-1);
|
||||
// Reset or Grab Recipes on Change
|
||||
watch(loading, (val) => {
|
||||
if (!val) {
|
||||
search.query.value = "";
|
||||
selectedIndex.value = -1;
|
||||
search.data.value = [];
|
||||
}
|
||||
});
|
||||
|
||||
// Units
|
||||
const unitStore = useUnitStore();
|
||||
const unitsData = useUnitData();
|
||||
@@ -323,6 +385,17 @@ function toggleTitle() {
|
||||
state.showTitle = !state.showTitle;
|
||||
}
|
||||
|
||||
function toggleIsRecipe() {
|
||||
if (state.isRecipe) {
|
||||
model.value.referencedRecipe = undefined;
|
||||
}
|
||||
else {
|
||||
model.value.unit = undefined;
|
||||
model.value.food = undefined;
|
||||
}
|
||||
state.isRecipe = !state.isRecipe;
|
||||
}
|
||||
|
||||
function handleUnitEnter() {
|
||||
if (
|
||||
model.value.unit === undefined
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
class="text-bold d-inline"
|
||||
:source="parsedIng.note"
|
||||
/>
|
||||
<template v-else-if="parsedIng.recipeLink">
|
||||
<SafeMarkdown v-if="parsedIng.recipeLink" class="text-bold d-inline" :source="parsedIng.recipeLink" />
|
||||
<SafeMarkdown v-if="parsedIng.note" class="note" :source="parsedIng.note" />
|
||||
</template>
|
||||
<template v-else>
|
||||
<SafeMarkdown
|
||||
v-if="parsedIng.name"
|
||||
@@ -39,9 +43,12 @@ interface Props {
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
scale: 1,
|
||||
});
|
||||
const route = useRoute();
|
||||
const $auth = useMealieAuth();
|
||||
const groupSlug = computed(() => route.params.groupSlug || $auth.user?.value?.groupSlug || "");
|
||||
|
||||
const parsedIng = computed(() => {
|
||||
return useParsedIngredientText(props.ingredient, props.scale);
|
||||
return useParsedIngredientText(props.ingredient, props.scale, true, groupSlug.value.toString());
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
:title="$t('recipe.made-this')"
|
||||
:submit-text="$t('recipe.add-to-timeline')"
|
||||
can-submit
|
||||
disable-submit-on-enter
|
||||
@submit="createTimelineEvent"
|
||||
>
|
||||
<v-card-text>
|
||||
@@ -20,6 +21,29 @@
|
||||
persistent-hint
|
||||
rows="4"
|
||||
/>
|
||||
<div v-if="childRecipes?.length">
|
||||
<v-card-text class="pt-6 pb-0">
|
||||
{{ $t('recipe.include-linked-recipes') }}
|
||||
</v-card-text>
|
||||
<v-list>
|
||||
<v-list-item
|
||||
v-for="(childRecipe, i) in childRecipes"
|
||||
:key="childRecipe.recipeId + i"
|
||||
density="compact"
|
||||
class="my-0 py-0"
|
||||
@click="childRecipe.checked = !childRecipe.checked"
|
||||
>
|
||||
<v-checkbox
|
||||
hide-details
|
||||
density="compact"
|
||||
:input-value="childRecipe.checked"
|
||||
:label="childRecipe.name"
|
||||
class="my-0 py-0"
|
||||
color="secondary"
|
||||
/>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</div>
|
||||
<v-container>
|
||||
<v-row>
|
||||
<v-col cols="6">
|
||||
@@ -32,7 +56,7 @@
|
||||
>
|
||||
<template #activator="{ props: activatorProps }">
|
||||
<v-text-field
|
||||
v-model="newTimelineEventTimestampString"
|
||||
:model-value="$d(newTimelineEventTimestamp)"
|
||||
:prepend-icon="$globals.icons.calendar"
|
||||
v-bind="activatorProps"
|
||||
readonly
|
||||
@@ -102,7 +126,7 @@
|
||||
<span class="text-body-1 opacity-80">
|
||||
<b>{{ $t("general.last-made") }}</b>
|
||||
<br>
|
||||
{{ lastMade ? new Date(lastMade).toLocaleDateString($i18n.locale) : $t("general.never") }}
|
||||
{{ lastMade ? $d(new Date(lastMade)) : $t("general.never") }}
|
||||
</span>
|
||||
<v-icon end size="large" color="primary">
|
||||
{{ $globals.icons.createAlt }}
|
||||
@@ -166,6 +190,21 @@ onMounted(async () => {
|
||||
lastMadeReady.value = true;
|
||||
});
|
||||
|
||||
const childRecipes = computed(() => {
|
||||
return props.recipe.recipeIngredient?.map((ingredient) => {
|
||||
if (ingredient.referencedRecipe) {
|
||||
return {
|
||||
checked: false, // Default value for checked
|
||||
recipeId: ingredient.referencedRecipe.id || "", // Non-nullable recipeId
|
||||
...ingredient.referencedRecipe, // Spread the rest of the referencedRecipe properties
|
||||
};
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
}).filter(recipe => recipe !== undefined); // Filter out undefined values
|
||||
});
|
||||
|
||||
whenever(
|
||||
() => madeThisDialog.value,
|
||||
() => {
|
||||
@@ -250,6 +289,37 @@ async function createTimelineEvent() {
|
||||
}
|
||||
}
|
||||
|
||||
for (const childRecipe of childRecipes.value || []) {
|
||||
if (!childRecipe.checked) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const childTimelineEvent = {
|
||||
...newTimelineEvent.value,
|
||||
recipeId: childRecipe.recipeId,
|
||||
eventMessage: i18n.t("recipe.made-for-recipe", { recipe: childRecipe.name }),
|
||||
image: undefined,
|
||||
};
|
||||
try {
|
||||
await userApi.recipes.createTimelineEvent(childTimelineEvent);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Failed to create timeline event for child recipe ${childRecipe.slug}:`, error);
|
||||
}
|
||||
|
||||
if (
|
||||
newTimelineEvent.value.timestamp
|
||||
&& (!childRecipe.lastMade || newTimelineEvent.value.timestamp > childRecipe.lastMade)
|
||||
) {
|
||||
try {
|
||||
await userApi.recipes.updateLastMade(childRecipe.slug || "", newTimelineEvent.value.timestamp);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Failed to update last made date for child recipe ${childRecipe.slug}:`, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// update the image, if provided
|
||||
let imageError = false;
|
||||
if (newTimelineEventImage.value) {
|
||||
@@ -268,7 +338,6 @@ async function createTimelineEvent() {
|
||||
console.error("Failed to upload image for timeline event:", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (imageError) {
|
||||
alert.error(i18n.t("recipe.added-to-timeline-but-failed-to-add-image"));
|
||||
}
|
||||
|
||||
@@ -105,10 +105,9 @@
|
||||
<v-icon>
|
||||
{{ icon }}
|
||||
</v-icon>
|
||||
<v-card-title class="py-1">
|
||||
<v-card-title class="py-1 text-truncate flex-shrink-1 flex-grow-1">
|
||||
{{ item.name }}
|
||||
</v-card-title>
|
||||
<v-spacer />
|
||||
<ContextMenu
|
||||
:items="[presets.delete, presets.edit]"
|
||||
@delete="confirmDelete(item)"
|
||||
|
||||
@@ -95,9 +95,12 @@
|
||||
<RecipePrintContainer :recipe="recipe" :scale="scale" />
|
||||
</v-container>
|
||||
<!-- Cook mode displayes two columns with ingredients and instructions side by side, each being scrolled individually, allowing to view both at the same time -->
|
||||
<!-- The calc is to account for the navabar height (48px) -->
|
||||
<v-sheet
|
||||
v-show="isCookMode && !hasLinkedIngredients"
|
||||
key="cookmode"
|
||||
:height="$vuetify.display.smAndUp ? 'calc(100vh - 48px)' : 'auto'"
|
||||
class-name="overflow-hidden"
|
||||
>
|
||||
<!-- the calc is to account for the toolbar a more dynamic solution could be needed -->
|
||||
<v-row style="height: 100%" no-gutters class="overflow-hidden">
|
||||
@@ -290,10 +293,13 @@ watch(isParsing, () => {
|
||||
*/
|
||||
|
||||
async function saveRecipe() {
|
||||
const { data } = await api.recipes.updateOne(recipe.value.slug, recipe.value);
|
||||
setMode(PageMode.VIEW);
|
||||
const { data, error } = await api.recipes.updateOne(recipe.value.slug, recipe.value);
|
||||
if (!error) {
|
||||
setMode(PageMode.VIEW);
|
||||
}
|
||||
if (data?.slug) {
|
||||
router.push(`/g/${groupSlug.value}/r/` + data.slug);
|
||||
recipe.value = data as NoUndefinedField<Recipe>;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
:slug="recipe.slug"
|
||||
@upload="uploadImage"
|
||||
@refresh="imageKey++"
|
||||
@delete="deleteImage"
|
||||
/>
|
||||
<RecipeSettingsMenu
|
||||
v-model="recipe.settings"
|
||||
@@ -78,4 +79,10 @@ async function uploadImage(fileObject: File) {
|
||||
}
|
||||
imageKey.value++;
|
||||
}
|
||||
|
||||
async function deleteImage() {
|
||||
// The image is already deleted on the backend, just need to update the UI
|
||||
recipe.value.image = "";
|
||||
imageKey.value++;
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
v-for="(ingredient, index) in recipe.recipeIngredient"
|
||||
:key="ingredient.referenceId"
|
||||
v-model="recipe.recipeIngredient[index]"
|
||||
:is-recipe="ingredientIsRecipe(ingredient)"
|
||||
enable-drag-handle
|
||||
enable-context-menu
|
||||
class="list-group-item"
|
||||
@@ -69,15 +70,59 @@
|
||||
<span>{{ parserToolTip }}</span>
|
||||
</v-tooltip>
|
||||
<RecipeDialogBulkAdd
|
||||
ref="domBulkAddDialog"
|
||||
class="mx-1 mb-1"
|
||||
style="display: none"
|
||||
@bulk-data="addIngredient"
|
||||
/>
|
||||
<BaseButton
|
||||
class="mb-1"
|
||||
@click="addIngredient"
|
||||
>
|
||||
{{ $t("general.add") }}
|
||||
</BaseButton>
|
||||
<div class="d-inline-flex">
|
||||
<!-- Main button: Add Food -->
|
||||
<v-btn
|
||||
color="success"
|
||||
class="split-main ml-2"
|
||||
@click="addIngredient"
|
||||
>
|
||||
<v-icon start>
|
||||
{{ $globals.icons.createAlt }}
|
||||
</v-icon>
|
||||
{{ $t('general.add') || 'Add Food' }}
|
||||
</v-btn>
|
||||
<!-- Dropdown button -->
|
||||
<v-menu>
|
||||
<template #activator="{ props }">
|
||||
<v-btn
|
||||
color="success"
|
||||
class="split-dropdown"
|
||||
v-bind="props"
|
||||
>
|
||||
<v-icon>{{ $globals.icons.chevronDown }}</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list>
|
||||
<v-list-item
|
||||
slim
|
||||
density="comfortable"
|
||||
:prepend-icon="$globals.icons.foods"
|
||||
:title="$t('new-recipe.add-food')"
|
||||
@click="addIngredient"
|
||||
/>
|
||||
<v-list-item
|
||||
slim
|
||||
density="comfortable"
|
||||
:prepend-icon="$globals.icons.silverwareForkKnife"
|
||||
:title="$t('new-recipe.add-recipe')"
|
||||
@click="addRecipe"
|
||||
/>
|
||||
<v-list-item
|
||||
slim
|
||||
density="comfortable"
|
||||
:prepend-icon="$globals.icons.create"
|
||||
:title="$t('new-recipe.bulk-add')"
|
||||
@click="showBulkAdd"
|
||||
/>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -85,16 +130,18 @@
|
||||
<script setup lang="ts">
|
||||
import { VueDraggable } from "vue-draggable-plus";
|
||||
import type { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
import type { Recipe } from "~/lib/api/types/recipe";
|
||||
import type { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import RecipeIngredientEditor from "~/components/Domain/Recipe/RecipeIngredientEditor.vue";
|
||||
import RecipeDialogBulkAdd from "~/components/Domain/Recipe/RecipeDialogBulkAdd.vue";
|
||||
import { usePageState } from "~/composables/recipe-page/shared-state";
|
||||
import { uuid4 } from "~/composables/use-utils";
|
||||
|
||||
const recipe = defineModel<NoUndefinedField<Recipe>>({ required: true });
|
||||
const ingredientsWithRecipe = new Map<string, boolean>();
|
||||
const i18n = useI18n();
|
||||
|
||||
const drag = ref(false);
|
||||
const domBulkAddDialog = ref<InstanceType<typeof RecipeDialogBulkAdd> | null>(null);
|
||||
const { toggleIsParsing } = usePageState(recipe.value.slug);
|
||||
|
||||
const hasFoodOrUnit = computed(() => {
|
||||
@@ -118,6 +165,22 @@ const parserToolTip = computed(() => {
|
||||
return i18n.t("recipe.parse-ingredients");
|
||||
});
|
||||
|
||||
function showBulkAdd() {
|
||||
domBulkAddDialog.value?.open();
|
||||
}
|
||||
|
||||
function ingredientIsRecipe(ingredient: RecipeIngredient): boolean {
|
||||
if (ingredient.referencedRecipe) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ingredient.referenceId) {
|
||||
return !!ingredientsWithRecipe.get(ingredient.referenceId);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function addIngredient(ingredients: Array<string> | null = null) {
|
||||
if (ingredients?.length) {
|
||||
const newIngredients = ingredients.map((x) => {
|
||||
@@ -127,7 +190,7 @@ function addIngredient(ingredients: Array<string> | null = null) {
|
||||
note: x,
|
||||
unit: undefined,
|
||||
food: undefined,
|
||||
quantity: 1,
|
||||
quantity: 0,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -145,6 +208,41 @@ function addIngredient(ingredients: Array<string> | null = null) {
|
||||
unit: undefined,
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
food: undefined,
|
||||
quantity: 0,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function addRecipe(recipes: Array<string> | null = null) {
|
||||
const refId = uuid4();
|
||||
ingredientsWithRecipe.set(refId, true);
|
||||
|
||||
if (recipes?.length) {
|
||||
const newRecipes = recipes.map((x) => {
|
||||
return {
|
||||
referenceId: refId,
|
||||
title: "",
|
||||
note: x,
|
||||
unit: undefined,
|
||||
referencedRecipe: undefined,
|
||||
quantity: 1,
|
||||
};
|
||||
});
|
||||
|
||||
if (newRecipes) {
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
recipe.value.recipeIngredient.push(...newRecipes);
|
||||
}
|
||||
}
|
||||
else {
|
||||
recipe.value.recipeIngredient.push({
|
||||
referenceId: refId,
|
||||
title: "",
|
||||
note: "",
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
unit: undefined,
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
referencedRecipe: undefined,
|
||||
quantity: 1,
|
||||
});
|
||||
}
|
||||
@@ -159,7 +257,21 @@ function insertNewIngredient(dest: number) {
|
||||
unit: undefined,
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
food: undefined,
|
||||
quantity: 1,
|
||||
quantity: 0,
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.split-main {
|
||||
border-top-right-radius: 0 !important;
|
||||
border-bottom-right-radius: 0 !important;
|
||||
}
|
||||
.split-dropdown {
|
||||
border-top-left-radius: 0 !important;
|
||||
border-bottom-left-radius: 0 !important;
|
||||
min-width: 30px;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -196,7 +196,7 @@ import { VueDraggable } from "vue-draggable-plus";
|
||||
import type { IngredientFood, IngredientUnit, ParsedIngredient, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import type { Parser } from "~/lib/api/user/recipes/recipe";
|
||||
import type { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
import { useAppInfo, useUserApi } from "~/composables/api";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { parseIngredientText } from "~/composables/recipes";
|
||||
import { useFoodData, useFoodStore, useUnitData, useUnitStore } from "~/composables/store";
|
||||
import { useGlobalI18n } from "~/composables/use-global-i18n";
|
||||
@@ -213,9 +213,9 @@ const emit = defineEmits<{
|
||||
(e: "save", value: NoUndefinedField<RecipeIngredient[]>): void;
|
||||
}>();
|
||||
|
||||
const { $appInfo } = useNuxtApp();
|
||||
const i18n = useGlobalI18n();
|
||||
const api = useUserApi();
|
||||
const appInfo = useAppInfo();
|
||||
const drag = ref(false);
|
||||
|
||||
const unitStore = useUnitStore();
|
||||
@@ -238,7 +238,7 @@ const availableParsers = computed(() => {
|
||||
{
|
||||
text: i18n.t("recipe.parser.openai-parser"),
|
||||
value: "openai",
|
||||
hide: !appInfo.value?.enableOpenai,
|
||||
hide: !$appInfo.enableOpenai,
|
||||
},
|
||||
];
|
||||
});
|
||||
@@ -268,6 +268,11 @@ const state = reactive({
|
||||
function shouldReview(ing: ParsedIngredient): boolean {
|
||||
console.debug(`Checking if ingredient needs review (input="${ing.input})":`, ing);
|
||||
|
||||
if (ing.ingredient.referencedRecipe) {
|
||||
console.debug("No review needed for sub-recipe ingredient");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((ing.confidence?.average || 0) < confidenceThreshold) {
|
||||
console.debug("Needs review due to low confidence:", ing.confidence?.average);
|
||||
return true;
|
||||
@@ -364,12 +369,21 @@ async function parseIngredients() {
|
||||
}
|
||||
state.loading.parser = true;
|
||||
try {
|
||||
const ingsAsString = props.ingredients.map(ing => parseIngredientText(ing, 1, false) ?? "");
|
||||
const ingsAsString = props.ingredients
|
||||
.filter(ing => !ing.referencedRecipe)
|
||||
.map(ing => parseIngredientText(ing, 1, false) ?? "");
|
||||
const { data, error } = await api.recipes.parseIngredients(parser.value, ingsAsString);
|
||||
if (error || !data) {
|
||||
throw new Error("Failed to parse ingredients");
|
||||
}
|
||||
parsedIngs.value = data;
|
||||
const parsed = data ?? [];
|
||||
const recipeRefs = props.ingredients.filter(ing => ing.referencedRecipe).map(ing => ({
|
||||
input: ing.note || "",
|
||||
confidence: {},
|
||||
ingredient: ing,
|
||||
}));
|
||||
parsedIngs.value = [...parsed, ...recipeRefs];
|
||||
state.currentParsedIndex = -1;
|
||||
state.allReviewed = false;
|
||||
createdUnits.clear();
|
||||
@@ -523,7 +537,7 @@ function insertNewIngredient(index: number) {
|
||||
input: "",
|
||||
confidence: {},
|
||||
ingredient: {
|
||||
quantity: 1.0,
|
||||
quantity: 0,
|
||||
referenceId: uuid4(),
|
||||
},
|
||||
} as ParsedIngredient;
|
||||
|
||||
@@ -262,32 +262,55 @@ const ingredientSections = computed<IngredientSection[]>(() => {
|
||||
if (!props.recipe.recipeIngredient) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return props.recipe.recipeIngredient.reduce((sections, ingredient) => {
|
||||
// if title append new section to the end of the array
|
||||
if (ingredient.title) {
|
||||
sections.push({
|
||||
sectionName: ingredient.title,
|
||||
ingredients: [ingredient],
|
||||
});
|
||||
|
||||
return sections;
|
||||
const addIngredientsToSections = (ingredients: RecipeIngredient[], sections: IngredientSection[], title: string | null) => {
|
||||
// If title is set, ensure the section exists before adding ingredients
|
||||
let section: IngredientSection | undefined;
|
||||
if (title) {
|
||||
section = sections.find(sec => sec.sectionName === title);
|
||||
if (!section) {
|
||||
section = { sectionName: title, ingredients: [] };
|
||||
sections.push(section);
|
||||
}
|
||||
}
|
||||
|
||||
// append new section if first
|
||||
if (sections.length === 0) {
|
||||
sections.push({
|
||||
sectionName: "",
|
||||
ingredients: [ingredient],
|
||||
});
|
||||
ingredients.forEach((ingredient) => {
|
||||
if (preferences.value.expandChildRecipes && ingredient.referencedRecipe?.recipeIngredient?.length) {
|
||||
// Recursively add to the section for this referenced recipe
|
||||
addIngredientsToSections(
|
||||
ingredient.referencedRecipe.recipeIngredient,
|
||||
sections,
|
||||
"",
|
||||
);
|
||||
}
|
||||
else {
|
||||
const sectionName = title || ingredient.title || "";
|
||||
if (sectionName) {
|
||||
let sec = sections.find(sec => sec.sectionName === sectionName);
|
||||
if (!sec) {
|
||||
sec = { sectionName, ingredients: [] };
|
||||
sections.push(sec);
|
||||
}
|
||||
ingredient.title = sectionName;
|
||||
sec.ingredients.push(ingredient);
|
||||
}
|
||||
else {
|
||||
if (sections.length === 0) {
|
||||
sections.push({
|
||||
sectionName: "",
|
||||
ingredients: [ingredient],
|
||||
});
|
||||
}
|
||||
else {
|
||||
sections[sections.length - 1].ingredients.push(ingredient);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
return sections;
|
||||
}
|
||||
|
||||
// otherwise add ingredient to last section in the array
|
||||
sections[sections.length - 1].ingredients.push(ingredient);
|
||||
return sections;
|
||||
}, [] as IngredientSection[]);
|
||||
const sections: IngredientSection[] = [];
|
||||
addIngredientsToSections(props.recipe.recipeIngredient, sections, null);
|
||||
return sections;
|
||||
});
|
||||
|
||||
// Group instructions by section so we can style them independently
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
left
|
||||
color="primary"
|
||||
>
|
||||
{{ $globals.icons.knfife }}
|
||||
{{ $globals.icons.knife }}
|
||||
</v-icon>
|
||||
<p class="my-0">
|
||||
<span class="font-weight-bold opacity-80">{{ validatePrepTime.name }}</span><br>{{ validatePrepTime.value }}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<v-icon class="mr-1">
|
||||
{{ $globals.icons.calendar }}
|
||||
</v-icon>
|
||||
{{ new Date(event.timestamp).toLocaleDateString($i18n.locale) }}
|
||||
{{ $d(new Date(event.timestamp)) }}
|
||||
</v-chip>
|
||||
</template>
|
||||
<v-card
|
||||
@@ -22,7 +22,7 @@
|
||||
<v-col v-if="useMobileFormat" align-self="center" class="pr-0">
|
||||
<v-chip label>
|
||||
<v-icon> {{ $globals.icons.calendar }} </v-icon>
|
||||
{{ new Date(event.timestamp || "").toLocaleDateString($i18n.locale) }}
|
||||
{{ $d(new Date(event.timestamp || "")) }}
|
||||
</v-chip>
|
||||
</v-col>
|
||||
<v-col v-else cols="9" style="margin: auto; text-align: center">
|
||||
|
||||
@@ -130,9 +130,8 @@
|
||||
<v-col cols="auto">
|
||||
<div class="text-caption font-weight-light font-italic">
|
||||
{{ $t("shopping-list.completed-on", {
|
||||
date: new Date(listItem.updatedAt
|
||||
|| "").toLocaleDateString($i18n.locale) })
|
||||
}}
|
||||
date: listItem.updatedAt ? $d(new Date(listItem.updatedAt)) : '',
|
||||
}) }}
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
v-model="listItem.unit"
|
||||
v-model:item-id="listItem.unitId!"
|
||||
:items="units"
|
||||
:label="$t('general.units')"
|
||||
:label="$t('recipe.unit')"
|
||||
:icon="$globals.icons.units"
|
||||
create
|
||||
@create="createAssignUnit"
|
||||
|
||||
@@ -97,7 +97,6 @@
|
||||
<script lang="ts">
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import type { SideBarLink } from "~/types/application-types";
|
||||
import { useAppInfo } from "~/composables/api";
|
||||
import { useCookbookPreferences } from "~/composables/use-users/preferences";
|
||||
import { useCookbookStore, usePublicCookbookStore } from "~/composables/store/use-cookbook-store";
|
||||
import type { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||
@@ -105,7 +104,7 @@ import type { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||
export default defineNuxtComponent({
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const { $globals } = useNuxtApp();
|
||||
const { $appInfo, $globals } = useNuxtApp();
|
||||
const display = useDisplay();
|
||||
const $auth = useMealieAuth();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
@@ -135,9 +134,7 @@ export default defineNuxtComponent({
|
||||
return [];
|
||||
});
|
||||
|
||||
const appInfo = useAppInfo();
|
||||
const showImageImport = computed(() => appInfo.value?.enableOpenaiImageServices);
|
||||
|
||||
const showImageImport = computed(() => $appInfo.enableOpenaiImageServices);
|
||||
const languageDialog = ref<boolean>(false);
|
||||
|
||||
const sidebar = ref<boolean>(false);
|
||||
|
||||
@@ -128,7 +128,7 @@ export default defineNuxtComponent({
|
||||
|
||||
async function logout() {
|
||||
try {
|
||||
await $auth.signOut({ callbackUrl: "/login?direct=1" });
|
||||
await $auth.signOut("/login?direct=1");
|
||||
}
|
||||
catch (e) {
|
||||
console.error(e);
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
<BaseButton
|
||||
v-if="canDelete"
|
||||
delete
|
||||
secondary
|
||||
@click="deleteEvent"
|
||||
/>
|
||||
<BaseButton
|
||||
|
||||
17
frontend/components/global/BaseExpansionPanels.vue
Normal file
17
frontend/components/global/BaseExpansionPanels.vue
Normal file
@@ -0,0 +1,17 @@
|
||||
<template>
|
||||
<v-expansion-panels v-model="open">
|
||||
<slot />
|
||||
</v-expansion-panels>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
interface Props {
|
||||
startOpen?: boolean;
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
startOpen: false,
|
||||
});
|
||||
|
||||
const open = ref(props.startOpen ? [0] : []);
|
||||
</script>
|
||||
@@ -1,3 +1,2 @@
|
||||
export { useAppInfo } from "./use-app-info";
|
||||
export { useStaticRoutes } from "./static-routes";
|
||||
export { useAdminApi, usePublicApi, usePublicExploreApi, useUserApi } from "./api-client";
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
import type { AppInfo } from "~/lib/api/types/admin";
|
||||
|
||||
export function useAppInfo(): Ref<AppInfo | null> {
|
||||
const i18n = useI18n();
|
||||
const { $axios } = useNuxtApp();
|
||||
$axios.defaults.headers.common["Accept-Language"] = i18n.locale.value;
|
||||
|
||||
const { data: appInfo } = useAsyncData("app-info", async () => {
|
||||
const data = await $axios.get<AppInfo>("/api/app/about");
|
||||
return data.data;
|
||||
});
|
||||
|
||||
return appInfo;
|
||||
}
|
||||
@@ -1,9 +1,19 @@
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { useGlobalI18n } from "~/composables/use-global-i18n";
|
||||
|
||||
export function useDownloader() {
|
||||
function download(url: string, filename: string) {
|
||||
useFetch(url, {
|
||||
method: "GET",
|
||||
responseType: "blob",
|
||||
onResponse({ response }) {
|
||||
if (!response.ok) {
|
||||
console.error("Download failed", response);
|
||||
const i18n = useGlobalI18n();
|
||||
alert.error(i18n.t("events.something-went-wrong"));
|
||||
return;
|
||||
}
|
||||
|
||||
const url = window.URL.createObjectURL(new Blob([response._data]));
|
||||
const link = document.createElement("a");
|
||||
link.href = url;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import DOMPurify from "isomorphic-dompurify";
|
||||
import { useFraction } from "./use-fraction";
|
||||
import type { CreateIngredientFood, CreateIngredientUnit, IngredientFood, IngredientUnit, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import type { CreateIngredientFood, CreateIngredientUnit, IngredientFood, IngredientUnit, Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
|
||||
const { frac } = useFraction();
|
||||
|
||||
@@ -36,8 +36,28 @@ function useUnitName(unit: CreateIngredientUnit | IngredientUnit | undefined, us
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
export function useParsedIngredientText(ingredient: RecipeIngredient, scale = 1, includeFormating = true) {
|
||||
const { quantity, food, unit, note, title } = ingredient;
|
||||
function useRecipeLink(recipe: Recipe | undefined, groupSlug: string | undefined): string | undefined {
|
||||
if (!(recipe && recipe.slug && recipe.name && groupSlug)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return `<a href="/g/${groupSlug}/r/${recipe.slug}" target="_blank">${recipe.name}</a>`;
|
||||
}
|
||||
|
||||
type ParsedIngredientText = {
|
||||
quantity?: string;
|
||||
unit?: string;
|
||||
name?: string;
|
||||
note?: string;
|
||||
|
||||
/**
|
||||
* If the ingredient is a linked recipe, an HTML link to the referenced recipe, otherwise undefined.
|
||||
*/
|
||||
recipeLink?: string;
|
||||
};
|
||||
|
||||
export function useParsedIngredientText(ingredient: RecipeIngredient, scale = 1, includeFormating = true, groupSlug?: string): ParsedIngredientText {
|
||||
const { quantity, food, unit, note, referencedRecipe } = ingredient;
|
||||
const usePluralUnit = quantity !== undefined && ((quantity || 0) * scale > 1 || (quantity || 0) * scale === 0);
|
||||
const usePluralFood = (!quantity) || quantity * scale > 1;
|
||||
|
||||
@@ -63,14 +83,14 @@ export function useParsedIngredientText(ingredient: RecipeIngredient, scale = 1,
|
||||
}
|
||||
|
||||
const unitName = useUnitName(unit || undefined, usePluralUnit);
|
||||
const foodName = useFoodName(food || undefined, usePluralFood);
|
||||
const ingName = referencedRecipe ? referencedRecipe.name || "" : useFoodName(food || undefined, usePluralFood);
|
||||
|
||||
return {
|
||||
title: title ? sanitizeIngredientHTML(title) : undefined,
|
||||
quantity: returnQty ? sanitizeIngredientHTML(returnQty) : undefined,
|
||||
unit: unitName && quantity ? sanitizeIngredientHTML(unitName) : undefined,
|
||||
name: foodName ? sanitizeIngredientHTML(foodName) : undefined,
|
||||
name: ingName ? sanitizeIngredientHTML(ingName) : undefined,
|
||||
note: note ? sanitizeIngredientHTML(note) : undefined,
|
||||
recipeLink: useRecipeLink(referencedRecipe || undefined, groupSlug),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -97,13 +97,8 @@ export function useShoppingListCrud(
|
||||
.sort(sortCheckedItems);
|
||||
}
|
||||
|
||||
// Update the item if it's checked, otherwise updateUncheckedListItems will handle it
|
||||
if (item.checked) {
|
||||
shoppingListItemActions.updateItem(item);
|
||||
}
|
||||
|
||||
shoppingListItemActions.updateItem(item);
|
||||
updateListItemOrder();
|
||||
updateUncheckedListItems();
|
||||
}
|
||||
|
||||
function deleteListItem(item: ShoppingListItemOut) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useToggle } from "@vueuse/core";
|
||||
import type { ShoppingListOut, ShoppingListItemOut } from "~/lib/api/types/household";
|
||||
import type { ShoppingListOut } from "~/lib/api/types/household";
|
||||
|
||||
/**
|
||||
* Composable for managing shopping list label state and operations
|
||||
@@ -36,14 +36,24 @@ export function useShoppingListLabels(shoppingList: Ref<ShoppingListOut | null>)
|
||||
);
|
||||
});
|
||||
|
||||
const labelColorByName = computed(() => {
|
||||
const map: Record<string, string | undefined> = {};
|
||||
shoppingList.value?.listItems?.forEach((item) => {
|
||||
if (!item.label) return;
|
||||
const labelName = item.label?.name || t("shopping-list.no-label");
|
||||
map[labelName] = item.label.color;
|
||||
});
|
||||
return map;
|
||||
});
|
||||
|
||||
watch(labelNames, initializeLabelOpenStates, { immediate: true });
|
||||
|
||||
function toggleShowLabel(key: string) {
|
||||
labelOpenState.value[key] = !labelOpenState.value[key];
|
||||
}
|
||||
|
||||
function getLabelColor(item: ShoppingListItemOut | null) {
|
||||
return item?.label?.color;
|
||||
function getLabelColor(label: string) {
|
||||
return labelColorByName.value[label];
|
||||
}
|
||||
|
||||
const presentLabels = computed(() => {
|
||||
|
||||
63
frontend/composables/use-default-activity.ts
Normal file
63
frontend/composables/use-default-activity.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import type { Activity, I18n, TranslationResult } from "~/lib/api/types/activity";
|
||||
import { ActivityKey } from "~/lib/api/types/activity";
|
||||
|
||||
export const DEFAULT_ACTIVITY = "/g/home" as const;
|
||||
|
||||
type ActivityRegistry = {
|
||||
recipes: Activity;
|
||||
mealplanner: Activity;
|
||||
shopping_list: Activity;
|
||||
};
|
||||
|
||||
const selectableActivities: ActivityRegistry = {
|
||||
recipes: {
|
||||
key: ActivityKey.RECIPES,
|
||||
route: groupSlug => groupSlug ? `/g/${groupSlug}` : DEFAULT_ACTIVITY,
|
||||
label: i18n => i18n.t("general.recipes"),
|
||||
},
|
||||
mealplanner: {
|
||||
key: ActivityKey.MEALPLANNER,
|
||||
route: () => "/household/mealplan/planner/view",
|
||||
label: i18n => i18n.t("meal-plan.meal-planner"),
|
||||
},
|
||||
shopping_list: {
|
||||
key: ActivityKey.SHOPPING_LIST,
|
||||
route: () => "/shopping-lists",
|
||||
label: i18n => i18n.t("shopping-list.shopping-lists"),
|
||||
},
|
||||
};
|
||||
|
||||
function getDefaultActivityRoute(activityKey?: ActivityKey, groupSlug?: string): string {
|
||||
if (!activityKey) {
|
||||
return DEFAULT_ACTIVITY;
|
||||
}
|
||||
const route = selectableActivities[activityKey]?.route ?? (() => DEFAULT_ACTIVITY);
|
||||
return route(groupSlug);
|
||||
}
|
||||
|
||||
function getDefaultActivityLabels(i18n: I18n): TranslationResult[] {
|
||||
return Object.values(selectableActivities).map(
|
||||
({ label }) => label(i18n),
|
||||
);
|
||||
}
|
||||
|
||||
function getActivityKey(i18n: I18n, target: TranslationResult = ""): ActivityKey | undefined {
|
||||
return Object.values(selectableActivities)
|
||||
.find(({ label }) => label(i18n) === target)?.key;
|
||||
}
|
||||
|
||||
function getActivityLabel(i18n: I18n, target?: ActivityKey): TranslationResult {
|
||||
return Object.values(selectableActivities)
|
||||
.find(({ key }) => key === target)
|
||||
?.label(i18n) ?? "";
|
||||
}
|
||||
|
||||
export default function useDefaultActivity() {
|
||||
return {
|
||||
selectableActivities,
|
||||
getDefaultActivityRoute,
|
||||
getDefaultActivityLabels,
|
||||
getActivityKey,
|
||||
getActivityLabel,
|
||||
};
|
||||
}
|
||||
@@ -21,19 +21,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Українська (Ukrainian)",
|
||||
value: "uk-UA",
|
||||
progress: 44,
|
||||
progress: 93,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Türkçe (Turkish)",
|
||||
value: "tr-TR",
|
||||
progress: 36,
|
||||
progress: 35,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 52,
|
||||
progress: 67,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -45,7 +45,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Slovenščina (Slovenian)",
|
||||
value: "sl-SI",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -57,43 +57,43 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 40,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Română (Romanian)",
|
||||
value: "ro-RO",
|
||||
progress: 37,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Português (Portuguese)",
|
||||
value: "pt-PT",
|
||||
progress: 38,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Português do Brasil (Brazilian Portuguese)",
|
||||
value: "pt-BR",
|
||||
progress: 45,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Polski (Polish)",
|
||||
value: "pl-PL",
|
||||
progress: 42,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 39,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 49,
|
||||
progress: 54,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -117,31 +117,31 @@ export const LOCALES = [
|
||||
{
|
||||
name: "日本語 (Japanese)",
|
||||
value: "ja-JP",
|
||||
progress: 37,
|
||||
progress: 36,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Italiano (Italian)",
|
||||
value: "it-IT",
|
||||
progress: 41,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Íslenska (Icelandic)",
|
||||
value: "is-IS",
|
||||
progress: 3,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 45,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Hrvatski (Croatian)",
|
||||
value: "hr-HR",
|
||||
progress: 28,
|
||||
progress: 29,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -159,37 +159,37 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 66,
|
||||
progress: 69,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Français canadien (Canadian French)",
|
||||
value: "fr-CA",
|
||||
progress: 38,
|
||||
progress: 100,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Belge (Belgian)",
|
||||
value: "fr-BE",
|
||||
progress: 41,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Suomi (Finnish)",
|
||||
value: "fi-FI",
|
||||
progress: 37,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Eesti (Estonian)",
|
||||
value: "et-EE",
|
||||
progress: 37,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 42,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -201,25 +201,25 @@ export const LOCALES = [
|
||||
{
|
||||
name: "British English",
|
||||
value: "en-GB",
|
||||
progress: 43,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Ελληνικά (Greek)",
|
||||
value: "el-GR",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 78,
|
||||
progress: 97,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Dansk (Danish)",
|
||||
value: "da-DK",
|
||||
progress: 40,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -237,7 +237,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Български (Bulgarian)",
|
||||
value: "bg-BG",
|
||||
progress: 44,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
|
||||
@@ -30,6 +30,7 @@ interface RecipeExplorerSearchState {
|
||||
requireAllTags: boolean;
|
||||
requireAllTools: boolean;
|
||||
requireAllFoods: boolean;
|
||||
randomSeed: number;
|
||||
}>;
|
||||
selectedCategories: Ref<NoUndefinedField<RecipeCategory>[]>;
|
||||
selectedFoods: Ref<IngredientFood[]>;
|
||||
@@ -41,6 +42,7 @@ interface RecipeExplorerSearchState {
|
||||
reset: () => void;
|
||||
toggleOrderDirection: () => void;
|
||||
setOrderBy: (value: string) => void;
|
||||
setRandomOrderBy: () => void;
|
||||
filterItems: (item: RecipeCategory | RecipeTag | RecipeTool, urlPrefix: string) => void;
|
||||
initialize: () => Promise<void>;
|
||||
}
|
||||
@@ -67,6 +69,7 @@ function createRecipeExplorerSearchState(groupSlug: ComputedRef<string>): Recipe
|
||||
requireAllTags: false,
|
||||
requireAllTools: false,
|
||||
requireAllFoods: false,
|
||||
randomSeed: 0,
|
||||
});
|
||||
|
||||
// Store references
|
||||
@@ -131,9 +134,16 @@ function createRecipeExplorerSearchState(groupSlug: ComputedRef<string>): Recipe
|
||||
return {
|
||||
...passedQuery.value,
|
||||
_searchSeed: Date.now().toString(),
|
||||
_randomSeed: state.value.randomSeed,
|
||||
};
|
||||
});
|
||||
|
||||
// Update the seed to trigger a new search
|
||||
function setRandomOrderBy() {
|
||||
state.value.orderBy = "random";
|
||||
state.value.randomSeed = Date.now();
|
||||
}
|
||||
|
||||
// Wait utility for async hydration
|
||||
function waitUntilAndExecute(
|
||||
condition: () => boolean,
|
||||
@@ -442,6 +452,7 @@ function createRecipeExplorerSearchState(groupSlug: ComputedRef<string>): Recipe
|
||||
reset,
|
||||
toggleOrderDirection,
|
||||
setOrderBy,
|
||||
setRandomOrderBy,
|
||||
filterItems,
|
||||
initialize,
|
||||
};
|
||||
|
||||
@@ -112,34 +112,46 @@ export function useShoppingListItemActions(shoppingListId: string) {
|
||||
|
||||
async function getList() {
|
||||
const response = await api.shopping.lists.getOne(shoppingListId);
|
||||
if (!isOnline.value && response.data) {
|
||||
if (response.data) {
|
||||
// Merge pending local changes (both online and offline)
|
||||
const createAndUpdateQueues = mergeListItemsByLatest(queue.update, queue.create);
|
||||
response.data.listItems = mergeListItemsByLatest(response.data.listItems ?? [], createAndUpdateQueues);
|
||||
const deleteQueueIds = new Set(queue.delete.map(item => item.id));
|
||||
|
||||
const filteredLocalChanges = createAndUpdateQueues.filter(item => !deleteQueueIds.has(item.id));
|
||||
let mergedItems = mergeListItemsByLatest(response.data.listItems ?? [], filteredLocalChanges);
|
||||
mergedItems = mergedItems.filter(item => !deleteQueueIds.has(item.id));
|
||||
|
||||
response.data.listItems = mergedItems;
|
||||
}
|
||||
return response.data;
|
||||
}
|
||||
|
||||
function createItem(item: ShoppingListItemOut) {
|
||||
removeFromQueue(queue.create, item);
|
||||
removeFromQueue(queue.update, item);
|
||||
removeFromQueue(queue.delete, item);
|
||||
|
||||
queue.create.push(item);
|
||||
}
|
||||
|
||||
function updateItem(item: ShoppingListItemOut) {
|
||||
const removedFromCreate = removeFromQueue(queue.create, item);
|
||||
if (removedFromCreate) {
|
||||
// this item hasn't been created yet, so we don't need to update it
|
||||
queue.create.push(item);
|
||||
return;
|
||||
}
|
||||
|
||||
removeFromQueue(queue.update, item);
|
||||
queue.update.push(item);
|
||||
removeFromQueue(queue.delete, item);
|
||||
|
||||
if (removedFromCreate) {
|
||||
// This item hasn't been created yet, so keep it in create queue with updated data
|
||||
queue.create.push(item);
|
||||
}
|
||||
else {
|
||||
queue.update.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
function deleteItem(item: ShoppingListItemOut) {
|
||||
const removedFromCreate = removeFromQueue(queue.create, item);
|
||||
if (removedFromCreate) {
|
||||
// this item hasn't been created yet, so we don't need to delete it
|
||||
// This item hasn't been created yet, so we don't need to delete it
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -198,10 +210,12 @@ export function useShoppingListItemActions(shoppingListId: string) {
|
||||
|
||||
try {
|
||||
const itemsToProcess = [...queueItems];
|
||||
const itemIdsToProcess = itemsToProcess.map(item => item.id);
|
||||
|
||||
await action(itemsToProcess)
|
||||
.then(() => {
|
||||
if (isOnline.value) {
|
||||
clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id));
|
||||
clearQueueItems(itemQueueType, itemIdsToProcess);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useLocalStorage, useSessionStorage } from "@vueuse/core";
|
||||
import { ActivityKey } from "~/lib/api/types/activity";
|
||||
import type { RegisteredParser, TimelineEventType } from "~/lib/api/types/recipe";
|
||||
import type { QueryFilterJSON } from "~/lib/api/types/response";
|
||||
|
||||
@@ -7,6 +8,7 @@ export interface UserPrintPreferences {
|
||||
showDescription: boolean;
|
||||
showNotes: boolean;
|
||||
showNutrition: boolean;
|
||||
expandChildRecipes: boolean;
|
||||
}
|
||||
|
||||
export interface UserSearchQuery {
|
||||
@@ -65,6 +67,10 @@ export interface UserRecipeCreatePreferences {
|
||||
parseRecipe: boolean;
|
||||
}
|
||||
|
||||
export interface UserActivityPreferences {
|
||||
defaultActivity: ActivityKey;
|
||||
}
|
||||
|
||||
export function useUserMealPlanPreferences(): Ref<UserMealPlanPreferences> {
|
||||
const fromStorage = useLocalStorage(
|
||||
"meal-planner-preferences",
|
||||
@@ -86,6 +92,7 @@ export function useUserPrintPreferences(): Ref<UserPrintPreferences> {
|
||||
imagePosition: "left",
|
||||
showDescription: true,
|
||||
showNotes: true,
|
||||
expandChildRecipes: false,
|
||||
},
|
||||
{ mergeDefaults: true },
|
||||
// we cast to a Ref because by default it will return an optional type ref
|
||||
@@ -115,6 +122,20 @@ export function useUserSortPreferences(): Ref<UserRecipePreferences> {
|
||||
return fromStorage;
|
||||
}
|
||||
|
||||
export function useUserActivityPreferences(): Ref<UserActivityPreferences> {
|
||||
const fromStorage = useLocalStorage(
|
||||
"activity-preferences",
|
||||
{
|
||||
defaultActivity: ActivityKey.RECIPES,
|
||||
},
|
||||
{ mergeDefaults: true },
|
||||
// we cast to a Ref because by default it will return an optional type ref
|
||||
// but since we pass defaults we know all properties are set.
|
||||
) as Ref<UserActivityPreferences>;
|
||||
|
||||
return fromStorage;
|
||||
}
|
||||
|
||||
export function useUserSearchQuerySession(): Ref<UserSearchQuery> {
|
||||
const fromStorage = useSessionStorage(
|
||||
"search-query",
|
||||
|
||||
@@ -5,9 +5,9 @@ const userRatings = ref<UserRatingSummary[]>([]);
|
||||
const loading = ref(false);
|
||||
const ready = ref(false);
|
||||
|
||||
const $auth = useMealieAuth();
|
||||
|
||||
export const useUserSelfRatings = function () {
|
||||
const $auth = useMealieAuth();
|
||||
|
||||
async function refreshUserRatings() {
|
||||
if (!$auth.user.value || loading.value) {
|
||||
return;
|
||||
|
||||
156
frontend/composables/useAuthBackend.ts
Normal file
156
frontend/composables/useAuthBackend.ts
Normal file
@@ -0,0 +1,156 @@
|
||||
import { ref, computed } from "vue";
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
interface AuthData {
|
||||
value: UserOut | null;
|
||||
}
|
||||
|
||||
interface AuthStatus {
|
||||
value: "loading" | "authenticated" | "unauthenticated";
|
||||
}
|
||||
|
||||
interface AuthState {
|
||||
data: AuthData;
|
||||
status: AuthStatus;
|
||||
signIn: (credentials: FormData, options?: { redirect?: boolean }) => Promise<void>;
|
||||
signOut: (callbackUrl?: string) => Promise<void>;
|
||||
refresh: () => Promise<void>;
|
||||
getSession: () => Promise<void>;
|
||||
setToken: (token: string | null) => void;
|
||||
}
|
||||
|
||||
const authUser = ref<UserOut | null>(null);
|
||||
const authStatus = ref<"loading" | "authenticated" | "unauthenticated">("loading");
|
||||
|
||||
export const useAuthBackend = function (): AuthState {
|
||||
const { $appInfo, $axios } = useNuxtApp();
|
||||
const router = useRouter();
|
||||
|
||||
const runtimeConfig = useRuntimeConfig();
|
||||
const tokenName = runtimeConfig.public.AUTH_TOKEN;
|
||||
const tokenCookie = useCookie(tokenName, {
|
||||
maxAge: $appInfo.tokenTime * 60 * 60,
|
||||
secure: $appInfo.production && window?.location?.protocol === "https:",
|
||||
});
|
||||
|
||||
function setToken(token: string | null) {
|
||||
tokenCookie.value = token;
|
||||
}
|
||||
|
||||
function handleAuthError(error: any, redirect = false) {
|
||||
// Only clear token on auth errors, not network errors
|
||||
if (error?.response?.status === 401) {
|
||||
setToken(null);
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
if (redirect) {
|
||||
router.push("/login");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function getSession(): Promise<void> {
|
||||
if (!tokenCookie.value) {
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
return;
|
||||
}
|
||||
|
||||
authStatus.value = "loading";
|
||||
try {
|
||||
const { data } = await $axios.get<UserOut>("/api/users/self");
|
||||
authUser.value = data;
|
||||
authStatus.value = "authenticated";
|
||||
}
|
||||
catch (error: any) {
|
||||
console.error("Failed to fetch user session:", error);
|
||||
handleAuthError(error);
|
||||
authStatus.value = "unauthenticated";
|
||||
}
|
||||
}
|
||||
|
||||
async function signIn(credentials: FormData): Promise<void> {
|
||||
authStatus.value = "loading";
|
||||
|
||||
try {
|
||||
const response = await $axios.post("/api/auth/token", credentials, {
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
});
|
||||
|
||||
const { access_token } = response.data;
|
||||
setToken(access_token);
|
||||
await getSession();
|
||||
}
|
||||
catch (error) {
|
||||
authStatus.value = "unauthenticated";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function signOut(callbackUrl: string = ""): Promise<void> {
|
||||
try {
|
||||
await $axios.post("/api/auth/logout");
|
||||
}
|
||||
catch (error) {
|
||||
// Continue with logout even if API call fails
|
||||
console.warn("Logout API call failed:", error);
|
||||
}
|
||||
finally {
|
||||
setToken(null);
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
await router.push(callbackUrl || "/login");
|
||||
}
|
||||
}
|
||||
|
||||
async function refresh(): Promise<void> {
|
||||
if (!tokenCookie.value) return;
|
||||
|
||||
try {
|
||||
const response = await $axios.get("/api/auth/refresh");
|
||||
const { access_token } = response.data;
|
||||
setToken(access_token);
|
||||
await getSession();
|
||||
}
|
||||
catch (error: any) {
|
||||
handleAuthError(error, true);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-refresh user data periodically when authenticated
|
||||
if (import.meta.client) {
|
||||
let refreshInterval: NodeJS.Timeout | null = null;
|
||||
|
||||
watch(() => authStatus.value, (status) => {
|
||||
if (status === "authenticated") {
|
||||
refreshInterval = setInterval(() => {
|
||||
if (tokenCookie.value) {
|
||||
getSession().catch(() => {
|
||||
// Ignore errors in background refresh
|
||||
});
|
||||
}
|
||||
}, 5 * 60 * 1000); // 5 minutes
|
||||
}
|
||||
else {
|
||||
// Clear interval when not authenticated
|
||||
if (refreshInterval) {
|
||||
clearInterval(refreshInterval);
|
||||
refreshInterval = null;
|
||||
}
|
||||
}
|
||||
}, { immediate: true });
|
||||
}
|
||||
|
||||
return {
|
||||
data: computed(() => authUser.value),
|
||||
status: computed(() => authStatus.value),
|
||||
signIn,
|
||||
signOut,
|
||||
refresh,
|
||||
getSession,
|
||||
setToken,
|
||||
};
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ref, watch, computed } from "vue";
|
||||
import { useAuthBackend } from "~/composables/useAuthBackend";
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
export const useMealieAuth = function () {
|
||||
const auth = useAuth();
|
||||
const { setToken } = useAuthState();
|
||||
const auth = useAuthBackend();
|
||||
const { $axios } = useNuxtApp();
|
||||
|
||||
// User Management
|
||||
@@ -40,7 +40,7 @@ export const useMealieAuth = function () {
|
||||
async function oauthSignIn() {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const { data: token } = await $axios.get<{ access_token: string; token_type: "bearer" }>("/api/auth/oauth/callback", { params });
|
||||
setToken(token.access_token);
|
||||
auth.setToken(token.access_token);
|
||||
await auth.getSession();
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ export const useMealieAuth = function () {
|
||||
loggedIn,
|
||||
signIn: auth.signIn,
|
||||
signOut: auth.signOut,
|
||||
signUp: auth.signUp,
|
||||
refresh: auth.refresh,
|
||||
oauthSignIn,
|
||||
};
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie kan resepte van Tandoor invoer. Voer jou data uit in die \"Standaardformaat\" en laai dan die .zip-lêer op.",
|
||||
"title": "Tandoor resepte"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Resep migrasie",
|
||||
"recipe-data-migrations-explanation": "Jy kan resepte vanaf 'n ander program in Mealie invoer. Op hierdie manier kan jy vinnig aan die gang kom.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Pogings om 'n paragraaf te verdeel deur die '1)' of '1.' patrone om te gebruik",
|
||||
"import-by-url": "Voer 'n resep vanaf 'n webwerf in",
|
||||
"create-manually": "Skep 'n resep met die hand",
|
||||
"make-recipe-image": "Maak dit die prentjie vir hierdie resep"
|
||||
"make-recipe-image": "Maak dit die prentjie vir hierdie resep",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Bladsy nie gevind nie",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Resep uitgevee",
|
||||
"recipe-image": "Resep foto",
|
||||
"recipe-image-updated": "Resep foto is opgedateer",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Resepnaam",
|
||||
"recipe-settings": "Resep verstellings",
|
||||
"recipe-update-failed": "Kon nie resep opdateer nie",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Kies 'n eenheid",
|
||||
"press-enter-to-create": "Druk Enter om te skep",
|
||||
"choose-food": "Keuse van kos",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notas",
|
||||
"toggle-section": "Wissel afdeling",
|
||||
"see-original-text": "Sien oorspronklike teks",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Ek het dit gemaak",
|
||||
"how-did-it-turn-out": "Hoe het dit uitgedraai?",
|
||||
"user-made-this": "{user} het dit gemaak",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Druk '/'",
|
||||
"advanced": "Gevorderd",
|
||||
"auto-search": "Outomatiese soektog",
|
||||
"no-results": "No results found"
|
||||
"no-results": "No results found",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Voeg 'n nuwe tema by",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "vertaal",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "يمكن لميلي استيراد الوصفات من تندور. يجب تصدير بياناتك بالتنسيق \"الافتراضي\"، ثم يجب تحميل المِلَفّ المضغوط أدناه.",
|
||||
"title": "وصفات تاندور"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "وصفة 2",
|
||||
"recipe-data-migrations-explanation": "يمكن نقل الوصفات من تطبيق آخر مدعوم إلى ميلي. هذه طريقة رائعة للبدء مع ميلي.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "هل تأتي من تطبيق آخر أو حتى إصدار قديم من ميلي؟ يجب التحقق من عمليات الترحيل لمعرفة ما إذا كان يمكن استيراد بياناتك.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
|
||||
"import-by-url": "استيراد وصفة عن طريق عنوان URL",
|
||||
"create-manually": "إنشاء وصفة يدوياً",
|
||||
"make-recipe-image": "اجعل هذه صورة الوصفة"
|
||||
"make-recipe-image": "اجعل هذه صورة الوصفة",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404: لم يتم العثور على الصفحة",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "تم حذف الوصفة",
|
||||
"recipe-image": "صورة الوصفة",
|
||||
"recipe-image-updated": "تم تحديث صورة الوصفة",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "اسم الوصفة",
|
||||
"recipe-settings": "إعدادات الوصفة",
|
||||
"recipe-update-failed": "فشل تحديث الوصفة",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "اختر الوحدة",
|
||||
"press-enter-to-create": "",
|
||||
"choose-food": "اختيار الطعام",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "ملاحظات",
|
||||
"toggle-section": "",
|
||||
"see-original-text": "عرض النص الأصلي",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "لقد طبخت هذا",
|
||||
"how-did-it-turn-out": "كيف كانت النتيجة؟",
|
||||
"user-made-this": "{user} طبخ هذه",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "البحث عن الوصفات",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "اضغط '/'",
|
||||
"advanced": "الإعدادات المتقدمة",
|
||||
"auto-search": "البحث التلقائي",
|
||||
"no-results": "لم يتم العثور على نتائج"
|
||||
"no-results": "لم يتم العثور على نتائج",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "إضافة سمة جديدة",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "لا تريد رؤية هذه الرسالة بعد الآن؟ تأكد من تغيير بريدك الإلكتروني في إعدادات المستخدم الخاصة بك!",
|
||||
"forgot-password": "نسيت كلمة المرور",
|
||||
"forgot-password-text": "الرجاء إدخال بريدك الإلكتروني وسنرسل لك رابطًا لإعادة تعيين كلمة المرور الخاصة بك.",
|
||||
"changes-reflected-immediately": "التغييرات التي ستطرأ على هذا المستخدم ستنعكس على الفور."
|
||||
"changes-reflected-immediately": "التغييرات التي ستطرأ على هذا المستخدم ستنعكس على الفور.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "مترجم",
|
||||
|
||||
@@ -4,25 +4,25 @@
|
||||
"about-mealie": "Относно Mealie",
|
||||
"api-docs": "API Документация",
|
||||
"api-port": "API Порт",
|
||||
"application-mode": "Режим на приложение",
|
||||
"application-mode": "Статус на приложението",
|
||||
"database-type": "Тип на база данни",
|
||||
"database-url": "URL адрес база данни",
|
||||
"default-group": "Група по подразбиране",
|
||||
"default-household": "Домакинство по подразбиране",
|
||||
"demo": "Демо",
|
||||
"demo-status": "Статус на Демото",
|
||||
"demo-status": "Статус на демо-версията",
|
||||
"development": "Разработване",
|
||||
"docs": "Документи",
|
||||
"download-log": "Дневник на изтеглянията",
|
||||
"download-recipe-json": "Последно обработен json файл",
|
||||
"github": "GitHub",
|
||||
"log-lines": "Редове от лога",
|
||||
"not-demo": "Не е демо",
|
||||
"not-demo": "Не е демо-версия",
|
||||
"portfolio": "Портфолио",
|
||||
"production": "Производствена среда",
|
||||
"support": "Поддръжка",
|
||||
"version": "Версия",
|
||||
"unknown-version": "неизвестно",
|
||||
"unknown-version": "неизвестен",
|
||||
"sponsor": "Спонсори"
|
||||
},
|
||||
"asset": {
|
||||
@@ -55,16 +55,16 @@
|
||||
"database": "База данни",
|
||||
"delete-event": "Изтриване на събитие",
|
||||
"event-delete-confirmation": "Наистина ли искате да премахнете това събитие?",
|
||||
"event-deleted": "Събитието изтрито",
|
||||
"event-updated": "Събитие Обновено",
|
||||
"event-deleted": "Събитието бе изтрито",
|
||||
"event-updated": "Събитието бе обновено",
|
||||
"new-notification-form-description": "Mealie използва библиотеката Apprise да генерира нотификации. Тя предлага много опции за услуги и нотификации. Прегледайте нейната Wiki страница за подробен гайд как да създадете URL за вашата услуга. Ако е налично, селектирайки типа на нотификацията може да са налични допълнителни функционалности.",
|
||||
"new-version": "Налична е нова версия!",
|
||||
"notification": "Известие",
|
||||
"refresh": "Опресни",
|
||||
"refresh": "Опресняване",
|
||||
"scheduled": "Планирано",
|
||||
"something-went-wrong": "Нещо се обърка!",
|
||||
"subscribed-events": "Планирани събития",
|
||||
"test-message-sent": "Тестово съобщение е изпратено",
|
||||
"test-message-sent": "Тестовото съобщение бе изпратено",
|
||||
"message-sent": "Съобщението е изпратено",
|
||||
"new-notification": "Ново известие",
|
||||
"event-notifiers": "Известия за събитие",
|
||||
@@ -97,11 +97,11 @@
|
||||
"custom": "Персонализиран",
|
||||
"dashboard": "Табло",
|
||||
"delete": "Изтриване",
|
||||
"disabled": "Деактивирано",
|
||||
"disabled": "Изключено",
|
||||
"download": "Изтегли",
|
||||
"duplicate": "Дублиране",
|
||||
"edit": "Редактирай",
|
||||
"enabled": "Активиран",
|
||||
"enabled": "Включено",
|
||||
"exception": "Грешка",
|
||||
"failed-count": "Неуспешни: {count}",
|
||||
"failure-uploading-file": "Неуспешно качване на файл",
|
||||
@@ -128,8 +128,8 @@
|
||||
"message": "Съобщение",
|
||||
"monday": "Понеделник",
|
||||
"name": "Име",
|
||||
"new": "Нов",
|
||||
"never": "никога",
|
||||
"new": "Добавяне",
|
||||
"never": "няма данни",
|
||||
"no": "Не",
|
||||
"no-recipe-found": "Няма намерени рецепти",
|
||||
"ok": "Добре",
|
||||
@@ -145,9 +145,9 @@
|
||||
"rename-object": "Преименувай {0}",
|
||||
"reset": "По подразбиране",
|
||||
"saturday": "Събота",
|
||||
"save": "Запази",
|
||||
"save": "Запазване",
|
||||
"settings": "Настройки",
|
||||
"share": "Сподели",
|
||||
"share": "Споделяне",
|
||||
"show-all": "Покажи всички",
|
||||
"shuffle": "Разбъркано",
|
||||
"sort": "Сортирай",
|
||||
@@ -159,13 +159,13 @@
|
||||
"submit": "Изпрати",
|
||||
"success-count": "Успешни: {count}",
|
||||
"sunday": "Неделя",
|
||||
"system": "Система",
|
||||
"system": "В хронологичен ред",
|
||||
"templates": "Шаблони:",
|
||||
"test": "Тест",
|
||||
"themes": "Теми",
|
||||
"thursday": "четвъртък",
|
||||
"title": "Заглавие",
|
||||
"token": "Токън",
|
||||
"token": "Токен",
|
||||
"tuesday": "Вторник",
|
||||
"type": "Тип",
|
||||
"update": "Актуализация",
|
||||
@@ -180,7 +180,7 @@
|
||||
"back": "Назад",
|
||||
"next": "Напред",
|
||||
"start": "Начало",
|
||||
"toggle-view": "Превключване на режим",
|
||||
"toggle-view": "Смяна на изгледа",
|
||||
"date": "Дата",
|
||||
"id": "Id",
|
||||
"owner": "Собственик",
|
||||
@@ -340,7 +340,7 @@
|
||||
"rule-day": "Ден от седмицата",
|
||||
"meal-type": "Вид ястие",
|
||||
"breakfast": "Закуска",
|
||||
"lunch": "обяд",
|
||||
"lunch": "Обяд",
|
||||
"dinner": "Вечеря",
|
||||
"type-any": "Всички",
|
||||
"day-any": "Всички",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie може да импортира рецепти от Tandoor. Експортирайте данните в стандартния формат и ги качете като .zip файл по-долу.",
|
||||
"title": "Tandoor рецепти"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie може да импортира рецепти от DVO Cook'n X3. Експортирайте готварска книга или меню във формат \"Cook'n\", преименувайте разширението за експортиране на .zip и след това качете .zip файла по-долу.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Миграция на данни на рецепти",
|
||||
"recipe-data-migrations-explanation": "Рецептите могат да бъдат мигрирани от други приложения поддържани от Mealie. Това е добър начин да започнете използването си на Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Идваш от друго приложение или дори по-стара версия на Mealie? Провери миграциите и виж дали данните ти могат да бъдат импорторани.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Опитва се да раздели параграф по '1)' or '1.' модел",
|
||||
"import-by-url": "Импортиране на рецепта от линк",
|
||||
"create-manually": "Създай рецепта ръчно",
|
||||
"make-recipe-image": "Задай като изображението на рецептата"
|
||||
"make-recipe-image": "Задай като изображението на рецептата",
|
||||
"add-food": "Добавяне на продукт",
|
||||
"add-recipe": "Добавяне на рецепта"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Страницата не е намерена",
|
||||
@@ -471,7 +477,7 @@
|
||||
"categories": "Категории",
|
||||
"cholesterol-content": "Холестерол",
|
||||
"comment-action": "Коментирай",
|
||||
"comment": "Коментар",
|
||||
"comment": "Добавен коментар",
|
||||
"comments": "Коментари",
|
||||
"delete-confirmation": "Сигурни ли сте, че желаете да изтриете тази рецепта?",
|
||||
"admin-delete-confirmation": "Ще изтриете рецепта, която не е ваша, използвайки администраторски права. Сигурни ли сте?",
|
||||
@@ -490,8 +496,8 @@
|
||||
"insert-ingredient": "Въведете съставка",
|
||||
"insert-section": "Въведете раздел",
|
||||
"insert-above": "Вмъкни отгоре",
|
||||
"insert-below": "Вмъкни по-долу",
|
||||
"instructions": "Инструкции",
|
||||
"insert-below": "Вмъкни отдолу",
|
||||
"instructions": "Начин на приготвяне",
|
||||
"key-name-required": "Ключовото име е задължително",
|
||||
"landscape-view-coming-soon": "Пейзажен изглед",
|
||||
"milligrams": "милиграма",
|
||||
@@ -506,11 +512,14 @@
|
||||
"prep-time": "Време за подготовка",
|
||||
"protein-content": "Белтъци",
|
||||
"public-recipe": "Публична рецепта",
|
||||
"recipe-created": "Рецептата е създадена",
|
||||
"recipe-created": "Нова рецепта",
|
||||
"recipe-creation-failed": "Създаването на рецепта беше неуспешно",
|
||||
"recipe-deleted": "Рецептата е изтрита",
|
||||
"recipe-image": "Изображение на рецептата",
|
||||
"recipe-image-updated": "Изображението на рецептата беше обновено",
|
||||
"delete-image": "Итриване на изображението на рецептата",
|
||||
"delete-image-confirmation": "Сигурни ли сте, че желаете да изтриете изображението на рецептата?",
|
||||
"recipe-image-deleted": "Изображението на рецептата беше изтрито",
|
||||
"recipe-name": "Наименование",
|
||||
"recipe-settings": "Настройки на рецептата",
|
||||
"recipe-update-failed": "Обновяването на рецептата беше неуспешно",
|
||||
@@ -539,8 +548,8 @@
|
||||
"entry-type": "Тип на записа",
|
||||
"date-format-hint": "MM/DD/YYYY формат",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD формат",
|
||||
"add-to-list": "Добавяне към списък",
|
||||
"add-to-plan": "Добавяне към план",
|
||||
"add-to-list": "Добавяне към списък за пазаруване",
|
||||
"add-to-plan": "Добави към меню",
|
||||
"add-to-timeline": "Добавяне към историята на събитията",
|
||||
"recipe-added-to-list": "Рецептата е добавена към списъка",
|
||||
"recipes-added-to-list": "Рецептите са добавени към списъка",
|
||||
@@ -553,20 +562,21 @@
|
||||
"yields-amount-with-text": "Порции {amount} {text}",
|
||||
"yield-text": "Забележка",
|
||||
"quantity": "Количество",
|
||||
"choose-unit": "Избери единица",
|
||||
"choose-unit": "Избери мерна единица",
|
||||
"press-enter-to-create": "Натисните Enter за да създадете",
|
||||
"choose-food": "Избери продукт",
|
||||
"choose-recipe": "Избор на рецепта",
|
||||
"notes": "Бележки",
|
||||
"toggle-section": "Превключване на раздела",
|
||||
"toggle-section": "Създай раздел",
|
||||
"see-original-text": "Виж оригиналния текст",
|
||||
"original-text-with-value": "Оригинален текст: {originalText}",
|
||||
"ingredient-linker": "Инструмент за свързване на съставки",
|
||||
"unlinked": "Все още не е свързано",
|
||||
"linked-to-other-step": "Свързано към друга стъпка",
|
||||
"auto": "Автоматично",
|
||||
"cook-mode": "Начин на приготвяне",
|
||||
"link-ingredients": "Свържи съставките",
|
||||
"merge-above": "Обедини с по-горната",
|
||||
"cook-mode": "Инструкции",
|
||||
"link-ingredients": "Свържи съставки",
|
||||
"merge-above": "Обедини с по-горната стъпка",
|
||||
"move-to-bottom": "Премести най-долу",
|
||||
"move-to-top": "Премести най-горе",
|
||||
"reset-scale": "Оригинален мащаб",
|
||||
@@ -579,10 +589,11 @@
|
||||
"timeline-is-empty": "Няма история на събитията. Опитайте да приготвите рецептата!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Няма намерени събития. Опитайте да промените филтрите си за търсене.",
|
||||
"group-global-timeline": "{groupName} История на събитията",
|
||||
"open-timeline": "История на събитията",
|
||||
"open-timeline": "Хронология на събитията",
|
||||
"made-this": "Сготвих рецептата",
|
||||
"how-did-it-turn-out": "Как се получи?",
|
||||
"user-made-this": "{user} направи това",
|
||||
"user-made-this": "{user} сготви",
|
||||
"made-for-recipe": "Направено за {recipe}",
|
||||
"added-to-timeline": "Добавено към историята на събитията",
|
||||
"failed-to-add-to-timeline": "Неуспешно добавяне към историята на събитията",
|
||||
"failed-to-update-recipe": "Неуспешно актуализиране на рецептата",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Можете да импортирате директно от сурови данни",
|
||||
"import-original-keywords-as-tags": "Добави оригиналните ключови думи като етикети",
|
||||
"stay-in-edit-mode": "Остани в режим на редакция",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Анализиране на съставките на рецептата след импортиране",
|
||||
"import-from-zip": "Импортирай от Zip",
|
||||
"import-from-zip-description": "Импортирай рецепта, която е била експортирана от друга инстанция на Mealie.",
|
||||
"import-from-html-or-json": "Импортиране от HTML или JSON",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Тази мерна единица не може да бъде анализирана автоматично",
|
||||
"this-food-could-not-be-parsed-automatically": "Тази храна не може да бъде анализирана автоматично",
|
||||
"no-food": "Не е зададен вид храна",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Прегледайте анализираните съставки",
|
||||
"confidence-score": "Индекс на доверие",
|
||||
"ingredient-parser-description": "Съставките бяха успешно анализирани. Моля, прегледайте съставките, за които не сме сигурни.",
|
||||
"ingredient-parser-final-review-description": "След като всички съставки бъдат прегледани, ще имате още една възможност да ги прегледате, преди да приложите промените към рецептата си.",
|
||||
"add-text-as-alias-for-item": "Добавете „{text}“ като псевдоним за {item}",
|
||||
"delete-item": "Изтриване"
|
||||
},
|
||||
"reset-servings-count": "Нулиране на броя на порциите",
|
||||
"not-linked-ingredients": "Допълнителни съставки",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Качване на изображения",
|
||||
"upload-more-images": "Качете още изображения",
|
||||
"set-as-cover-image": "Задай като изображение на корицата на рецептата",
|
||||
"cover-image": "Изображение на корицата"
|
||||
"cover-image": "Изображение на корицата",
|
||||
"include-linked-recipes": "Влючване на свързаните рецепти",
|
||||
"include-linked-recipe-ingredients": "Включване на съставките от свързаните рецепти",
|
||||
"toggle-recipe": "Превключване на рецептата"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Търсачка на рецепти",
|
||||
@@ -721,11 +735,12 @@
|
||||
"search-hint": "Натисни '/'",
|
||||
"advanced": "Разширени",
|
||||
"auto-search": "Автоматично търсене",
|
||||
"no-results": "Не са намерени резултати"
|
||||
"no-results": "Не са намерени резултати",
|
||||
"type-to-search": "Въведете текст за търсене..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Добавяне на нова тема",
|
||||
"admin-settings": "Административни настройки",
|
||||
"admin-settings": "Системни настройки",
|
||||
"backup": {
|
||||
"backup-created": "Архивът е създаден успешно",
|
||||
"backup-created-at-response-export_path": "Резервно копие е създадено в {path}",
|
||||
@@ -737,7 +752,7 @@
|
||||
"delete-backup": "Изтрий резервно копие",
|
||||
"error-creating-backup-see-log-file": "Грешка при създаването на резервно копие. Виж лог файла",
|
||||
"full-backup": "Пълно резервно копие",
|
||||
"import-summary": "Обобщение на импортирането",
|
||||
"import-summary": "Преглед на импортирането",
|
||||
"partial-backup": "Частично резервно копие",
|
||||
"unable-to-delete-backup": "Невъзможно е да се изтрие това резервно копие.",
|
||||
"experimental-description": "Резервните копия са моменти копия на базата данни и директорията за данни на сайта. Това включва цялата информация и е невъзможно да изключите определени раздели от информация. Може да гледате на това като моменти копия на Mealie за специфично време. Те служат като агностичен начин за експортиране на базата данни и импортиране на данни или архивиране на сайта към външна локация.",
|
||||
@@ -751,7 +766,7 @@
|
||||
},
|
||||
"backup-and-exports": "Резервни копия",
|
||||
"change-password": "Смяна на парола",
|
||||
"current": "Версия:",
|
||||
"current": "Версия на приложението:",
|
||||
"custom-pages": "Допълнителни страници",
|
||||
"edit-page": "Редактиране на страница",
|
||||
"events": "Събития",
|
||||
@@ -788,7 +803,7 @@
|
||||
"error-creating-theme-see-log-file": "Грешка при създаването на темата. Виж лог файла.",
|
||||
"error-deleting-theme": "Грешка при изтриването на темата",
|
||||
"error-updating-theme": "Грешка при актуализирането на темата",
|
||||
"info": "Инфо",
|
||||
"info": "Информация",
|
||||
"light": "Светла",
|
||||
"primary": "Основен",
|
||||
"secondary": "Вторичен",
|
||||
@@ -853,7 +868,7 @@
|
||||
"failed": "Неуспешно",
|
||||
"general-about": "Основни настройки",
|
||||
"application-version": "Версия на приложението",
|
||||
"application-version-error-text": "Вашата текуща версия ({0}) не съответства на най-новата версия. Обмисляте актуализиране до най-новата версия ({1}).",
|
||||
"application-version-error-text": "Вашата текуща версия ({0}) не съответства на най-новата версия. Обмислете актуализиране до най-новата версия ({1}).",
|
||||
"mealie-is-up-to-date": "Mealie е обновен до актуалната версия",
|
||||
"secure-site": "Сигурен сайт",
|
||||
"secure-site-error-text": "Сервирайте чрез localhost или защитено с https. Клипбордът и допълнителните API на браузъра може да не работят.",
|
||||
@@ -864,7 +879,7 @@
|
||||
"ldap-ready": "Използва LDAP",
|
||||
"ldap-ready-error-text": "Не всички LDAP стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате LDAP удостоверяване.",
|
||||
"ldap-ready-success-text": "Задължителните LDAP променливи са зададени.",
|
||||
"build": "Компилинирана версия",
|
||||
"build": "GitHub версия",
|
||||
"recipe-scraper-version": "Версия на скрепер на рецепти",
|
||||
"oidc-ready": "Готов за OIDC",
|
||||
"oidc-ready-error-text": "Не всички OIDC стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате OIDC удостоверяване.",
|
||||
@@ -932,7 +947,7 @@
|
||||
},
|
||||
"signup": {
|
||||
"error-signing-up": "Грешка при регистирането",
|
||||
"sign-up": "Регистриране",
|
||||
"sign-up": "Регистрация",
|
||||
"sign-up-link-created": "Линкът за регистриране е създаден",
|
||||
"sign-up-link-creation-failed": "Линкът за регистриране не беше създаден",
|
||||
"sign-up-links": "Линкове за регистриране",
|
||||
@@ -954,14 +969,14 @@
|
||||
"tag": "Етикет"
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Инструменти",
|
||||
"tools": "Прибори",
|
||||
"on-hand": "Наличности",
|
||||
"create-a-tool": "Създаване на инструмент",
|
||||
"tool-name": "Име на инструмента",
|
||||
"create-new-tool": "Създаване на нов инструмент",
|
||||
"on-hand-checkbox-label": "Показване като налични (отметнато)",
|
||||
"required-tools": "Задължителни инструменти",
|
||||
"tool": "Инструменти"
|
||||
"tool": "Прибори"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Админ",
|
||||
@@ -1001,8 +1016,8 @@
|
||||
"password-strength": "Сигурността на паролата е {strength}",
|
||||
"please-enter-password": "Моля, въведете новата си парола.",
|
||||
"register": "Регистриране",
|
||||
"reset-password": "Нулиране на паролата",
|
||||
"sign-in": "Влизане",
|
||||
"reset-password": "Забравена парола",
|
||||
"sign-in": "Вход в системата",
|
||||
"total-mealplans": "Хранителни планове общо",
|
||||
"total-users": "Общо потребители",
|
||||
"upload-photo": "Качете снимка",
|
||||
@@ -1041,7 +1056,7 @@
|
||||
"very-strong": "Много силна"
|
||||
},
|
||||
"user-management": "Управление на потребителя",
|
||||
"reset-locked-users": "Нулиране на заключените потребители",
|
||||
"reset-locked-users": "Отключване на заключените потребители",
|
||||
"admin-user-creation": "Създаване на администратор",
|
||||
"admin-user-management": "Управление на администраторите",
|
||||
"user-details": "Детайли за потребителя",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Искате ли да виждате това по-често? Уверете се, че сте конфигурирали настройките си за email известяване правилно!",
|
||||
"forgot-password": "Забравена Парола",
|
||||
"forgot-password-text": "Въведете Вашият имейл адрес и ние ще ви изпратим линк, с който да промените Вашата парола.",
|
||||
"changes-reflected-immediately": "Промените по този потребител ще бъдат отразени моментално."
|
||||
"changes-reflected-immediately": "Промените по този потребител ще бъдат отразени моментално.",
|
||||
"default-activity": "Действие по подразбиране",
|
||||
"default-activity-hint": "Изберете коя страница искате да отворите, след като влезете от това устройство"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "преведено",
|
||||
@@ -1080,7 +1097,7 @@
|
||||
"create-food": "Създай продукт",
|
||||
"food-label": "Заглавие на храната",
|
||||
"edit-food": "Редактирай храна",
|
||||
"food-data": "Данни за храните",
|
||||
"food-data": "Продукти",
|
||||
"example-food-singular": "пример: Домат",
|
||||
"example-food-plural": "пример: Домати",
|
||||
"label-overwrite-warning": "Това ще присвои избрания етикет на всички избрани храни и евентуално ще презапише съществуващите ви етикети.",
|
||||
@@ -1251,8 +1268,8 @@
|
||||
"maintenance": {
|
||||
"storage-details": "Подробности за мястото за съхранение",
|
||||
"page-title": "Поддръжка на сайта",
|
||||
"summary-title": "Обобщение",
|
||||
"button-label-get-summary": "Вземи обобщение",
|
||||
"summary-title": "Преглед на ресурсите",
|
||||
"button-label-get-summary": "Опресняване",
|
||||
"button-label-open-details": "Подробности",
|
||||
"info-description-data-dir-size": "Размер на директорията с данни",
|
||||
"info-description-log-file-size": "Размер на лог файла",
|
||||
@@ -1319,9 +1336,9 @@
|
||||
"welcome-user": "👋 Добре дошъл(а), {0}!",
|
||||
"description": "Настройки на профил, рецепти и настройки на групата.",
|
||||
"invite-link": "Линк за Покана",
|
||||
"get-invite-link": "Вземи линк за покана",
|
||||
"get-public-link": "Вземи публичен линк",
|
||||
"account-summary": "Обобщение на акаунта",
|
||||
"get-invite-link": "Създай линк за покана",
|
||||
"get-public-link": "Създай публичен линк",
|
||||
"account-summary": "Преглед на потребителския профил",
|
||||
"account-summary-description": "Обобщение на информацията за Вашата група.",
|
||||
"group-statistics": "Статистики на групата",
|
||||
"group-statistics-description": "Вашата статистика на групата дава известна представа как използвате Mealie.",
|
||||
@@ -1344,7 +1361,7 @@
|
||||
"members": "Участници",
|
||||
"members-description": "Вижте кой е във вашето домакинство и управлявайте техните разрешения.",
|
||||
"webhooks-description": "Настройте webhooks, които се задействат в дните, в които имате планиран план за хранене.",
|
||||
"notifiers": "Уведомители",
|
||||
"notifiers": "Уведомления",
|
||||
"notifiers-description": "Настройте имейл и push известия, които се задействат при конкретни събития.",
|
||||
"manage-data": "Управление на данни",
|
||||
"manage-data-description": "Управлявай данните в Mealie: Храни, Единици, Категории, Тагове и други.",
|
||||
@@ -1362,7 +1379,7 @@
|
||||
"manage-cookbooks": "Управление на готварските книги",
|
||||
"manage-members": "Управление на потребителите",
|
||||
"manage-webhooks": "Управление на Webhooks",
|
||||
"manage-notifiers": "Управление на уведомители",
|
||||
"manage-notifiers": "Настройки на уведомленията",
|
||||
"manage-data-migrations": "Управление на миграцията на данни"
|
||||
},
|
||||
"cookbook": {
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie pot importar les receptes de Tandoor. Exporta les dades en format \"Default\", i carrega el .zip a sota.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migració de receptes",
|
||||
"recipe-data-migrations-explanation": "Les receptes es poden migrar des d'una altra aplicació suportada cap a Mealie. És una manera genial de començar a utilitzar el Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Véns d'una altra aplicació o una versió més antiga de Mealia? Fés un cop d'ull a migracions i mira si pots importar les teves dades.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"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": "Fes-la la imatge de la recepta"
|
||||
"make-recipe-image": "Fes-la la imatge de la recepta",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 - Pàgina no trobada",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "S'ha suprimit la recepta",
|
||||
"recipe-image": "Imatge de la recepta",
|
||||
"recipe-image-updated": "S'ha actualitzat la imatge de la recepta",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Nom de la recepta",
|
||||
"recipe-settings": "Opcions de la recepta",
|
||||
"recipe-update-failed": "S'ha produït un error a l'actualitzar la recepta",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Tria el tipus d'unitat",
|
||||
"press-enter-to-create": "Premeu enter per a crear-lo",
|
||||
"choose-food": "Tria un aliment",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Nova secció",
|
||||
"see-original-text": "Mostra el text original",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Ho he fet",
|
||||
"how-did-it-turn-out": "Com ha sortit?",
|
||||
"user-made-this": "{user} ha fet això",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Cercador de receptes",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Prem '/'",
|
||||
"advanced": "Avançat",
|
||||
"auto-search": "Cerca automàtica",
|
||||
"no-results": "No s'han trobat resultats"
|
||||
"no-results": "No s'han trobat resultats",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Afegiu un nou tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "No vols tornar a veure això? Assegura't de canviar el teu correu electrònic a les configuracions del teu usuari!",
|
||||
"forgot-password": "Contrasenya oblidada",
|
||||
"forgot-password-text": "Introdueix siusplau la teva adreça de correu electrònic i t'enviarem un enllaç per restablir la teva contrassenya.",
|
||||
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament."
|
||||
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduït",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie může importovat recepty z Tandoor. Exportujte data ve výchozím formátu, poté nahrajte soubor ve formátu .zip.",
|
||||
"title": "Recepty Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrace dat receptů",
|
||||
"recipe-data-migrations-explanation": "Recepty mohou být migrovány z jiné podporované aplikace na Mealie. To je skvělý způsob, jak začít s Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Migrujete z jiné aplikace nebo starší verze Mealie? Podívejte se na migrace a zjistěte, zda lze vaše data importovat.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Pokusí se rozdělit odstavec na místech odpovídajících vzorům '1)' a '1.'",
|
||||
"import-by-url": "Importovat recept podle URL",
|
||||
"create-manually": "Vytvořit recept ručně",
|
||||
"make-recipe-image": "Nastavit jako obrázek receptu"
|
||||
"make-recipe-image": "Nastavit jako obrázek receptu",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Stránka nebyla nalezena",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recept smazán",
|
||||
"recipe-image": "Obrázek receptu",
|
||||
"recipe-image-updated": "Obrázek receptu aktualizován",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Název receptu",
|
||||
"recipe-settings": "Nastavení receptu",
|
||||
"recipe-update-failed": "Aktualizace receptu se nezdařila",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Vybrat jednotku",
|
||||
"press-enter-to-create": "Stiskněte enter pro vytvoření",
|
||||
"choose-food": "Zvolte jídlo",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Poznámky",
|
||||
"toggle-section": "Přidat/odebrat název sekce",
|
||||
"see-original-text": "Zobrazit původní text",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Toto jsem uvařil",
|
||||
"how-did-it-turn-out": "Jak to dopadlo?",
|
||||
"user-made-this": "{user} udělal toto",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Přidáno na časovou osu",
|
||||
"failed-to-add-to-timeline": "Přidání na časovou osu selhalo",
|
||||
"failed-to-update-recipe": "Aktualizace receptu selhala",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Nahrát obrázky",
|
||||
"upload-more-images": "Nahrát více obrázků",
|
||||
"set-as-cover-image": "Nastavit recept jako úvodní obrázek",
|
||||
"cover-image": "Úvodní obrázek"
|
||||
"cover-image": "Úvodní obrázek",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Vyhledávač receptů",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Stiskněte '/'",
|
||||
"advanced": "Pokročilé",
|
||||
"auto-search": "Automatické vyhledávání",
|
||||
"no-results": "Nebyly nalezeny žádné výsledky"
|
||||
"no-results": "Nebyly nalezeny žádné výsledky",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Přidat nový motiv",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Už to nechcete vidět? Nezapomeňte si změnit svůj e-mail v uživatelském nastavení!",
|
||||
"forgot-password": "Zapomenuté heslo",
|
||||
"forgot-password-text": "Zadejte prosím svou e-mailovou adresu a my vám zašleme odkaz pro obnovení hesla.",
|
||||
"changes-reflected-immediately": "Změny tohoto uživatele budou okamžitě zohledněny."
|
||||
"changes-reflected-immediately": "Změny tohoto uživatele budou okamžitě zohledněny.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "přeloženo",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"database-type": "Database-type",
|
||||
"database-url": "Database-url",
|
||||
"default-group": "Standardgruppe",
|
||||
"default-household": "Standard Husholdning",
|
||||
"default-household": "Standard Husstand",
|
||||
"demo": "Demo",
|
||||
"demo-status": "Demo status",
|
||||
"development": "Udvikling",
|
||||
@@ -57,7 +57,7 @@
|
||||
"event-delete-confirmation": "Er du sikker på, at du vil slette denne begivenhed?",
|
||||
"event-deleted": "Hændelse slettet",
|
||||
"event-updated": "Hændelse opdateret",
|
||||
"new-notification-form-description": "Mealie bruger Apprise-biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
|
||||
"new-notification-form-description": "Mealie bruger Apprise biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
|
||||
"new-version": "Ny opdatering er tilgængelig!",
|
||||
"notification": "Notifikation",
|
||||
"refresh": "Opdater",
|
||||
@@ -248,7 +248,7 @@
|
||||
"manage-members": "Administrer medlemmer",
|
||||
"manage-members-description": "Administrer tilladelser for medlemmerne i din husstand. {manage} giver brugeren adgang til datastyringssiden, og {invite} giver brugeren mulighed for at generere invitationslinks til andre brugere. Gruppeejere kan ikke ændre deres egne tilladelser.",
|
||||
"manage": "Administrer",
|
||||
"manage-household": "Administrer husholdning",
|
||||
"manage-household": "Administrer Husstand",
|
||||
"invite": "Invitér",
|
||||
"looking-to-update-your-profile": "Ønsker du at opdatere din profil?",
|
||||
"default-recipe-preferences-description": "Dette er standardindstillingerne, når en ny opskrift oprettes i din gruppe. Indstillingerne kan ændres for en opskrift i menuen Opskriftindstillinger.",
|
||||
@@ -278,30 +278,30 @@
|
||||
"admin-group-management": "Administratorgruppeadministration",
|
||||
"admin-group-management-text": "Ændringer i denne gruppe vil træde i kraft øjeblikkeligt.",
|
||||
"group-id-value": "Gruppe-ID: {0}",
|
||||
"total-households": "Husholdninger i Alt",
|
||||
"total-households": "Husstande i Alt",
|
||||
"you-must-select-a-group-before-selecting-a-household": "Du skal vælge en gruppe, før du vælger en husstand"
|
||||
},
|
||||
"household": {
|
||||
"household": "Husholdning",
|
||||
"households": "Husholdninger",
|
||||
"user-household": "Husholdning",
|
||||
"create-household": "Opret husholdning",
|
||||
"household-name": "Husholdningens navn",
|
||||
"household-group": "Husholdnings Gruppe",
|
||||
"household-management": "Husholdningsadministration",
|
||||
"manage-households": "Administrer husholdninger",
|
||||
"admin-household-management": "Husholdningsadministration",
|
||||
"household": "Husstand",
|
||||
"households": "Husstande",
|
||||
"user-household": "Bruger Husstand",
|
||||
"create-household": "Opret Husstand",
|
||||
"household-name": "Husstandens Navn",
|
||||
"household-group": "Husstandens Gruppe",
|
||||
"household-management": "Husstands Administration",
|
||||
"manage-households": "Administrer Husstande",
|
||||
"admin-household-management": "Admin Husstands Administration",
|
||||
"admin-household-management-text": "Ændringer ved denne husholdning vil træde i kraft øjeblikkeligt.",
|
||||
"household-id-value": "Id: {0}",
|
||||
"private-household": "Privat husholdning",
|
||||
"private-household-description": "Sættes din husholdning til private vil det deaktivere alle indstillinger for offentlig visning. Dette tilsidesætter individuelle indstillinger for offentlig visning",
|
||||
"lock-recipe-edits-from-other-households": "Lås ændringer fra andre husholdninger",
|
||||
"lock-recipe-edits-from-other-households-description": "Når aktiveret kan kun husholdningens brugere ændre dens opskrifter",
|
||||
"household-recipe-preferences": "Husholdningens opskriftspræferencer",
|
||||
"default-recipe-preferences-description": "Disse er standardindstillingerne, når en ny opskrift er oprettet i din husstand. Disse kan ændres for individuelle opskrifter i menuen Opsætninger.",
|
||||
"household-id-value": "Husstand Id: {0}",
|
||||
"private-household": "Privat Husstand",
|
||||
"private-household-description": "Sættes din Husstand til privat, vil det deaktivere alle indstillinger for offentlig visning. Dette overskriver individuelle indstillinger for offentlig visning",
|
||||
"lock-recipe-edits-from-other-households": "Lås opskriftredigeringer fra andre husstande",
|
||||
"lock-recipe-edits-from-other-households-description": "Når denne funktion er aktiveret, kan kun brugere i din husstand redigere opskrifter, der er oprettet af din husstand.",
|
||||
"household-recipe-preferences": "Husstandens opskriftspræferencer",
|
||||
"default-recipe-preferences-description": "Dette er standardindstillingerne, når der oprettes en ny opskrift i din husstand. Disse kan ændres for individuelle opskrifter i menuen med opskriftindstillinger.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Tillad brugere udenfor din husholdning at se dine opskrifter",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Når det er aktiveret kan du bruge et link til offentlig deling af specifikke opskrifter uden at godkende brugeren. Når deaktiveret, kan du kun dele opskrifter med brugere, der er i din husstand eller med et forudgenereret privat link",
|
||||
"household-preferences": "Præferencer"
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Når denne funktion er aktiveret, kan du bruge et offentligt delingslink til at dele bestemte opskrifter uden at godkende brugeren. Når funktionen er deaktiveret, kan du kun dele opskrifter med brugere, der bor i din husstand, eller med et forudgenereret privat link.",
|
||||
"household-preferences": "Husstands præferencer"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Opret madplan",
|
||||
@@ -326,7 +326,7 @@
|
||||
"mealplan-households-description": "Hvis ingen husstand er valgt, kan opskrifter tilføjes fra enhver husstand",
|
||||
"any-category": "Alle kategorier",
|
||||
"any-tag": "Alle tags",
|
||||
"any-household": "Alle husholdninger",
|
||||
"any-household": "Alle husstande",
|
||||
"no-meal-plan-defined-yet": "Ingen madplaner er oprettet endnu",
|
||||
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
|
||||
"numberOfDays-hint": "Antal dage ved sideindlæsning",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie kan importere opskrifter fra Tandoor. Eksporter dine data i \"Standard\" format, og upload derefter Zip filen nedenfor.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie kan importere opskrifter fra DVO Cook'n X3. Eksportér en kogebog eller menu i \"Cook'n\" formatet, omdøb filtypen .dvo til .zip, og upload derefter .zip nedenfor.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"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.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer fra en anden applikation eller en endnu ældre version af Mealie? Tjek migrationer og se om dine data kan importeres.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Forsøger at opdele et afsnit ved at matche '1)' eller '1.' mønstre",
|
||||
"import-by-url": "Importér opskrift fra en webside",
|
||||
"create-manually": "Opret opskrift manuelt",
|
||||
"make-recipe-image": "Gør dette til opskriftsbillede"
|
||||
"make-recipe-image": "Gør dette til opskriftsbillede",
|
||||
"add-food": "Tilføj Mad",
|
||||
"add-recipe": "Tilføj opskrift"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Siden blev ikke fundet",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Opskrift slettet",
|
||||
"recipe-image": "Opskriftsbillede",
|
||||
"recipe-image-updated": "Opskriftsbillede ændret",
|
||||
"delete-image": "Slet Opskrift Billede",
|
||||
"delete-image-confirmation": "Er du sikker på, du vil slette dette opskrift billede?",
|
||||
"recipe-image-deleted": "Opskrift billede slettet",
|
||||
"recipe-name": "Opskriftens navn",
|
||||
"recipe-settings": "Opskriftsindstillinger",
|
||||
"recipe-update-failed": "Opdatering af opskrift fejlede",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Vælg enhed",
|
||||
"press-enter-to-create": "Tryk enter for at oprette",
|
||||
"choose-food": "Vælg fødevarer",
|
||||
"choose-recipe": "Vælg Opskrift",
|
||||
"notes": "Kommentarer",
|
||||
"toggle-section": "Sektion",
|
||||
"see-original-text": "Vis den oprindelige tekst",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Jeg har lavet denne",
|
||||
"how-did-it-turn-out": "Hvordan blev det?",
|
||||
"user-made-this": "{user} lavede denne",
|
||||
"made-for-recipe": "Lavet til {recipe}",
|
||||
"added-to-timeline": "Tilføjet til tidslinjen",
|
||||
"failed-to-add-to-timeline": "Kunne ikke tilføje til tidslinjen",
|
||||
"failed-to-update-recipe": "Kunne ikke opdatere opskrift",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere direkte fra rå data",
|
||||
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
|
||||
"stay-in-edit-mode": "Bliv i redigeringstilstand",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Fortolk opskrift ingredienser efter import",
|
||||
"import-from-zip": "Importer fra zip-fil",
|
||||
"import-from-zip-description": "Importer en enkelt opskrift, der blev eksporteret fra en anden Mealie instans.",
|
||||
"import-from-html-or-json": "Importer fra HTML eller JSON",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Denne enhed kunne ikke fortolkes automatisk",
|
||||
"this-food-could-not-be-parsed-automatically": "Denne fødevare kunne ikke fortolkes automatisk",
|
||||
"no-food": "Ingen fødevarer",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Gennemgå fortolkede ingredienser",
|
||||
"confidence-score": "Tillidsscore",
|
||||
"ingredient-parser-description": "Dine ingredienser er blevet fortolket. Gennemgå de ingredienser, vi ikke er sikker på.",
|
||||
"ingredient-parser-final-review-description": "Når alle ingredienser er blevet gennemgået, har du endnu en chance for at gennemgå alle ingredienser, før du anvender ændringerne til din opskrift.",
|
||||
"add-text-as-alias-for-item": "Tilføj \"{text}\" som alias for {item}",
|
||||
"delete-item": "Slet Element"
|
||||
},
|
||||
"reset-servings-count": "Nulstil antal serveringer",
|
||||
"not-linked-ingredients": "Yderligere ingredienser",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload billeder",
|
||||
"upload-more-images": "Upload flere billeder",
|
||||
"set-as-cover-image": "Angiv som opskriftens coverbillede",
|
||||
"cover-image": "Coverbillede"
|
||||
"cover-image": "Coverbillede",
|
||||
"include-linked-recipes": "Inkluder Relaterede Opskrifter",
|
||||
"include-linked-recipe-ingredients": "Inkluder Relaterede Opskrift Ingredienser",
|
||||
"toggle-recipe": "Vis/Skjul Opskrift"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Opskriftssøger",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Tryk '/'",
|
||||
"advanced": "Avanceret",
|
||||
"auto-search": "Automatisk søgning",
|
||||
"no-results": "Ingen resultater fundet"
|
||||
"no-results": "Ingen resultater fundet",
|
||||
"type-to-search": "Skriv for at søge..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Tilføj et nyt tema",
|
||||
@@ -1052,14 +1067,16 @@
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Bruger kan invitere andre til gruppen",
|
||||
"user-can-manage-group": "Bruger kan administrere gruppen",
|
||||
"user-can-manage-household": "Bruger kan administrere husholdningen",
|
||||
"user-can-manage-household": "Brugeren kan administrere husstande",
|
||||
"user-can-organize-group-data": "Bruger kan organisere gruppedata",
|
||||
"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": "Glemt adgangskode",
|
||||
"forgot-password-text": "Indtast venligst din e-mail-adresse. Vi sender dig en e-mail, så at du kan nulstille din adgangskode.",
|
||||
"changes-reflected-immediately": "Ændringer til denne bruger vil have effekt med det samme."
|
||||
"changes-reflected-immediately": "Ændringer til denne bruger vil have effekt med det samme.",
|
||||
"default-activity": "",
|
||||
"default-activity-hint": "Vælg den side, du vil navigere til, når du logger ind fra denne enhed"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "oversat",
|
||||
@@ -1176,7 +1193,7 @@
|
||||
"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.",
|
||||
"group-details": "Gruppeoplysninger",
|
||||
"group-details-description": "Før du opretter en konto, skal du oprette en gruppe. Din gruppe vil kun indeholde dig, men du vil kunne invitere andre senere. Medlemmer i din gruppe kan dele madplaner, indkøbslister, opskrifter og meget mere!",
|
||||
"use-seed-data": "Anved standard data",
|
||||
"use-seed-data": "Anvend standard data",
|
||||
"use-seed-data-description": "Mealie kommer med en samling af Fødevarer, Enheder, og Etiketter som kan blive brugt til at udfylde din gruppe med nyttig data til at organisere dine opskrifter. De er oversat til det sprog, du i øjeblikket har valgt. Du kan altid tilføje og ændre disse data senere.",
|
||||
"account-details": "Kontodetaljer"
|
||||
},
|
||||
@@ -1312,8 +1329,8 @@
|
||||
"debug-openai-services-description": "Brug denne side til at fejlsøge OpenAI-tjenester. Du kan teste din OpenAI-forbindelse og se resultaterne her. Hvis du har billedetjenester aktiveret, kan du også prøve med et billede.",
|
||||
"run-test": "Kør test",
|
||||
"test-results": "Testresultater",
|
||||
"group-delete-note": "Grupper med brugere eller husholdninger kan ikke slettes",
|
||||
"household-delete-note": "Husholdninger med brugere kan ikke slettes"
|
||||
"group-delete-note": "Grupper med brugere eller husstande kan ikke slettes",
|
||||
"household-delete-note": "Husstande med brugere kan ikke slettes"
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Velkommen, {0}!",
|
||||
@@ -1325,8 +1342,8 @@
|
||||
"account-summary-description": "Her er en oversigt over din gruppes oplysninger.",
|
||||
"group-statistics": "Gruppestatistik",
|
||||
"group-statistics-description": "Din gruppestatistik giver indsigt i, hvordan du bruger Mealie.",
|
||||
"household-statistics": "Husholdnings Statistikker",
|
||||
"household-statistics-description": "Dine husstandsstatistikker giver lidt indsigt i, hvordan du bruger Mealie.",
|
||||
"household-statistics": "Husstands Statistikker",
|
||||
"household-statistics-description": "Din husstandsstatistik giver et indblik i, hvordan du bruger Mealie.",
|
||||
"storage-capacity": "Lagerkapacitet",
|
||||
"storage-capacity-description": "Din lagerkapacitet er en beregning af de billeder og elementer, du har uploadet.",
|
||||
"personal": "Personlig",
|
||||
@@ -1337,9 +1354,9 @@
|
||||
"group-description": "Disse elementer deles i din gruppe. Redigering af et af dem vil ændre det for hele gruppen!",
|
||||
"group-settings": "Gruppeindstillinger",
|
||||
"group-settings-description": "Administrer dine fælles gruppeindstillinger, såsom privatlivsindstillinger.",
|
||||
"household-description": "Disse elementer deles i din husstand. Redigering af en af dem vil ændre det for hele husstanden!",
|
||||
"household-settings": "Husholdningsindstillinger",
|
||||
"household-settings-description": "Administrer dine husholdningsindstillinger, såsom madplan og privatlivsindstillinger.",
|
||||
"household-description": "Disse elementer deles inden for din husstand. Hvis du redigerer et af dem, ændres det for hele husstanden!",
|
||||
"household-settings": "Husstands indstillinger",
|
||||
"household-settings-description": "Administrer din husstands indstillinger, såsom madplan og privatlivsindstillinger.",
|
||||
"cookbooks-description": "Administrer en samling af kategorier og opret sider til dem.",
|
||||
"members": "Medlemmer",
|
||||
"members-description": "Se, hvem der er i din husstand og administrer deres tilladelser.",
|
||||
@@ -1368,7 +1385,7 @@
|
||||
"cookbook": {
|
||||
"cookbooks": "Kogebøger",
|
||||
"description": "Kogebøger er en anden måde at organisere opskrifter ved at skabe tværsnit af opskrifter, arrangører, og andre filtre. Oprettelse af en kogebog vil tilføje et link i sidemenuen, og alle opskrifter med de valgte filtre vil blive vist i kogebogen.",
|
||||
"hide-cookbooks-from-other-households": "Skjul kogebøger fra andre husholdninger",
|
||||
"hide-cookbooks-from-other-households": "Skjul kogebøger fra andre husstande",
|
||||
"hide-cookbooks-from-other-households-description": "Når aktiveret, kun kogebøger fra din husstand vises på sidepanelet",
|
||||
"public-cookbook": "Offentlig kogebog",
|
||||
"public-cookbook-description": "Offentlige kogebøger kan deles med personer, der ikke er oprettet som brugere i Mealie og vil blive vist på din gruppe side.",
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
"category-updated": "Kategorie aktualisiert",
|
||||
"uncategorized-count": "Nicht kategorisiert {count}",
|
||||
"create-a-category": "Eine Kategorie erstellen",
|
||||
"category-name": "Name der Kategorie",
|
||||
"category-name": "Kategoriename",
|
||||
"category": "Kategorie"
|
||||
},
|
||||
"events": {
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie kann Rezepte von Tandoor importieren. Exportiere deine Daten im 'Default' Format und lade dann unten die .zip Datei hoch.",
|
||||
"title": "Tandoor Rezepte"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie kann Rezepte von DVO Cook'n X3 importieren. Exportieren Sie ein Kochbuch oder ein Menü im \"Cook'n\"-Format, benennen Sie die Export-Erweiterung in .zip um, dann laden Sie die .zip unten hoch.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Rezeptdatenmigration",
|
||||
"recipe-data-migrations-explanation": "Rezepte können aus unterstützten Programmen nach Mealie migriert werden. Das ist eine gute Möglichkeit, um mit Mealie loszulegen.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Wechselst du von einer anderen Anwendung oder einer noch älteren Version von Mealie? Prüfe die Migrations-Optionen, vielleicht können deine Daten importiert werden.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Absätze nach dem Schema '1)' oder '1.' aufzuteilen versuchen",
|
||||
"import-by-url": "Ein Rezept von einer Webseite importieren",
|
||||
"create-manually": "Ein Rezept manuell erstellen",
|
||||
"make-recipe-image": "Als Rezept-Titelbild verwenden"
|
||||
"make-recipe-image": "Als Rezept-Titelbild verwenden",
|
||||
"add-food": "Lebensmittel",
|
||||
"add-recipe": "Rezepte hinzufügen"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Seite nicht gefunden",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Rezept entfernt",
|
||||
"recipe-image": "Rezeptbild",
|
||||
"recipe-image-updated": "Rezeptbild aktualisiert",
|
||||
"delete-image": "Rezeptbild löschen",
|
||||
"delete-image-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
|
||||
"recipe-image-deleted": "Rezeptbild gelöscht",
|
||||
"recipe-name": "Rezeptname",
|
||||
"recipe-settings": "Rezepteinstellungen",
|
||||
"recipe-update-failed": "Aktualisieren des Rezepts fehlgeschlagen",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Einheit wählen",
|
||||
"press-enter-to-create": "Zum Erstellen Eingabetaste drücken",
|
||||
"choose-food": "Lebensmittel wählen",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notizen",
|
||||
"toggle-section": "Überschrift ein-/ausblenden",
|
||||
"see-original-text": "Originaltext anzeigen",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Ich hab's gemacht",
|
||||
"how-did-it-turn-out": "Wie ist es geworden?",
|
||||
"user-made-this": "{user} hat's gemacht",
|
||||
"made-for-recipe": "Erstellt für {recipe}",
|
||||
"added-to-timeline": "Zur Zeitleiste hinzugefügt",
|
||||
"failed-to-add-to-timeline": "Fehler beim Hinzufügen zur Zeitleiste",
|
||||
"failed-to-update-recipe": "Fehler beim Aktualisieren des Rezepts",
|
||||
@@ -676,7 +687,7 @@
|
||||
"ingredient-parser-description": "Deine Zutaten wurden erfolgreich geparst. Bitte überprüfe die Zutaten, bei denen wir uns nicht sicher sind.",
|
||||
"ingredient-parser-final-review-description": "Sobald alle Zutaten überprüft wurden, kannst du nochmal alle Zutaten kontrollieren, bevor die Änderungen ins Rezept übernommen werden.",
|
||||
"add-text-as-alias-for-item": "Füge \"{text}\" als Alias für {item} hinzu",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Element löschen"
|
||||
},
|
||||
"reset-servings-count": "Portionen zurücksetzen",
|
||||
"not-linked-ingredients": "Zusätzliche Zutaten",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Bilder hochladen",
|
||||
"upload-more-images": "Weitere Bilder hochladen",
|
||||
"set-as-cover-image": "Als Rezept-Titelbild setzen",
|
||||
"cover-image": "Titelbild"
|
||||
"cover-image": "Titelbild",
|
||||
"include-linked-recipes": "Verknüpfte Rezepte einbeziehen",
|
||||
"include-linked-recipe-ingredients": "Zutaten verknüpfter Rezepte einbeziehen",
|
||||
"toggle-recipe": "Rezept ein/aus"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Rezept-Suche",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "'/' drücken",
|
||||
"advanced": "Erweitert",
|
||||
"auto-search": "Automatische Suche",
|
||||
"no-results": "Keine Ergebnisse gefunden"
|
||||
"no-results": "Keine Ergebnisse gefunden",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Neues Thema hinzufügen",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Änderungen an diesem Benutzer sind sofort wirksam.",
|
||||
"default-activity": "Standardaktivität",
|
||||
"default-activity-hint": "Wählen Sie die Seite, auf die Sie navigieren möchten, wenn Sie sich von diesem Gerät aus anmelden"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "übersetzt",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"about": {
|
||||
"about": "Σχετικά με",
|
||||
"about": "Σχετικά",
|
||||
"about-mealie": "Σχετικά με το Mealie",
|
||||
"api-docs": "Τεκμηρίωση API",
|
||||
"api-port": "Θύρα API",
|
||||
@@ -14,7 +14,7 @@
|
||||
"development": "Ανάπτυξη",
|
||||
"docs": "Τεκμηρίωση",
|
||||
"download-log": "Λήψη αρχείου καταγραφής",
|
||||
"download-recipe-json": "Τελευταίο Scraped JSON",
|
||||
"download-recipe-json": "Τελευταίο αντλημένο JSON",
|
||||
"github": "GitHub",
|
||||
"log-lines": "Γραμμές καταγραφής",
|
||||
"not-demo": "Εκτός Επίδειξης",
|
||||
@@ -27,7 +27,7 @@
|
||||
},
|
||||
"asset": {
|
||||
"assets": "Στοιχεία",
|
||||
"code": "Κώδικας",
|
||||
"code": "Κωδικός",
|
||||
"file": "Αρχείο",
|
||||
"image": "Εικόνα",
|
||||
"new-asset": "Νέο Στοιχείο",
|
||||
@@ -38,15 +38,15 @@
|
||||
},
|
||||
"category": {
|
||||
"categories": "Κατηγορίες",
|
||||
"category-created": "Δημιουργήθηκε η κατηγορία",
|
||||
"category-created": "Η κατηγορία δημιουργήθηκε",
|
||||
"category-creation-failed": "Η δημιουργία κατηγορίας απέτυχε",
|
||||
"category-deleted": "Κατηγορία Διαγράφηκε",
|
||||
"category-deleted": "Η κατηγορία διαγράφηκε",
|
||||
"category-deletion-failed": "Η διαγραφή κατηγορίας απέτυχε",
|
||||
"category-filter": "Φίλτρο κατηγορίας",
|
||||
"category-update-failed": "Η ενημέρωση της κατηγορίας απέτυχε",
|
||||
"category-updated": "Η κατηγορία ενημερώθηκε",
|
||||
"uncategorized-count": "Μη κατηγοριοποιημένο {count}",
|
||||
"create-a-category": "Δημιουργήστε μια Κατηγορία",
|
||||
"create-a-category": "Δημιουργία Κατηγορίας",
|
||||
"category-name": "Όνομα Κατηγορίας",
|
||||
"category": "Κατηγορία"
|
||||
},
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το Tandoor. Εξαγάγετε τα δεδομένα σας στην \"Προεπιλεγμένη\" (default) μορφή, στη συνέχεια, ανεβάστε το .zip παρακάτω.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το DVO Cook'n X3. Κάντε εξαγωγή ενός βιβλίου μαγειρικής ή ενός μενού σε μορφή \"Cook'n\", αλλάξτε την επέκταση του εξαγόμενου αρχείου σε .zip και, στη συνέχεια, ανεβάστε το .zip παρακάτω.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Μετεγκατάσταση Δεδομένων Συνταγής",
|
||||
"recipe-data-migrations-explanation": "Συνταγές μπορούν να μετεγκατασταθούν από άλλη υποστηριζόμενη εφαρμογή στο Mealie. Αυτός είναι ένας πολύ καλός τρόπος για να ξεκινήσετε με Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Ερχόμενοι από άλλη εφαρμογή ή ακόμα και παλαιότερη έκδοση του Mealie; Ελέγξτε τις μετεγκαταστάσεις και δείτε αν τα δεδομένα σας μπορούν να εισαχθούν.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Προσπάθεια για χωρισμό μιας παραγράφου ταιριάζοντας μοτίβα '1)' ή '1.'",
|
||||
"import-by-url": "Εισαγωγή μιας συνταγής από URL",
|
||||
"create-manually": "Δημιουργήστε μια συνταγή χειροκίνητα",
|
||||
"make-recipe-image": "Ορισμός ως εικόνας συνταγής"
|
||||
"make-recipe-image": "Ορισμός ως εικόνας συνταγής",
|
||||
"add-food": "Προσθήκη τρόφιμου",
|
||||
"add-recipe": "Προσθήκη συνταγής"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404. η σελίδα δεν βρέθηκε",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Η συνταγή διαγράφηκε",
|
||||
"recipe-image": "Εικόνα Συνταγής",
|
||||
"recipe-image-updated": "Η εικόνα συνταγής ενημερώθηκε",
|
||||
"delete-image": "Διαγραφή Εικόνας Συνταγής",
|
||||
"delete-image-confirmation": "Θέλετε σίγουρα να διαγράψετε αυτή την εικόνα συνταγής;",
|
||||
"recipe-image-deleted": "Η εικόνα συνταγής διαγράφηκε",
|
||||
"recipe-name": "Όνομα συνταγής",
|
||||
"recipe-settings": "Ρυθμίσεις Συνταγής",
|
||||
"recipe-update-failed": "Η ενημέρωση συνταγής απέτυχε",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Επιλέξτε μονάδα",
|
||||
"press-enter-to-create": "Πατήστε Enter για δημιουργία",
|
||||
"choose-food": "Επιλέξτε τρόφιμο",
|
||||
"choose-recipe": "Επιλέξτε συνταγή",
|
||||
"notes": "Σημειώσεις",
|
||||
"toggle-section": "Ενεργοποίηση/απενεργοποίηση τμήματος",
|
||||
"see-original-text": "Προβολή Αρχικού Κειμένου",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Το έφτιαξα",
|
||||
"how-did-it-turn-out": "Ποιό ήταν το αποτέλεσμα;",
|
||||
"user-made-this": "Ο/η {user} έφτιαξε αυτό",
|
||||
"made-for-recipe": "Φτιαγμένο για {recipe}",
|
||||
"added-to-timeline": "Προστέθηκε στο χρονολόγιο",
|
||||
"failed-to-add-to-timeline": "Αποτυχία προσθήκης στο χρονολόγιο",
|
||||
"failed-to-update-recipe": "Αποτυχία ενημέρωσης συνταγής",
|
||||
@@ -591,7 +602,7 @@
|
||||
"message-key": "Κλειδί Μηνύματος",
|
||||
"parse": "Ανάλυση",
|
||||
"ingredients-not-parsed-description": "Φαίνεται ότι τα συστατικά σας δεν έχουν αναλυθεί ακόμα. Κάντε κλικ στο κουμπί \"{parse}\" παρακάτω για να αναλύσετε τα συστατικά σας σε δομημένα τρόφιμα.",
|
||||
"attach-images-hint": "Επισυνάψτε εικόνες σύροντας τις & αφήνοντάς τις στον επεξεργαστή",
|
||||
"attach-images-hint": "Επισυνάψτε εικόνες σύροντας & αφήνοντάς τες στον επεξεργαστή",
|
||||
"drop-image": "Απόθεση εικόνας",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Ενεργοποιήστε τις ποσότητες συστατικών για να χρησιμοποιήσετε αυτήν τη δυνατότητα",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Δεν είναι δυνατή η ανάλυση συνταγών με καθορισμένες μονάδες ή τρόφιμα.",
|
||||
@@ -676,7 +687,7 @@
|
||||
"ingredient-parser-description": "Τα συστατικά σας έχουν αναλυθεί επιτυχώς. Παρακαλούμε ελέγξτε τα συστατικά για τα οποία δεν είμαστε σίγουροι.",
|
||||
"ingredient-parser-final-review-description": "Μόλις εξεταστούν όλα τα συστατικά, θα έχετε μία ακόμη ευκαιρία να επανεξετάσετε όλα τα συστατικά πριν εφαρμόσετε τις αλλαγές στη συνταγή σας.",
|
||||
"add-text-as-alias-for-item": "Προσθήκη \"{text}\" ως ψευδώνυμο για το {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Διαγραφή αντικειμένου"
|
||||
},
|
||||
"reset-servings-count": "Επαναφορά μέτρησης μερίδων",
|
||||
"not-linked-ingredients": "Πρόσθετα συστατικά",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Ανέβασμα εικόνων",
|
||||
"upload-more-images": "Ανέβασμα περισσότερων εικόνων",
|
||||
"set-as-cover-image": "Ορισμός ως εικόνα εξώφυλλου συνταγής",
|
||||
"cover-image": "Εικόνα εξώφυλλου"
|
||||
"cover-image": "Εικόνα εξώφυλλου",
|
||||
"include-linked-recipes": "Συμπερίληψη συνδεδεμένων συνταγών",
|
||||
"include-linked-recipe-ingredients": "Συμπερίληψη συστατικών συνδεδεμένης συνταγής",
|
||||
"toggle-recipe": "Εναλλαγή συνταγής"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Εύρεση συνταγών",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Πατήστε '/'",
|
||||
"advanced": "Για προχωρημένους",
|
||||
"auto-search": "Αυτόματη Αναζήτηση",
|
||||
"no-results": "Δε βρέθηκαν αποτελέσματα"
|
||||
"no-results": "Δε βρέθηκαν αποτελέσματα",
|
||||
"type-to-search": "Πληκτρολογήστε για αναζήτηση…"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Προσθήκη νέου θέματος",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Δεν θέλετε να το δείτε αυτό ξανά; Φροντίστε να αλλάξετε το email σας στις ρυθμίσεις χρήστη!",
|
||||
"forgot-password": "Ξέχασα τον κωδικό πρόσβασης",
|
||||
"forgot-password-text": "Παρακαλώ εισάγετε τη διεύθυνση email σας και θα σας στείλουμε έναν σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας.",
|
||||
"changes-reflected-immediately": "Οι αλλαγές σε αυτόν τον χρήστη θα αντικατοπτρίζονται αμέσως."
|
||||
"changes-reflected-immediately": "Οι αλλαγές σε αυτόν τον χρήστη θα αντικατοπτρίζονται αμέσως.",
|
||||
"default-activity": "Προεπιλεγμένη Δραστηριότητα",
|
||||
"default-activity-hint": "Επιλέξτε σε ποια σελίδα θα θέλατε να μεταβείτε κατά τη σύνδεση από αυτήν τη συσκευή"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "μεταφρασμένο",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"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.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
|
||||
"import-by-url": "Import a recipe by URL",
|
||||
"create-manually": "Create a recipe manually",
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
"make-recipe-image": "Make this the recipe image",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page not found",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recipe deleted",
|
||||
"recipe-image": "Recipe Image",
|
||||
"recipe-image-updated": "Recipe image updated",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Recipe Name",
|
||||
"recipe-settings": "Recipe Settings",
|
||||
"recipe-update-failed": "Recipe update failed",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Choose Unit",
|
||||
"press-enter-to-create": "Press Enter to Create",
|
||||
"choose-food": "Choose Food",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "I Made This",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"user-made-this": "{user} made this",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
"no-results": "No results found",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this any more? 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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"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.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
|
||||
"import-by-url": "Import a recipe by URL",
|
||||
"create-manually": "Create a recipe manually",
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
"make-recipe-image": "Make this the recipe image",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page not found",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recipe deleted",
|
||||
"recipe-image": "Recipe Image",
|
||||
"recipe-image-updated": "Recipe image updated",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Recipe Name",
|
||||
"recipe-settings": "Recipe Settings",
|
||||
"recipe-update-failed": "Recipe update failed",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Choose Unit",
|
||||
"press-enter-to-create": "Press Enter to Create",
|
||||
"choose-food": "Choose Food",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "I Made This",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"user-made-this": "{user} made this",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
"no-results": "No results found",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"github": "GitHub",
|
||||
"log-lines": "Líneas de registro",
|
||||
"not-demo": "No Demo",
|
||||
"portfolio": "Portfolio",
|
||||
"portfolio": "Portafolio",
|
||||
"production": "Producción",
|
||||
"support": "Soporte",
|
||||
"version": "Versión",
|
||||
@@ -399,6 +399,10 @@
|
||||
"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"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie no puede importar recetas de DVO Cook'n X3. Exporta un recetario o un menú en el formato \"Cook'n\", renómbralo a la extensión .zip y sube el .zip en la sección de abajo.",
|
||||
"title": "Cook'n DVO X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migración de recetas",
|
||||
"recipe-data-migrations-explanation": "Las recetas pueden migrarse desde otra aplicación soportada a Mealie. Esta es una excelente manera de empezar con Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "¿Vienes de otra app o una versión previa de Mealie? Revisa migraciones para ver si tus datos pueden ser importados.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Intenta dividir un párrafo utilizando los patrones '1)' o '1.'",
|
||||
"import-by-url": "Importar una receta desde URL",
|
||||
"create-manually": "Crear receta manualmente",
|
||||
"make-recipe-image": "Haz de esta la imagen de la receta"
|
||||
"make-recipe-image": "Haz de esta la imagen de la receta",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Agregar receta"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Página no encontrada",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Receta eliminada",
|
||||
"recipe-image": "Imagen de la receta",
|
||||
"recipe-image-updated": "Imagen de la receta actualizada",
|
||||
"delete-image": "Borra la imagen de la receta",
|
||||
"delete-image-confirmation": "¿Estás seguro de que quieres borrar esta imagen de la receta?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Nombre de la receta",
|
||||
"recipe-settings": "Ajustes de la receta",
|
||||
"recipe-update-failed": "Error al actualizar la receta",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Elija unidad",
|
||||
"press-enter-to-create": "Presione Intro para crear",
|
||||
"choose-food": "Elija comida",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notas",
|
||||
"toggle-section": "Activar sección",
|
||||
"see-original-text": "Mostrar Texto Original",
|
||||
"original-text-with-value": "Texto original: {originalText}",
|
||||
"ingredient-linker": "Vincular ingredientes",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Aún no vinculado",
|
||||
"linked-to-other-step": "Enlazado a otro paso",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Modo Cocinar",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Lo hice",
|
||||
"how-did-it-turn-out": "¿Cómo resultó esto?",
|
||||
"user-made-this": "{user} hizo esto",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Añadido a la línea de tiempo",
|
||||
"failed-to-add-to-timeline": "No se pudo agregar a la línea de tiempo",
|
||||
"failed-to-update-recipe": "Error al actualizar la receta",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Puede importar directamente desde datos brutos",
|
||||
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
|
||||
"stay-in-edit-mode": "Permanecer en modo edición",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analizar los ingredientes de la receta después de importarla",
|
||||
"import-from-zip": "Importar desde zip",
|
||||
"import-from-zip-description": "Importa una receta única que fue exportada desde otra instancia de Mealie.",
|
||||
"import-from-html-or-json": "Importar desde HTML o JSON",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Esta unidad no pudo ser procesada automáticamente",
|
||||
"this-food-could-not-be-parsed-automatically": "Esta comida no pudo ser procesada automáticamente",
|
||||
"no-food": "Sin Comida",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Revisar los ingredientes analizados",
|
||||
"confidence-score": "Puntuación de confianza",
|
||||
"ingredient-parser-description": "Tus ingredientes se han analizado correctamente. Revisa los ingredientes que no nos convencen.",
|
||||
"ingredient-parser-final-review-description": "Una vez que se hayan revisado todos los ingredientes, tendrás una oportunidad más de revisarlos todos antes de aplicar los cambios a tu receta.",
|
||||
"add-text-as-alias-for-item": "Añadir \"{text}\" como alias para {item}",
|
||||
"delete-item": "Borrar elemento"
|
||||
},
|
||||
"reset-servings-count": "Restablecer contador de porciones",
|
||||
"not-linked-ingredients": "Ingredientes adicionales",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Subir imágenes",
|
||||
"upload-more-images": "Subir más imágenes",
|
||||
"set-as-cover-image": "Establecer como imagen de portada de receta",
|
||||
"cover-image": "Imagen de portada"
|
||||
"cover-image": "Imagen de portada",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Alternar Receta"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Buscador de recetas",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Presione '/'",
|
||||
"advanced": "Avanzado",
|
||||
"auto-search": "Búsqueda automática",
|
||||
"no-results": "No se encontraron resultados"
|
||||
"no-results": "No se encontraron resultados",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Añadir un nuevo tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "¿No quieres ver esto más? ¡Asegúrate de cambiar tu correo electrónico en tu configuración de usuario!",
|
||||
"forgot-password": "Olvidé mi contraseña",
|
||||
"forgot-password-text": "Por favor, introduce tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.",
|
||||
"changes-reflected-immediately": "Los cambios en este grupo se reflejarán inmediatamente."
|
||||
"changes-reflected-immediately": "Los cambios en este grupo se reflejarán inmediatamente.",
|
||||
"default-activity": "Actividad predeterminada",
|
||||
"default-activity-hint": "Selecciona la pagina a la que navegar al iniciar la sesion en este dispositivo"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traducido",
|
||||
|
||||
@@ -62,14 +62,14 @@
|
||||
"notification": "Teade",
|
||||
"refresh": "Värskenda",
|
||||
"scheduled": "Ajastatud",
|
||||
"something-went-wrong": "Miski läks valesti",
|
||||
"something-went-wrong": "Miski läks valesti!",
|
||||
"subscribed-events": "Tellitud sündmused",
|
||||
"test-message-sent": "Test-sõnum saadetud",
|
||||
"message-sent": "Sõnum saadetud",
|
||||
"new-notification": "Uus teade",
|
||||
"event-notifiers": "Sündmuste märguanded",
|
||||
"apprise-url-skipped-if-blank": "Apprise URL (kui on tühi, jäetakse vahele)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Kuna Apprise URL-id sisaldavad tavaliselt tundlikku teavet, jäetakse see väli redigeerimisel tahtlikult tühjaks. Kui soovite URL-i uuendada, sisestage siia uus URL, muidu jätke väli tühjaks, et säilitada praegune URL.",
|
||||
"enable-notifier": "Luba teavitaja",
|
||||
"what-events": "Millised sündmused peaks see teavitaja tellimaa?",
|
||||
"user-events": "Kasutaja sündmused",
|
||||
@@ -105,8 +105,8 @@
|
||||
"exception": "Erand",
|
||||
"failed-count": "Ebaõnnestunud: {count}",
|
||||
"failure-uploading-file": "Faili üleslaadimine ebaõnnestunud",
|
||||
"favorites": "Lemmiud",
|
||||
"field-required": "Väli nõutud",
|
||||
"favorites": "Lemmikud",
|
||||
"field-required": "Nõutud väli",
|
||||
"file-folder-not-found": "Faili/kausta ei leitud",
|
||||
"file-uploaded": "Fail üles laetud",
|
||||
"filter": "Filter",
|
||||
@@ -119,17 +119,17 @@
|
||||
"import": "Impordi",
|
||||
"json": "JSON",
|
||||
"keyword": "Otsingusõna",
|
||||
"link-copied": "Link kopeeritud!",
|
||||
"link-copied": "Link kopeeritud",
|
||||
"loading": "Laadimine",
|
||||
"loading-events": "Sündmuste laadimine",
|
||||
"loading-recipe": "Laeb retsepti...",
|
||||
"loading-ocr-data": "Laeb OCR admeid",
|
||||
"loading-recipes": "Laeb retsepte",
|
||||
"loading-recipe": "Retsepti laadimine...",
|
||||
"loading-ocr-data": "OCR admete laadimine...",
|
||||
"loading-recipes": "Retseptide laadimine",
|
||||
"message": "Sõnum",
|
||||
"monday": "Esmaspäev",
|
||||
"name": "Nimi",
|
||||
"new": "Uus",
|
||||
"never": "Uuem",
|
||||
"never": "Mitte kunagi",
|
||||
"no": "Ei",
|
||||
"no-recipe-found": "Retsepti ei leitud",
|
||||
"ok": "OK",
|
||||
@@ -192,7 +192,7 @@
|
||||
"a-name-is-required": "Nimi on kohustuslik",
|
||||
"delete-with-name": "Kustuta {name}",
|
||||
"confirm-delete-generic-with-name": "Kas olete kindel, et soovite kirje {name} kustutada?",
|
||||
"confirm-delete-own-admin-account": "Pane tähele, et sa proovid kustutada oma admin kasutajat! Seda tegevust ei saa tagasi võtta ning su kasutaja on jäädavalt kustutatud.",
|
||||
"confirm-delete-own-admin-account": "Pane tähele, et sa proovid kustutada oma admin kasutajat! Seda tegevust ei saa tagasi võtta ning see kustutab su kasutaja jäädavalt.",
|
||||
"organizer": "Korraldaja",
|
||||
"transfer": "Vii üle",
|
||||
"copy": "Kopeeri",
|
||||
@@ -203,8 +203,8 @@
|
||||
"this-feature-is-currently-inactive": "See funktsioon on hetkel mitte-aktiivne",
|
||||
"clipboard-not-supported": "Lõikelaud ei ole toetatud",
|
||||
"copied-to-clipboard": "Kopeeritud lõikelauale",
|
||||
"your-browser-does-not-support-clipboard": "Sinu lehitseja ei toeta lõikelauda.",
|
||||
"copied-items-to-clipboard": "Midagi ei kopeeritud lõikelauale | Üks asi kopeeritud lõikelauale | {count} asja kopeeritud lõikelauale",
|
||||
"your-browser-does-not-support-clipboard": "Sinu lehitseja ei toeta lõikelauda",
|
||||
"copied-items-to-clipboard": "Midagi ei kopeeritud lõikelauale|Üks asi kopeeritud lõikelauale|{count} asja kopeeritud lõikelauale",
|
||||
"actions": "Tegevused",
|
||||
"selected-count": "Valitud: {count}",
|
||||
"export-all": "Ekspordi kõik",
|
||||
@@ -212,7 +212,7 @@
|
||||
"upload-file": "Lae fail üles",
|
||||
"created-on-date": "Loodud: {0}",
|
||||
"unsaved-changes": "Sul on salvestamata muudatusi. Kas sa tahad salvestada enne lehelt lahkumist? Vajuta OK salvestamiseks või Tühista, et muudatused tühistada.",
|
||||
"clipboard-copy-failure": "Lõikepuhvrisse kopeerimine ebaõnnestus",
|
||||
"clipboard-copy-failure": "Lõikepuhvrisse kopeerimine ebaõnnestus.",
|
||||
"confirm-delete-generic-items": "Kas oled kindel, et tahad kustutada järgnevad asjad?",
|
||||
"organizers": "Korraldajad",
|
||||
"caution": "Ettevaatust",
|
||||
@@ -222,7 +222,7 @@
|
||||
"date-updated": "Üleslaadimise kuupäev"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Kas oled kindel, et tahad kustutada <b>{groupName}<b/>",
|
||||
"are-you-sure-you-want-to-delete-the-group": "Kas oled kindel, et tahad kustutada <b>{groupName}<b/>?",
|
||||
"cannot-delete-default-group": "Ei saa kustutada vaikegruppi",
|
||||
"cannot-delete-group-with-users": "Ei saa kustutada kasutajatega gruppi",
|
||||
"confirm-group-deletion": "Kinnita grupi kustutamine",
|
||||
@@ -251,15 +251,15 @@
|
||||
"manage-household": "Halda leibkonda",
|
||||
"invite": "Kutsu",
|
||||
"looking-to-update-your-profile": "Kas soovida uuendada oma profiili?",
|
||||
"default-recipe-preferences-description": "Need on lähteseaded kui loote uut retseepti oma grupis. Neid saab muuta iga retsepti jaoks individuaalselt retsepti sätete menüüs.",
|
||||
"default-recipe-preferences-description": "Need on lähteseaded kui loote uut retsepti oma grupis. Neid saab muuta iga retsepti jaoks individuaalselt retsepti sätete menüüs.",
|
||||
"default-recipe-preferences": "Retsepti vaikevalikud",
|
||||
"group-preferences": "Grupi sätted",
|
||||
"private-group": "Privaatne grupp",
|
||||
"private-group-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded.",
|
||||
"private-group-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded",
|
||||
"enable-public-access": "Luba avalik juurdepääs",
|
||||
"enable-public-access-description": "Teeb grupi retseptid vaikimisi avalikuks ja lubab külalistel vaadata retsepte ilma sisse logimata",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Lubab kasutajatel väljaspool sinu gruppi näha retsepte",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link.",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link",
|
||||
"show-nutrition-information": "Näita toitumisalast teavet",
|
||||
"show-nutrition-information-description": "Kui see on lubatud, kuvatakse saadavuse korral toitumisalane teave retseptis. Kui toitumisalane teave pole saadaval, siis toitumisalast teavet ei kuvata",
|
||||
"show-recipe-assets": "Näita retsepti manuseid",
|
||||
@@ -294,13 +294,13 @@
|
||||
"admin-household-management-text": "Selle leibkonna muudatused on koheselt nähtaval",
|
||||
"household-id-value": "Leibkonna ID: {0}",
|
||||
"private-household": "Privaatne leibkond",
|
||||
"private-household-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded.",
|
||||
"private-household-description": "Grupi privaatseks määramine keelab kõik avaliku vaate valikud. See kirjutab üle kõik üksikud avaliku vaate seaded",
|
||||
"lock-recipe-edits-from-other-households": "Lukusta retsepti muudatused teiste leibkondade eest",
|
||||
"lock-recipe-edits-from-other-households-description": "Kui lubatud, ainult sinu leibkonna kasutajad saavad teha muudatusi sinu leibkonna retseptides",
|
||||
"household-recipe-preferences": "Leibkonna retseptide seaded",
|
||||
"default-recipe-preferences-description": "Need on vaikesätted uute retseptide loomiseks sinu leibkonnas. Neid saab muuta iga retsepti jaoks individuaalselt seadete menüü alt",
|
||||
"default-recipe-preferences-description": "Need on vaikesätted uute retseptide loomiseks sinu leibkonnas. Neid saab muuta iga retsepti jaoks individuaalselt seadete menüü alt.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Luba kasutajatel väljaspool sinu leibkonda näha sinu retsepte",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Kui see on lubatud, saate konkreetsete retseptide jagamiseks ilma kasutaja loata kasutada avalikku jagamislinki. Kui see on keelatud, saate retsepte jagada ainult nende kasutajatega, kes on teie rühmas või kellel on eelnevalt loodud privaatne link",
|
||||
"household-preferences": "Leibkonna seaded"
|
||||
},
|
||||
"meal-plan": {
|
||||
@@ -314,7 +314,7 @@
|
||||
"group": "Grupp (beeta)",
|
||||
"main": "Pearoog",
|
||||
"meal-planner": "Toitumismplaneerija",
|
||||
"meal-plans": "Toitumismplanid",
|
||||
"meal-plans": "Toitumismplaanid",
|
||||
"mealplan-categories": "TOITUMISPLAANI KATEGOORIAD",
|
||||
"mealplan-created": "Toitumisplaan loodud",
|
||||
"mealplan-creation-failed": "Toitumisplaani loomine ebaõnnestus",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie saab importida retsepte Tandoor-ist. Ekspordi oma andmed \"Default\" formaadis ning lae .zip allolevasse kasti",
|
||||
"title": "Tandoor-i retsptid"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie saab importida retsepte DVO Cook'n X3-st. Ekspordi kokaraamat või menüü „Cook'n“ formaadis, nimeta ekspordi laiendiks .zip ja lae seejärel .zip allpool üles.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Retsepti andmete ületoomised",
|
||||
"recipe-data-migrations-explanation": "Retsepte saab üle tuua teisest toetatud rakendusest Mealiesse. See on hea viis tegemaks algust Mealie-ga.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Tuled teisest rakendusest või hoopis vanemast Mealie versioonist? Uuri ületoomise võimalusi ning vaata kas su andmeid saab importida.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Proovib paragrahvi poolitada sobitades \"1)\" või \"1\". mustrid",
|
||||
"import-by-url": "Impordi retsept URL-lt",
|
||||
"create-manually": "Loo retsept manuaalselt",
|
||||
"make-recipe-image": "Sea see retsepti pildiks"
|
||||
"make-recipe-image": "Sea see retsepti pildiks",
|
||||
"add-food": "Lisa toit",
|
||||
"add-recipe": "Lisa retsept"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Lehte ei leitud",
|
||||
@@ -474,7 +480,7 @@
|
||||
"comment": "Kommentaar",
|
||||
"comments": "Kommentaarid",
|
||||
"delete-confirmation": "Kas sa oled kindel, et tahad seda retsepti kustutada?",
|
||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
||||
"admin-delete-confirmation": "Sa oled kustutamas sulle mittekuuluvat retsepti, kasutades administraatori õigusi. Oled kindel?",
|
||||
"delete-recipe": "Kustuta retsept",
|
||||
"description": "Kirjeldus",
|
||||
"disable-amount": "Deaktiveeri koostisosade kogused",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Retsept kustutatud",
|
||||
"recipe-image": "Retsepti pilt",
|
||||
"recipe-image-updated": "Retsepti pilt uuendatud",
|
||||
"delete-image": "Kustuta retsepti pilt",
|
||||
"delete-image-confirmation": "Kas sa oled kindel, et tahad seda retsepti pilti kustutada?",
|
||||
"recipe-image-deleted": "Retsepti pilt kustutatud",
|
||||
"recipe-name": "Retsepti nimi",
|
||||
"recipe-settings": "Retsepti seaded",
|
||||
"recipe-update-failed": "Retsepti uuendamine ebaõnnestus",
|
||||
@@ -541,7 +550,7 @@
|
||||
"date-format-hint-yyyy-mm-dd": "AAAA-KK-PP formaat",
|
||||
"add-to-list": "Lisa nimekirja",
|
||||
"add-to-plan": "Lisa plaani",
|
||||
"add-to-timeline": "Lisa ajateljele",
|
||||
"add-to-timeline": "Lisa ajajoonele",
|
||||
"recipe-added-to-list": "Retsept lisatud nimekirja",
|
||||
"recipes-added-to-list": "Retseptid lisatud nimekirja",
|
||||
"successfully-added-to-list": "Edukalt lisatud nimekirja",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Vali ühik",
|
||||
"press-enter-to-create": "Loomiseks vajuta Enter",
|
||||
"choose-food": "Vali toit",
|
||||
"choose-recipe": "Vali retsept",
|
||||
"notes": "Märkmed",
|
||||
"toggle-section": "Jaotise sisse- ja väljalülitamine",
|
||||
"see-original-text": "Vaata originaalteksti",
|
||||
"original-text-with-value": "Originaaltekst: {originalText}",
|
||||
"ingredient-linker": "Koostisosa linkija",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Pole viidatud veel",
|
||||
"linked-to-other-step": "Lingitud järgmise sammuga",
|
||||
"auto": "Automaatne",
|
||||
"cook-mode": "Küpsetusviis",
|
||||
@@ -574,7 +584,7 @@
|
||||
"increase-scale-label": "Suurenda skaalat ühe võrra",
|
||||
"locked": "Lukustatud",
|
||||
"public-link": "Avalik link",
|
||||
"edit-timeline-event": "Muuda sündmust ajasjoonel",
|
||||
"edit-timeline-event": "Muuda sündmust ajajoonel",
|
||||
"timeline": "Ajajoon",
|
||||
"timeline-is-empty": "Ajajoon on tühi. Proovi valmistada see retsept!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Sündmused puuduvad. Proovi kohandada oma otsingufiltreid.",
|
||||
@@ -583,14 +593,15 @@
|
||||
"made-this": "Olen seda valmistanud",
|
||||
"how-did-it-turn-out": "Kuidas tuli see välja?",
|
||||
"user-made-this": "{user} on seda valmistanud",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
||||
"made-for-recipe": "Tehtud {recipe} jaoks",
|
||||
"added-to-timeline": "Lisatud ajajoonele",
|
||||
"failed-to-add-to-timeline": "Ajajoonele lisamine ebaõnnestus",
|
||||
"failed-to-update-recipe": "Retsepti uuendamine ebaõnnestus",
|
||||
"added-to-timeline-but-failed-to-add-image": "Lisatud ajajoonele, kuid pildi lisamine ebaõnnestus",
|
||||
"api-extras-description": "Retsepti väljavõtted on Meali API oluline funktsioon. Neid saab kasutada kohandatud JSON-võtme/väärtuse paaride loomiseks retseptis, et viidata kolmandate osapoolte rakendustele. Neid klahve saab kasutada teabe edastamiseks, näiteks automaatse toimingu või kohandatud sõnumi käivitamiseks teie valitud seadmele.",
|
||||
"message-key": "Sõnumi võti",
|
||||
"parse": "Analüüsi",
|
||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||
"ingredients-not-parsed-description": "Tundub, et teie koostisosad pole veel tuvastatud. Klõpsake allpool olevat nuppu „{parse}”, et tuvastada teie koostisosad struktureeritud toitudeks.",
|
||||
"attach-images-hint": "Lisa pildid manustesse neid lohistades ja vabastades need redaktorisse",
|
||||
"drop-image": "Vabasta pilt",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Luba koostisosa kogused, et kasutada seda omadust",
|
||||
@@ -608,10 +619,10 @@
|
||||
"create-recipe-from-an-image": "Retsepti loomine pildist",
|
||||
"create-recipe-from-an-image-description": "Retsepti loomiseks lae üles selle pilt. Mealie üritab ekstraheerida pildil oleva teksti ning luua retsepti sellest kasutades AI-d.",
|
||||
"crop-and-rotate-the-image": "Kärpige ja pöörake pilti nii, et ainult tekst oleks nähtaval ja see oleks suunatud ülespoole.",
|
||||
"create-from-images": "Create from Images",
|
||||
"create-from-images": "Retsepti loomine pildist",
|
||||
"should-translate-description": "Tõlgi retsept minu keelde",
|
||||
"please-wait-image-procesing": "Palun oota, pilti töödeldakse veel. See võib võtta veidi aega.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"please-wait-images-processing": "Palun oota, pilti töödeldakse veel. See võib võtta veidi aega.",
|
||||
"bulk-url-import": "Hulgiimport URL-ist",
|
||||
"debug-scraper": "Otsige Scraperis probleeme",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Loo retsept selle nime kasutades. Igal retseptil peab olema unikaalne nimi",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Sa võid otse importida töötlemata andmetest",
|
||||
"import-original-keywords-as-tags": "Impordi originaal võtmesõnad siltidena",
|
||||
"stay-in-edit-mode": "Püsige redigeerimisrežiimis",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Tuvasta retsepti koostisosad pärast importimist",
|
||||
"import-from-zip": "Impordi .zip-st",
|
||||
"import-from-zip-description": "Impordi üks retsept, mis oli eksporditud teisest Mealie paigaldusest.",
|
||||
"import-from-html-or-json": "Impordi HTMLst või JSONist",
|
||||
@@ -668,23 +679,26 @@
|
||||
"no-unit": "Ilma ühikuta",
|
||||
"missing-unit": "Loo puuduv ühik: {unit}",
|
||||
"missing-food": "Loo puuduv toit: {food}",
|
||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
||||
"this-unit-could-not-be-parsed-automatically": "Seda ühikut ei saanud automaatselt tuvastada",
|
||||
"this-food-could-not-be-parsed-automatically": "Seda toitu ei saanud automaatselt tuvastada",
|
||||
"no-food": "Toit puudub",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Vaata läbi tuvastatud koostisosad",
|
||||
"confidence-score": "Kindluse tase",
|
||||
"ingredient-parser-description": "Koostisosad on edukalt tuvastatud. Palun vaadake üle koostisosad, mille puhul me pole kindlad.",
|
||||
"ingredient-parser-final-review-description": "Kui kõik koostisosad on üle vaadatud, on teil enne muudatuste retsepti salvestamist veel üks võimalus kõik koostisosad üle vaadata.",
|
||||
"add-text-as-alias-for-item": "Lisa \"{text}\" kui teine nimetus {item} jaoks",
|
||||
"delete-item": "Kustuta element"
|
||||
},
|
||||
"reset-servings-count": "Lähtesta portsionite arv",
|
||||
"not-linked-ingredients": "Lisa-koostisosad",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"upload-another-image": "Laadi üles veel üks pilt",
|
||||
"upload-images": "Lae üles pilte",
|
||||
"upload-more-images": "Lae üles veel pilte",
|
||||
"set-as-cover-image": "Määra retsepti kaanepildiks",
|
||||
"cover-image": "Kaanepilt",
|
||||
"include-linked-recipes": "Arva kaasa viidatud retseptid",
|
||||
"include-linked-recipe-ingredients": "Arva kaasa viidatud retseptide koostisosad",
|
||||
"toggle-recipe": "Lülita retsept"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Retsepti otsing",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Vajuta \"/\"",
|
||||
"advanced": "Lisavalikud",
|
||||
"auto-search": "Automaatotsing",
|
||||
"no-results": "Tulemusi ei leitud"
|
||||
"no-results": "Tulemusi ei leitud",
|
||||
"type-to-search": "Tippige otsimiseks..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Lisa uus teema",
|
||||
@@ -744,7 +759,7 @@
|
||||
"backup-restore": "Taasta tagavarakoopiast",
|
||||
"back-restore-description": "Selle varukoopia taastamisel kirjutatakse üle kõik teie andmebaasis ja andmebaasihalduris olevad andmed ning asendatakse need selle varukoopia sisuga. {cannot-be-undone} Kui taastamine õnnestub, logitakse teid välja.",
|
||||
"cannot-be-undone": "Seda tegevust ei saa tagasi võtta - kasuta ettevaatusega.",
|
||||
"postgresql-note": "If you are using PostgreSQL, please review the {backup-restore-process} prior to restoring.",
|
||||
"postgresql-note": "Kui kasutate PostgreSQL-i, vaadake enne taastamist läbi {backup-restore-process}.",
|
||||
"backup-restore-process-in-the-documentation": "varundamise/taastamise protsessi dokumentatsioonis",
|
||||
"irreversible-acknowledgment": "Ma saan aru, et seda tegevust ei ole võimalik tagasi võtta, on destruktiivne, ning võib põhjustada andmekadu",
|
||||
"restore-backup": "Taasta tagavarakoopiast"
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Ei taha enam seda näha? Ära unusta muuta oma email kasutaja seadetes",
|
||||
"forgot-password": "Unustasid salasõna",
|
||||
"forgot-password-text": "Sisestage oma meiliaadress, et saada e-kiri uue salasõna määramiseks.",
|
||||
"changes-reflected-immediately": "Selle kasutaja muudatused on koheselt nähtaval"
|
||||
"changes-reflected-immediately": "Selle kasutaja muudatused on koheselt nähtaval",
|
||||
"default-activity": "Vaikimisi tegevus",
|
||||
"default-activity-hint": "Valige, millisele lehele soovite navigeerida, kui logite sisse sellelt seadmelt"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tõlgitud",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Grupi detailid",
|
||||
"group-details-description": "Sa pead looma grupi enne konto loomist. Sinu grupis oled vaid sina, kuid sa saad kutsuda teisi sinna hiljem. Su grupi liikmed saavad jagada toitumisplaane, ostunimekirju, retsepte ja muud!",
|
||||
"use-seed-data": "Kasuta baasandmete infot.",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "Mealie sisaldab toiduainete, ühikute ja siltide kogumit, mida saad enda gruppi kaasata, et hõlbustada retseptide organiseerimist. Need on tõlgitud teie valitud keelde. Neid andmeid saab alati hiljem täiendada või muuta.",
|
||||
"account-details": "Konto üksikasjad"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"about": {
|
||||
"about": "Tietoja",
|
||||
"about-mealie": "Tietoja Mealiestä",
|
||||
"api-docs": "API Docs",
|
||||
"api-docs": "API-dokumentit",
|
||||
"api-port": "API-portti",
|
||||
"application-mode": "Sovellustila",
|
||||
"database-type": "Tietokannan tyyppi",
|
||||
@@ -12,12 +12,12 @@
|
||||
"demo": "Demo",
|
||||
"demo-status": "Demon tila",
|
||||
"development": "Kehitys",
|
||||
"docs": "Docs",
|
||||
"docs": "Dokumentit",
|
||||
"download-log": "Latausloki",
|
||||
"download-recipe-json": "Viimeisin haettu JSON",
|
||||
"github": "GitHub",
|
||||
"log-lines": "Lokirivit",
|
||||
"not-demo": "Ei esittelytilassa",
|
||||
"not-demo": "Ei demotilassa",
|
||||
"portfolio": "Portfolio",
|
||||
"production": "Tuotanto",
|
||||
"support": "Tuki",
|
||||
@@ -57,7 +57,7 @@
|
||||
"event-delete-confirmation": "Oletko varma että haluat poistaa tämän tapahtuman?",
|
||||
"event-deleted": "Tapahtuma poistettu",
|
||||
"event-updated": "Tapahtuma päivitetty",
|
||||
"new-notification-form-description": "Mealie käyttää Apprise-kirjastoa ilmoitusten luomiseen. Se tarjoaa monia ilmoituspalvelveluvaihtoehtoja. Lisää tietoa siitä, kuinka luoda URL palvelua varten, Apprisen wikistä. Joihinkin ilmoitustyyppeihin voi sisältyä lisäominaisuuksia.",
|
||||
"new-notification-form-description": "Mealie käyttää Apprise-kirjastoa ilmoitusten luomiseen. Se tarjoaa monia ilmoituspalvelveluvaihtoehtoja. Lisää tietoa siitä, kuinka luoda URL palvelua varten, löydät Apprisen wikistä. Joihinkin ilmoitustyyppeihin voi sisältyä lisäominaisuuksia.",
|
||||
"new-version": "Uusi versio saatavilla!",
|
||||
"notification": "Ilmoitus",
|
||||
"refresh": "Päivitä",
|
||||
@@ -69,11 +69,11 @@
|
||||
"new-notification": "Uusi ilmoitus",
|
||||
"event-notifiers": "Tapahtumien ilmoitukset",
|
||||
"apprise-url-skipped-if-blank": "Ilmoitusverkko-osoite (voi jättää tyhjäksi)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Apprise URL-osoitteet sisältävät yleensä arkaluonteisia tietoja, joten tämä kenttä on tarkoituksellisesti tyhjä muokattaessa. Jos haluat päivittää URL-osoitteen, kirjoita uusi osoite tähän, muuten jätä se tyhjäksi pitääksesi nykyisen URL-osoitteen.",
|
||||
"enable-notifier": "Ota ilmoittaja käyttöön",
|
||||
"what-events": "Mistä tapahtumista tulisi ilmoittaa?",
|
||||
"user-events": "Käyttäjän tapahtumat",
|
||||
"mealplan-events": "Ateriasuunnitelman Tapahtumat",
|
||||
"mealplan-events": "Ateriasuunnittelun tapahtumat",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Kun ryhmäsi käyttäjä tekee ateriasuunnitelman",
|
||||
"shopping-list-events": "Ostoslistatapahtumat",
|
||||
"cookbook-events": "Keittokirjatapahtumat",
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Luokkatapahtumat",
|
||||
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen",
|
||||
"recipe-events": "Reseptitapahtumat",
|
||||
"label-events": "Label Events"
|
||||
"label-events": "Merkitse Tapahtumat"
|
||||
},
|
||||
"general": {
|
||||
"add": "Lisää",
|
||||
@@ -136,7 +136,7 @@
|
||||
"options": "Valinnat:",
|
||||
"plural-name": "Monikollinen nimi",
|
||||
"print": "Tulosta",
|
||||
"print-preferences": "Tulosta asetukset",
|
||||
"print-preferences": "Tulostusasetukset",
|
||||
"random": "Satunnainen",
|
||||
"rating": "Arvio",
|
||||
"recent": "Viimeisimmät",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie voi tuoda reseptejä Tandoorista. Vie tietosi \"Oletus\" -muodossa ja lataa sitten .zip alla.",
|
||||
"title": "Tandoor Recipes -sovellus"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie voi tuoda reseptejä DVO Cook'n X3:sta. Vie keittokirja tai valikko \"Cook'n\"-muodossa, nimeä tiedosto uudelleen .zip-muotoon ja lataa sitten Mealieen alta.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Reseptien tietojen migraatiot",
|
||||
"recipe-data-migrations-explanation": "Reseptit voidaan siirtää toisesta tuetusta sovelluksesta Mealie -sovellukseen. Tämä on hyvä tapa päästä alkuun Mealiella.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Olitko toisessa sovelluksessa tai Mealien aiemmassa versiossa? Tarkista, voidaanko tietosi siirtää.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Yrittää jakaa kappaleen vastaamalla '1)' tai '1.' kuvioita",
|
||||
"import-by-url": "Tuo resepti osoitteesta",
|
||||
"create-manually": "Luo resepti manuaalisesti",
|
||||
"make-recipe-image": "Luo reseptikuva"
|
||||
"make-recipe-image": "Luo reseptikuva",
|
||||
"add-food": "Lisää Ruoka",
|
||||
"add-recipe": "Lisää resepti"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 sivua ei löydy",
|
||||
@@ -474,7 +480,7 @@
|
||||
"comment": "Kommentti",
|
||||
"comments": "Kommentit",
|
||||
"delete-confirmation": "Haluatko varmasti poistaa reseptin?",
|
||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
||||
"admin-delete-confirmation": "Olet poistamassa reseptiä, joka ei ole sinun käyttäen järjestelmänvalvojan käyttöoikeuksia. Oletko varma?",
|
||||
"delete-recipe": "Poista resepti",
|
||||
"description": "Kuvaus",
|
||||
"disable-amount": "Poista ainesosien määrät käytöstä",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Resepti poistettu",
|
||||
"recipe-image": "Reseptikuva",
|
||||
"recipe-image-updated": "Reseptikuva päivitetty",
|
||||
"delete-image": "Poista Reseptin Kuva",
|
||||
"delete-image-confirmation": "Haluatko varmasti poistaa reseptikuvan?",
|
||||
"recipe-image-deleted": "Reseptikuva poistettu",
|
||||
"recipe-name": "Reseptin nimi",
|
||||
"recipe-settings": "Reseptiasetukset",
|
||||
"recipe-update-failed": "Reseptin päivitys epäonnistui",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Valitse Yksikkö",
|
||||
"press-enter-to-create": "Luo painamalla Enter",
|
||||
"choose-food": "Valitse Ruoka",
|
||||
"choose-recipe": "Valitse Resepti",
|
||||
"notes": "Merkinnät",
|
||||
"toggle-section": "Vaihda osio",
|
||||
"see-original-text": "Katso Alkuperäinen Teksti",
|
||||
"original-text-with-value": "Alkuperäinen Teksti: {originalText}",
|
||||
"ingredient-linker": "Ainesosan linkittäjä",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Ei vielä linkitetty",
|
||||
"linked-to-other-step": "Linkitetty toiseen vaiheeseen",
|
||||
"auto": "Automaattinen",
|
||||
"cook-mode": "Kokkitila",
|
||||
@@ -583,14 +593,15 @@
|
||||
"made-this": "Tein tämän",
|
||||
"how-did-it-turn-out": "Miten se onnistui?",
|
||||
"user-made-this": "{user} teki tämän",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
||||
"made-for-recipe": "Tehty reseptille",
|
||||
"added-to-timeline": "Lisätty aikajanalle",
|
||||
"failed-to-add-to-timeline": "Aikajanaan lisääminen epäonnistui",
|
||||
"failed-to-update-recipe": "Reseptin päivitys epäonnistui",
|
||||
"added-to-timeline-but-failed-to-add-image": "Lisätty aikajanaan, mutta kuvan lisääminen epäonnistui",
|
||||
"api-extras-description": "Reseptiekstrat ovat Mealien API:n tärkeä ominaisuus. Niiden avulla voidaan luoda mukautettuja JSON-avain/arvo-pareja reseptin sisällä viitaten kolmannen osapuolen sovelluksiin. Näitä avaimia voi käyttää tiedon antamiseksi, esimerkiksi automaattisen toiminnon tai mukautetun viestin käynnistämiseksi haluamaasi laitteeseen.",
|
||||
"message-key": "Viestiavain",
|
||||
"parse": "Jäsennä",
|
||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||
"ingredients-not-parsed-description": "Näyttää siltä, että ainesosat eivät ole vielä jäsenneltyjä. Klikkaa \"{parse}\" painiketta alla jäsentääksesi ainesosat strukturoiduiksi elintarvikkeiksi.",
|
||||
"attach-images-hint": "Liitä kuvia vetämällä ja pudottamalla ne editoriin",
|
||||
"drop-image": "Tuo kuva",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Käytä ainesosan määriä käyttääksesi tätä ominaisuutta",
|
||||
@@ -608,10 +619,10 @@
|
||||
"create-recipe-from-an-image": "Luo resepti kuvasta",
|
||||
"create-recipe-from-an-image-description": "Luo resepti tuomalla siitä kuva. Mealie pyrkii poimimaan tekstin kuvasta tekoälyllä ja luomaan siitä reseptin.",
|
||||
"crop-and-rotate-the-image": "Rajaa ja kierrä kuvaa niin, että vain teksti näkyy, ja että se on oikein päin.",
|
||||
"create-from-images": "Create from Images",
|
||||
"create-from-images": "Luo resepti kuvasta",
|
||||
"should-translate-description": "Käännä resepti kielelleni",
|
||||
"please-wait-image-procesing": "Odota, että kuva käsitellään. Tämä voi kestää hetken.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"please-wait-images-processing": "Odota, että kuvat käsitellään. Tämä saattaa kestää jonkin aikaa.",
|
||||
"bulk-url-import": "Massa tuonti URL-osoitteesta",
|
||||
"debug-scraper": "Etsi ongelmia Scraperista",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Luo resepti antamalla nimi. Kaikilla resepteillä on oltava yksilölliset nimet.",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Voit tuoda raakadatan suoraan",
|
||||
"import-original-keywords-as-tags": "Tuo alkuperäiset avainsanat tunnisteiksi",
|
||||
"stay-in-edit-mode": "Pysy muokkaustilassa",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Jäsennä reseptin ainesosat tuonnin jälkeen",
|
||||
"import-from-zip": "Tuo zip-arkistosta",
|
||||
"import-from-zip-description": "Tuo yksi resepti, joka on viety toisesta Mealie-asennuksesta.",
|
||||
"import-from-html-or-json": "Tuo HTML- tai JSON-tiedostosta",
|
||||
@@ -668,23 +679,26 @@
|
||||
"no-unit": "Ei yksikköä",
|
||||
"missing-unit": "Luo puuttuva yksikkö: {unit}",
|
||||
"missing-food": "Luo puuttuva ruoka: {food}",
|
||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
||||
"this-unit-could-not-be-parsed-automatically": "Tätä yksikköä ei voitu jäsentää automaattisesti",
|
||||
"this-food-could-not-be-parsed-automatically": "Tätä ruokaa ei voitu automaattisesti jäsentää",
|
||||
"no-food": "Ei ruokaa",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Tarkastele jäsennetyt ainesosat",
|
||||
"confidence-score": "Varmuuspisteet",
|
||||
"ingredient-parser-description": "Ainesosat on haettu onnistuneesti. Ole hyvä ja tarkista ainesosat joista emme ole varmoja.",
|
||||
"ingredient-parser-final-review-description": "Kun kaikki ainesosat on tarkistettu, sinulla on vielä yksi mahdollisuus tarkistaa kaikki ainesosat ennen kuin muokkaat reseptiäsi.",
|
||||
"add-text-as-alias-for-item": "",
|
||||
"delete-item": "Poista kohde"
|
||||
},
|
||||
"reset-servings-count": "Palauta Annoksien Määrä",
|
||||
"not-linked-ingredients": "Muut ainesosat",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"upload-another-image": "Lataa toinen kuva",
|
||||
"upload-images": "Lataa kuva",
|
||||
"upload-more-images": "Lataa lisää kuvia",
|
||||
"set-as-cover-image": "Aseta reseptin kansikuvaksi",
|
||||
"cover-image": "Kansikuva",
|
||||
"include-linked-recipes": "Sisällytä Linkitetyt Reseptit",
|
||||
"include-linked-recipe-ingredients": "Sisällytä Yhdistetyt Reseptin Ainesosat",
|
||||
"toggle-recipe": "Vaihda osio"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Reseptin etsijä",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Paina '/'",
|
||||
"advanced": "Lisäasetukset",
|
||||
"auto-search": "Automaattinen Haku",
|
||||
"no-results": "Ei tuloksia"
|
||||
"no-results": "Ei tuloksia",
|
||||
"type-to-search": "Kirjoita haettavaksi..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Lisää uusi teema",
|
||||
@@ -733,7 +748,7 @@
|
||||
"restore-success": "Palautus onnistui",
|
||||
"restore-fail": "Palautus epäonnistui. Tarkista palvelinloki saadaksesi lisätietoja",
|
||||
"backup-tag": "Varmuuskopion tunniste",
|
||||
"create-heading": "Create a Backup",
|
||||
"create-heading": "Luo varmuuskopio",
|
||||
"delete-backup": "Poista varmuuskopio",
|
||||
"error-creating-backup-see-log-file": "Virhe varmuuskopiota luodessa. Katso lokitiedosto",
|
||||
"full-backup": "Täysi varmuuskopiointi",
|
||||
@@ -988,7 +1003,7 @@
|
||||
"login": "Kirjaudu",
|
||||
"login-oidc": "Kirjaudu sisään käyttäen",
|
||||
"or": "tai",
|
||||
"logout": "Uloskirjaudu",
|
||||
"logout": "Kirjaudu ulos",
|
||||
"manage-users": "Käyttäjien hallinta",
|
||||
"manage-users-description": "Luo ja hallitse käyttäjiä.",
|
||||
"new-password": "Uusi salasana",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vaihda sähköpostisi asetuksista, jos et halua nähdä tätä enää.",
|
||||
"forgot-password": "Unohditko salasanasi",
|
||||
"forgot-password-text": "Syötä sähköpostiosoitteesi, niin voit muuttaa salasanaasi linkin kautta.",
|
||||
"changes-reflected-immediately": "Muutokset tähän käyttäjään astuvat välittömästi voimaan."
|
||||
"changes-reflected-immediately": "Muutokset tähän käyttäjään astuvat välittömästi voimaan.",
|
||||
"default-activity": "Oletus Toiminta",
|
||||
"default-activity-hint": "Valitse haluamasi sivu, johon haluat navigoida kirjautuessasi tältä laitteelta"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "käännetty",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Ryhmän tiedot",
|
||||
"group-details-description": "Ennen kuin luot tilin, sinun on luotava ryhmä. Ryhmässäsi on vain sinä, mutta voit kutsua muita myöhemmin. Ryhmäsi jäsenet voivat jakaa ateriasuunnitelmia, ostoslistoja, reseptejä ja paljon muuta!",
|
||||
"use-seed-data": "Käytä pohjatietoja",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "Mealie:ssa tulee mukana kokoelma valmiita Ruokia, Yksiköitä sekä Luokituksia, joita voidaan käyttää resepteissä sekä niiden lajittelussa. Ne on käännetty kielelle joka on tällä hetkellä valittuna. Voit aina lisätä tai muokata tätä dataa myöhemmin.",
|
||||
"account-details": "Tilitiedot"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
|
||||
"title": "Recettes Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléchargez le .zip ci-dessous.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migration des données de recettes",
|
||||
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance d’une autre application une d’une version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tente de découper un paragraphe par correspondance de motifs : '1)' ou '1.'",
|
||||
"import-by-url": "Importer une recette par son URL",
|
||||
"create-manually": "Créer une recette manuellement",
|
||||
"make-recipe-image": "Faire de cette image l’image de recette"
|
||||
"make-recipe-image": "Faire de cette image l’image de recette",
|
||||
"add-food": "Ajouter un aliment",
|
||||
"add-recipe": "Ajouter une recette"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page introuvable",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recette supprimée",
|
||||
"recipe-image": "Image de la recette",
|
||||
"recipe-image-updated": "L’image de la recette a été mise à jour",
|
||||
"delete-image": "Supprimer l'image de la recette",
|
||||
"delete-image-confirmation": "Êtes-vous sûr de vouloir supprimer l'image de cette recette ?",
|
||||
"recipe-image-deleted": "L’image de la recette a été supprimée",
|
||||
"recipe-name": "Nom de la recette",
|
||||
"recipe-settings": "Paramètres de la recette",
|
||||
"recipe-update-failed": "La mise à jour de la recette a échoué",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Choisissez une unité",
|
||||
"press-enter-to-create": "Clique sur Entrer pour créer",
|
||||
"choose-food": "Choisissez un aliment",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Activer/Désactiver la section",
|
||||
"see-original-text": "Afficher le texte original",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Je l’ai cuisiné",
|
||||
"how-did-it-turn-out": "C’était bon ?",
|
||||
"user-made-this": "{user} l’a cuisiné",
|
||||
"made-for-recipe": "Fait pour {recipe}",
|
||||
"added-to-timeline": "Ajouté à la ligne du temps",
|
||||
"failed-to-add-to-timeline": "Impossible d'ajouter à la ligne du temps",
|
||||
"failed-to-update-recipe": "Impossible de modifier la recette",
|
||||
@@ -674,9 +685,9 @@
|
||||
"review-parsed-ingredients": "Vérifier les ingrédients analysés",
|
||||
"confidence-score": "Score de confiance",
|
||||
"ingredient-parser-description": "Vos ingrédients ont été analysés avec succès. Veuillez vérifier les ingrédients dont nous ne sommes pas certains.",
|
||||
"ingredient-parser-final-review-description": "Une fois que tous les ingrédients ont été analysés, vous aurez encore une chance de vérifier tous les ingrédients avant de les appliquer à votre recette.",
|
||||
"ingredient-parser-final-review-description": ".....",
|
||||
"add-text-as-alias-for-item": "Ajouter \"{text}\" comme alias pour {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Supprimer l'élément"
|
||||
},
|
||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Télécharger des images",
|
||||
"upload-more-images": "Télécharger d'autres images",
|
||||
"set-as-cover-image": "Définir comme image de couverture de recette",
|
||||
"cover-image": "Image de couverture"
|
||||
"cover-image": "Image de couverture",
|
||||
"include-linked-recipes": "Inclure les recettes liées",
|
||||
"include-linked-recipe-ingredients": "Inclure les ingrédients de la recette liée",
|
||||
"toggle-recipe": "Afficher/Masquer la recette"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Appuyez sur « /»",
|
||||
"advanced": "Avancé",
|
||||
"auto-search": "Recherche automatique",
|
||||
"no-results": "Aucun résultat trouvé"
|
||||
"no-results": "Aucun résultat trouvé",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
|
||||
"default-activity": "Activité par défaut ",
|
||||
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Événements de catégories",
|
||||
"when-a-new-user-joins-your-group": "Lorsqu'un nouvel utilisateur rejoint votre groupe",
|
||||
"recipe-events": "Événements de recette",
|
||||
"label-events": "Étiquette des événements"
|
||||
"label-events": "Libellé des événements"
|
||||
},
|
||||
"general": {
|
||||
"add": "Ajouter",
|
||||
@@ -198,7 +198,7 @@
|
||||
"copy": "Copier",
|
||||
"color": "Couleur",
|
||||
"timestamp": "Horodatage",
|
||||
"last-made": "Cuisiné le",
|
||||
"last-made": "Cuisinée le",
|
||||
"learn-more": "En savoir plus",
|
||||
"this-feature-is-currently-inactive": "Cette fonctionnalité est actuellement inactive",
|
||||
"clipboard-not-supported": "Presse-papier non supporté",
|
||||
@@ -375,7 +375,7 @@
|
||||
"recipe-migration": "Migrer les recettes",
|
||||
"chowdown": {
|
||||
"description": "Importer des recettes depuis Chowdown",
|
||||
"description-long": "Mealie supporte nativement le format du dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous.",
|
||||
"description-long": "Mealie supporte nativement le format du dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléverser-le ci-dessous.",
|
||||
"title": "Chowdown"
|
||||
},
|
||||
"nextcloud": {
|
||||
@@ -384,43 +384,47 @@
|
||||
"title": "Nextcloud Cookbook"
|
||||
},
|
||||
"copymethat": {
|
||||
"description-long": "Mealie peut importer des recettes à partir de Copy Me That. Exportez vos recettes au format HTML, puis téléchargez le .zip ci-dessous.",
|
||||
"description-long": "Mealie peut importer des recettes à partir de Copy Me That. Exportez vos recettes au format HTML, puis téléverser-le .zip ci-dessous.",
|
||||
"title": "Gestionnaire de recettes Copy Me That"
|
||||
},
|
||||
"paprika": {
|
||||
"description-long": "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.",
|
||||
"description-long": "Mealie peut importer des recettes depuis l'application Paprika. Exportez vos recettes de paprika, renommez l'extension d'exportation en .zip et téléverser-les ci-dessous.",
|
||||
"title": "Gestionnaire de recettes Paprika"
|
||||
},
|
||||
"mealie-pre-v1": {
|
||||
"description-long": "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.",
|
||||
"description-long": "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éverser-le fichier zip ci-dessous. Notez que seules les recettes peuvent être importées à partir de l'exportation.",
|
||||
"title": "Mealie Pré-1.0"
|
||||
},
|
||||
"tandoor": {
|
||||
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
|
||||
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléverser-le .zip ci-dessous.",
|
||||
"title": "Recettes Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléverser-le .zip ci-dessous.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migration des données de recettes",
|
||||
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance d’une autre application une d’une version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
|
||||
"choose-migration-type": "Choisissez le type de migration",
|
||||
"tag-all-recipes": "Étiquetez toutes les recettes avec le mot-clé {tag-name}",
|
||||
"nextcloud-text": "Les recettes Nextcloud peuvent être importées depuis un fichier zip qui contient les données stockées dans Nextcloud. Consultez la structure de dossiers d'exemple ci-dessous pour vous assurer que vos recettes peuvent être importées.",
|
||||
"chowdown-text": "Mealie prend en charge nativement le format de dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous.",
|
||||
"chowdown-text": "Mealie prend en charge nativement le format de dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléverser-le ci-dessous.",
|
||||
"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.",
|
||||
"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éverser-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éverser-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."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléchargez le fichier CSV ci-dessous."
|
||||
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléverser-le fichier CSV ci-dessous."
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie peut importer des recettes depuis Recipe Keeper. Exportez vos recettes au format Zip, puis téléversez le fichier .zip ci-dessous."
|
||||
"description-long": "Mealie peut importer des recettes depuis Recipe Keeper. Exportez vos recettes au format Zip, puis téléverser-le fichier .zip ci-dessous."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -436,7 +440,7 @@
|
||||
"recipe-url": "Adresse de la recette",
|
||||
"recipe-html-or-json": "Recette HTML ou JSON",
|
||||
"upload-a-recipe": "Télécharger une recette",
|
||||
"upload-individual-zip-file": "Chargez un fichier .zip exporté depuis une autre instance Mealie.",
|
||||
"upload-individual-zip-file": "Téléverser un fichier .zip exporté depuis une autre instance Mealie.",
|
||||
"url-form-hint": "Copiez et collez un lien depuis votre site de recettes favori",
|
||||
"view-scraped-data": "Voir les données récupérées",
|
||||
"trim-whitespace-description": "Ajuster les espaces de début et de fin ainsi que les lignes vides",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tenter de découper un paragraphe par correspondance de motifs : '1) ou '1.'",
|
||||
"import-by-url": "Importer une recette par son URL",
|
||||
"create-manually": "Créer une recette manuellement",
|
||||
"make-recipe-image": "Faire de cette image l’image de recette"
|
||||
"make-recipe-image": "Faire de cette image l’image de recette",
|
||||
"add-food": "Ajouter un aliment",
|
||||
"add-recipe": "Ajouter une recette"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page introuvable",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recette supprimée",
|
||||
"recipe-image": "Image de la recette",
|
||||
"recipe-image-updated": "L'image de la recette a été mise à jour",
|
||||
"delete-image": "Supprimer l'image de la recette",
|
||||
"delete-image-confirmation": "Êtes-vous sûr(e) de vouloir supprimer l'image de cette recette?",
|
||||
"recipe-image-deleted": "L'image de la recette a été supprimée",
|
||||
"recipe-name": "Nom de la recette",
|
||||
"recipe-settings": "Paramètres de la recette",
|
||||
"recipe-update-failed": "La mise à jour de la recette a échoué",
|
||||
@@ -551,17 +560,18 @@
|
||||
"failed-to-add-to-list": "Ajout dans la liste en échec",
|
||||
"yield": "Rendement",
|
||||
"yields-amount-with-text": "Produit {amount} {text}",
|
||||
"yield-text": "Unité",
|
||||
"yield-text": "Unité du rendement",
|
||||
"quantity": "Quantité",
|
||||
"choose-unit": "Choisir une unité",
|
||||
"press-enter-to-create": "Clique sur Entrer pour créer",
|
||||
"choose-food": "Choisir un aliment",
|
||||
"choose-recipe": "Choisir une recette",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Activer/désactiver la section",
|
||||
"see-original-text": "Afficher le texte original",
|
||||
"original-text-with-value": "Texte original: {originalText}",
|
||||
"ingredient-linker": "Association d’ingrédients",
|
||||
"unlinked": "Pas encore associée",
|
||||
"unlinked": "Pas encore lié",
|
||||
"linked-to-other-step": "Lié à une autre étape",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Mode Cuisine",
|
||||
@@ -583,9 +593,10 @@
|
||||
"made-this": "Je l’ai cuisiné",
|
||||
"how-did-it-turn-out": "C’était bon ?",
|
||||
"user-made-this": "{user} l’a cuisiné",
|
||||
"made-for-recipe": "Cuisinée pour {recipe}",
|
||||
"added-to-timeline": "Ajouté à l’historique",
|
||||
"failed-to-add-to-timeline": "Ajout dans l’historique en échec",
|
||||
"failed-to-update-recipe": "Impossible de mettre à jour la recette",
|
||||
"failed-to-add-to-timeline": "Échec d'ajout à l'historique",
|
||||
"failed-to-update-recipe": "Échec de la mise à jour de la recette",
|
||||
"added-to-timeline-but-failed-to-add-image": "Ajouté à l’historique, mais impossible d’ajouter l’image",
|
||||
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
||||
"message-key": "Clé de message",
|
||||
@@ -632,8 +643,8 @@
|
||||
"json-import-format-description-colon": "Pour importer via JSON, le format doit être valide :",
|
||||
"json-editor": "Éditeur JSON",
|
||||
"zip-files-must-have-been-exported-from-mealie": "Les fichiers .zip doivent avoir été exportés depuis Mealie",
|
||||
"create-a-recipe-by-uploading-a-scan": "Créer une recette en envoyant un scan.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Importer une image png d'un livre de recettes",
|
||||
"create-a-recipe-by-uploading-a-scan": "Créer une recette en téléversant une image numérisée.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Téléverser une image png d'un livre de recettes",
|
||||
"recipe-bulk-importer": "Importation en masse de recettes",
|
||||
"recipe-bulk-importer-description": "L'importateur en masse de recettes vous permet d'importer plusieurs recettes à la fois en lançant l'import en arrière-plan. Cela peut être utile lors de la migration vers Mealie, ou lorsque vous voulez importer un grand nombre de recettes.",
|
||||
"set-categories-and-tags": "Définir des catégories et des étiquettes",
|
||||
@@ -648,8 +659,8 @@
|
||||
"debug": "Déboguer",
|
||||
"tree-view": "Vue en arborescence",
|
||||
"recipe-servings": "Portions de la recette",
|
||||
"recipe-yield": "Nombre de parts",
|
||||
"recipe-yield-text": "Unité",
|
||||
"recipe-yield": "Rendement",
|
||||
"recipe-yield-text": "Unité du rendement",
|
||||
"unit": "Unité",
|
||||
"upload-image": "Ajouter une image",
|
||||
"screen-awake": "Garder l’écran allumé",
|
||||
@@ -675,16 +686,19 @@
|
||||
"confidence-score": "Score de confiance",
|
||||
"ingredient-parser-description": "Vos ingrédients ont été analysés avec succès. Veuillez vérifier les ingrédients dont nous ne sommes pas certains.",
|
||||
"ingredient-parser-final-review-description": "Une fois que tous les ingrédients ont été analysés, vous aurez encore une chance de vérifier tous les ingrédients avant de les appliquer à votre recette.",
|
||||
"add-text-as-alias-for-item": "Ajouter \"{text}\" comme alias pour {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"add-text-as-alias-for-item": "Ajouter \"{text}\" comme un alias pour {item}",
|
||||
"delete-item": "Supprimer l'élément"
|
||||
},
|
||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||
"upload-another-image": "Télécharger une autre image",
|
||||
"upload-images": "Télécharger des images",
|
||||
"upload-more-images": "Télécharger d'autres images",
|
||||
"upload-another-image": "Téléverser une autre image",
|
||||
"upload-images": "Téléverser des images",
|
||||
"upload-more-images": "Téléverser d'autres images",
|
||||
"set-as-cover-image": "Définir comme image de couverture de la recette",
|
||||
"cover-image": "Image de couverture"
|
||||
"cover-image": "Image de couverture",
|
||||
"include-linked-recipes": "Inclure les recettes liées",
|
||||
"include-linked-recipe-ingredients": "Inclure les ingrédients de la recette liée",
|
||||
"toggle-recipe": "Activer/désactiver la recette"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Appuyez sur « /»",
|
||||
"advanced": "Avancé",
|
||||
"auto-search": "Recherche automatique",
|
||||
"no-results": "Pas de résultats trouvés"
|
||||
"no-results": "Pas de résultats trouvés",
|
||||
"type-to-search": "Tapez pour chercher..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
|
||||
"default-activity": "Activité principale",
|
||||
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
@@ -1328,7 +1345,7 @@
|
||||
"household-statistics": "Statistiques du foyer",
|
||||
"household-statistics-description": "Vos statistiques du foyer fournissent un aperçu sur la façon dont vous utilisez Mealie.",
|
||||
"storage-capacity": "Capacité de stockage",
|
||||
"storage-capacity-description": "Votre capacité de stockage est un calcul des images et des ressources que vous avez téléchargées.",
|
||||
"storage-capacity-description": "Votre capacité de stockage est un calcul des images et des ressources que vous avez téléversées.",
|
||||
"personal": "Personnel",
|
||||
"personal-description": "Il s'agit de paramètres qui vous sont personnels. Les modifications ici n'affecteront pas les autres utilisateurs.",
|
||||
"user-settings": "Paramètres utilisateur",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
|
||||
"title": "Recettes Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléchargez le .zip ci-dessous.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migration des données de recettes",
|
||||
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance d’une autre application une d’une version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tente de découper un paragraphe par correspondance de motifs : '1)' ou '1.'",
|
||||
"import-by-url": "Importer une recette par son URL",
|
||||
"create-manually": "Créer une recette manuellement",
|
||||
"make-recipe-image": "Faire de cette image l’image de recette"
|
||||
"make-recipe-image": "Faire de cette image l’image de recette",
|
||||
"add-food": "Ajouter un aliment",
|
||||
"add-recipe": "Ajouter une recette"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page introuvable",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recette supprimée",
|
||||
"recipe-image": "Image de la recette",
|
||||
"recipe-image-updated": "L’image de la recette a été mise à jour",
|
||||
"delete-image": "Supprimer l'image de la recette",
|
||||
"delete-image-confirmation": "Êtes-vous sûr de vouloir supprimer l'image de cette recette ?",
|
||||
"recipe-image-deleted": "L’image de la recette a été supprimée",
|
||||
"recipe-name": "Nom de la recette",
|
||||
"recipe-settings": "Paramètres de la recette",
|
||||
"recipe-update-failed": "La mise à jour de la recette a échoué",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Choisissez une unité",
|
||||
"press-enter-to-create": "Clique sur Entrer pour créer",
|
||||
"choose-food": "Choisissez un aliment",
|
||||
"choose-recipe": "Choisissez la recette",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Activer/Désactiver la section",
|
||||
"see-original-text": "Afficher le texte original",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Je l’ai cuisiné",
|
||||
"how-did-it-turn-out": "C’était bon ?",
|
||||
"user-made-this": "{user} l’a cuisiné",
|
||||
"made-for-recipe": "Fait pour {recipe}",
|
||||
"added-to-timeline": "Ajouté à l’historique",
|
||||
"failed-to-add-to-timeline": "Ajout dans l’historique en échec",
|
||||
"failed-to-update-recipe": "Impossible de mettre à jour la recette",
|
||||
@@ -617,7 +628,7 @@
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.",
|
||||
"new-recipe-names-must-be-unique": "Les noms de nouvelles recettes doivent être uniques",
|
||||
"scrape-recipe": "Récupérer une recette",
|
||||
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer, et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
||||
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
||||
"scrape-recipe-have-a-lot-of-recipes": "Vous avez un tas de recettes à récupérer d’un coup ?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Essayez l’importateur de masse",
|
||||
"scrape-recipe-have-raw-html-or-json-data": "Vous avez des données brutes en HTML ou JSON ?",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Télécharger des images",
|
||||
"upload-more-images": "Télécharger d'autres images",
|
||||
"set-as-cover-image": "Définir comme image de couverture de la recette",
|
||||
"cover-image": "Image de couverture"
|
||||
"cover-image": "Image de couverture",
|
||||
"include-linked-recipes": "Inclure les recettes liées",
|
||||
"include-linked-recipe-ingredients": "Inclure les ingrédients de la recette liée",
|
||||
"toggle-recipe": "Afficher/Masquer la recette"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Appuyez sur « /»",
|
||||
"advanced": "Avancé",
|
||||
"auto-search": "Recherche automatique",
|
||||
"no-results": "Aucun résultat trouvé"
|
||||
"no-results": "Aucun résultat trouvé",
|
||||
"type-to-search": "Tapez pour chercher..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
|
||||
"default-activity": "Activité par défaut ",
|
||||
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "O Mealie pode importar receitas do Tandoor. Exporte os seus datos no formato \"Padrón\" e despois cargue o . zip abaixo.",
|
||||
"title": "Receitas do Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migracións de Datos de Receita",
|
||||
"recipe-data-migrations-explanation": "As receitas poden ser migradas desde outra aplicación compatível a Mealie. Esta é unha boa forma de comezar a usar o Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Ven de outra aplicación ou de unha versión ainda mais antiga do Mealie? Verifique as migracións e vexa se os seus datos poden ser importados.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tenta dividir un parágrafo facendo corresponder os padróns '1)' ou '1.'",
|
||||
"import-by-url": "Importar unha receita por URL",
|
||||
"create-manually": "Cree unha receita manualmente",
|
||||
"make-recipe-image": "Faga desta a imaxen da receita"
|
||||
"make-recipe-image": "Faga desta a imaxen da receita",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Páxina non encontrada",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Eliminouse a receita",
|
||||
"recipe-image": "Imaxe da Receita",
|
||||
"recipe-image-updated": "Actualizouse a imaxe da receita",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Nome da Receita",
|
||||
"recipe-settings": "Configuración da Receita",
|
||||
"recipe-update-failed": "Produciuse un erro na actualización da receita",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Escolla Unidade",
|
||||
"press-enter-to-create": "Prema 'Enter' para Crear",
|
||||
"choose-food": "Escoller Alimento",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notas",
|
||||
"toggle-section": "Alternar Sección",
|
||||
"see-original-text": "Mostrar Texto Orixinal",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Eu fixen isto",
|
||||
"how-did-it-turn-out": "Que tal ficou?",
|
||||
"user-made-this": "{user} fixo isto",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Adicionado ao histórico",
|
||||
"failed-to-add-to-timeline": "Falla ao adicionar ao histórico",
|
||||
"failed-to-update-recipe": "Falla ao atualizar a receita",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Cargar imaxens",
|
||||
"upload-more-images": "Cargar mais imaxens",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Localizador de Receitas",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Prema '/'",
|
||||
"advanced": "Avanzado",
|
||||
"auto-search": "Pesquisa Automática",
|
||||
"no-results": "Nengun resultado encontrado"
|
||||
"no-results": "Nengun resultado encontrado",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Adicionar novo tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Non quer voltar a ver isto? Non se esqueza de alterar o seu email nas suas definicións de usuario!",
|
||||
"forgot-password": "Esquecin a miña seña",
|
||||
"forgot-password-text": "Por favor, dixite o seu enderezo de email para enviarmos un link para redefinir a sua seña.",
|
||||
"changes-reflected-immediately": "As alteracións deste usuario serán aplicadas imediatamente."
|
||||
"changes-reflected-immediately": "As alteracións deste usuario serán aplicadas imediatamente.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traducido",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie יכול לייבא מתכונים מ-Tandoor, תייצא את המתכון בפורמט הדיפולטיבי ולאחר מכן העלאה אותם בחזרה בפורמט zip.",
|
||||
"title": "מתכוני Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "מגרציית מידע מתכונים",
|
||||
"recipe-data-migrations-explanation": "ניתן לייבא מתכונים מאפליקציות תומכות אחרות אל Mealie. זו דרך מעולה להתחיל במילי.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "הגעת מתוכנה אחרת או גרסה ישנה יותר של Mealie? מומלץ לבדוק מיגרציות ולראות אם ניתן לייבא את המידע שלך.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "מנסה לפצל את הפסקה עם תבניות '1)' או '1.'",
|
||||
"import-by-url": "ייבוא מתכון באמצעות לינק",
|
||||
"create-manually": "יצירת מתכון ידנית",
|
||||
"make-recipe-image": "הפוך תמונה זאת לתמונת המתכון"
|
||||
"make-recipe-image": "הפוך תמונה זאת לתמונת המתכון",
|
||||
"add-food": "הוסף מאכל",
|
||||
"add-recipe": "הוסף מתכון"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 העמוד אינו נמצא",
|
||||
@@ -474,7 +480,7 @@
|
||||
"comment": "הערה",
|
||||
"comments": "הערות",
|
||||
"delete-confirmation": "למחוק את המתכון הזה?",
|
||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
||||
"admin-delete-confirmation": "אתה עומד למחוק מתכון שאינו שלך באמצעות הרשאות מנהל. האם אתה בטוח?",
|
||||
"delete-recipe": "מחיקת מתכון",
|
||||
"description": "תיאור",
|
||||
"disable-amount": "ביטול כמויות מרכיבים",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "מתכון נמחק",
|
||||
"recipe-image": "תמונת המתכון",
|
||||
"recipe-image-updated": "תמונת המתכון עודכנה",
|
||||
"delete-image": "מחק תמונת מתכון",
|
||||
"delete-image-confirmation": "האם אתה בטוח שאתה רוצה למחוק את תמונת המתכון?",
|
||||
"recipe-image-deleted": "תמונת מתכון נמחקה",
|
||||
"recipe-name": "שם המתכון",
|
||||
"recipe-settings": "הגדרות המתכון",
|
||||
"recipe-update-failed": "עדכון מתכון נכשל",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "בחירת יחידת מידה",
|
||||
"press-enter-to-create": "הקש Enter כדי להוסיף",
|
||||
"choose-food": "בחר מזון",
|
||||
"choose-recipe": "בחר מתכון",
|
||||
"notes": "הערות",
|
||||
"toggle-section": "צור כותרת",
|
||||
"see-original-text": "הטקסט המקורי",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "הכנתי את זה",
|
||||
"how-did-it-turn-out": "איך יצא?",
|
||||
"user-made-this": "{user} הכין את זה",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "נוסף לציר הזמן",
|
||||
"failed-to-add-to-timeline": "כישלון בהוספה לציר הזמן",
|
||||
"failed-to-update-recipe": "כישלון בעדכון מתכון",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "העלאת תמונות",
|
||||
"upload-more-images": "העלאת תמונות נוספות",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "מצא מתכון",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "לחץ '/'",
|
||||
"advanced": "מתקדם",
|
||||
"auto-search": "חיפוש אוטומטי",
|
||||
"no-results": "לא נמצאו תוצאות"
|
||||
"no-results": "לא נמצאו תוצאות",
|
||||
"type-to-search": "הקלד לחיפוש..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "הוסף ערכת נושא חדשה",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "לא רוצה לראות את זה יותר? ניתן לשנות את המייל שלך בהגדרות המשתמש!",
|
||||
"forgot-password": "שכחתי סיסמא",
|
||||
"forgot-password-text": "נא לספק כתובת דוא\"ל. אנו נשלח לך הודעת דוא\"ל לצורך איפוס הסיסמה שלך.",
|
||||
"changes-reflected-immediately": "שינויים למשתמש זה ישתקפו מיידית."
|
||||
"changes-reflected-immediately": "שינויים למשתמש זה ישתקפו מיידית.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "תורגם",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie može inportirati recepte iz Tandoor-a. Izvezite Vaše recepte u uobičajnom formatu, pa učitajte .zip ispod.",
|
||||
"title": "Tandoor Recepti"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migracije Podataka Recepata",
|
||||
"recipe-data-migrations-explanation": "Recepti se mogu prenijeti s druge podržane aplikacije na Mealie. To je sjajan način za započetak korištenja Mealieja.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Pokušava podijeliti odlomak prepoznavanjem obrazaca '1)' ili '1.'",
|
||||
"import-by-url": "Učitaj recept preko URL linka",
|
||||
"create-manually": "Ručno kreirajte recept",
|
||||
"make-recipe-image": "Postavite ovo kao sliku recepta"
|
||||
"make-recipe-image": "Postavite ovo kao sliku recepta",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 - Stranica nije pronađena",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recept obrisan",
|
||||
"recipe-image": "Slika Recepta",
|
||||
"recipe-image-updated": "Slika recepta ažurirana",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Naziv Recepta",
|
||||
"recipe-settings": "Postavke Recepta",
|
||||
"recipe-update-failed": "Ažuriranje polja recepta",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Odaberi Jedinicu",
|
||||
"press-enter-to-create": "Pritisni Enter za Kreiranje",
|
||||
"choose-food": "Odaberi Hranu",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Bilješke",
|
||||
"toggle-section": "Preklopi Odjeljak",
|
||||
"see-original-text": "Prikaži Izvorni Tekst",
|
||||
@@ -568,7 +578,7 @@
|
||||
"link-ingredients": "Poveži Sastojke",
|
||||
"merge-above": "Spoji prethodni korak",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"move-to-top": "Na vrh",
|
||||
"reset-scale": "Vrati skaliranje na stare postavke",
|
||||
"decrease-scale-label": "Smanji skaliranje za 1",
|
||||
"increase-scale-label": "Povećaj skaliranje za 1",
|
||||
@@ -577,16 +587,17 @@
|
||||
"edit-timeline-event": "Uredi Događaj Vremenske Crte",
|
||||
"timeline": "Vremenska Crta",
|
||||
"timeline-is-empty": "Još nema ništa na vremenskoj crti. Pokušajte napraviti ovaj recept!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Nisu pronađeni događaji. Pokušaj promjeniti filtere za pretragu.",
|
||||
"group-global-timeline": "{groupName} Globalna vremenska crta",
|
||||
"open-timeline": "Otvori Vremensku Crtu",
|
||||
"made-this": "Napravio/la sam ovo",
|
||||
"how-did-it-turn-out": "Kako je ispalo?",
|
||||
"user-made-this": "{user} je napravio/la ovo",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
||||
"made-for-recipe": "Napravljeno za {recipe}",
|
||||
"added-to-timeline": "Dodano na vremensku crtu",
|
||||
"failed-to-add-to-timeline": "Neuspješno dodavanje na vremensku crtu",
|
||||
"failed-to-update-recipe": "Neuspješno ažuriranje recepta",
|
||||
"added-to-timeline-but-failed-to-add-image": "Dodano na vremensku crtu, no nije uspjelo dodavanje fotografije",
|
||||
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
||||
"message-key": "Ključ poruke",
|
||||
"parse": "Razluči (parsiraj)",
|
||||
@@ -602,33 +613,33 @@
|
||||
"looking-for-migrations": "Tražite migracije?",
|
||||
"import-with-url": "Učitaj preko URL-a",
|
||||
"create-recipe": "Kreiraj recept",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipe-description": "Izradi novi recept od početka",
|
||||
"create-recipes": "Kreiraj recept",
|
||||
"import-with-zip": "Učitaj pomoću .zip-a",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"crop-and-rotate-the-image": "Obreži i rotiraj sliku tako da bude vidljiv samo tekst i da bude u ispravnoj orijentaciji.",
|
||||
"create-from-images": "Izradi na temelju fotografije",
|
||||
"should-translate-description": "Prevedi recept na moj jezik",
|
||||
"please-wait-image-procesing": "Molimo pričekajte, slika se obrađuje. Ovo može potrajati.",
|
||||
"please-wait-images-processing": "Molimo pričekajte, slike se obrađuju. Ovo može potrajati.",
|
||||
"bulk-url-import": "Uvoz više URL-ova",
|
||||
"debug-scraper": "Debugiranje skraper-a",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Kreirajte recept pružajući naziv. Svi recepti moraju imati jedinstvena imena.",
|
||||
"new-recipe-names-must-be-unique": "Naziv novog recepta mora imati jedinstveno ime",
|
||||
"scrape-recipe": "Prikupi (skraperaj) recept",
|
||||
"scrape-recipe-description": "Prikupi (skraperaj) recept putem URL-a. Priložite URL web stranice s koje želite prikupiti recept, a Mealie će pokušati prikupiti recept s te stranice i dodati ga u vašu kolekciju.",
|
||||
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||
"scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?",
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly",
|
||||
"scrape-recipe-have-a-lot-of-recipes": "Imate puno recepata koje želite odjednom preuzeti?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Isprobajte masovni uvoz",
|
||||
"scrape-recipe-have-raw-html-or-json-data": "Imate neobrađene HTML ili JSON podatke?",
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Možete uvesti iz neobrađenih podataka izravno",
|
||||
"import-original-keywords-as-tags": "Uvezi originalne ključne riječi kao oznake",
|
||||
"stay-in-edit-mode": "Ostanite u načinu uređivanja",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Parsiranje sastojaka recepta nakon uvoza",
|
||||
"import-from-zip": "Uvoz iz Zip-a",
|
||||
"import-from-zip-description": "Uvezi pojedinačni recept koji je izvezen iz druge instance Mealie aplikacije.",
|
||||
"import-from-html-or-json": "Import from HTML or JSON",
|
||||
"import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.",
|
||||
"import-from-html-or-json": "Uvoz iz HTML-a ili JSON-a",
|
||||
"import-from-html-or-json-description": "Uvezite jedan recept iz neobrađenog HTML-a ili JSON-a. Ovo je korisno ako imate recept s web-stranice koju Mealie ne može normalno preuzeti ili iz nekog drugog vanjskog izvora.",
|
||||
"json-import-format-description-colon": "To import via JSON, it must be in valid format:",
|
||||
"json-editor": "JSON uređivač",
|
||||
"zip-files-must-have-been-exported-from-mealie": ".zip datoteke moraju biti izvezeni iz Mealie-a",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -699,7 +713,7 @@
|
||||
"max-missing-ingredients": "Max Missing Ingredients",
|
||||
"max-missing-tools": "Max Missing Tools",
|
||||
"selected-tools": "Selected Tools",
|
||||
"other-filters": "Other Filters",
|
||||
"other-filters": "Ostali filtri",
|
||||
"ready-to-make": "Ready to Make",
|
||||
"almost-ready-to-make": "Almost Ready to Make"
|
||||
},
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Pritisni '/'",
|
||||
"advanced": "Napredno",
|
||||
"auto-search": "Auto Pretraga",
|
||||
"no-results": "No results found"
|
||||
"no-results": "No results found",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Dodaj Novu Temu",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "prevedeno",
|
||||
@@ -1367,7 +1384,7 @@
|
||||
},
|
||||
"cookbook": {
|
||||
"cookbooks": "Zbirka recepata",
|
||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.",
|
||||
"description": "Zbirke recepata su još jedan način organiziranja recepata stvaranjem presjeka recepata, organizatora i ostalih filtera. Izrada zbirke recepata dodat će stavku na bočnu traku, a svi recepti s odabranim filtrima bit će prikazani u zbirci recepata.",
|
||||
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households",
|
||||
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar",
|
||||
"public-cookbook": "Javna zbirka recepata",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie képes recepteket importálni a Tandoorból. Exportálja adatait az \"Alapértelmezett\" formátumban, majd töltse fel a .zip fájlt lentebb.",
|
||||
"title": "Tandoor receptek"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie képes importálni a DVO Cook'n X3 receptjeit. Exportáljon egy szakácskönyvet vagy menüt „Cook'n” formátumban, nevezze át az exportált fájl kiterjesztését .zip-re, majd töltse fel az alábbi .zip fájlt.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"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.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "A Mealie egy másik verzióját használtad vagy valami teljesen más applikációt? Nézd meg az adat importálási lehetőségeinket.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "A bekezdés felosztására tesz kísérletet az '1)' vagy '1.' mintákkal való egyezéssel",
|
||||
"import-by-url": "Recept importálása URL-cím alapján",
|
||||
"create-manually": "Recept kézi létrehozása",
|
||||
"make-recipe-image": "Ez legyen a recept képe"
|
||||
"make-recipe-image": "Ez legyen a recept képe",
|
||||
"add-food": "Étel hozzáadása",
|
||||
"add-recipe": "Recept hozzáadása"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404. Az oldal nem található",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recept törölve",
|
||||
"recipe-image": "Recept képe",
|
||||
"recipe-image-updated": "Recept képe frissítve",
|
||||
"delete-image": "Receptkép törlése",
|
||||
"delete-image-confirmation": "Biztosan törli ezt a receptképet?",
|
||||
"recipe-image-deleted": "Receptkép törölve",
|
||||
"recipe-name": "Recept neve",
|
||||
"recipe-settings": "Recept beállítások",
|
||||
"recipe-update-failed": "Recept frissítése sikertelen",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Válasszon mennyiségi egységet",
|
||||
"press-enter-to-create": "Üssön Enter-t a létrehozáshoz",
|
||||
"choose-food": "Étel kiválasztása",
|
||||
"choose-recipe": "Recept kiválasztása",
|
||||
"notes": "Megjegyzések",
|
||||
"toggle-section": "Szakaszcím megjelenítése/kikapcsolása",
|
||||
"see-original-text": "Eredeti szöveg megjelenítése",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Elkészítettem ezt",
|
||||
"how-did-it-turn-out": "Hogyan sikerült?",
|
||||
"user-made-this": "ezt {user} készítette el",
|
||||
"made-for-recipe": "Készült {recipe} számára",
|
||||
"added-to-timeline": "Idővonalhoz hozzáadva",
|
||||
"failed-to-add-to-timeline": "Nem sikerült az idővonalhoz hozzáadni",
|
||||
"failed-to-update-recipe": "Nem sikerült frissíteni a receptet",
|
||||
@@ -676,7 +687,7 @@
|
||||
"ingredient-parser-description": "Sikeresen feldolgoztuk a hozzávalókat. Kérljük, nézze át azokat, amelyekben nem vagyunk teljesen biztosak.",
|
||||
"ingredient-parser-final-review-description": "Miután az összes hozzávalót átnézte, még egyszer átnézheti az összes hozzávalót, mielőtt a változtatásokat átvezeti a receptbe.",
|
||||
"add-text-as-alias-for-item": "Adja hozzá a „{text}” nevet {item} aliasaként",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Elem törlése"
|
||||
},
|
||||
"reset-servings-count": "Adagok számának visszaállítása",
|
||||
"not-linked-ingredients": "Kiegészítő hozzávalók",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Képek feltöltése",
|
||||
"upload-more-images": "További képek feltöltése",
|
||||
"set-as-cover-image": "Beállítás a recept borítóképének",
|
||||
"cover-image": "Borítókép"
|
||||
"cover-image": "Borítókép",
|
||||
"include-linked-recipes": "Kapcsolódó receptek hozzáadása",
|
||||
"include-linked-recipe-ingredients": "Kapcsolódó recept hozzávalók hozzáadása",
|
||||
"toggle-recipe": "Recept váltása"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Receptkereső",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Üsse be '/'",
|
||||
"advanced": "Haladó mód",
|
||||
"auto-search": "Automatikus keresés",
|
||||
"no-results": "Nincs találat"
|
||||
"no-results": "Nincs találat",
|
||||
"type-to-search": "Írja be a keresett szót..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Új téma hozzáadása",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Ehhez a felhasználóhoz tartozó változtatások azonnal megjelennek.",
|
||||
"default-activity": "Alapértelmezett tevékenység",
|
||||
"default-activity-hint": "Válassza ki, melyik oldalra szeretne navigálni, amikor bejelentkezik erről az eszközről"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "lefordítva",
|
||||
@@ -1273,7 +1290,7 @@
|
||||
"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": "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": "A karbantartási műveletek {destructive_in_bold} jellegűek, ezért óvatosan kell alkalmazni őket. Ezen műveletek végrehajtása {irreversible_in_bold}.",
|
||||
"actions-description-destructive": "romboló",
|
||||
"actions-description-irreversible": "visszafordíthatatlan",
|
||||
"logs-action-refresh": "Logok frissítése",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie può importare ricette da Tandoor. Esporta i tuoi dati nel formato \"Predefinito\", quindi carica il file .zip sottostante.",
|
||||
"title": "Ricette Del Tandoore"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie può importare ricette da DVO Cook'n X3. Per esportare un ricettario o un menu nel formato \"Cook'n\", rinominare l'estensione di esportazione in .zip, quindi caricare il file .zip qui sotto.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrazione Dati Ricetta",
|
||||
"recipe-data-migrations-explanation": "Le ricette possono essere migrate da un'altra applicazione supportata da Mealie. Questo è un ottimo modo per iniziare con Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Arrivi da un'altra applicazione o da una versione più vecchia di Mealie? Scopri le migrazioni e scopri se i tuoi dati possono essere importati.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tenta di dividere un paragrafo con i modelli '1)' o '1.'",
|
||||
"import-by-url": "Importa una ricetta tramite URL",
|
||||
"create-manually": "Crea una ricetta manualmente",
|
||||
"make-recipe-image": "Usa come immagine della ricetta"
|
||||
"make-recipe-image": "Usa come immagine della ricetta",
|
||||
"add-food": "Aggiungi cibo",
|
||||
"add-recipe": "Aggiungi ricetta"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Pagina non Trovata",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Ricetta eliminata",
|
||||
"recipe-image": "Immagine Ricetta",
|
||||
"recipe-image-updated": "Immagine ricetta aggiornata",
|
||||
"delete-image": "Elimina Immagine Ricetta",
|
||||
"delete-image-confirmation": "Sei sicuro di voler eliminare questa immagine della ricetta?",
|
||||
"recipe-image-deleted": "Immagine della ricetta eliminata",
|
||||
"recipe-name": "Nome Ricetta",
|
||||
"recipe-settings": "Impostazioni Ricetta",
|
||||
"recipe-update-failed": "Aggiornamento ricetta fallito",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Scegli Unità",
|
||||
"press-enter-to-create": "Premi invio per creare",
|
||||
"choose-food": "Scegli Cibo",
|
||||
"choose-recipe": "Scegli Ricetta",
|
||||
"notes": "Note",
|
||||
"toggle-section": "Attiva Sezione",
|
||||
"see-original-text": "Vedi Testo Originale",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "L'Ho Preparato",
|
||||
"how-did-it-turn-out": "Come è venuto?",
|
||||
"user-made-this": "{user} l'ha preparato",
|
||||
"made-for-recipe": "Creato per {recipe}",
|
||||
"added-to-timeline": "Aggiunto alla cronologia",
|
||||
"failed-to-add-to-timeline": "Impossibile aggiungere alla cronologia",
|
||||
"failed-to-update-recipe": "Impossibile aggiornare la ricetta",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Carica immagini",
|
||||
"upload-more-images": "Carica altre immagini",
|
||||
"set-as-cover-image": "Imposta come immagine di copertina della ricetta",
|
||||
"cover-image": "Immagine di copertina"
|
||||
"cover-image": "Immagine di copertina",
|
||||
"include-linked-recipes": "Includi Ricette Collegate",
|
||||
"include-linked-recipe-ingredients": "Includi Ingredienti Della Ricetta Collegata",
|
||||
"toggle-recipe": "Attiva/Disattiva Ricetta"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Trova ricette",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Premi '/'",
|
||||
"advanced": "Ricerca Avanzata",
|
||||
"auto-search": "Ricerca automatica",
|
||||
"no-results": "Nessun risultato trovato"
|
||||
"no-results": "Nessun risultato trovato",
|
||||
"type-to-search": "Scrivi per cercare..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Aggiungi un Nuovo Tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Non vuoi più vederlo? Assicurati di modificare la tua email nelle impostazioni utente!",
|
||||
"forgot-password": "Password Dimenticata",
|
||||
"forgot-password-text": "Inserisci il tuo indirizzo email e ti invieremo un collegamento per reimpostare la tua password.",
|
||||
"changes-reflected-immediately": "Le modifiche a questo utente diventeranno immediatamente effettive."
|
||||
"changes-reflected-immediately": "Le modifiche a questo utente diventeranno immediatamente effettive.",
|
||||
"default-activity": "Attività Predefinita",
|
||||
"default-activity-hint": "Seleziona a quale pagina vuoi navigare al momento dell'accesso da questo dispositivo"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tradotto",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "MealieはTandoorからレシピをインポートすることができます。「デフォルト」形式でデータをエクスポートし、以下に.zipをアップロードしてください。",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "レシピの移行",
|
||||
"recipe-data-migrations-explanation": "レシピは、サポートされている別のアプリケーションからMealieに移行できます。これはMealieを始めるのに最適な方法です。",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "別のアプリケーションもしくは古いバージョンのMealieからですか?移行をチェックして、データをインポートできるかどうかを確認してください。",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "「1)」または「1.」に一致する段落を分割しようとします。",
|
||||
"import-by-url": "URLからレシピをインポート",
|
||||
"create-manually": "レシピを手動で作成",
|
||||
"make-recipe-image": "これをレシピ画像にします"
|
||||
"make-recipe-image": "これをレシピ画像にします",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 ページが見つかりません",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "レシピを削除しました",
|
||||
"recipe-image": "レシピの画像",
|
||||
"recipe-image-updated": "レシピ画像を更新しました",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "レシピ名",
|
||||
"recipe-settings": "レシピの設定",
|
||||
"recipe-update-failed": "レシピの更新に失敗しました",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "単位を選択",
|
||||
"press-enter-to-create": "Enterキーを押して作成",
|
||||
"choose-food": "食料を選択",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "備考",
|
||||
"toggle-section": "セクションの切り替え",
|
||||
"see-original-text": "元のテキストを見る",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "これを作りました",
|
||||
"how-did-it-turn-out": "どうなりましたか?",
|
||||
"user-made-this": "{user} がこれを作りました",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "レシピ検索",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "'/' を押す",
|
||||
"advanced": "詳細",
|
||||
"auto-search": "自動検索",
|
||||
"no-results": "結果は見つかりませんでした。"
|
||||
"no-results": "結果は見つかりませんでした。",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "新しいテーマを追加",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "これ以上表示したくないですか?ユーザー設定でメールアドレスを変更してください!",
|
||||
"forgot-password": "パスワードを忘れた",
|
||||
"forgot-password-text": "メールアドレスを入力すると、パスワードをリセットするためのリンクが送信されます。",
|
||||
"changes-reflected-immediately": "このユーザーへの変更はすぐに反映されます。"
|
||||
"changes-reflected-immediately": "このユーザーへの変更はすぐに反映されます。",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "翻訳済み",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"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.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "'1)' 또는 '1.' 패턴을 일치시켜 문단을 분할하려고 시도합니다.",
|
||||
"import-by-url": "URL로 레시피 가져오기",
|
||||
"create-manually": "수동으로 레시피 만들기",
|
||||
"make-recipe-image": "이것을 레시피 이미지로 만드세요."
|
||||
"make-recipe-image": "이것을 레시피 이미지로 만드세요.",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404. 페이지를 찾을 수 없음",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recipe deleted",
|
||||
"recipe-image": "Recipe Image",
|
||||
"recipe-image-updated": "Recipe image updated",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Recipe Name",
|
||||
"recipe-settings": "Recipe Settings",
|
||||
"recipe-update-failed": "Recipe update failed",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "단위 선택",
|
||||
"press-enter-to-create": "Enter 키를 눌러 생성하세요",
|
||||
"choose-food": "음식 선택",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "노트",
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "I Made This",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"user-made-this": "{user} made this",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "자동 검색",
|
||||
"no-results": "검색 결과가 없습니다."
|
||||
"no-results": "검색 결과가 없습니다.",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "새 테마 추가",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie gali importuoti receptus iš \"Tandoor\". Eksportuokite savo duomenis \"Default\" formatu ir įkelkite .ZIP failą žemiau.",
|
||||
"title": "\"Tandoor\" receptai"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Receptų duomenų migracijos",
|
||||
"recipe-data-migrations-explanation": "Receptai gali būti importuojami į Mealie iš kitų palaikomų sistemų. Tai - puikus būdas pradėti naudotis Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Bandyti atskirti pastraipas pagal \"1)\" ar \"1.\" numeraciją",
|
||||
"import-by-url": "Importuokite receptą iš URL",
|
||||
"create-manually": "Sukurti receptą rankiniu būdu",
|
||||
"make-recipe-image": "Padaryti pagrindine recepto nuotrauka"
|
||||
"make-recipe-image": "Padaryti pagrindine recepto nuotrauka",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Puslapis nerastas",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Receptas ištrintas",
|
||||
"recipe-image": "Recepto paveikslėlis",
|
||||
"recipe-image-updated": "Recepto paveikslėlis atnaujintas",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Recepto pavadinimas",
|
||||
"recipe-settings": "Recepto nustatymai",
|
||||
"recipe-update-failed": "Nepavyko atnaujinti recepto",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Pasirinkite vienetą",
|
||||
"press-enter-to-create": "Paspauskite 'Enter', norėdami sukurti",
|
||||
"choose-food": "Pasirinkite maistą",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Pastabos",
|
||||
"toggle-section": "Rodyti skyrių",
|
||||
"see-original-text": "Rodyti originalų tekstą",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Aš tai gaminau",
|
||||
"how-did-it-turn-out": "Kaip tai pavyko?",
|
||||
"user-made-this": "{user} gamino šį patiekalą",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Paspauskite '/'",
|
||||
"advanced": "Išplėstinė paieška",
|
||||
"auto-search": "Automatinė paieška",
|
||||
"no-results": "No results found"
|
||||
"no-results": "No results found",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Pridėti naują temą",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"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."
|
||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "išversta",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie var importēt receptes no Tandoor. Eksportējiet savus datus formātā “Noklusējums”, pēc tam augšupielādējiet zemāk esošu.zip.",
|
||||
"title": "Tandoor receptes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Recepšu datu migrācija",
|
||||
"recipe-data-migrations-explanation": "Receptes var migrēt no citas atbalstītas lietojumprogrammas uz Mealie. Tas ir lielisks veids, kā sākt darbu ar Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vai nāk no citas lietojumprogrammas vai vēl vecākas Mealie versijas? Pārbaudiet migrācijas un pārbaudiet, vai jūsu datus var importēt.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Mēģinājumi sadalīt rindkopu, saskaņojot modeļus “1)” vai “1.”",
|
||||
"import-by-url": "Receptes importēšana pēc URL",
|
||||
"create-manually": "Izveidojiet recepti manuāli",
|
||||
"make-recipe-image": "Padariet šo par receptes attēlu"
|
||||
"make-recipe-image": "Padariet šo par receptes attēlu",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Lapa nav atrasta",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recepte izdzēsta",
|
||||
"recipe-image": "Receptes attēls",
|
||||
"recipe-image-updated": "Receptes attēls atjaunināts",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Receptes nosaukums",
|
||||
"recipe-settings": "Receptes iestatījumi",
|
||||
"recipe-update-failed": "Receptes atjaunināšana neizdevās",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Izvēlieties vienību",
|
||||
"press-enter-to-create": "Nospiediet taustiņu Enter, lai izveidotu",
|
||||
"choose-food": "Izvēlieties ēdienu",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Piezīmes",
|
||||
"toggle-section": "Pārslēgt sadaļu",
|
||||
"see-original-text": "Skatīt oriģinālo tekstu",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Es to pagatavoju",
|
||||
"how-did-it-turn-out": "Kā tas izrādījās?",
|
||||
"user-made-this": "{user}izdarīja šo",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"cover-image": "Cover image",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Nospiediet '/'",
|
||||
"advanced": "Papildu Opcijas",
|
||||
"auto-search": "Automātiskā meklēšana",
|
||||
"no-results": "Nav atrasts neviens rezultāts"
|
||||
"no-results": "Nav atrasts neviens rezultāts",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Pievienot jaunu motīvu",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vai nevēlaties to vairs redzēt? Noteikti mainiet savu e-pastu lietotāja iestatījumos!",
|
||||
"forgot-password": "Aizmirsāt paroli",
|
||||
"forgot-password-text": "Lūdzu, ievadiet savu e-pasta adresi, un mēs jums nosūtīsim saiti, lai atiestatītu jūsu paroli.",
|
||||
"changes-reflected-immediately": "Izmaiņas šim lietotājam tiks atspoguļotas nekavējoties."
|
||||
"changes-reflected-immediately": "Izmaiņas šim lietotājam tiks atspoguļotas nekavējoties.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tulkots",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie kan recepten importeren van Tandoor. Exporteer je gegevens in het \"Standaardformaat\" (\"Default\") en upload het .zip bestand hieronder.",
|
||||
"title": "Tandoor-recepten"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie kan recepten importeren van DVO Cook'n X3. Exporteer een cookboek of menu in het \"Cook'n\" formaat. Verander de naam van de export extensie naar .zip. En upload daarna de .zip.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Receptmigratie",
|
||||
"recipe-data-migrations-explanation": "Je kunt recepten van een ander programma importeren in Mealie. Zo kun je snel aan de slag.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kom je van een andere toepassing of een oudere versie van Mealie? Kijk eens naar de migraties. Misschien kunnen we je gegevens importeren.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Probeert om een alinea te splitsen door de '1)' of '1.' patronen te gebruiken",
|
||||
"import-by-url": "Importeer een recept van een website",
|
||||
"create-manually": "Maak handmatig een recept aan",
|
||||
"make-recipe-image": "Maak dit de afbeelding voor dit recept"
|
||||
"make-recipe-image": "Maak dit de afbeelding voor dit recept",
|
||||
"add-food": "Voeg eten toe",
|
||||
"add-recipe": "Voeg recept toe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Pagina niet gevonden",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recept verwijderd",
|
||||
"recipe-image": "Receptafbeelding",
|
||||
"recipe-image-updated": "Receptafbeelding bijgewerkt",
|
||||
"delete-image": "Verwijder Recept Afbeelding",
|
||||
"delete-image-confirmation": "Weet je zeker dat je deze afbeelding wil verwijderen?",
|
||||
"recipe-image-deleted": "Receptafbeelding verwijderd",
|
||||
"recipe-name": "Receptnaam",
|
||||
"recipe-settings": "Receptinstellingen",
|
||||
"recipe-update-failed": "Recept bijwerken mislukt",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Kies een eenheid",
|
||||
"press-enter-to-create": "Druk op Enter om aan te maken",
|
||||
"choose-food": "Levensmiddelen kiezen",
|
||||
"choose-recipe": "Kies recept",
|
||||
"notes": "Notities",
|
||||
"toggle-section": "Sectie schakelen",
|
||||
"see-original-text": "Zie oorspronkelijke tekst",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Ik heb dit gemaakt",
|
||||
"how-did-it-turn-out": "Hoe was je gerecht?",
|
||||
"user-made-this": "{user} heeft dit gemaakt",
|
||||
"made-for-recipe": "Gemaakt voor {recipe}",
|
||||
"added-to-timeline": "Toevoegen aan tijdlijn",
|
||||
"failed-to-add-to-timeline": "Toegevoegd aan tijdlijn",
|
||||
"failed-to-update-recipe": "Updaten recept mislukt",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Afbeelding uploaden",
|
||||
"upload-more-images": "Meer afbeeldingen uploaden",
|
||||
"set-as-cover-image": "Als recept omslagfoto instellen",
|
||||
"cover-image": "Omslagfoto"
|
||||
"cover-image": "Omslagfoto",
|
||||
"include-linked-recipes": "Reken gekoppelde recepten mee",
|
||||
"include-linked-recipe-ingredients": "Voeg gekoppelde receptingrediënten toe",
|
||||
"toggle-recipe": "Recept wisselen"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recept zoeker",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Druk op '/'",
|
||||
"advanced": "Geavanceerd",
|
||||
"auto-search": "Automatisch zoeken",
|
||||
"no-results": "Geen resultaten gevonden"
|
||||
"no-results": "Geen resultaten gevonden",
|
||||
"type-to-search": "Zoek..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Voeg een nieuw thema toe",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Wil je dit niet meer zien? Verander dan je e-mailadres in je gebruikersinstellingen!",
|
||||
"forgot-password": "Wachtwoord vergeten",
|
||||
"forgot-password-text": "Voer je e-mailadres in, dan sturen we je een link om het wachtwoord te herstellen.",
|
||||
"changes-reflected-immediately": "Wijzigingen in deze groep zijn meteen zichtbaar."
|
||||
"changes-reflected-immediately": "Wijzigingen in deze groep zijn meteen zichtbaar.",
|
||||
"default-activity": "Standaard activiteit",
|
||||
"default-activity-hint": "Kies de pagina waar u naar toe wilt, na inloggen op dit apparaat"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "vertaald",
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
"new-notification": "Nytt varsel",
|
||||
"event-notifiers": "Hendelsesvarsler",
|
||||
"apprise-url-skipped-if-blank": "Apprise-URL (hoppes over hvis tom)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Siden Apprise URL-er vanligvis inneholder sensitiv informasjon, må dette feltet ikke være tomt mens du redigerer. Hvis du vil oppdatere URL, skriv inn den nye her, ellers la den være tom for å beholde den gjeldende URL.",
|
||||
"enable-notifier": "Aktiver varslingsagenten",
|
||||
"what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?",
|
||||
"user-events": "Brukerhendelser",
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Kategorihendelser",
|
||||
"when-a-new-user-joins-your-group": "Når en ny bruker blir med i gruppen din",
|
||||
"recipe-events": "Oppskriftshendelser",
|
||||
"label-events": "Label Events"
|
||||
"label-events": "Merk hendelser"
|
||||
},
|
||||
"general": {
|
||||
"add": "Legg til",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp zip-filen nedenfor.",
|
||||
"title": "Tandoor Recipes"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie kan importere oppskrifter fra DVO Cook'n X3. Eksporter en cookbook eller meny i \"Cook'n\" formatet, endre navnet på eksporten til .zip, og last så opp .zip-filen nedenfor.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Overføring av oppskrifter",
|
||||
"recipe-data-migrations-explanation": "Oppskrifter kan overføres fra et annet støttet program til Mealie. Dette er en flott måte å komme i gang med Mealie på.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer du fra en annen applikasjon eller en enda eldre versjon av Mealie? Sjekk ut overføringer og se om dine data kan importeres.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Forsøk å dele opp et avsnitt ved å matche mønsteret '1)' eller '1.'",
|
||||
"import-by-url": "Importer en oppskrift via nettadresse",
|
||||
"create-manually": "Opprett en oppskrift manuelt",
|
||||
"make-recipe-image": "Bruk dette som oppskriftsbilde"
|
||||
"make-recipe-image": "Bruk dette som oppskriftsbilde",
|
||||
"add-food": "Legg til mat",
|
||||
"add-recipe": "Legg til oppskrift"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Siden ble ikke funnet",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Oppskrift slettet",
|
||||
"recipe-image": "Oppskriftsbilde",
|
||||
"recipe-image-updated": "Oppskriftsbilde oppdatert",
|
||||
"delete-image": "Slett oppskriftsbilde",
|
||||
"delete-image-confirmation": "Er du sikker på at du vil slette dette oppskriftsbilde?",
|
||||
"recipe-image-deleted": "Oppskriftsbilde slettet",
|
||||
"recipe-name": "Navn på oppskrift",
|
||||
"recipe-settings": "Oppskriftsinnstillinger",
|
||||
"recipe-update-failed": "Oppdatering av oppskrift mislyktes",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Velg enhet",
|
||||
"press-enter-to-create": "Trykk Enter for å opprette",
|
||||
"choose-food": "Velg matvarer",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notater",
|
||||
"toggle-section": "Legg til seksjon",
|
||||
"see-original-text": "Se opprinnelig tekst",
|
||||
"original-text-with-value": "Opprinnelig tekst: {originalText}",
|
||||
"ingredient-linker": "Tilknytt ingredienser",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Ingen lenke enda",
|
||||
"linked-to-other-step": "Tilknyttet et annet steg",
|
||||
"auto": "Automatisk",
|
||||
"cook-mode": "Tilberedelsesmodus",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Jeg har laget dette",
|
||||
"how-did-it-turn-out": "Hvordan ble det?",
|
||||
"user-made-this": "{user} har laget dette",
|
||||
"made-for-recipe": "Laget til {recipe}",
|
||||
"added-to-timeline": "Legg til tidslinje",
|
||||
"failed-to-add-to-timeline": "Kunne ikke legge til på tidslinjen",
|
||||
"failed-to-update-recipe": "Kunne ikke oppdatere oppskriften",
|
||||
@@ -590,7 +601,7 @@
|
||||
"api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.",
|
||||
"message-key": "Meldingsnøkkel",
|
||||
"parse": "Analyser",
|
||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||
"ingredients-not-parsed-description": "Det ser ut som ingridensene ikke har blitt analysert enda. Klikk\"{parse}\"-knappen under for å analysere ingrediensese som strukturert matvarer.",
|
||||
"attach-images-hint": "Fest bilder ved å dra og slippe dem inn i redigereringsverktøyet",
|
||||
"drop-image": "Slipp bilde",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Aktiver ingrediensmengder for å bruke denne funksjonen",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere fra rådata direkte",
|
||||
"import-original-keywords-as-tags": "Importer originale søkeord som emneord",
|
||||
"stay-in-edit-mode": "Forbli i redigeringsmodus",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analyser oppskriftens ingredienser etter at importen er fullført",
|
||||
"import-from-zip": "Importer fra zip-fil",
|
||||
"import-from-zip-description": "Importer en enkelt oppskrift som ble eksportert fra en annen Mealie-instans.",
|
||||
"import-from-html-or-json": "Importer fra HTML eller JSON",
|
||||
@@ -668,15 +679,15 @@
|
||||
"no-unit": "Ingen enhet",
|
||||
"missing-unit": "Opprett manglende enhet: {unit}",
|
||||
"missing-food": "Opprett manglende mat: {food}",
|
||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
||||
"this-unit-could-not-be-parsed-automatically": "Denne enheten kunne ikke analyseres automatisk",
|
||||
"this-food-could-not-be-parsed-automatically": "Denne maten kunne ikke leses automatisk",
|
||||
"no-food": "Ingen matvarer",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Gjennomgå de analyserte ingrediensene",
|
||||
"confidence-score": "Tillit score",
|
||||
"ingredient-parser-description": "Ingrediensene har blitt analysert. Venligst gjennomgå ingrediensene vi ikke er sikkre på.",
|
||||
"ingredient-parser-final-review-description": "Når alle ingredienser er gjennomgått, har du en siste sjanse til å gjennomgå alle ingrediensene før du tar i bruk endringene på oppskriften din.",
|
||||
"add-text-as-alias-for-item": "Legg til \"{text}\" som kallenavn for {item}",
|
||||
"delete-item": "Slett gjenstanden"
|
||||
},
|
||||
"reset-servings-count": "Nullstill antall porsjoner",
|
||||
"not-linked-ingredients": "Tilleggsingredienser",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Last opp bilder",
|
||||
"upload-more-images": "Last opp flere bilder",
|
||||
"set-as-cover-image": "Bruk som forsidebilde for oppskriften",
|
||||
"cover-image": "Forsidebilde"
|
||||
"cover-image": "Forsidebilde",
|
||||
"include-linked-recipes": "Inkluder lenkede oppskrifter",
|
||||
"include-linked-recipe-ingredients": "Inkluder lenkede oppskriftsingredienser",
|
||||
"toggle-recipe": "Aktiver/deaktiver oppskrift"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Oppskriftsfinner",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Trykk på '/'",
|
||||
"advanced": "Avansert",
|
||||
"auto-search": "Autosøk",
|
||||
"no-results": "Ingen resultater funnet"
|
||||
"no-results": "Ingen resultater funnet",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Legg til nytt tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Ønsker du ikke å se dette lenger? Sørg for å endre e-posten din i brukerinnstillingene dine!",
|
||||
"forgot-password": "Glemt passord",
|
||||
"forgot-password-text": "Skriv inn e-postadressen din. Vi sender deg en e-post slik at du kan tilbakestille passordet ditt.",
|
||||
"changes-reflected-immediately": "Endringer på denne brukeren gjenspeiles umiddelbart."
|
||||
"changes-reflected-immediately": "Endringer på denne brukeren gjenspeiles umiddelbart.",
|
||||
"default-activity": "Standard aktivitet",
|
||||
"default-activity-hint": "Velg hvilken side du vil navigere til når du logger inn fra denne enheten"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "oversatt",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Gruppedetaljer",
|
||||
"group-details-description": "Før du oppretter en konto må du opprette en gruppe. Gruppen din vil bare inneholde deg, men du vil kunne invitere andre senere. Medlemmer i gruppen din kan dele måltider, handlelister, oppskrifter med mer!",
|
||||
"use-seed-data": "Bruk tilføringsdata",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "Mealie leveres med en kolleksjon av matvarer, enheter og etiketter, som can bli brukt til å utfylle gruppen med hjelpsom data for organisering av oppskrifter. Disse er oversatt over til språket du har valgt. Du kan alltid legge til eller modifisere denne dataen senere.",
|
||||
"account-details": "Kontodetaljer"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie może zaimportować przepisy z Tandoor. Wyeksportuj swoje przepisy w formacie HTML, a następnie prześlij plik .zip poniżej.",
|
||||
"title": "Przepisy Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie może importować przepisy z DVO Cook'n X3. Wyeksportuj książkę kucharską lub menu w formacie \"Cook'n\", zmień rozszerzenie eksportu na .zip, a następnie prześlij plik .zip poniżej.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migracja danych przepisów",
|
||||
"recipe-data-migrations-explanation": "Receptury mogą być przeniesione z innej wspieranej aplikacji na Mealie. To świetny sposób na rozpoczęcie z Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Przechodzisz z innej aplikacji, bądź starszej wersji Mealie? Sprawdź dostępne migracje i zobacz czy dane mogą zostać zaimportowane.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Próbuj podzielić paragrafy poprzez dopasowanie po wzorcach '1)' i '1.'",
|
||||
"import-by-url": "Importuj przepis przez URL",
|
||||
"create-manually": "Stwórz przepis ręcznie",
|
||||
"make-recipe-image": "Niech to będzie obraz przepisu"
|
||||
"make-recipe-image": "Niech to będzie obraz przepisu",
|
||||
"add-food": "Dodaj Składnik",
|
||||
"add-recipe": "Dodaj przepis"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404. Nie znaleziono strony",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Przepis został usunięty",
|
||||
"recipe-image": "Zdjęcie do przepisu",
|
||||
"recipe-image-updated": "Zdjęcie przepisu zostało zaktualizowane",
|
||||
"delete-image": "Usuń obrazek przepisu",
|
||||
"delete-image-confirmation": "Czy jesteś pewien, że chcesz usunąć obrazek przepisu?",
|
||||
"recipe-image-deleted": "Obrazek przepisu został usunięty",
|
||||
"recipe-name": "Nazwa przepisu",
|
||||
"recipe-settings": "Ustawienia przepisu",
|
||||
"recipe-update-failed": "Aktualizacja przepisu nie powiodła się",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Wybierz jednostkę",
|
||||
"press-enter-to-create": "Naciśnij \"enter\", aby utworzyć",
|
||||
"choose-food": "Wybierz jedzenie",
|
||||
"choose-recipe": "Wybierz Przepis",
|
||||
"notes": "Notatki",
|
||||
"toggle-section": "Przełącz Sekcję",
|
||||
"see-original-text": "Zobacz oryginalny tekst",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Ugotowałem to",
|
||||
"how-did-it-turn-out": "Jak się to udało?",
|
||||
"user-made-this": "{user} ugotował(a) to",
|
||||
"made-for-recipe": "Wykonane do {recipe}",
|
||||
"added-to-timeline": "Dodano do osi czasu",
|
||||
"failed-to-add-to-timeline": "Nie udało się dodać do osi czasu",
|
||||
"failed-to-update-recipe": "Nie udało się zaktualizować przepisu",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Możesz zaimportować bezpośrednio z surowych danych",
|
||||
"import-original-keywords-as-tags": "Importuj oryginalne słowa kluczowe jako tagi",
|
||||
"stay-in-edit-mode": "Pozostań w trybie edycji",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analizuj składniki receptury po zaimportowaniu",
|
||||
"import-from-zip": "Importuj z pliku Zip",
|
||||
"import-from-zip-description": "Importuj pojedynczy przepis, który został wyeksportowany z innej instancji Mealie.",
|
||||
"import-from-html-or-json": "Importuj z HTML lub JSON",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Nie można przetworzyć tej jednostki automatycznie",
|
||||
"this-food-could-not-be-parsed-automatically": "Nie można przetworzyć tego jedzenia automatycznie",
|
||||
"no-food": "Brak potrawy",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Przejrzyj przeanalizowane składniki",
|
||||
"confidence-score": "Wskaźnik pewności",
|
||||
"ingredient-parser-description": "Twoja lista składników została przetworzona. Sprawdź proszę składniki co , do których mamy wątpliwości",
|
||||
"ingredient-parser-final-review-description": "Gdy wszystkie składniki zostaną sprawdzone, będziesz mieć jeszcze jedną szansę na sprawdzenie ich przed zastosowaniem zmian w przepisie.",
|
||||
"add-text-as-alias-for-item": "Dodaj \"{text}\" jako alternatywną nazwę dla {item}",
|
||||
"delete-item": "Usuń przedmiot"
|
||||
},
|
||||
"reset-servings-count": "Zresetuj liczbę porcji",
|
||||
"not-linked-ingredients": "Dodatkowe składniki",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Prześlij obraz",
|
||||
"upload-more-images": "Prześlij więcej obrazów",
|
||||
"set-as-cover-image": "Ustaw jako okładkę przepisu",
|
||||
"cover-image": "Okładka"
|
||||
"cover-image": "Okładka",
|
||||
"include-linked-recipes": "Dołącz połączone przepisy",
|
||||
"include-linked-recipe-ingredients": "Uwzględnij Składniki Powiązanego Przepisu",
|
||||
"toggle-recipe": "Przełącz Przepis"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Wyszukiwarka przepisów",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Naciśnij '/'",
|
||||
"advanced": "Zaawansowane",
|
||||
"auto-search": "Auto wyszukiwanie",
|
||||
"no-results": "Nie znaleziono wyników"
|
||||
"no-results": "Nie znaleziono wyników",
|
||||
"type-to-search": "Wpisz, aby wyszukać..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Dodaj nowy motyw",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nie chcesz już tego widzieć? Pamiętaj, aby zmienić swój adres e-mail w ustawieniach użytkownika!",
|
||||
"forgot-password": "Nie pamiętam hasła",
|
||||
"forgot-password-text": "Podaj adres e-mail konta, do którego chcesz odzyskać hasło.",
|
||||
"changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo."
|
||||
"changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo.",
|
||||
"default-activity": "Domyślna aktywność",
|
||||
"default-activity-hint": "Wybierz stronę, do której chcesz przejść po zalogowaniu się z tego urządzenia"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "przetłumaczone",
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
"event-delete-confirmation": "Tem certeza de que quer excluir este evento?",
|
||||
"event-deleted": "Evento Excluído",
|
||||
"event-updated": "Evento Atualizado",
|
||||
"new-notification-form-description": "Mealie usa a biblioteca Apprise para gerar notificações. Eles oferecem várias opções de serviços para usar em notificações. Consulte sua wiki para um guia completo sobre como criar a URL para o seu serviço. Se disponível, selecionar o tipo da sua notificação pode incluir recursos extras.",
|
||||
"new-notification-form-description": "Mealie usa a biblioteca Apprise para gerar notificações. Eles oferecem várias opções de serviços para serem usados para notificações. Consulte a wiki para um guia completo sobre como criar a URL para o seu serviço. Se disponível, selecionar o tipo de notificação pode incluir recursos extras.",
|
||||
"new-version": "Nova versão disponível!",
|
||||
"notification": "Notificação",
|
||||
"refresh": "Recarregar",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie pode importar receitas do Tandoor. Exporte seus dados no formato \"Padrão\" e faça o upload do arquivo .zip abaixo.",
|
||||
"title": "Receitas do Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "O Mealie pode importar receitas do DVO Cook’n X3. Exporte um livro de receitas ou menu no formato “Cook'n”, renomeie a extensão do arquivo exportado para .zip e, em seguida, envie o arquivo .zip abaixo.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrações de Dados de Receita",
|
||||
"recipe-data-migrations-explanation": "Receitas podem ser migradas de outro aplicativo suportado para o Mealie. Esta é uma ótima maneira de começar com Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vindo de outra aplicação ou de uma versão mais antiga do Mealie? Confira as migrações e veja se seus dados podem ser importados.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tenta dividir um parágrafo correspondendo aos padrões '1)' ou '1.'",
|
||||
"import-by-url": "Importar uma receita por URL",
|
||||
"create-manually": "Crie uma receita manualmente",
|
||||
"make-recipe-image": "Tornar esta a imagem da receita"
|
||||
"make-recipe-image": "Tornar esta a imagem da receita",
|
||||
"add-food": "Adicionar Alimento",
|
||||
"add-recipe": "Adicionar Receita"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Página não encontrada",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Receita excluída",
|
||||
"recipe-image": "Imagem da Receita",
|
||||
"recipe-image-updated": "Imagem da receita atualizada",
|
||||
"delete-image": "Deletar Imagem da Receita",
|
||||
"delete-image-confirmation": "Tem certeza que deseja deletar a imagem da receita?",
|
||||
"recipe-image-deleted": "Imagem da receita deletada",
|
||||
"recipe-name": "Nome da Receita",
|
||||
"recipe-settings": "Configurações da Receita",
|
||||
"recipe-update-failed": "Falha ao atualizar a receita",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Escolher unidades",
|
||||
"press-enter-to-create": "Pressione Enter para criar",
|
||||
"choose-food": "Escolher Comida",
|
||||
"choose-recipe": "Selecionar Receita",
|
||||
"notes": "Notas",
|
||||
"toggle-section": "Alternar Seção",
|
||||
"see-original-text": "Exibir texto original",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Eu Fiz Isso",
|
||||
"how-did-it-turn-out": "Como que ficou?",
|
||||
"user-made-this": "{user} fez isso",
|
||||
"made-for-recipe": "Feito para {recipe}",
|
||||
"added-to-timeline": "Adicionado à linha do tempo",
|
||||
"failed-to-add-to-timeline": "Falha ao adicionar à linha do tempo",
|
||||
"failed-to-update-recipe": "Falha ao atualizar receita",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Esta unidade não pôde ser analisada automaticamente",
|
||||
"this-food-could-not-be-parsed-automatically": "Este alimento não pôde ser analisado automaticamente",
|
||||
"no-food": "Sem Comida",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Revisar ingredientes analisados",
|
||||
"confidence-score": "Nota de Confiança",
|
||||
"ingredient-parser-description": "Seus ingredientes foram analisados com sucesso. Por favor, verifique os ingredientes que não temos certeza.",
|
||||
"ingredient-parser-final-review-description": "Depois que todos os ingredientes forem revisados, você terá mais uma chance de revisar todos os ingredientes antes de aplicar as mudanças em sua receita.",
|
||||
"add-text-as-alias-for-item": "Adicionar \"{text}\" como apelido para {item}",
|
||||
"delete-item": "Excluir item"
|
||||
},
|
||||
"reset-servings-count": "Redefinir Contagem de Porções",
|
||||
"not-linked-ingredients": "Ingredientes adicionais",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Carregar imagens",
|
||||
"upload-more-images": "Carregar mais imagens",
|
||||
"set-as-cover-image": "Definir como imagem de capa da receita",
|
||||
"cover-image": "Imagem de capa"
|
||||
"cover-image": "Imagem de capa",
|
||||
"include-linked-recipes": "Incluir Receita Linkada",
|
||||
"include-linked-recipe-ingredients": "Incluir Ingredientes da Receita Linkada",
|
||||
"toggle-recipe": "Alternar Receita"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Localizador de Receitas",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Pressione '/'",
|
||||
"advanced": "Avançado",
|
||||
"auto-search": "Pesquisa automática",
|
||||
"no-results": "Nenhum resultado encontrado"
|
||||
"no-results": "Nenhum resultado encontrado",
|
||||
"type-to-search": "Digite para pesquisar..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Adicionar um novo tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Não quer mais ver isto? Não se esqueça de alterar seu e-mail nas configurações do seu usuário!",
|
||||
"forgot-password": "Esqueci minha senha",
|
||||
"forgot-password-text": "Digite seu endereço de e-mail e enviaremos um link para redefinir sua senha.",
|
||||
"changes-reflected-immediately": "As alterações deste usuário serão refletidas imediatamente."
|
||||
"changes-reflected-immediately": "As alterações deste usuário serão refletidas imediatamente.",
|
||||
"default-activity": "Atividade padrão",
|
||||
"default-activity-hint": "Selecione para qual página você deseja ser direcionado ao fazer \"login\" neste dispositivo"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduzido",
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
"new-notification": "Nova Notificação",
|
||||
"event-notifiers": "Notificadores de eventos",
|
||||
"apprise-url-skipped-if-blank": "URL da Apprise (ignorado se vazio)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Como os URLs do Apprise normalmente contêm informação sensível, este campo é deixado propositadamente em branco durante a edição. Caso pretenda manter o URL atual, deixe este campo em branco.",
|
||||
"enable-notifier": "Ativar Notificador",
|
||||
"what-events": "Que eventos este notificador deve subscrever?",
|
||||
"user-events": "Eventos do utilizador",
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Eventos de Categoria",
|
||||
"when-a-new-user-joins-your-group": "Quando um novo utilizador entra no seu grupo",
|
||||
"recipe-events": "Eventos de receita",
|
||||
"label-events": "Label Events"
|
||||
"label-events": "Eventos de etiqueta"
|
||||
},
|
||||
"general": {
|
||||
"add": "Adicionar",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "O Mealie pode importar receitas a partir da Tandoor. Exporte os seus dados no formato \"Padrão\" e faça o upload do .zip abaixo.",
|
||||
"title": "Receitas do Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "O Mealie pode importar receitas do DVO Cook’n X3. Exporte um livro de receitas ou um menu no formato “Cook’n”, mude a extensão do ficheiro exportado para .zip e, em seguida, carregue o ficheiro .zip abaixo.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrações de dados de receita",
|
||||
"recipe-data-migrations-explanation": "Podem ser migradas receitas de outra aplicação suportada para o Mealie. Esta é uma ótima maneira de começar com o Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vem de outra aplicação ou de uma versão ainda mais antiga do Mealie? Consulte as migrações e veja se os seus dados podem ser importados.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Tenta dividir um parágrafo fazendo corresponder os padrões '1)' ou '1.'",
|
||||
"import-by-url": "Importar uma receita do URL",
|
||||
"create-manually": "Crie uma receita manualmente",
|
||||
"make-recipe-image": "Faça desta a imagem da receita"
|
||||
"make-recipe-image": "Faça desta a imagem da receita",
|
||||
"add-food": "Adicionar alimento",
|
||||
"add-recipe": "Adicionar receita"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Página não encontrada",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Receita apagada",
|
||||
"recipe-image": "Imagem da Receita",
|
||||
"recipe-image-updated": "Imagem da receita atualizada",
|
||||
"delete-image": "Eliminar imagem da receita",
|
||||
"delete-image-confirmation": "Tem a certeza de que pretende eliminar esta imagem da receita?",
|
||||
"recipe-image-deleted": "Imagem da receita eliminada",
|
||||
"recipe-name": "Nome da Receita",
|
||||
"recipe-settings": "Definições da receita",
|
||||
"recipe-update-failed": "Falha na atualização da receita",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Escolha uma unidade",
|
||||
"press-enter-to-create": "Prima 'Enter' para criar",
|
||||
"choose-food": "Escolher Alimento",
|
||||
"choose-recipe": "Escolher receita",
|
||||
"notes": "Notas",
|
||||
"toggle-section": "Alternar secção",
|
||||
"see-original-text": "Mostrar texto original",
|
||||
"original-text-with-value": "Texto Original: {originalText}",
|
||||
"ingredient-linker": "Conector de ingredientes",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Ainda não ligado(a)",
|
||||
"linked-to-other-step": "Ligado a outro passo",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Modo Cozinheiro",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Eu fiz isto",
|
||||
"how-did-it-turn-out": "Que tal ficou?",
|
||||
"user-made-this": "{user} fez isto",
|
||||
"made-for-recipe": "Feito para {recipe}",
|
||||
"added-to-timeline": "Adicionado à linha do tempo",
|
||||
"failed-to-add-to-timeline": "Falha ao adicionar à linha do tempo",
|
||||
"failed-to-update-recipe": "Falha ao atualizar a receita",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "É possível importar diretamente a partir de dados em bruto",
|
||||
"import-original-keywords-as-tags": "Importar palavras-chave originais como etiquetas",
|
||||
"stay-in-edit-mode": "Permanecer no modo de edição",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analisar ingredientes da receita após a importação",
|
||||
"import-from-zip": "Importar de Zip",
|
||||
"import-from-zip-description": "Importar uma única receita que foi exportada de outra instância Mealie.",
|
||||
"import-from-html-or-json": "Importar a partir de HTML ou JSON",
|
||||
@@ -671,20 +682,23 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Não foi possível processar automaticamente esta unidade",
|
||||
"this-food-could-not-be-parsed-automatically": "Não foi possível processar automaticamente este alimento",
|
||||
"no-food": "Nenhum Ingrediente",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Rever ingredientes analisados",
|
||||
"confidence-score": "Pontuação de confiança",
|
||||
"ingredient-parser-description": "Os seus ingredientes foram analisados com sucesso. Por favor, reveja os ingredientes acerca dos quais não temos a certeza.",
|
||||
"ingredient-parser-final-review-description": "Depois de todos os ingredientes serem revistos, terá mais uma oportunidade para rever todos os ingredientes antes de aplicar as alterações à sua receita.",
|
||||
"add-text-as-alias-for-item": "Adicionar \"{text}\" como alias de {item}",
|
||||
"delete-item": "Eliminar item"
|
||||
},
|
||||
"reset-servings-count": "Reiniciar Contador de Doses",
|
||||
"not-linked-ingredients": "Ingredientes Adicionais",
|
||||
"upload-another-image": "Carregar outra imagem",
|
||||
"upload-images": "Carregar imagens",
|
||||
"upload-more-images": "Carregar mais imagens",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"set-as-cover-image": "Definir como imagem de capa da receita",
|
||||
"cover-image": "Imagem de capa",
|
||||
"include-linked-recipes": "Incluir receitas ligadas",
|
||||
"include-linked-recipe-ingredients": "Incluir ingredientes das receitas ligadas",
|
||||
"toggle-recipe": "Alternar receita"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Localizador de Receitas",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Prima '/'",
|
||||
"advanced": "Avançado",
|
||||
"auto-search": "Pesquisa Automática",
|
||||
"no-results": "Nenhum resultado encontrado"
|
||||
"no-results": "Nenhum resultado encontrado",
|
||||
"type-to-search": "Escreva para pesquisar..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Adicionar novo tema",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Não quer voltar a ver isto? Não se esqueça de alterar o seu email nas suas definições de utilizador!",
|
||||
"forgot-password": "Esqueceu-se da palavra-passe",
|
||||
"forgot-password-text": "Por favor, digite o seu endereço de email para enviarmos um link para redefinir a sua palavra-passe.",
|
||||
"changes-reflected-immediately": "As alterações a este utilizador serão aplicadas imediatamente."
|
||||
"changes-reflected-immediately": "As alterações a este utilizador serão aplicadas imediatamente.",
|
||||
"default-activity": "Atividade predefinida",
|
||||
"default-activity-hint": "Selecione para que página pretende navegar ao iniciar sessão a partir deste dispositivo"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduzido",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Detalhes do Grupo",
|
||||
"group-details-description": "Antes de criar uma conta é necessário criar um grupo. Será o único membro do seu grupo, mas poderá convidar outros mais tarde. Os membros do seu grupo podem partilhar planos de refeição, listas de compras, receitas e muito mais!",
|
||||
"use-seed-data": "Utilizar dados gerados",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "O Mealie inclui uma coleção de Alimentos, Unidades e Etiquetas que pode ser usada para preencher o seu grupo com dados úteis para organizar as suas receitas. Estes estão traduzidos para o idioma que tem atualmente selecionado. Pode sempre adicionar ou modificar estes dados mais tarde.",
|
||||
"account-details": "Detalhes da Conta"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
"new-notification": "Notificare nouă",
|
||||
"event-notifiers": "Notificatori de evenimente",
|
||||
"apprise-url-skipped-if-blank": "URL Apprise (ignorat daca e gol)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Deoarece URL-urile Apprise conțin de obicei informații sensibile, acest câmp este lăsat intenționat gol în timpul editării. Dacă doriți să actualizați URL-ul, vă rugăm să introduceți cel nou aici, altfel lăsați-l gol pentru a păstra URL-ul curent.",
|
||||
"enable-notifier": "Activare notificator",
|
||||
"what-events": "La ce evenimente ar trebui să se înscrie acest notificator?",
|
||||
"user-events": "Evenimente Utilizator",
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Categorie de Evenimente",
|
||||
"when-a-new-user-joins-your-group": "Când un utilizator nou se alătură grupului tău",
|
||||
"recipe-events": "Evenimente rețetă",
|
||||
"label-events": "Label Events"
|
||||
"label-events": "Etichete Evenimente"
|
||||
},
|
||||
"general": {
|
||||
"add": "Adaugă",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie poate importa rețete din Tandoor. Exportă datele în formatul \"Implicit\", apoi încarcă fișierul de tip \".ZIP\" folosind câmpul de mai jos.",
|
||||
"title": "Rețete Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie poate importa rețete din DVO Cook'n X3. Exportă o carte de bucate sau un meniu în formatul \"Cook'n\", redenumește extensia de export în .zip, apoi încarcă fișierul .zip mai jos.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrarea datelor rețetelor",
|
||||
"recipe-data-migrations-explanation": "Rețetele pot fi migrate de la o altă aplicație ce este suportată de Mealie. Acesta este un mod excelent de a începe să folosiți Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Veniți dintr-o altă aplicație sau o versiune și mai veche a Mealie? Uitați-vă la migrări și vedeți dacă datele dvs. pot fi importate.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Încearcă să împartă un paragraf prin potrivirea modelelor \"1)\" sau \"1.\"",
|
||||
"import-by-url": "Importă rețetă prin URL",
|
||||
"create-manually": "Creează o rețetă manual",
|
||||
"make-recipe-image": "Setează ca imaginea rețetei"
|
||||
"make-recipe-image": "Setează ca imaginea rețetei",
|
||||
"add-food": "Adaugă Aliment",
|
||||
"add-recipe": "Adaugă Rețetă"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Pagina nu a fost găsită",
|
||||
@@ -474,7 +480,7 @@
|
||||
"comment": "Comentariu",
|
||||
"comments": "Comentarii",
|
||||
"delete-confirmation": "Sunteți sigur că doriți să ștergeți această rețetă?",
|
||||
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
|
||||
"admin-delete-confirmation": "Ești pe cale să ștergi o rețetă care nu este a ta folosind permisiuni de administrator. Ești sigur?",
|
||||
"delete-recipe": "Șterge rețeta",
|
||||
"description": "Descriere",
|
||||
"disable-amount": "Dezactivați cantitățile Ingredientelor",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Rețeta a fost ștearsă",
|
||||
"recipe-image": "Imagine rețetă",
|
||||
"recipe-image-updated": "Imagine rețetă actualizată",
|
||||
"delete-image": "Șterge Imaginea Rețetei",
|
||||
"delete-image-confirmation": "Sunteți sigur că doriți să ștergeți această imagine de rețetă?",
|
||||
"recipe-image-deleted": "Imaginea rețetei a fost ștearsă",
|
||||
"recipe-name": "Numele rețetei",
|
||||
"recipe-settings": "Setări rețetă",
|
||||
"recipe-update-failed": "Actualizarea rețetei a eșuat",
|
||||
@@ -556,12 +565,13 @@
|
||||
"choose-unit": "Alegeţi unitatea",
|
||||
"press-enter-to-create": "Apăsați Enter pentru a crea",
|
||||
"choose-food": "Alege Mâncarea",
|
||||
"choose-recipe": "Alege Rețeta",
|
||||
"notes": "Notițe",
|
||||
"toggle-section": "Activează/dezactivează secțiunea",
|
||||
"see-original-text": "Vezi Textul Original",
|
||||
"original-text-with-value": "Text original: {originalText}",
|
||||
"ingredient-linker": "Legarea cu ingrediente",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Încă nu este conectat",
|
||||
"linked-to-other-step": "Conectat la alt pas",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Modul de gătire",
|
||||
@@ -583,14 +593,15 @@
|
||||
"made-this": "Am făcut asta",
|
||||
"how-did-it-turn-out": "Cum a ieșit?",
|
||||
"user-made-this": "{user} a făcut asta",
|
||||
"added-to-timeline": "Added to timeline",
|
||||
"failed-to-add-to-timeline": "Failed to add to timeline",
|
||||
"failed-to-update-recipe": "Failed to update recipe",
|
||||
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
|
||||
"made-for-recipe": "Făcut pentru {recipe}",
|
||||
"added-to-timeline": "Adăugat la cronologie",
|
||||
"failed-to-add-to-timeline": "Eroare la adăugarea în cronologie",
|
||||
"failed-to-update-recipe": "Eroare la actualizarea rețetei",
|
||||
"added-to-timeline-but-failed-to-add-image": "Adăugat la cronologie, dar nu s-a putut adăuga imaginea",
|
||||
"api-extras-description": "Recipes extras sunt o caracteristică cheie a API-ului Mealie. Îți permit să creezi perechi personalizate de cheie/valoare JSON într-o rețetă, ca să faci referire la aplicații terțe. Puteți utiliza aceste chei pentru a furniza informații, de exemplu pentru a declanșa automatizări sau mesaje personalizate pentru a transmite dispozitivul dorit.",
|
||||
"message-key": "Cheie mesaj",
|
||||
"parse": "Parsează",
|
||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||
"ingredients-not-parsed-description": "Se pare că ingredientele tale nu sunt încă analizate. Apăsați butonul \"{parse}\" de mai jos pentru a analiza ingredientele în alimente structurate.",
|
||||
"attach-images-hint": "Atașează imagini trăgându-le cu mouse-ul și plasându-le în editor",
|
||||
"drop-image": "Trage imaginea",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Activaţi cantităţile de ingrediente pentru a utiliza această funcționalitate",
|
||||
@@ -608,10 +619,10 @@
|
||||
"create-recipe-from-an-image": "Creează o rețetă dintr-o imagine",
|
||||
"create-recipe-from-an-image-description": "Creează o rețetă prin încărcarea unei imagini a acesteia. Mealie va încerca să extragă textul din imagine folosind AI și să creeze o rețetă din el.",
|
||||
"crop-and-rotate-the-image": "Decupați și rotiți imaginea astfel încât numai textul să fie vizibil, iar orientarea să fie corectă.",
|
||||
"create-from-images": "Create from Images",
|
||||
"create-from-images": "Creează din Imagini",
|
||||
"should-translate-description": "Tradu rețeta în limba mea",
|
||||
"please-wait-image-procesing": "Te rog așteaptă, imaginea este procesata. Acest lucru poate dura ceva timp.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"please-wait-images-processing": "Vă rugăm să așteptați, imaginile sunt în procesare. Acest lucru poate dura ceva timp.",
|
||||
"bulk-url-import": "Import URL în bulk",
|
||||
"debug-scraper": "Depanare funcție Importare",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Creează o rețetă furnizând numele. Toate rețetele trebuie să aibă nume unice.",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Poți importa datele direct",
|
||||
"import-original-keywords-as-tags": "Importă cuvintele cheie originale ca tag-uri",
|
||||
"stay-in-edit-mode": "Rămâi în modul Editare",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analizează ingredientele rețetei după import",
|
||||
"import-from-zip": "Importă din zip",
|
||||
"import-from-zip-description": "Importă o rețetă care a fost exportată dintr-o altă instanță a Mealie.",
|
||||
"import-from-html-or-json": "Importă din HTML sau JSON",
|
||||
@@ -668,23 +679,26 @@
|
||||
"no-unit": "Nicio unitate",
|
||||
"missing-unit": "Creează unitate lipsă: {unit}",
|
||||
"missing-food": "Creează mâncare lipsă: {food}",
|
||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
||||
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
|
||||
"this-unit-could-not-be-parsed-automatically": "Această unitate nu a putut fi analizată automat",
|
||||
"this-food-could-not-be-parsed-automatically": "Acest aliment nu a putut fi analizat automat",
|
||||
"no-food": "Niciun aliment",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Revizuiește ingredientele analizate",
|
||||
"confidence-score": "Scor de încredere",
|
||||
"ingredient-parser-description": "Ingredientele tale au fost analizate cu succes. Te rugăm să revizuiești ingredientele despre care nu suntem siguri.",
|
||||
"ingredient-parser-final-review-description": "Odată ce toate ingredientele au fost revizuite, vei mai avea o șansă de a revizui toate ingredientele înainte de a aplica modificările la rețetă.",
|
||||
"add-text-as-alias-for-item": "Adaugă \"{text}\" ca alias pentru {item}",
|
||||
"delete-item": "Șterge Articol"
|
||||
},
|
||||
"reset-servings-count": "Resetează numărul de serviri",
|
||||
"not-linked-ingredients": "Ingrediente suplimentare",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images",
|
||||
"set-as-cover-image": "Set as recipe cover image",
|
||||
"cover-image": "Cover image"
|
||||
"upload-another-image": "Încărcă o altă imagine",
|
||||
"upload-images": "Încărcă imagini",
|
||||
"upload-more-images": "Încărcă mai multe imagini",
|
||||
"set-as-cover-image": "Setează ca imagine copertă rețetă",
|
||||
"cover-image": "Imagine copertă",
|
||||
"include-linked-recipes": "Include rețetele conectate",
|
||||
"include-linked-recipe-ingredients": "Include ingredientele rețetelor conectate",
|
||||
"toggle-recipe": "Comută Rețeta"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Căutător de rețete",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Apasă „/”",
|
||||
"advanced": "Avansat",
|
||||
"auto-search": "Căutare automată",
|
||||
"no-results": "Nu s-au găsit rezultate"
|
||||
"no-results": "Nu s-au găsit rezultate",
|
||||
"type-to-search": "Tastați pentru a căuta..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Adaugă o nouă temă",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nu mai vrei să vezi acest lucru? Asigură-te că îți schimbi adresa de e-mail în setările de utilizator!",
|
||||
"forgot-password": "Recuperare parola",
|
||||
"forgot-password-text": "Va rugam introduceti adresa de e-mail pentru a va trimite un link de resetare parola.",
|
||||
"changes-reflected-immediately": "Modificările aduse acestui utilizator vor fi reflectate imediat."
|
||||
"changes-reflected-immediately": "Modificările aduse acestui utilizator vor fi reflectate imediat.",
|
||||
"default-activity": "Activitate implicită",
|
||||
"default-activity-hint": "Selectați la care pagină doriți să navigați la conectarea de pe acest dispozitiv"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tradus",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Detalii grup",
|
||||
"group-details-description": "Înainte de a crea un cont, va trebui să creezi un grup. Grupul tău va conține inițial doar pe tine, dar vei putea invita și alte persoane ulterior. Membrii din grupul tău vor putea să partajeze planuri de mese, liste de cumpărături, rețete și multe altele!",
|
||||
"use-seed-data": "Utilizează setul de date a populării",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "Mealie este livrată cu o colecție de alimente, unități și etichete care pot fi folosite pentru a popula grupul tău cu date utile pentru organizarea rețetelor. Acestea sunt traduse în limba pe care ai selectat-o în prezent. Puteți oricând adăuga sau modifica aceste date mai târziu.",
|
||||
"account-details": "Detalii Cont"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
"database-type": "Тип базы данных",
|
||||
"database-url": "URL базы данных",
|
||||
"default-group": "Группа по умолчанию",
|
||||
"default-household": "Дом по умолчанию",
|
||||
"default-household": "Домохозяйство по умолчанию",
|
||||
"demo": "Демо",
|
||||
"demo-status": "Демо-статус",
|
||||
"development": "В разработке",
|
||||
"docs": "Справка",
|
||||
"download-log": "Скачать журнал",
|
||||
"download-recipe-json": "Последний распаршенный JSON",
|
||||
"download-recipe-json": "Последний извлеченный JSON",
|
||||
"github": "GitHub",
|
||||
"log-lines": "Строки журнала",
|
||||
"not-demo": "Не демо",
|
||||
@@ -26,11 +26,11 @@
|
||||
"sponsor": "Спонсор"
|
||||
},
|
||||
"asset": {
|
||||
"assets": "Приложения",
|
||||
"assets": "Файлы",
|
||||
"code": "Код",
|
||||
"file": "Файл",
|
||||
"image": "Изображение",
|
||||
"new-asset": "Новое приложение",
|
||||
"new-asset": "Новый файл",
|
||||
"pdf": "PDF",
|
||||
"recipe": "Рецепт",
|
||||
"show-assets": "Показать приложения",
|
||||
@@ -45,13 +45,13 @@
|
||||
"category-filter": "Фильтр по категориям",
|
||||
"category-update-failed": "Не удалось обновить категорию",
|
||||
"category-updated": "Категория обновлена",
|
||||
"uncategorized-count": "Без категории {count}",
|
||||
"uncategorized-count": "Без категории: {count}",
|
||||
"create-a-category": "Создать категорию",
|
||||
"category-name": "Название категории",
|
||||
"category": "Категория"
|
||||
},
|
||||
"events": {
|
||||
"apprise-url": "Apprise URL",
|
||||
"apprise-url": "URL-адрес для уведомлений Apprise",
|
||||
"database": "База данных",
|
||||
"delete-event": "Удалить событие",
|
||||
"event-delete-confirmation": "Вы уверены, что хотите удалить данное событие?",
|
||||
@@ -246,9 +246,9 @@
|
||||
"keep-my-recipes-private-description": "Устанавливает группу и все рецепты по умолчанию приватными. Вы всегда можете изменить это позже."
|
||||
},
|
||||
"manage-members": "Настройки участников",
|
||||
"manage-members-description": "Пользователь",
|
||||
"manage-members-description": "Управление правами доступа участников в вашем домохозяйстве. {manage} позволяет пользователю получить доступ к странице управления данными, {invite} позволяет пользователю генерировать пригласительные ссылки для других пользователей. Владельцы групп не могут изменять свои собственные права.",
|
||||
"manage": "Редактировать",
|
||||
"manage-household": "Управление Домом",
|
||||
"manage-household": "Управление домохозяйством",
|
||||
"invite": "Пригласить",
|
||||
"looking-to-update-your-profile": "Хотите обновить свой профиль?",
|
||||
"default-recipe-preferences-description": "Это настройки по умолчанию при создании нового рецепта в вашей группе. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.",
|
||||
@@ -288,17 +288,17 @@
|
||||
"create-household": "Создать домохозяйство",
|
||||
"household-name": "Название домохозяйства",
|
||||
"household-group": "Группа домохозяйства",
|
||||
"household-management": "Управление домохозяйствами",
|
||||
"manage-households": "Управление Домами",
|
||||
"admin-household-management": "Управление Домохозяйством",
|
||||
"household-management": "Управление домохозяйством",
|
||||
"manage-households": "Управление всеми домохозяйствами",
|
||||
"admin-household-management": "Администраторское управление домохозяйствами",
|
||||
"admin-household-management-text": "Изменения в данном домохозяйстве будут отражены немедленно.",
|
||||
"household-id-value": "Id домохозяйства: {0}",
|
||||
"private-household": "Частное домохозяйство",
|
||||
"private-household": "Приватное домохозяйство",
|
||||
"private-household-description": "Переключение домохозяйства в приватное отключит все настройки публичного доступа. Это так же переписывает все индивидуальные настройки публичного доступа",
|
||||
"lock-recipe-edits-from-other-households": "Заблокировать изменения рецепта от других домохозяйств",
|
||||
"lock-recipe-edits-from-other-households-description": "Если включено, только пользователи в вашем домашнем хозяйстве могут редактировать рецепты, созданные вашим домашним хозяйством",
|
||||
"household-recipe-preferences": "Предпочтения для рецептов домашнего хозяйства",
|
||||
"default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домашнем хозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.",
|
||||
"lock-recipe-edits-from-other-households-description": "Если включено, только пользователи в вашем домохозяйстве могут редактировать рецепты, созданные вашим домохозяйством",
|
||||
"household-recipe-preferences": "Параметры рецептов домохозяйства",
|
||||
"default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домохозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Разрешить пользователям вне вашего домохозяйства видеть ваши рецепты",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "При включении данной функции, вы можете делиться публичной ссылкой на данный рецепт, чтобы поделиться им с людьми без аккаунта. Если функция выключена — поделиться рецептом можно только с пользователями внутри вашего домохозяйства или по предварительно сгенерированной приватной ссылке",
|
||||
"household-preferences": "Параметры домохозяйства"
|
||||
@@ -323,7 +323,7 @@
|
||||
"mealplan-settings": "Настройки плана питания",
|
||||
"mealplan-update-failed": "Не удалось обновить план питания",
|
||||
"mealplan-updated": "План питания обновлен",
|
||||
"mealplan-households-description": "Если домохозяйство не выбрано, то рецепты могут быть добавлены из любого домашнего хозяйства",
|
||||
"mealplan-households-description": "Если домохозяйство не выбрано, то рецепты могут быть добавлены из любого домохозяйства",
|
||||
"any-category": "Любая категория",
|
||||
"any-tag": "Любая метка",
|
||||
"any-household": "Любое домохозяйство",
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie может импортировать рецепты из Tandoor. Экспортируйте ваши данные в формате «По умолчанию», затем загрузите .zip ниже.",
|
||||
"title": "Рецепты Tandoor"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie может импортировать рецепты из DVO Cook'n X3. Экспортируйте книгу рецептов или меню в формате \"Cook'n\", переименуйте расширение файла экспорта в .zip, затем загрузите .zip ниже.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Перенос данных рецептов",
|
||||
"recipe-data-migrations-explanation": "Рецепты могут быть перенесены из другого поддерживаемого приложения в Mealie. Это отличный способ начать работу с Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Переходите из другого приложения или с более поздней версии Mealie? Проверьте \"миграции\", чтобы убедиться, что ваши данные могут быть перенесены.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Попытка разделить параграф с помощью шаблонов '1)' или '1.'",
|
||||
"import-by-url": "Импортировать рецепт по URL",
|
||||
"create-manually": "Создать рецепт вручную",
|
||||
"make-recipe-image": "Сделать это изображением рецепта"
|
||||
"make-recipe-image": "Сделать это изображением рецепта",
|
||||
"add-food": "Добавить продукт",
|
||||
"add-recipe": "Добавить рецепт"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 - страница не найдена",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Рецепт удален",
|
||||
"recipe-image": "Изображение рецепта",
|
||||
"recipe-image-updated": "Изображение рецепта обновлено",
|
||||
"delete-image": "Удалить изображение рецепта",
|
||||
"delete-image-confirmation": "Вы уверены, что хотите удалить данное изображение рецепта?",
|
||||
"recipe-image-deleted": "Изображение рецепта удалено",
|
||||
"recipe-name": "Название рецепта",
|
||||
"recipe-settings": "Настройки рецепта",
|
||||
"recipe-update-failed": "Ошибка обновления рецепта",
|
||||
@@ -521,7 +530,7 @@
|
||||
"save-recipe-before-use": "Сохранить рецепт перед использованием",
|
||||
"section-title": "Название раздела",
|
||||
"servings": "Порций",
|
||||
"serves-amount": "Серверов {amount}",
|
||||
"serves-amount": "Порции {amount}",
|
||||
"share-recipe-message": "Я хотел(а) поделиться с тобой моим рецептом {0}.",
|
||||
"show-nutrition-values": "Показать пищевую ценность",
|
||||
"sodium-content": "Соль",
|
||||
@@ -556,6 +565,7 @@
|
||||
"choose-unit": "Выберите единицу измерения",
|
||||
"press-enter-to-create": "Нажмите Enter для создания",
|
||||
"choose-food": "Выберите продукт",
|
||||
"choose-recipe": "Выберите рецепт",
|
||||
"notes": "Заметки",
|
||||
"toggle-section": "Переключить раздел",
|
||||
"see-original-text": "Показать исходный текст",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Я приготовил это",
|
||||
"how-did-it-turn-out": "Что получилось?",
|
||||
"user-made-this": "{user} приготовил это",
|
||||
"made-for-recipe": "Сделано для {recipe}",
|
||||
"added-to-timeline": "Добавлено в ленту",
|
||||
"failed-to-add-to-timeline": "Не удалось добавить в ленту",
|
||||
"failed-to-update-recipe": "Не удалось обновить рецепт",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Загрузить изображения",
|
||||
"upload-more-images": "Загрузить больше изображений",
|
||||
"set-as-cover-image": "Установить как обложку рецепта",
|
||||
"cover-image": "Обложка"
|
||||
"cover-image": "Обложка",
|
||||
"include-linked-recipes": "Включить привязанные рецепты",
|
||||
"include-linked-recipe-ingredients": "Включить ингредиенты привязанного рецепта",
|
||||
"toggle-recipe": "Переключить рецепт"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Поиск рецептов",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Нажмите '/'",
|
||||
"advanced": "Дополнительно",
|
||||
"auto-search": "Авто поиск",
|
||||
"no-results": "Ничего не найдено"
|
||||
"no-results": "Ничего не найдено",
|
||||
"type-to-search": "Начните печатать для поиска..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Добавить новую тему",
|
||||
@@ -1047,7 +1062,7 @@
|
||||
"user-details": "Данные пользователя",
|
||||
"user-name": "Имя пользователя",
|
||||
"authentication-method": "Метод аутентификации",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"authentication-method-hint": "Определяет способ аутентификации пользователя с Mealie. Если вы не уверены, выберите 'Mealie'",
|
||||
"permissions": "Права доступа",
|
||||
"administrator": "Администратор",
|
||||
"user-can-invite-other-to-group": "Пользователь может пригласить других в группу",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Больше не хотите видеть это сообщение? Не забудьте изменить адрес электронной почты в настройках пользователя!",
|
||||
"forgot-password": "Забыли Пароль",
|
||||
"forgot-password-text": "Введите адрес вашей почты, и мы отправим на неё ссылку для сброса пароля.",
|
||||
"changes-reflected-immediately": "Изменения в этом пользователе будут отражены немедленно."
|
||||
"changes-reflected-immediately": "Изменения в этом пользователе будут отражены немедленно.",
|
||||
"default-activity": "Действие по умолчанию",
|
||||
"default-activity-hint": "Выберите, на какую страницу вы хотели бы перейти при входе в систему с этого устройства"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "переведено",
|
||||
@@ -1072,8 +1089,8 @@
|
||||
"foods": {
|
||||
"merge-dialog-text": "Сочетание выбранных продуктов позволит объединить первый и второй продукт в один. Первый продукт будет удалён, и все ссылки на него будут указывать на второй продукт.",
|
||||
"merge-food-example": "Объединение {food1} в {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.",
|
||||
"seed-dialog-text": "Заполняет базу данных с продуктами на основе локального языка. Это добавит ~2700 типичных продуктов, которые могут быть использованы для организации вашей базы данных. Продукты переводятся с помощью усилий сообщества.",
|
||||
"seed-dialog-warning": "У вас уже есть некоторые элементы в базе данных. Новый элемент не будет добавлен, если элемент с таким именем уже существует.",
|
||||
"combine-food": "Объединить продукты",
|
||||
"source-food": "Первый продукт",
|
||||
"target-food": "Второй продукт",
|
||||
@@ -1343,9 +1360,9 @@
|
||||
"cookbooks-description": "Управление коллекцией категорий рецептов и созданием страниц для них.",
|
||||
"members": "Участники",
|
||||
"members-description": "Узнайте, кто состоит в вашем домохозяйстве и управляйте их правами.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"webhooks-description": "Настройте webhook'и запускаемые в дни, когда у вас запланированы блюда.",
|
||||
"notifiers": "Уведомления",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"notifiers-description": "Настройте почту и push-уведомления, которые запускаются при определенных событиях.",
|
||||
"manage-data": "Настройки хранилища данных",
|
||||
"manage-data-description": "Управляйте вашими данными в Mealie: продукты, единицы измерения, категории, теги и многое другое.",
|
||||
"data-migrations": "Перенос данных",
|
||||
|
||||
@@ -399,6 +399,10 @@
|
||||
"description-long": "Mealie dokáže importovať recepty z Tandoor. Exportujte recepty v prednastavenom formáte a zip-súbor nahrajte nižšie.",
|
||||
"title": "Tandoor recepty"
|
||||
},
|
||||
"cookn": {
|
||||
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
|
||||
"title": "DVO Cook'n X3"
|
||||
},
|
||||
"recipe-data-migrations": "Migrácie dát receptov",
|
||||
"recipe-data-migrations-explanation": "Recepty je možné prenášať do Mealie z inej podporovanej aplikácie. Je to výborný spôsob ako začať s používaním Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Prichádzate z inej aplikácie alebo dokonca staršej verzie Mealie? Pozrite si možnosti migrácie a zistite, či je možné importovať vaše pôvodné dáta.",
|
||||
@@ -444,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Pokúsiť sa rozdeliť odsek pomocou vzoru '1)' alebo '1.'",
|
||||
"import-by-url": "Importovať recept z URL",
|
||||
"create-manually": "Vytvoriť recept manuálne",
|
||||
"make-recipe-image": "Nastaviť ako obrázok receptu"
|
||||
"make-recipe-image": "Nastaviť ako obrázok receptu",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "Chyba 404 - Stránka nenájdená",
|
||||
@@ -511,6 +517,9 @@
|
||||
"recipe-deleted": "Recept bol odstránený",
|
||||
"recipe-image": "Obrázok receptu",
|
||||
"recipe-image-updated": "Obrázok receptu aktualizovaný",
|
||||
"delete-image": "Delete Recipe Image",
|
||||
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
|
||||
"recipe-image-deleted": "Recipe image deleted",
|
||||
"recipe-name": "Názov receptu",
|
||||
"recipe-settings": "Nastavenia receptu",
|
||||
"recipe-update-failed": "Aktualizácia receptu zlyhala",
|
||||
@@ -549,13 +558,14 @@
|
||||
"failed-to-add-recipes-to-list": "Pridanie receptu do zoznamu zlyhalo",
|
||||
"failed-to-add-recipe-to-mealplan": "Pridanie receptu do stravovacieho plánu zlyhalo",
|
||||
"failed-to-add-to-list": "Pridanie do zoznamu zlyhalo",
|
||||
"yield": "Počet porcií",
|
||||
"yield": "Množstvo",
|
||||
"yields-amount-with-text": "Pre {amount} {text}",
|
||||
"yield-text": "Jednotka množstva",
|
||||
"quantity": "Množstvo",
|
||||
"choose-unit": "Vyberte jednotku",
|
||||
"press-enter-to-create": "Stlačte Enter pre vytvorenie",
|
||||
"choose-food": "Vyberte potravinu",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Poznámky",
|
||||
"toggle-section": "Prepnúť sekciu",
|
||||
"see-original-text": "Pozrieť pôvodný text",
|
||||
@@ -583,6 +593,7 @@
|
||||
"made-this": "Toto som uvaril",
|
||||
"how-did-it-turn-out": "Ako to dopadlo?",
|
||||
"user-made-this": "{user} toto uvaril(a)",
|
||||
"made-for-recipe": "Made for {recipe}",
|
||||
"added-to-timeline": "Pridané na časovú os",
|
||||
"failed-to-add-to-timeline": "Pridanie na časovú os skončilo chybou",
|
||||
"failed-to-update-recipe": "Recept sa nepodarilo aktualizovať",
|
||||
@@ -590,7 +601,7 @@
|
||||
"api-extras-description": "API dolnky receptov sú kľúčovou funkcionalitou Mealie API. Umožňujú používateľom vytvárať vlastné JSON páry kľúč/hodnota v rámci receptu, a využiť v aplikáciách tretích strán. Údaje uložené pod jednotlivými kľúčmi je možné využiť napríklad ako spúšťač automatizovaných procesov, či pri zasielaní vlastných správ do vami zvolených zariadení.",
|
||||
"message-key": "Kľúč správy",
|
||||
"parse": "Analyzovať",
|
||||
"ingredients-not-parsed-description": "",
|
||||
"ingredients-not-parsed-description": "Zdá sa, že vaše suroviny neboli zatiaľ analyzované. Kliknite na tlačidlo \"{parse}\" nižšie, aby ste rozložili ingrediencie do štrukturovaných potravín.",
|
||||
"attach-images-hint": "Pridaj obrázky ich potiahnutím a pustením na editor",
|
||||
"drop-image": "Odstrániť obrázok",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Povoľ množstvám prísad využívať túto vlastnosť",
|
||||
@@ -624,7 +635,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Môžete importovať priamo nespracované údaje",
|
||||
"import-original-keywords-as-tags": "Importovať pôvodné kľúčové slová ako štítky",
|
||||
"stay-in-edit-mode": "Zostať v režime editovania",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analyzovať ingrediencie po importe",
|
||||
"import-from-zip": "Importovať zo Zip-súboru",
|
||||
"import-from-zip-description": "Importovať recept exportovaný z inej Mealie inštalácie.",
|
||||
"import-from-html-or-json": "Importovať z HTML alebo JSONu",
|
||||
@@ -671,12 +682,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Túto jednotku nebolo možné parsovať automaticky",
|
||||
"this-food-could-not-be-parsed-automatically": "Toto jedlo nebolo možné parsovať automaticky",
|
||||
"no-food": "Žiadne suroviny",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Skontrolovať analyzované ingrediencie",
|
||||
"confidence-score": "Skóre istoty",
|
||||
"ingredient-parser-description": "Vaše ingrediencie boli úspešne zanalyzované. Prosím prekontrolujte ingrediencie pri ktorých nemáme istotu.",
|
||||
"ingredient-parser-final-review-description": "Keď skontrolujete všetky ingrediencie, budete mať ešte jednu možnosť skontrolovať ich pred tým než uložíte zmeny vo svojom recepte.",
|
||||
"add-text-as-alias-for-item": "Pridať \"{text}\" ako alias pre {item}",
|
||||
"delete-item": "Zmazať položku"
|
||||
},
|
||||
"reset-servings-count": "Resetovať počet porcií",
|
||||
"not-linked-ingredients": "Ďalšie suroviny",
|
||||
@@ -684,7 +695,10 @@
|
||||
"upload-images": "Nahrať obrázky",
|
||||
"upload-more-images": "Nahrať ďalšie obrázky",
|
||||
"set-as-cover-image": "Nastaviť ako titulný obrázok receptu",
|
||||
"cover-image": "Titulný obrázok"
|
||||
"cover-image": "Titulný obrázok",
|
||||
"include-linked-recipes": "Include Linked Recipes",
|
||||
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
|
||||
"toggle-recipe": "Toggle Recipe"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Hľadač receptov",
|
||||
@@ -721,7 +735,8 @@
|
||||
"search-hint": "Stlač '/'",
|
||||
"advanced": "Rozšírené",
|
||||
"auto-search": "Automatické vyhľadávanie",
|
||||
"no-results": "Nenašli sa žiadne výsledky"
|
||||
"no-results": "Nenašli sa žiadne výsledky",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Pridať nový motív",
|
||||
@@ -1059,7 +1074,9 @@
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Želáte si, aby sa vám toto už viackrát nezobrazovalo? Zmeňte si prosím váš e-mail v nastaveniach používateľa!",
|
||||
"forgot-password": "Zabudnuté heslo",
|
||||
"forgot-password-text": "Prosím zadajte svoju e-mailovú adresu a my vám zašleme odkaz, ktorý vám umožní heslo obnoviť.",
|
||||
"changes-reflected-immediately": "Zmeny týkajúce sa tohto používateľa budú vykonané okamžite."
|
||||
"changes-reflected-immediately": "Zmeny týkajúce sa tohto používateľa budú vykonané okamžite.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "preložené",
|
||||
@@ -1072,7 +1089,7 @@
|
||||
"foods": {
|
||||
"merge-dialog-text": "Kombináciou vybraných potravín sa zdrojové jedlo a cieľové jedlo zlúčia do jedného jedla. Zdrojové jedlo bude vymazané a všetky odkazy na zdrojové jedlo budú aktualizované tak, aby ukazovali na cieľové jedlo.",
|
||||
"merge-food-example": "Zlučujem {food1} do {food2}",
|
||||
"seed-dialog-text": "Naplňte databázu potravinami vo vašom jazyku. Tým vytvoríte viac ako 200 bežných potravín, ktoré môžete použiť na organizovanie vašej databáze. Potraviny sú preložené vďaka úsiliu komunity.",
|
||||
"seed-dialog-text": "Naplňte databázu potravinami vo vašom jazyku. Tým vytvoríte viac ako 2700 bežných potravín, ktoré môžete použiť na organizovanie vašej databáze. Potraviny sú preložené vďaka úsiliu komunity.",
|
||||
"seed-dialog-warning": "V databáze už máte nejaké údaje. Táto akcia neodstráni duplicitné položky, budete ich musieť odstrániť ručne.",
|
||||
"combine-food": "Kombinované jedlo",
|
||||
"source-food": "Zdrojové jedlo",
|
||||
@@ -1177,7 +1194,7 @@
|
||||
"group-details": "Podrobnosti o skupine",
|
||||
"group-details-description": "Pred vytvorením účtu musíte vytvoriť skupinu. Vaša skupina bude obsahovať iba vás, ale neskôr budete môcť pozvať ostatných. Členovia vašej skupiny môžu zdieľať stravovacie plány, nákupné zoznamy, recepty a ďalšie!",
|
||||
"use-seed-data": "Použiť predvolené dáta",
|
||||
"use-seed-data-description": "Mealie sa dodáva so zbierkou ingrediencií, jednotiek a označení. Môžete ich použiť vo vašej skupine pre lepšiu organizáciu vašich receptov. Tieto sú preložené do jazyka, ktorý ste si práve zvolili. Tieto dáta môžete kedykoľvek doplniť alebo zmeniť.",
|
||||
"use-seed-data-description": "Mealie sa dodáva so zbierkou potravín, jednotiek a označení, ktorými môžete naplniť vašu skupinu užitočnými dátami pre lepšiu organizáciu vašich receptov. Tieto sú preložené do jazyka, ktorý ste si práve zvolili. Tieto dáta môžete kedykoľvek doplniť alebo zmeniť.",
|
||||
"account-details": "Detaily účtu"
|
||||
},
|
||||
"validation": {
|
||||
@@ -1347,7 +1364,7 @@
|
||||
"notifiers": "Notifikátory",
|
||||
"notifiers-description": "Nastaviť e-mail a push notifikácie, ktoré sa spúšťajú pri špecifických udalostiach.",
|
||||
"manage-data": "Spravovať dáta",
|
||||
"manage-data-description": "Spravujte svoje údaje, jedlá, jednotky, kategórie, štítky a ďalšie.",
|
||||
"manage-data-description": "Spravujte svoje údaje, potraviny, jednotky, kategórie, štítky a ďalšie.",
|
||||
"data-migrations": "Migrácie dát",
|
||||
"data-migrations-description": "Migrujte svoje existujúce údaje z iných aplikácií, ako sú Nextcloud Recipes a Chowdown.",
|
||||
"email-sent": "E-mail Odoslaný",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user