mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-23 22:48:20 -05:00
Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acd0c2cb3e | ||
|
|
28d00f7dd5 | ||
|
|
fdd3d4b37a | ||
|
|
b09a85dfab | ||
|
|
b6ceece901 | ||
|
|
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 |
@@ -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 }}
|
||||
|
||||
|
||||
132
.github/workflows/release.yml
vendored
132
.github/workflows/release.yml
vendored
@@ -5,17 +5,73 @@ on:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
commit-version-bump:
|
||||
name: Commit version bump to repository
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
outputs:
|
||||
commit-sha: ${{ steps.commit.outputs.commit-sha }}
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Extract Version From Tag Name
|
||||
run: echo "VERSION_NUM=$(echo ${{ github.event.release.tag_name }} | sed 's/^v//')" >> $GITHUB_ENV
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config user.name "mealie-commit-bot[bot]"
|
||||
git config user.email "mealie-commit-bot[bot]@users.noreply.github.com"
|
||||
|
||||
- name: Update all version strings
|
||||
run: |
|
||||
sed -i 's/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' pyproject.toml
|
||||
sed -i '/^name = "mealie"$/,/^version = / s/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' uv.lock
|
||||
sed -i 's/\("version": "\)[^"]*"/\1${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
sed -i 's/:v[0-9]*\.[0-9]*\.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/installation-checklist.md
|
||||
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
|
||||
|
||||
- name: Commit and push changes
|
||||
id: commit
|
||||
run: |
|
||||
git add pyproject.toml frontend/package.json uv.lock docs/
|
||||
git commit -m "chore: bump version to ${{ github.event.release.tag_name }}"
|
||||
git push origin HEAD:${{ github.event.repository.default_branch }}
|
||||
echo "commit-sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Move release tag to new commit
|
||||
run: |
|
||||
git tag -f ${{ github.event.release.tag_name }}
|
||||
git push -f origin ${{ github.event.release.tag_name }}
|
||||
|
||||
backend-tests:
|
||||
name: "Backend Server Tests"
|
||||
uses: ./.github/workflows/test-backend.yml
|
||||
needs:
|
||||
- commit-version-bump
|
||||
|
||||
frontend-tests:
|
||||
name: "Frontend Tests"
|
||||
uses: ./.github/workflows/test-frontend.yml
|
||||
needs:
|
||||
- commit-version-bump
|
||||
|
||||
build-package:
|
||||
name: Build Package
|
||||
uses: ./.github/workflows/build-package.yml
|
||||
needs:
|
||||
- commit-version-bump
|
||||
with:
|
||||
tag: ${{ github.event.release.tag_name }}
|
||||
|
||||
@@ -43,10 +99,48 @@ jobs:
|
||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
rollback-on-failure:
|
||||
name: Rollback version commit if deployment fails
|
||||
needs:
|
||||
- commit-version-bump
|
||||
- publish
|
||||
if: always() && needs.publish.result == 'failure'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
with:
|
||||
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config user.name "mealie-commit-bot[bot]"
|
||||
git config user.email "mealie-commit-bot[bot]@users.noreply.github.com"
|
||||
|
||||
- name: Delete release tag
|
||||
run: |
|
||||
git push --delete origin ${{ github.event.release.tag_name }}
|
||||
|
||||
- name: Revert version bump commit
|
||||
run: |
|
||||
git revert --no-edit ${{ needs.commit-version-bump.outputs.commit-sha }}
|
||||
git push origin HEAD:${{ github.event.repository.default_branch }}
|
||||
|
||||
notify-discord:
|
||||
name: Notify Discord
|
||||
needs:
|
||||
- publish
|
||||
if: success()
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Discord notification
|
||||
@@ -55,41 +149,3 @@ jobs:
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
with:
|
||||
args: "🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/mealie-recipes/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"
|
||||
|
||||
update-image-tags:
|
||||
name: Update image tag in sample docker-compose files
|
||||
needs:
|
||||
- publish
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract Version From Tag Name
|
||||
run: echo "VERSION_NUM=$(echo ${{ github.event.release.tag_name }} | sed 's/^v//')" >> $GITHUB_ENV
|
||||
|
||||
- name: Modify version strings
|
||||
run: |
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/installation-checklist.md
|
||||
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/\("version": "\)[^"]*"/\1${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
# This doesn't currently work for us because it creates the PR but the workflows don't run.
|
||||
# TODO: Provide a personal access token as a parameter here, that solves that problem.
|
||||
# https://github.com/peter-evans/create-pull-request
|
||||
with:
|
||||
commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}"
|
||||
branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}"
|
||||
labels: |
|
||||
documentation
|
||||
delete-branch: true
|
||||
base: mealie-next
|
||||
title: "docs(auto): Update image tag, for release ${{ github.event.release.tag_name }}"
|
||||
body: "Auto-generated by `.github/workflows/release.yml`, on publish of release ${{ github.event.release.tag_name }}"
|
||||
|
||||
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.14.2
|
||||
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
|
||||
|
||||
@@ -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:24@sha256:34af25027ee1b8bffd482ba995ec1e577fbd398db87beb4c60b80c2c9c025127 \
|
||||
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)
|
||||
|
||||
@@ -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. Must be <= 87600 (10 years, 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 |
|
||||
| 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.3.2`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.6.1`
|
||||
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
|
||||
4. Restart the container
|
||||
|
||||
|
||||
@@ -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.3.2 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.6.1 # (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.3.2 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.6.1 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
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
|
||||
|
||||
@@ -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,
|
||||
() => {
|
||||
|
||||
@@ -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) => {
|
||||
@@ -150,6 +213,41 @@ function addIngredient(ingredients: Array<string> | null = null) {
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function insertNewIngredient(dest: number) {
|
||||
recipe.value.recipeIngredient.splice(dest, 0, {
|
||||
referenceId: uuid4(),
|
||||
@@ -163,3 +261,17 @@ function insertNewIngredient(dest: number) {
|
||||
});
|
||||
}
|
||||
</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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
<BaseButton
|
||||
v-if="canDelete"
|
||||
delete
|
||||
secondary
|
||||
@click="deleteEvent"
|
||||
/>
|
||||
<BaseButton
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -23,10 +23,15 @@ const authUser = ref<UserOut | null>(null);
|
||||
const authStatus = ref<"loading" | "authenticated" | "unauthenticated">("loading");
|
||||
|
||||
export const useAuthBackend = function (): AuthState {
|
||||
const { $axios } = useNuxtApp();
|
||||
const { $appInfo, $axios } = useNuxtApp();
|
||||
const router = useRouter();
|
||||
const tokenName = useRuntimeConfig().public.AUTH_TOKEN;
|
||||
const tokenCookie = useCookie(tokenName);
|
||||
|
||||
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;
|
||||
@@ -115,30 +120,6 @@ export const useAuthBackend = function (): AuthState {
|
||||
}
|
||||
}
|
||||
|
||||
// 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),
|
||||
@@ -21,19 +21,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Українська (Ukrainian)",
|
||||
value: "uk-UA",
|
||||
progress: 57,
|
||||
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: 65,
|
||||
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,19 +57,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 44,
|
||||
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",
|
||||
},
|
||||
{
|
||||
@@ -81,19 +81,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Polski (Polish)",
|
||||
value: "pl-PL",
|
||||
progress: 43,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 52,
|
||||
progress: 54,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -117,37 +117,37 @@ export const LOCALES = [
|
||||
{
|
||||
name: "日本語 (Japanese)",
|
||||
value: "ja-JP",
|
||||
progress: 37,
|
||||
progress: 36,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Italiano (Italian)",
|
||||
value: "it-IT",
|
||||
progress: 46,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Íslenska (Icelandic)",
|
||||
value: "is-IS",
|
||||
progress: 27,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 46,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Hrvatski (Croatian)",
|
||||
value: "hr-HR",
|
||||
progress: 28,
|
||||
progress: 29,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "עברית (Hebrew)",
|
||||
value: "he-IL",
|
||||
progress: 72,
|
||||
progress: 73,
|
||||
dir: "rtl",
|
||||
},
|
||||
{
|
||||
@@ -159,13 +159,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 67,
|
||||
progress: 69,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Français canadien (Canadian French)",
|
||||
value: "fr-CA",
|
||||
progress: 38,
|
||||
progress: 100,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -177,19 +177,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Suomi (Finnish)",
|
||||
value: "fi-FI",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Eesti (Estonian)",
|
||||
value: "et-EE",
|
||||
progress: 36,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 45,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -201,7 +201,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "British English",
|
||||
value: "en-GB",
|
||||
progress: 43,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -213,13 +213,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 95,
|
||||
progress: 97,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Dansk (Danish)",
|
||||
value: "da-DK",
|
||||
progress: 45,
|
||||
progress: 47,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { ref, watch, computed } from "vue";
|
||||
import { useAuthBackend } from "~/composables/useAuthBackend";
|
||||
import { useAuthBackend } from "~/composables/use-auth-backend";
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
export const useMealieAuth = function () {
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ export interface UserPrintPreferences {
|
||||
showDescription: boolean;
|
||||
showNotes: boolean;
|
||||
showNutrition: boolean;
|
||||
expandChildRecipes: boolean;
|
||||
}
|
||||
|
||||
export interface UserSearchQuery {
|
||||
@@ -91,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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: لم يتم العثور على الصفحة",
|
||||
@@ -515,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": "فشل تحديث الوصفة",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "اختر الوحدة",
|
||||
"press-enter-to-create": "",
|
||||
"choose-food": "اختيار الطعام",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "ملاحظات",
|
||||
"toggle-section": "",
|
||||
"see-original-text": "عرض النص الأصلي",
|
||||
@@ -587,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",
|
||||
@@ -688,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": "البحث عن الوصفات",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "اضغط '/'",
|
||||
"advanced": "الإعدادات المتقدمة",
|
||||
"auto-search": "البحث التلقائي",
|
||||
"no-results": "لم يتم العثور على نتائج"
|
||||
"no-results": "لم يتم العثور على نتائج",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "إضافة سمة جديدة",
|
||||
|
||||
@@ -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": "Известия за събитие",
|
||||
@@ -128,7 +128,7 @@
|
||||
"message": "Съобщение",
|
||||
"monday": "Понеделник",
|
||||
"name": "Име",
|
||||
"new": "Нов",
|
||||
"new": "Добавяне",
|
||||
"never": "няма данни",
|
||||
"no": "Не",
|
||||
"no-recipe-found": "Няма намерени рецепти",
|
||||
@@ -145,7 +145,7 @@
|
||||
"rename-object": "Преименувай {0}",
|
||||
"reset": "По подразбиране",
|
||||
"saturday": "Събота",
|
||||
"save": "Запази",
|
||||
"save": "Запазване",
|
||||
"settings": "Настройки",
|
||||
"share": "Споделяне",
|
||||
"show-all": "Покажи всички",
|
||||
@@ -159,13 +159,13 @@
|
||||
"submit": "Изпрати",
|
||||
"success-count": "Успешни: {count}",
|
||||
"sunday": "Неделя",
|
||||
"system": "Система",
|
||||
"system": "В хронологичен ред",
|
||||
"templates": "Шаблони:",
|
||||
"test": "Тест",
|
||||
"themes": "Теми",
|
||||
"thursday": "четвъртък",
|
||||
"title": "Заглавие",
|
||||
"token": "Токън",
|
||||
"token": "Токен",
|
||||
"tuesday": "Вторник",
|
||||
"type": "Тип",
|
||||
"update": "Актуализация",
|
||||
@@ -448,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 Страницата не е намерена",
|
||||
@@ -475,7 +477,7 @@
|
||||
"categories": "Категории",
|
||||
"cholesterol-content": "Холестерол",
|
||||
"comment-action": "Коментирай",
|
||||
"comment": "Коментар",
|
||||
"comment": "Добавен коментар",
|
||||
"comments": "Коментари",
|
||||
"delete-confirmation": "Сигурни ли сте, че желаете да изтриете тази рецепта?",
|
||||
"admin-delete-confirmation": "Ще изтриете рецепта, която не е ваша, използвайки администраторски права. Сигурни ли сте?",
|
||||
@@ -494,8 +496,8 @@
|
||||
"insert-ingredient": "Въведете съставка",
|
||||
"insert-section": "Въведете раздел",
|
||||
"insert-above": "Вмъкни отгоре",
|
||||
"insert-below": "Вмъкни по-долу",
|
||||
"instructions": "Инструкции",
|
||||
"insert-below": "Вмъкни отдолу",
|
||||
"instructions": "Начин на приготвяне",
|
||||
"key-name-required": "Ключовото име е задължително",
|
||||
"landscape-view-coming-soon": "Пейзажен изглед",
|
||||
"milligrams": "милиграма",
|
||||
@@ -510,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": "Обновяването на рецептата беше неуспешно",
|
||||
@@ -543,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": "Рецептите са добавени към списъка",
|
||||
@@ -560,17 +565,18 @@
|
||||
"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": "Оригинален мащаб",
|
||||
@@ -583,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": "Неуспешно актуализиране на рецептата",
|
||||
@@ -688,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": "Търсачка на рецепти",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Натисни '/'",
|
||||
"advanced": "Разширени",
|
||||
"auto-search": "Автоматично търсене",
|
||||
"no-results": "Не са намерени резултати"
|
||||
"no-results": "Не са намерени резултати",
|
||||
"type-to-search": "Въведете текст за търсене..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Добавяне на нова тема",
|
||||
@@ -741,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 за специфично време. Те служат като агностичен начин за експортиране на базата данни и импортиране на данни или архивиране на сайта към външна локация.",
|
||||
@@ -792,7 +803,7 @@
|
||||
"error-creating-theme-see-log-file": "Грешка при създаването на темата. Виж лог файла.",
|
||||
"error-deleting-theme": "Грешка при изтриването на темата",
|
||||
"error-updating-theme": "Грешка при актуализирането на темата",
|
||||
"info": "Инфо",
|
||||
"info": "Информация",
|
||||
"light": "Светла",
|
||||
"primary": "Основен",
|
||||
"secondary": "Вторичен",
|
||||
@@ -857,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 на браузъра може да не работят.",
|
||||
@@ -936,7 +947,7 @@
|
||||
},
|
||||
"signup": {
|
||||
"error-signing-up": "Грешка при регистирането",
|
||||
"sign-up": "Регистриране",
|
||||
"sign-up": "Регистрация",
|
||||
"sign-up-link-created": "Линкът за регистриране е създаден",
|
||||
"sign-up-link-creation-failed": "Линкът за регистриране не беше създаден",
|
||||
"sign-up-links": "Линкове за регистриране",
|
||||
@@ -958,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": "Админ",
|
||||
@@ -1005,8 +1016,8 @@
|
||||
"password-strength": "Сигурността на паролата е {strength}",
|
||||
"please-enter-password": "Моля, въведете новата си парола.",
|
||||
"register": "Регистриране",
|
||||
"reset-password": "Нулиране на паролата",
|
||||
"sign-in": "Вписване",
|
||||
"reset-password": "Забравена парола",
|
||||
"sign-in": "Вход в системата",
|
||||
"total-mealplans": "Хранителни планове общо",
|
||||
"total-users": "Общо потребители",
|
||||
"upload-photo": "Качете снимка",
|
||||
@@ -1045,7 +1056,7 @@
|
||||
"very-strong": "Много силна"
|
||||
},
|
||||
"user-management": "Управление на потребителя",
|
||||
"reset-locked-users": "Нулиране на заключените потребители",
|
||||
"reset-locked-users": "Отключване на заключените потребители",
|
||||
"admin-user-creation": "Създаване на администратор",
|
||||
"admin-user-management": "Управление на администраторите",
|
||||
"user-details": "Детайли за потребителя",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"forgot-password": "Забравена Парола",
|
||||
"forgot-password-text": "Въведете Вашият имейл адрес и ние ще ви изпратим линк, с който да промените Вашата парола.",
|
||||
"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"
|
||||
"default-activity": "Действие по подразбиране",
|
||||
"default-activity-hint": "Изберете коя страница искате да отворите, след като влезете от това устройство"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "преведено",
|
||||
@@ -1086,7 +1097,7 @@
|
||||
"create-food": "Създай продукт",
|
||||
"food-label": "Заглавие на храната",
|
||||
"edit-food": "Редактирай храна",
|
||||
"food-data": "Данни за храните",
|
||||
"food-data": "Продукти",
|
||||
"example-food-singular": "пример: Домат",
|
||||
"example-food-plural": "пример: Домати",
|
||||
"label-overwrite-warning": "Това ще присвои избрания етикет на всички избрани храни и евентуално ще презапише съществуващите ви етикети.",
|
||||
@@ -1257,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": "Размер на лог файла",
|
||||
@@ -1327,7 +1338,7 @@
|
||||
"invite-link": "Линк за Покана",
|
||||
"get-invite-link": "Създай линк за покана",
|
||||
"get-public-link": "Създай публичен линк",
|
||||
"account-summary": "Обобщение на акаунта",
|
||||
"account-summary": "Преглед на потребителския профил",
|
||||
"account-summary-description": "Обобщение на информацията за Вашата група.",
|
||||
"group-statistics": "Статистики на групата",
|
||||
"group-statistics-description": "Вашата статистика на групата дава известна представа как използвате Mealie.",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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ů",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -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",
|
||||
@@ -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",
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1056,7 +1067,7 @@
|
||||
"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.",
|
||||
@@ -1065,7 +1076,7 @@
|
||||
"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.",
|
||||
"default-activity": "",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"default-activity-hint": "Vælg den side, du vil navigere til, når du logger ind fra denne enhed"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "oversat",
|
||||
@@ -1318,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}!",
|
||||
@@ -1331,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",
|
||||
@@ -1343,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.",
|
||||
@@ -1374,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.",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Einheit wählen",
|
||||
"press-enter-to-create": "Zum Erstellen Eingabetaste drücken",
|
||||
"choose-food": "Lebensmittel wählen",
|
||||
"choose-recipe": "Rezept wählen",
|
||||
"notes": "Notizen",
|
||||
"toggle-section": "Überschrift ein-/ausblenden",
|
||||
"see-original-text": "Originaltext anzeigen",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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": "Suchbegriff eingeben..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Neues Thema hinzufügen",
|
||||
|
||||
@@ -448,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. η σελίδα δεν βρέθηκε",
|
||||
@@ -515,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": "Η ενημέρωση συνταγής απέτυχε",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Επιλέξτε μονάδα",
|
||||
"press-enter-to-create": "Πατήστε Enter για δημιουργία",
|
||||
"choose-food": "Επιλέξτε τρόφιμο",
|
||||
"choose-recipe": "Επιλέξτε συνταγή",
|
||||
"notes": "Σημειώσεις",
|
||||
"toggle-section": "Ενεργοποίηση/απενεργοποίηση τμήματος",
|
||||
"see-original-text": "Προβολή Αρχικού Κειμένου",
|
||||
@@ -587,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": "Αποτυχία ενημέρωσης συνταγής",
|
||||
@@ -595,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": "Δεν είναι δυνατή η ανάλυση συνταγών με καθορισμένες μονάδες ή τρόφιμα.",
|
||||
@@ -688,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": "Εύρεση συνταγών",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Πατήστε '/'",
|
||||
"advanced": "Για προχωρημένους",
|
||||
"auto-search": "Αυτόματη Αναζήτηση",
|
||||
"no-results": "Δε βρέθηκαν αποτελέσματα"
|
||||
"no-results": "Δε βρέθηκαν αποτελέσματα",
|
||||
"type-to-search": "Πληκτρολογήστε για αναζήτηση…"
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Προσθήκη νέου θέματος",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -400,8 +400,8 @@
|
||||
"title": "Recetas de 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"
|
||||
"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.",
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -400,7 +400,7 @@
|
||||
"title": "Tandoor-i retsptid"
|
||||
},
|
||||
"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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -478,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",
|
||||
@@ -515,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",
|
||||
@@ -545,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",
|
||||
@@ -560,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",
|
||||
@@ -578,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.",
|
||||
@@ -587,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",
|
||||
@@ -612,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",
|
||||
@@ -628,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",
|
||||
@@ -672,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",
|
||||
@@ -725,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",
|
||||
@@ -748,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"
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"default-activity": "Vaikimisi tegevus",
|
||||
"default-activity-hint": "Valige, millisele lehele soovite navigeerida, kui logite sisse sellelt seadmelt"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "tõlgitud",
|
||||
@@ -1183,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": {
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"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",
|
||||
@@ -587,6 +593,7 @@
|
||||
"made-this": "Tein tämän",
|
||||
"how-did-it-turn-out": "Miten se onnistui?",
|
||||
"user-made-this": "{user} teki tämän",
|
||||
"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",
|
||||
@@ -688,7 +695,10 @@
|
||||
"upload-images": "Lataa kuva",
|
||||
"upload-more-images": "Lataa lisää kuvia",
|
||||
"set-as-cover-image": "Aseta reseptin kansikuvaksi",
|
||||
"cover-image": "Kansikuva"
|
||||
"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ä",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"default-activity": "Oletus Toiminta",
|
||||
"default-activity-hint": "Valitse haluamasi sivu, johon haluat navigoida kirjautuessasi tältä laitteelta"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "käännetty",
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
"title": "Recettes 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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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é",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -678,7 +685,7 @@
|
||||
"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": "Supprimer l'élément"
|
||||
},
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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,23 +384,23 @@
|
||||
"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 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.",
|
||||
"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",
|
||||
@@ -409,22 +409,22 @@
|
||||
"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": {
|
||||
@@ -440,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",
|
||||
@@ -448,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",
|
||||
@@ -515,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é",
|
||||
@@ -555,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",
|
||||
@@ -587,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",
|
||||
@@ -636,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",
|
||||
@@ -652,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é",
|
||||
@@ -679,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}",
|
||||
"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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -1334,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",
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
"title": "Recettes 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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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é",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -621,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 ?",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1065,7 +1076,7 @@
|
||||
"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.",
|
||||
"default-activity": "Activité par défaut ",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "traduit",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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 העמוד אינו נמצא",
|
||||
@@ -478,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": "ביטול כמויות מרכיבים",
|
||||
@@ -515,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": "עדכון מתכון נכשל",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "בחירת יחידת מידה",
|
||||
"press-enter-to-create": "הקש Enter כדי להוסיף",
|
||||
"choose-food": "בחר מזון",
|
||||
"choose-recipe": "בחר מתכון",
|
||||
"notes": "הערות",
|
||||
"toggle-section": "צור כותרת",
|
||||
"see-original-text": "הטקסט המקורי",
|
||||
@@ -587,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": "כישלון בעדכון מתכון",
|
||||
@@ -688,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": "מצא מתכון",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "לחץ '/'",
|
||||
"advanced": "מתקדם",
|
||||
"auto-search": "חיפוש אוטומטי",
|
||||
"no-results": "לא נמצאו תוצאות"
|
||||
"no-results": "לא נמצאו תוצאות",
|
||||
"type-to-search": "הקלד לחיפוש..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "הוסף ערכת נושא חדשה",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -572,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",
|
||||
@@ -581,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)",
|
||||
@@ -606,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",
|
||||
@@ -688,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",
|
||||
@@ -703,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"
|
||||
},
|
||||
@@ -725,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",
|
||||
@@ -1373,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",
|
||||
|
||||
@@ -448,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ó",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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ő",
|
||||
@@ -725,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",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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 ページが見つかりません",
|
||||
@@ -515,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": "レシピの更新に失敗しました",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "単位を選択",
|
||||
"press-enter-to-create": "Enterキーを押して作成",
|
||||
"choose-food": "食料を選択",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "備考",
|
||||
"toggle-section": "セクションの切り替え",
|
||||
"see-original-text": "元のテキストを見る",
|
||||
@@ -587,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",
|
||||
@@ -688,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": "レシピ検索",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "'/' を押す",
|
||||
"advanced": "詳細",
|
||||
"auto-search": "自動検索",
|
||||
"no-results": "結果は見つかりませんでした。"
|
||||
"no-results": "結果は見つかりませんでした。",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "新しいテーマを追加",
|
||||
|
||||
@@ -448,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. 페이지를 찾을 수 없음",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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": "새 테마 추가",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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ą",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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ą",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
"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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
"title": "Przepisy 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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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ę",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -677,9 +684,9 @@
|
||||
"no-food": "Brak potrawy",
|
||||
"review-parsed-ingredients": "Przejrzyj przeanalizowane składniki",
|
||||
"confidence-score": "Wskaźnik pewności",
|
||||
"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}",
|
||||
"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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -400,7 +400,7 @@
|
||||
"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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -400,7 +400,7 @@
|
||||
"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.",
|
||||
"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",
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -628,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",
|
||||
@@ -675,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",
|
||||
@@ -725,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",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -1183,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ă",
|
||||
@@ -400,7 +400,7 @@
|
||||
"title": "Rețete 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.",
|
||||
"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",
|
||||
@@ -448,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ă",
|
||||
@@ -478,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -612,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.",
|
||||
@@ -628,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",
|
||||
@@ -672,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",
|
||||
@@ -725,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ă",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"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.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"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",
|
||||
@@ -1183,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,7 +8,7 @@
|
||||
"database-type": "Тип базы данных",
|
||||
"database-url": "URL базы данных",
|
||||
"default-group": "Группа по умолчанию",
|
||||
"default-household": "Дом по умолчанию",
|
||||
"default-household": "Домохозяйство по умолчанию",
|
||||
"demo": "Демо",
|
||||
"demo-status": "Демо-статус",
|
||||
"development": "В разработке",
|
||||
@@ -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": "Любое домохозяйство",
|
||||
@@ -448,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 - страница не найдена",
|
||||
@@ -515,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": "Ошибка обновления рецепта",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Выберите единицу измерения",
|
||||
"press-enter-to-create": "Нажмите Enter для создания",
|
||||
"choose-food": "Выберите продукт",
|
||||
"choose-recipe": "Выберите рецепт",
|
||||
"notes": "Заметки",
|
||||
"toggle-section": "Переключить раздел",
|
||||
"see-original-text": "Показать исходный текст",
|
||||
@@ -587,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": "Не удалось обновить рецепт",
|
||||
@@ -688,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": "Поиск рецептов",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Нажмите '/'",
|
||||
"advanced": "Дополнительно",
|
||||
"auto-search": "Авто поиск",
|
||||
"no-results": "Ничего не найдено"
|
||||
"no-results": "Ничего не найдено",
|
||||
"type-to-search": "Начните печатать для поиска..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Добавить новую тему",
|
||||
@@ -1051,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": "Пользователь может пригласить других в группу",
|
||||
@@ -1078,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": "Второй продукт",
|
||||
@@ -1349,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": "Перенос данных",
|
||||
|
||||
@@ -448,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á",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"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",
|
||||
@@ -587,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ť",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Poskušaj razdeliti odstavek z ujemanjem '1)' ali '1.' vzorcev",
|
||||
"import-by-url": "Uvozi recept preko URL",
|
||||
"create-manually": "Ročno ustvari recept",
|
||||
"make-recipe-image": "To sliko izberi kot sliko recepta"
|
||||
"make-recipe-image": "To sliko izberi kot sliko recepta",
|
||||
"add-food": "Dodaj hrano",
|
||||
"add-recipe": "Dodaj recept"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 strani ni mogoče najti",
|
||||
@@ -515,6 +517,9 @@
|
||||
"recipe-deleted": "Recept je izbrisan",
|
||||
"recipe-image": "Slika recepta",
|
||||
"recipe-image-updated": "Slika recepta je posodobljena",
|
||||
"delete-image": "Izbriši sliko recepta",
|
||||
"delete-image-confirmation": "Ali ste prepričani, da želite izbrisati to sliko recepta?",
|
||||
"recipe-image-deleted": "Slika recepta je bila izbrisana",
|
||||
"recipe-name": "Naslov recepta",
|
||||
"recipe-settings": "Nastavitve recepta",
|
||||
"recipe-update-failed": "Napaka pri posodobitvi recepta",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Izberite enoto",
|
||||
"press-enter-to-create": "Pritisnite enter da izdelate",
|
||||
"choose-food": "Izberite hrano",
|
||||
"choose-recipe": "Izberi recept",
|
||||
"notes": "Zapiski",
|
||||
"toggle-section": "Preklopi izbiro",
|
||||
"see-original-text": "Prikaži izvirno besedilo",
|
||||
@@ -587,6 +593,7 @@
|
||||
"made-this": "Naredil sem to",
|
||||
"how-did-it-turn-out": "Kako se je izkazalo?",
|
||||
"user-made-this": "{user} je tole pripravil/a",
|
||||
"made-for-recipe": "Narejeno za {recipe}",
|
||||
"added-to-timeline": "Dodano na časovnico",
|
||||
"failed-to-add-to-timeline": "Dodajanje na časovnico ni uspelo",
|
||||
"failed-to-update-recipe": "Posodobitev recepta ni uspela",
|
||||
@@ -688,7 +695,10 @@
|
||||
"upload-images": "Naloži slike",
|
||||
"upload-more-images": "Naloži več slik",
|
||||
"set-as-cover-image": "Nastavi kot sliko naslovnice recepta",
|
||||
"cover-image": "Naslovna slika"
|
||||
"cover-image": "Naslovna slika",
|
||||
"include-linked-recipes": "Vključi povezane recepte",
|
||||
"include-linked-recipe-ingredients": "Vključi povezane sestavine recepta",
|
||||
"toggle-recipe": "Preklopi recept"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Iskalnik receptov",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Pritisni '/'",
|
||||
"advanced": "Napredno",
|
||||
"auto-search": "Avtomatsko iskanje",
|
||||
"no-results": "Ni zadetkov"
|
||||
"no-results": "Ni zadetkov",
|
||||
"type-to-search": "Vpiši iskalni niz..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Dodaj novo temo",
|
||||
|
||||
@@ -448,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 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",
|
||||
@@ -515,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",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Choose Unit",
|
||||
"press-enter-to-create": "Притисни Ентер да направиш",
|
||||
"choose-food": "Изабери храну",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Стисни '/'",
|
||||
"advanced": "Напредна",
|
||||
"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",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"api-port": "API-port",
|
||||
"application-mode": "Applikationsläge",
|
||||
"database-type": "Databastyp",
|
||||
"database-url": "Databas URL",
|
||||
"database-url": "Databas-URL",
|
||||
"default-group": "Standardgrupp",
|
||||
"default-household": "Standardhushåll",
|
||||
"demo": "Demo",
|
||||
@@ -51,7 +51,7 @@
|
||||
"category": "Kategori"
|
||||
},
|
||||
"events": {
|
||||
"apprise-url": "Apprise URL",
|
||||
"apprise-url": "Apprise-URL",
|
||||
"database": "Databas",
|
||||
"delete-event": "Radera händelse",
|
||||
"event-delete-confirmation": "Är du säker du vill ta bort denna händelse?",
|
||||
@@ -448,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Försök att dela ett stycke genom att matcha mönstret '1)' eller '1.'",
|
||||
"import-by-url": "Importera recept via URL",
|
||||
"create-manually": "Skapa recept manuellt",
|
||||
"make-recipe-image": "Gör detta till receptbild"
|
||||
"make-recipe-image": "Gör detta till receptbild",
|
||||
"add-food": "Lägg till mat",
|
||||
"add-recipe": "Lägg till recept"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 sidan hittades inte",
|
||||
@@ -515,6 +517,9 @@
|
||||
"recipe-deleted": "Recept raderat",
|
||||
"recipe-image": "Recept bild",
|
||||
"recipe-image-updated": "Recept bild uppdaterad",
|
||||
"delete-image": "Radera receptbild",
|
||||
"delete-image-confirmation": "Är du säker på att du vill ta bort den här receptbilden?",
|
||||
"recipe-image-deleted": "Recept bild raderad",
|
||||
"recipe-name": "Receptets namn",
|
||||
"recipe-settings": "Recept inställningar",
|
||||
"recipe-update-failed": "Receptet gick inte att uppdatera",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Välj enhet",
|
||||
"press-enter-to-create": "Tryck Enter för att skapa",
|
||||
"choose-food": "Välj mat",
|
||||
"choose-recipe": "Välj recept",
|
||||
"notes": "Anteckningar",
|
||||
"toggle-section": "Växla sektion",
|
||||
"see-original-text": "Visa originaltext",
|
||||
@@ -587,6 +593,7 @@
|
||||
"made-this": "Jag lagade den här",
|
||||
"how-did-it-turn-out": "Hur blev rätten?",
|
||||
"user-made-this": "{user} lagade detta",
|
||||
"made-for-recipe": "Skapat för {recipe}",
|
||||
"added-to-timeline": "Lagt till i tidslinjen",
|
||||
"failed-to-add-to-timeline": "Kunde inte lägga till i tidslinjen",
|
||||
"failed-to-update-recipe": "Kunde inte uppdatera receptet",
|
||||
@@ -688,7 +695,10 @@
|
||||
"upload-images": "Ladda upp bilder",
|
||||
"upload-more-images": "Ladda upp fler bilder",
|
||||
"set-as-cover-image": "Använd som receptbild",
|
||||
"cover-image": "Receptbild"
|
||||
"cover-image": "Receptbild",
|
||||
"include-linked-recipes": "Inkludera länk till recept",
|
||||
"include-linked-recipe-ingredients": "Inkludera länk till receptingredienser",
|
||||
"toggle-recipe": "Växla receptet"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Sök recept",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Tryck '/'",
|
||||
"advanced": "Avancerat",
|
||||
"auto-search": "Autosök",
|
||||
"no-results": "Inga resultat hittades"
|
||||
"no-results": "Inga resultat hittades",
|
||||
"type-to-search": "Skriv för att söka..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Lägg till ett nytt tema",
|
||||
@@ -1064,8 +1075,8 @@
|
||||
"forgot-password": "Glömt lösenord",
|
||||
"forgot-password-text": "Ange din e-postadress så skickar vi dig en länk för att återställa ditt lösenord.",
|
||||
"changes-reflected-immediately": "Ändringar av denna användare kommer att ske omedelbart.",
|
||||
"default-activity": "Default Activity",
|
||||
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
|
||||
"default-activity": "Standard aktivitet",
|
||||
"default-activity-hint": "Välj vilken sida du vill gå till när du loggar in från den här enheten"
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "översatt",
|
||||
|
||||
@@ -448,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "Bir paragrafı '1)' veya '1' kalıpları ile eşleştirerek bölmeye çalışır",
|
||||
"import-by-url": "Tarifi URL'den içe aktar",
|
||||
"create-manually": "Manuel olarak tarif oluştur",
|
||||
"make-recipe-image": "Bunu tarif resmi yap"
|
||||
"make-recipe-image": "Bunu tarif resmi yap",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Sayfa bulunamadı",
|
||||
@@ -515,6 +517,9 @@
|
||||
"recipe-deleted": "Tarif silindi",
|
||||
"recipe-image": "Tarif Resmi",
|
||||
"recipe-image-updated": "Tarif resmi güncellendi",
|
||||
"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": "Tarif Adı",
|
||||
"recipe-settings": "Tarif Ayarları",
|
||||
"recipe-update-failed": "Tarifi güncellerken hata oluştu",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Birim Seçin",
|
||||
"press-enter-to-create": "Oluşturmak İçin Enter'a Basın",
|
||||
"choose-food": "Yemek Seç",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "Notlar",
|
||||
"toggle-section": "Bölümü Görünürlüğünü Değiştir",
|
||||
"see-original-text": "Orijinal Metni Göster",
|
||||
@@ -587,6 +593,7 @@
|
||||
"made-this": "Bunu ben yaptım",
|
||||
"how-did-it-turn-out": "Nasıl oldu?",
|
||||
"user-made-this": "{user} bunu yaptı",
|
||||
"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",
|
||||
@@ -688,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": "Tarif Bulucu",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "'/' Tuşuna Basın",
|
||||
"advanced": "Gelişmiş",
|
||||
"auto-search": "Otomatik Arama",
|
||||
"no-results": "Sonuç bulunamadı"
|
||||
"no-results": "Sonuç bulunamadı",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Yeni Tema Ekle",
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"support": "Підтримка",
|
||||
"version": "Версія",
|
||||
"unknown-version": "невідомо",
|
||||
"sponsor": "Спонсор"
|
||||
"sponsor": "Підтримка"
|
||||
},
|
||||
"asset": {
|
||||
"assets": "Медіаресурси",
|
||||
@@ -67,14 +67,14 @@
|
||||
"test-message-sent": "Тестове повідомлення надіслано",
|
||||
"message-sent": "Повідомлення надіслано",
|
||||
"new-notification": "Нове сповіщення",
|
||||
"event-notifiers": "Сповіщувачі",
|
||||
"event-notifiers": "Нагадувач про події",
|
||||
"apprise-url-skipped-if-blank": "Apprise URL (пропущено якщо порожній)",
|
||||
"apprise-url-is-left-intentionally-blank": "Оскільки URL адреси, як правило, містять конфіденційну інформацію, це поле залишається навмисно порожнім під час редагування. Якщо ви хочете оновити URL адресу, введіть тут новий, інакше залиште його порожнім, щоб зберегти поточну URL адресу.",
|
||||
"enable-notifier": "Увімкнути сповіщувач",
|
||||
"what-events": "На які події цей сповіщувач має бути підписаний?",
|
||||
"enable-notifier": "Увімкнути нагадувач",
|
||||
"what-events": "На які події повинен підписатися цей нагадувач?",
|
||||
"user-events": "Події користувача",
|
||||
"mealplan-events": "Події плану харчування",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Коли користувач з вашої групи створює новий план харчування",
|
||||
"mealplan-events": "Події меню",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Коли користувач з вашої групи створює нове меню",
|
||||
"shopping-list-events": "Події списку покупок",
|
||||
"cookbook-events": "Події кулінарної книги",
|
||||
"tag-events": "Події міток",
|
||||
@@ -93,13 +93,13 @@
|
||||
"confirm-delete-generic": "Ви дійсно бажаєте видалити це?",
|
||||
"copied_message": "Скопійовано!",
|
||||
"create": "Створити",
|
||||
"created": "Створено",
|
||||
"created": "Дата створення",
|
||||
"custom": "Власний",
|
||||
"dashboard": "Панель керування",
|
||||
"delete": "Видалити",
|
||||
"disabled": "Вимкнено",
|
||||
"download": "Завантажити",
|
||||
"duplicate": "Дублікат",
|
||||
"duplicate": "Копіювати",
|
||||
"edit": "Редагувати",
|
||||
"enabled": "Увімкнено",
|
||||
"exception": "Виняток",
|
||||
@@ -115,7 +115,7 @@
|
||||
"get": "Отримати",
|
||||
"home": "Головна",
|
||||
"image": "Зображення",
|
||||
"image-upload-failed": "Не вдалося відвантажити зображення",
|
||||
"image-upload-failed": "Не вдалося завантажити зображення",
|
||||
"import": "Імпорт",
|
||||
"json": "JSON",
|
||||
"keyword": "Ключове слово",
|
||||
@@ -137,13 +137,13 @@
|
||||
"plural-name": "Назва у множині",
|
||||
"print": "Друк",
|
||||
"print-preferences": "Налаштування друку",
|
||||
"random": "Випадково",
|
||||
"random": "Випадковий",
|
||||
"rating": "Рейтинг",
|
||||
"recent": "Нещодавні",
|
||||
"recipe": "Рецепт",
|
||||
"recipes": "Рецепти",
|
||||
"rename-object": "Перейменувати {0}",
|
||||
"reset": "Скинути",
|
||||
"reset": "Очистити",
|
||||
"saturday": "Субота",
|
||||
"save": "Зберегти",
|
||||
"settings": "Налаштування",
|
||||
@@ -169,8 +169,8 @@
|
||||
"tuesday": "Вівторок",
|
||||
"type": "Тип",
|
||||
"update": "Оновити",
|
||||
"updated": "Оновлено",
|
||||
"upload": "Відвантажити",
|
||||
"updated": "Дата оновлення",
|
||||
"upload": "Завантажити",
|
||||
"url": "URL-адреса",
|
||||
"view": "Перегляд",
|
||||
"wednesday": "Середа",
|
||||
@@ -188,7 +188,7 @@
|
||||
"date-added": "Дата додавання",
|
||||
"none": "Нічого",
|
||||
"run": "Виконати",
|
||||
"menu": "Меню",
|
||||
"menu": "Розділ",
|
||||
"a-name-is-required": "Необхідно вказати назву",
|
||||
"delete-with-name": "Видалити {name}",
|
||||
"confirm-delete-generic-with-name": "Ви дійсно хочете видалити {name}?",
|
||||
@@ -198,7 +198,7 @@
|
||||
"copy": "Скопіювати",
|
||||
"color": "Колір",
|
||||
"timestamp": "Час",
|
||||
"last-made": "Приготовано",
|
||||
"last-made": "Дата готування",
|
||||
"learn-more": "Дізнатися більше",
|
||||
"this-feature-is-currently-inactive": "Ця функція наразі не активна",
|
||||
"clipboard-not-supported": "Буфер обміну не підтримується",
|
||||
@@ -209,12 +209,12 @@
|
||||
"selected-count": "Обрано: {count}",
|
||||
"export-all": "Експортувати Всі",
|
||||
"refresh": "Оновити",
|
||||
"upload-file": "Вивантажити файл",
|
||||
"upload-file": "Завантажити файл",
|
||||
"created-on-date": "Створено: {0}",
|
||||
"unsaved-changes": "У вас є незбережені зміни. Ви хочете зберегти їх перед виходом? Гаразд, щоб зберегти, Скасувати, щоб скасувати.",
|
||||
"clipboard-copy-failure": "Не вдалося скопіювати до буфера обміну.",
|
||||
"confirm-delete-generic-items": "Ви впевнені, що хочете видалити вибрані елементи?",
|
||||
"organizers": "Організатори",
|
||||
"organizers": "Органайзери",
|
||||
"caution": "Увага",
|
||||
"show-advanced": "Показати розширені",
|
||||
"add-field": "Додати поле",
|
||||
@@ -246,7 +246,7 @@
|
||||
"keep-my-recipes-private-description": "Встановлює \"приватне\" налаштуванням по замовчування для групи та всіх рецептів. Це завжди можна змінити потім."
|
||||
},
|
||||
"manage-members": "Керування Користувачами",
|
||||
"manage-members-description": "Керуйте дозволами учасників вашої сімʼї. {manage} дозволяє користувачеві отримати доступ до сторінки керування даними {invite} дозволяє користувачеві генерувати посилання запрошення для інших користувачів. Власники групи не можуть змінити власні дозволи.",
|
||||
"manage-members-description": "Керуйте правами доступу членів вашої родини. {manage} дозволяє користувачеві отримати доступ до сторінки управління даними, а {invite} дозволяє користувачеві створювати посилання-запрошення для інших користувачів. Власники груп не можуть змінювати свої права доступу.",
|
||||
"manage": "Керування",
|
||||
"manage-household": "Керувати сімʼєю",
|
||||
"invite": "Запрошення",
|
||||
@@ -309,36 +309,36 @@
|
||||
"dinner-this-week": "Обід цього тижня",
|
||||
"dinner-today": "Обід сьогодні",
|
||||
"dinner-tonight": "Вечеря сьогодні",
|
||||
"edit-meal-plan": "Редагувати план харчування",
|
||||
"edit-meal-plan": "Редагувати меню",
|
||||
"end-date": "Дата завершення",
|
||||
"group": "Група (бета)",
|
||||
"main": "Основне",
|
||||
"meal-planner": "Планувальник харчування",
|
||||
"meal-plans": "Плани харчування",
|
||||
"mealplan-categories": "КАТЕГОРІЇ",
|
||||
"mealplan-created": "План харчування створено",
|
||||
"mealplan-creation-failed": "Не вдалося створити план харчування",
|
||||
"mealplan-deleted": "План харчування видалено",
|
||||
"mealplan-deletion-failed": "Не вдалося видалити план харчування",
|
||||
"mealplan-settings": "Налаштування плану харчування",
|
||||
"mealplan-update-failed": "Не вдалося оновити план харчування",
|
||||
"mealplan-updated": "План харчування оновлено",
|
||||
"meal-planner": "Конструктор Меню",
|
||||
"meal-plans": "Плани меню",
|
||||
"mealplan-categories": "КАТЕГОРІЇ МЕНЮ",
|
||||
"mealplan-created": "Меню створено",
|
||||
"mealplan-creation-failed": "Не вдалося створити меню",
|
||||
"mealplan-deleted": "Меню видалено",
|
||||
"mealplan-deletion-failed": "Не вдалося видалити меню",
|
||||
"mealplan-settings": "Налаштування меню",
|
||||
"mealplan-update-failed": "Не вдалося оновити меню",
|
||||
"mealplan-updated": "Меню оновлено",
|
||||
"mealplan-households-description": "Якщо жодної сім'ї не вибрано, рецепти можуть бути доданими з будь-якої сім'ї",
|
||||
"any-category": "Будь-яка категорія",
|
||||
"any-tag": "Будь-який тег",
|
||||
"any-household": "Будь-яка сім'я",
|
||||
"no-meal-plan-defined-yet": "Не створено жодного плану харчування",
|
||||
"no-meal-planned-for-today": "Не заплановано харчування на сьогодні",
|
||||
"no-meal-plan-defined-yet": "Не створено жодного меню",
|
||||
"no-meal-planned-for-today": "Не заплановано меню на сьогодні",
|
||||
"numberOfDays-hint": "Скільки днів завантажувати на сторінку",
|
||||
"numberOfDays-label": "Дні за замовчуванням",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Лише рецепти з цими категоріями будуть використані в планах харчування",
|
||||
"planner": "Планувальник",
|
||||
"quick-week": "Швидкий тиждень",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Лише рецепти з цими категоріями будуть використані в меню",
|
||||
"planner": "Конструктор",
|
||||
"quick-week": "Швидкий план на тиждень",
|
||||
"side": "Закуска",
|
||||
"sides": "Закуска",
|
||||
"start-date": "Дата початку",
|
||||
"rule-day": "Правило Днів",
|
||||
"meal-type": "Тип їжи",
|
||||
"meal-type": "Тип їжі",
|
||||
"breakfast": "Сніданок",
|
||||
"lunch": "Обід",
|
||||
"dinner": "Вечеря",
|
||||
@@ -350,21 +350,21 @@
|
||||
"meal-note": "Нотатки страви",
|
||||
"note-only": "Тільки нотатки",
|
||||
"random-meal": "Випадкова страва",
|
||||
"random-dinner": "Випадкова Вечеря",
|
||||
"random-dinner": "Випадкова вечеря",
|
||||
"random-side": "Випадкова додаткова страва",
|
||||
"this-rule-will-apply": "Це правило буде застосовуватися до {dayCriteria} {mealTypeCriteria}.",
|
||||
"this-rule-will-apply": "Це правило буде застосовуватися до{dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "до всіх днів",
|
||||
"on-days": "на {0}сек",
|
||||
"for-all-meal-types": "для всіх типів харчування",
|
||||
"for-type-meal-types": "для {0} типів харчування",
|
||||
"meal-plan-rules": "Правила планів харчування",
|
||||
"for-all-meal-types": "для всіх типів страв",
|
||||
"for-type-meal-types": "для {0} типів страв",
|
||||
"meal-plan-rules": "Правила меню",
|
||||
"new-rule": "Нове правило",
|
||||
"meal-plan-rules-description": "Ви можете створити правила для автоматичного вибору рецептів для ваших планів харчування. Ці правила використовуються сервером для вибору рецептів при створенні плану харчування. Зверніть увагу, що якщо правила мають обмеження на день/тип, то їх категорії будуть об'єднані. Дублювати правила немає сенсу, але можливо.",
|
||||
"new-rule-description": "При створенні нового правила для плану харчування, ви можете обмежити правило на певний день тижня та/або певний тип їжі. Щоб застосувати правило до всіх днів або всіх типів їжі, ви можете встановити правило \"Будь-який\", що застосовуватиме його до всіх можливих значень для дня та/або типу їжі.",
|
||||
"meal-plan-rules-description": "Ви можете створити правила для автоматичного вибору рецептів для ваших меню. Ці правила використовуються сервером для визначення випадкового набору рецептів, з яких можна вибирати при створенні меню. Зверніть увагу, що якщо правила мають однакові обмеження за днем/типом, то фільтри правил будуть об'єднані. На практиці створювати дублікати правил не потрібно, але це можливо.",
|
||||
"new-rule-description": "Створюючи нове правило для меню, ви можете обмежити його застосування певним днем тижня та/або певним типом харчування. Щоб застосувати правило до всіх днів або всіх типів харчування, ви можете встановити правило «Будь-який», яке застосовуватиметься до всіх можливих значень для дня та/або типу меню.",
|
||||
"recipe-rules": "Правила рецептів",
|
||||
"applies-to-all-days": "Застосовується до всіх днів",
|
||||
"applies-on-days": "Застосовується на {0}сек",
|
||||
"meal-plan-settings": "Налаштування плану харчування"
|
||||
"meal-plan-settings": "Налаштування меню"
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Дані міграції видалені",
|
||||
@@ -439,8 +439,8 @@
|
||||
"recipe-markup-specification": "Налаштування розмітки рецептів",
|
||||
"recipe-url": "URL-адреса рецепту",
|
||||
"recipe-html-or-json": "Рецепт HTML або JSON",
|
||||
"upload-a-recipe": "Відвантажити рецепт",
|
||||
"upload-individual-zip-file": "Відвантажити окремий .zip файл, експортований з іншого Mealie.",
|
||||
"upload-a-recipe": "Завантажити рецепт",
|
||||
"upload-individual-zip-file": "Завантажити окремий .zip файл, експортований з іншого Mealie.",
|
||||
"url-form-hint": "Скопіюйте та вставте посилання з вашого улюбленого кулінарного веб-сайту",
|
||||
"view-scraped-data": "Переглянути зібрані дані",
|
||||
"trim-whitespace-description": "Обрізати початкові та кінцеву пробілів і порожні лінії",
|
||||
@@ -448,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 - Сторінка не знайдена",
|
||||
@@ -485,7 +487,7 @@
|
||||
"disable-comments": "Вимкнути коментарі",
|
||||
"duplicate": "Дублювати рецепт",
|
||||
"duplicate-name": "Назва нового рецепту",
|
||||
"edit-scale": "Maßeinheiten bearbeiten",
|
||||
"edit-scale": "Редагувати порції",
|
||||
"fat-content": "Жири",
|
||||
"fiber-content": "Волокна",
|
||||
"grams": "грами",
|
||||
@@ -515,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": "Не вдалося оновити рецепт",
|
||||
@@ -539,19 +544,19 @@
|
||||
"no-recipe": "Немає рецепту",
|
||||
"locked-by-owner": "Заблоковано власником",
|
||||
"join-the-conversation": "Приєднатися до розмови",
|
||||
"add-recipe-to-mealplan": "Додати рецепт до плану харчування",
|
||||
"add-recipe-to-mealplan": "Додати рецепт до меню",
|
||||
"entry-type": "Тип",
|
||||
"date-format-hint": "Формат ММ/ДД/РРРР",
|
||||
"date-format-hint-yyyy-mm-dd": "РРРР-ММ-ДД формат",
|
||||
"add-to-list": "Додати до списку",
|
||||
"add-to-plan": "Додати до плану",
|
||||
"add-to-timeline": "Додати до хроніки",
|
||||
"add-to-timeline": "Додати до Хронології",
|
||||
"recipe-added-to-list": "Рецепт додано до списку",
|
||||
"recipes-added-to-list": "Рецепти додані до списку",
|
||||
"successfully-added-to-list": "Успішно додано до списку",
|
||||
"recipe-added-to-mealplan": "Рецепт додано до плану харчування",
|
||||
"recipe-added-to-mealplan": "Рецепт додано до меню",
|
||||
"failed-to-add-recipes-to-list": "Не вдалося додати рецепт до списку",
|
||||
"failed-to-add-recipe-to-mealplan": "Не вдалося додати рецепт до плану харчування",
|
||||
"failed-to-add-recipe-to-mealplan": "Не вдалося додати рецепт до меню",
|
||||
"failed-to-add-to-list": "Не вдалося додати до списку",
|
||||
"yield": "Вихід",
|
||||
"yields-amount-with-text": "Вийде: {amount} {text}",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "Виберіть одиниці вимірювання",
|
||||
"press-enter-to-create": "Натисніть Enter, щоб створити",
|
||||
"choose-food": "Вибрати продукт",
|
||||
"choose-recipe": "Обрати рецепт",
|
||||
"notes": "Нотатки",
|
||||
"toggle-section": "Перемкнути секцію",
|
||||
"see-original-text": "Переглянути оригінальний текст",
|
||||
@@ -573,9 +579,9 @@
|
||||
"merge-above": "Об'єднати з тим що вище",
|
||||
"move-to-bottom": "Перемістити вниз",
|
||||
"move-to-top": "Перемістити вгору",
|
||||
"reset-scale": "Скинути масштабування",
|
||||
"decrease-scale-label": "Зменшити масштабування на 1",
|
||||
"increase-scale-label": "Збільшити масштабування на 1",
|
||||
"reset-scale": "Скинути порції",
|
||||
"decrease-scale-label": "Зменшити порцію на 1",
|
||||
"increase-scale-label": "Збільшити порцію на 1",
|
||||
"locked": "Заблоковано",
|
||||
"public-link": "Публічне посилання",
|
||||
"edit-timeline-event": "Редагувати подію хронології",
|
||||
@@ -587,11 +593,12 @@
|
||||
"made-this": "Я це приготував",
|
||||
"how-did-it-turn-out": "Як вийшло?",
|
||||
"user-made-this": "{user} зробив це",
|
||||
"added-to-timeline": "Додати до хроніки",
|
||||
"failed-to-add-to-timeline": "Не вдалося додати до хроніки",
|
||||
"made-for-recipe": "Зроблено для {recipe}",
|
||||
"added-to-timeline": "Додати до хронології",
|
||||
"failed-to-add-to-timeline": "Не вдалося додати до хронології",
|
||||
"failed-to-update-recipe": "Не вдалося оновити рецепт",
|
||||
"added-to-timeline-but-failed-to-add-image": "Додано до хроніки, але не вдалося додати зображення",
|
||||
"api-extras-description": "Додатки в рецептах - ключова функція API Mealie. Вони дозволяють створювати користувацьку пару JSON ключів та значень в рецепті для сторонніх додатків. Це можна використовувати для автоматизації або для створення користувацьких повідомлень для сторонніх сервісів.",
|
||||
"added-to-timeline-but-failed-to-add-image": "Додано до хронології, але не вдалося додати зображення",
|
||||
"api-extras-description": "Розширення в рецептах - ключова функція API Mealie. Вони дозволяють створювати користувацьку пару JSON ключів та значень в рецепті для сторонніх додатків. Ви можете використовувати ці ключі для надання інформації, наприклад, для запуску автоматизації або власних повідомлень, які будуть передані на бажаний пристрій.",
|
||||
"message-key": "Ключ повідомлення",
|
||||
"parse": "Проаналізувати",
|
||||
"ingredients-not-parsed-description": "Схоже, що ваші інгредієнти ще не оброблені. Натисніть кнопку \"{parse}\" знизу, щоб проаналізувати свої інгредієнти в структуровані продукти.",
|
||||
@@ -639,14 +646,14 @@
|
||||
"create-a-recipe-by-uploading-a-scan": "Створити рецепт, завантаживши скан.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Завантажити png зображення з книги рецептів",
|
||||
"recipe-bulk-importer": "Масовий імпорт рецептів",
|
||||
"recipe-bulk-importer-description": "Масовий імпорт дозволяє імпортувати багато рецептів одночасно шляхом додавання посилань в чергу й імпорту в фоні. Це може бути корисним при початковій міграції на Mealie, або при імпорті великої кількості рецептів.",
|
||||
"recipe-bulk-importer-description": "Масовий імпортер рецептів дозволяє імпортувати відразу декілька рецептів, додаючи сайти в чергу на сервері та виконуючи завдання у фоновому режимі. Це може бути корисно під час початкового переходу на Mealie або коли ви хочете імпортувати велику кількість рецептів.",
|
||||
"set-categories-and-tags": "Обрати категорії та мітки",
|
||||
"bulk-imports": "Масовий імпорт",
|
||||
"bulk-import-process-has-started": "Процес масового імпорту розпочато",
|
||||
"bulk-import-process-has-failed": "Помилка масового імпорту",
|
||||
"report-deletion-failed": "Не вдалося видалити звіт",
|
||||
"recipe-debugger": "Дебаггер рецептів",
|
||||
"recipe-debugger-description": "Вставте URL-адресу рецепта, який ви хочете дебажити сюди. URL буде розпарсено парсером рецептів й результати будуть відображені. Якщо ви не бачите жодних даних - значить Mealie або парсер рецептів не підтримує сайт який ви намагаєтеся використати.",
|
||||
"recipe-debugger-description": "Скопіюйте URL-адресу рецепта, який ви хочете стягнути, і вставте її тут. URL-адреса буде вилучена за допомогою паресра рецептів, і результати будуть відображені. Якщо ви не бачите жодних даних, сайт, який ви намагаєтеся вилучити, не підтримується Mealie або його бібліотекою парсерів.",
|
||||
"use-openai": "Використовувати OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Використовуйте OpenAI для аналізу результатів замість використання бібліотеки парсера. Під час створення рецепта через URL це робиться автоматично, якщо бібліотека парсера не впоралася, але ви можете перевірити це тут вручну.",
|
||||
"debug": "Дебажити",
|
||||
@@ -655,14 +662,14 @@
|
||||
"recipe-yield": "Вихід рецепту",
|
||||
"recipe-yield-text": "Вихід рецепту",
|
||||
"unit": "Одиниця виміру",
|
||||
"upload-image": "Вивантажити зображення",
|
||||
"upload-image": "Завантажити зображення",
|
||||
"screen-awake": "Тримати екран активним",
|
||||
"remove-image": "Видалити зображення",
|
||||
"nextStep": "Наступний крок",
|
||||
"recipe-actions": "Дії рецепту",
|
||||
"parser": {
|
||||
"ingredient-parser": "Аналізатор інгредієнтів",
|
||||
"explanation": "Щоб використати аналізатор інгредієнтів, натисніть кнопку 'Аналізувати все', щоб запустити процес. Після того, як інгредієнти проаналізовані, ви можете їх переглянути та переконатися, що вони були проаналізовані правильно. Оцінка надійності аналізу відображена праворуч від назви елемента. Ця оцінка розраховується як середнє значення усіх індивідуальних оцінок і не завжди може бути абсолютно точним.",
|
||||
"explanation": "Щоб скористатися аналізатором інгредієнтів, натисніть кнопку «Аналізувати все», щоб розпочати процес. Після обробки інгредієнтів ви можете переглянути елементи та перевірити, чи вони були проаналізовані правильно. Оцінка надійності моделі відображається праворуч від назви елемента. Ця оцінка є середнім значенням усіх окремих оцінок і не завжди може бути повністю точною.",
|
||||
"alerts-explainer": "Оповіщення будуть відображатися, якщо знайдені продукти або одиниці знайдені яких не існує в базі даних.",
|
||||
"select-parser": "Вибрати аналізатор",
|
||||
"natural-language-processor": "Аналізатор природної мови",
|
||||
@@ -688,10 +695,13 @@
|
||||
"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": "Шукач рецептів",
|
||||
"recipe-finder": "Пошук рецептів",
|
||||
"recipe-finder-description": "Пошук рецептів базується на продуктах, які ви маєте. Ви також можете фільтрувати за наявними інструментами та встановити максимальну кількість відсутніх продуктів або інструментів.",
|
||||
"selected-ingredients": "Вибрані продукти",
|
||||
"no-ingredients-selected": "Жодного продукту не вибрано",
|
||||
@@ -714,9 +724,9 @@
|
||||
"include": "Включаючи",
|
||||
"max-results": "Максимальна кількість результатів",
|
||||
"or": "Або",
|
||||
"has-any": "Є будь-яке",
|
||||
"has-any": "Містить будь-який",
|
||||
"has-all": "Є всі",
|
||||
"clear-selection": "Зняти позначення",
|
||||
"clear-selection": "Очистити вибір",
|
||||
"results": "Результати",
|
||||
"search": "Пошук",
|
||||
"search-mealie": "Пошук по Mealie (натисніть /)",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "Натисніть '/'",
|
||||
"advanced": "Розширений",
|
||||
"auto-search": "Автопошук",
|
||||
"no-results": "Нічого не знайдено"
|
||||
"no-results": "Нічого не знайдено",
|
||||
"type-to-search": "Введіть текст для пошуку..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Додати нову тему",
|
||||
@@ -744,7 +755,7 @@
|
||||
"import-summary": "Резюме імпорту",
|
||||
"partial-backup": "Часткова резервна копія",
|
||||
"unable-to-delete-backup": "Не вдалося видалити резервну копію.",
|
||||
"experimental-description": "Резервні копії - це загальні знімки каталогу бази даних і даних сайту. Це включає всі дані без виключень. Вважайте це знімком Mealie у певний час. Вони служать способом експорту та імпорту даних, або створення резервної копії сайту.",
|
||||
"experimental-description": "Резервні копії - це повні знімки бази даних та каталогу даних сайту. Вони містять усі дані, і неможливо виключити з них окремі підмножини даних. Можна уявити це як знімок Mealie в певний момент часу. Вони слугують незалежним від бази даних способом експорту та імпорту даних або створення резервної копії сайту на зовнішньому носії.",
|
||||
"backup-restore": "Відновлення з резервної копії",
|
||||
"back-restore-description": "Відновлення резервної копії перезапише всі дані вашої бази даних і в каталозі даних і замінить їх вміст вмістом цієї резервної копії. {cannot-be-undone} Якщо відновлення успішне, вас вилогінить з системи.",
|
||||
"cannot-be-undone": "Цю дію не можна скасувати - використовуйте з обережністю.",
|
||||
@@ -774,7 +785,7 @@
|
||||
"locale-settings": "Налаштування локалі",
|
||||
"migrations": "Міграції",
|
||||
"new-page": "Нова сторінка",
|
||||
"notify": "Сповіщення",
|
||||
"notify": "Нагадати",
|
||||
"organize": "Впорядкувати",
|
||||
"page-name": "Назва сторінки",
|
||||
"pages": "Сторінки",
|
||||
@@ -836,7 +847,7 @@
|
||||
"webhooks-caps": "ВЕБХУКИ",
|
||||
"webhooks": "Вебхуки",
|
||||
"webhook-name": "Назва вебхука",
|
||||
"description": "Веб хуки, визначені нижче, будуть виконані коли буде визначено план харчування на день. В запланований час веб хук отримає дані з рецепта, який заплановано на день. Зверніть увагу, що виконання веб хука не точне в часі. Веб хуки виконуються з інтервалом в 5 хвилин, тому вони будуть виконані протягом 5 +/- хвилин від запланованого."
|
||||
"description": "Веб-хуки, визначені нижче, будуть виконуватися, коли буде визначено меню на день. У призначений час веб-хуки будуть надіслані з даними з рецепта, запланованого на цей день. Зверніть увагу, що виконання веб-хуків не є точним. Веб-хуки виконуються з інтервалом у 5 хвилин, тому вони будуть виконані протягом 5 +/- хвилин від призначеного часу."
|
||||
},
|
||||
"bug-report": "Повідомлення про помилку",
|
||||
"bug-report-information": "Використати цю інформацію, щоб повідомити про помилку. Надання даних з Mealie розробника найкращий спосіб пришвидшити розв'язання проблеми.",
|
||||
@@ -1007,9 +1018,9 @@
|
||||
"register": "Зареєструватися",
|
||||
"reset-password": "Скинути пароль",
|
||||
"sign-in": "Увійти",
|
||||
"total-mealplans": "Всього планів харчування",
|
||||
"total-mealplans": "Всього меню",
|
||||
"total-users": "Всього користувачів",
|
||||
"upload-photo": "Відвантажити світлину",
|
||||
"upload-photo": "Завантажити світлину",
|
||||
"use-8-characters-or-more-for-your-password": "Пароль повинен містити 8 або більше символів",
|
||||
"user-created": "Користувача створено",
|
||||
"user-creation-failed": "Не вдалося створити користувача",
|
||||
@@ -1076,9 +1087,9 @@
|
||||
},
|
||||
"data-pages": {
|
||||
"foods": {
|
||||
"merge-dialog-text": "Об'єднання вибраних продуктів об'єднає вихідний продукт та цільовий продукт до одного продукту. Вихідний продукт буде видалений і всі посилання на вихідний продукт будуть посилатися на цільовий продукт.",
|
||||
"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-text": "Заповніть базу даних продуктами вашою мовою. Це дозволить створити близько 2700 поширених продуктів, які можна використовувати для організації вашої бази даних. Продукти перекладаються спільними зусиллями спільноти.",
|
||||
"seed-dialog-warning": "У вас уже є деякі елементи в базі даних. Ця дія не об'єднає дублікати, вам доведеться керувати ними вручну.",
|
||||
"combine-food": "Об'єднати продукти",
|
||||
"source-food": "Вихідний продукт",
|
||||
@@ -1181,7 +1192,7 @@
|
||||
"create-a-new-group": "Створити нову групу",
|
||||
"provide-registration-token-description": "Будь ласка, вкажіть реєстраційний ключ, пов'язаний з групою, до якої ви хочете приєднатися. Цей токен потрібно буде отримати від існуючого члена групи.",
|
||||
"group-details": "Деталі групи",
|
||||
"group-details-description": "Перед створенням облікового запису вам потрібно створити групу. Спочатку ваша група буде містити тільки вас, але ви зможете запрошувати інших пізніше. Учасники вашої групи можуть обмінюватися планами харчування, списками покупок, рецептами і багато чим іншим!",
|
||||
"group-details-description": "Перед створенням облікового запису вам потрібно створити групу. Спочатку ваша група буде містити тільки вас, але ви зможете запрошувати інших пізніше. Учасники вашої групи можуть обмінюватися меню, списками покупок, рецептами і багато чим іншим!",
|
||||
"use-seed-data": "Використати початкові дані",
|
||||
"use-seed-data-description": "Mealie поставляється з набором продуктів, одиниць і міток, які можуть бути використані для наповнення ваших груп корисними даними для організації ваших рецептів. Це перекладено на вибрану вами мову. Ви можете додати або змінити ці дані пізніше.",
|
||||
"account-details": "Деталі акаунта"
|
||||
@@ -1290,8 +1301,8 @@
|
||||
"actions-title": "Дії"
|
||||
},
|
||||
"ingredients-natural-language-processor": "Обробка природної мови для інгредієнтів",
|
||||
"ingredients-natural-language-processor-explanation": "Mealie використовує умовні випадкові поля (УВП) для аналізу та обробки компонентів. Модель яка використовується для інгредієнтів, ґрунтується на наборі даних більш ніж 100 000 інгредієнтів з бази даних, зібраних Нью-Йорк Таймс. Зверніть увагу, що модель натренована на англійській мові, тож ви можете мати неточні результати при використанні моделі з іншими мовами. Ця сторінка є майданчиком для тестування моделі.",
|
||||
"ingredients-natural-language-processor-explanation-2": "Модель не ідеальна, але дає непогані результати в загальному і є хорошим початковим пунктом для ручного парсингу інгредієнтів в окремі поля. Крім того, ви можете використовувати \"Brute\" процесор, який використовує метод підбору для визначення інгредієнтів.",
|
||||
"ingredients-natural-language-processor-explanation": "Mealie використовує умовні випадкові поля (CRF) для аналізу та обробки інгредієнтів. Модель, що використовується для інгредієнтів, базується на наборі даних, що містить понад 100 000 інгредієнтів, зібраних газетою New York Times. Зверніть увагу, що оскільки модель навчена лише англійською мовою, при використанні моделі іншими мовами результати можуть відрізнятися. Ця сторінка є майданчиком для тестування моделі.",
|
||||
"ingredients-natural-language-processor-explanation-2": "Модель не ідеальна, але загалом дає чудові результати і є гарною відправною точкою для ручного розбиття інгредієнтів на окремі поля. Як альтернативу, ви також можете використовувати процесор «Brute», який використовує техніку зіставлення шаблонів для ідентифікації інгредієнтів.",
|
||||
"nlp": "ОПМ",
|
||||
"brute": "Брут",
|
||||
"openai": "OpenAI",
|
||||
@@ -1345,12 +1356,12 @@
|
||||
"group-settings-description": "Керуйте спільними налаштуваннями групи, як-от налаштування конфіденційності.",
|
||||
"household-description": "Ці елементи є спільними для вашої сімʼї. Редагування одного з них змінить його для всієї сімʼї!",
|
||||
"household-settings": "Налаштування сімʼї",
|
||||
"household-settings-description": "Керуйте налаштуваннями сімʼї, такими як план харчування і налаштування конфіденційності.",
|
||||
"household-settings-description": "Керуйте налаштуваннями сімʼї, такими як меню і налаштування конфіденційності.",
|
||||
"cookbooks-description": "Управління колекцією категорій рецептів і генерація сторінок для них.",
|
||||
"members": "Учасники",
|
||||
"members-description": "Подивіться, хто у вас в сім'ї й керуйте їх дозволами.",
|
||||
"webhooks-description": "Налаштуйте веб хуки, що спрацьовують у дні, коли у вас є запланований план харчування.",
|
||||
"notifiers": "Сповіщувачі",
|
||||
"webhooks-description": "Налаштуйте веб хуки, що спрацьовують у дні, коли у вас є заплановане меню.",
|
||||
"notifiers": "Нагадувачі",
|
||||
"notifiers-description": "Налаштуйте email та push сповіщення, що спрацьовують для певних подій.",
|
||||
"manage-data": "Керування даними",
|
||||
"manage-data-description": "Керуйте своїми даними Mealie; їжа, одиниці, категорії, мітки та багато іншого.",
|
||||
@@ -1368,7 +1379,7 @@
|
||||
"manage-cookbooks": "Керування кулінарними книгами",
|
||||
"manage-members": "Керування користувачами",
|
||||
"manage-webhooks": "Керування вебхуками",
|
||||
"manage-notifiers": "Керування Сповіщувачами",
|
||||
"manage-notifiers": "Керування Нагадувачами",
|
||||
"manage-data-migrations": "Керування міграцією даних"
|
||||
},
|
||||
"cookbook": {
|
||||
|
||||
@@ -448,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",
|
||||
@@ -515,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",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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",
|
||||
|
||||
@@ -448,7 +448,9 @@
|
||||
"split-by-numbered-line-description": "尝试匹配 “1)” 或 “1.” 的格式来分割段落",
|
||||
"import-by-url": "通过网址导入食谱",
|
||||
"create-manually": "手动创建食谱",
|
||||
"make-recipe-image": "将此设为食谱图片"
|
||||
"make-recipe-image": "将此设为食谱图片",
|
||||
"add-food": "Add Food",
|
||||
"add-recipe": "Add Recipe"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404-页面未找到",
|
||||
@@ -515,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": "食谱更新失败",
|
||||
@@ -560,6 +565,7 @@
|
||||
"choose-unit": "选择单位",
|
||||
"press-enter-to-create": "按回车键以创建",
|
||||
"choose-food": "选择食品",
|
||||
"choose-recipe": "Choose Recipe",
|
||||
"notes": "备注",
|
||||
"toggle-section": "切换分类",
|
||||
"see-original-text": "查看原文",
|
||||
@@ -587,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": "更新配方失败",
|
||||
@@ -688,7 +695,10 @@
|
||||
"upload-images": "上传图片",
|
||||
"upload-more-images": "上传更多图片",
|
||||
"set-as-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": "食谱搜索",
|
||||
@@ -725,7 +735,8 @@
|
||||
"search-hint": "按 '/'",
|
||||
"advanced": "高级",
|
||||
"auto-search": "自动搜索",
|
||||
"no-results": "未找到任何结果"
|
||||
"no-results": "未找到任何结果",
|
||||
"type-to-search": "Type to search..."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "新增布景主题",
|
||||
|
||||
@@ -448,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 找不到頁面",
|
||||
@@ -515,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": "食譜更新失敗",
|
||||
@@ -560,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",
|
||||
@@ -587,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",
|
||||
@@ -688,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",
|
||||
@@ -725,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": "新增佈景主題",
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<TheSnackbar />
|
||||
|
||||
<v-banner
|
||||
v-if="isDemo"
|
||||
v-if="$appInfo.demoStatus"
|
||||
sticky
|
||||
>
|
||||
<div class="text-center">
|
||||
<b> {{ $t("demo.info_message_with_version", { version: version }) }} </b>
|
||||
<b> {{ $t("demo.info_message_with_version", { version: $appInfo.version }) }} </b>
|
||||
</div>
|
||||
</v-banner>
|
||||
|
||||
@@ -23,24 +23,8 @@
|
||||
|
||||
<script lang="ts">
|
||||
import TheSnackbar from "~/components/Layout/LayoutParts/TheSnackbar.vue";
|
||||
import { useAppInfo } from "~/composables/api";
|
||||
import { useGlobalI18n } from "~/composables/use-global-i18n";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { TheSnackbar },
|
||||
setup() {
|
||||
const appInfo = useAppInfo();
|
||||
|
||||
const isDemo = computed(() => appInfo?.value?.demoStatus || false);
|
||||
|
||||
const i18n = useGlobalI18n();
|
||||
const version = computed(() => appInfo?.value?.version || i18n.t("about.unknown-version"));
|
||||
|
||||
return {
|
||||
appInfo,
|
||||
isDemo,
|
||||
version,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -18,6 +18,7 @@ export interface AdminAboutInfo {
|
||||
oidcProviderName: string;
|
||||
enableOpenai: boolean;
|
||||
enableOpenaiImageServices: boolean;
|
||||
tokenTime: number;
|
||||
versionLatest: string;
|
||||
apiPort: number;
|
||||
apiDocs: boolean;
|
||||
@@ -50,6 +51,7 @@ export interface AppInfo {
|
||||
oidcProviderName: string;
|
||||
enableOpenai: boolean;
|
||||
enableOpenaiImageServices: boolean;
|
||||
tokenTime: number;
|
||||
}
|
||||
export interface AppStartupInfo {
|
||||
isFirstLogin: boolean;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user