Compare commits

..

107 Commits

Author SHA1 Message Date
Lory
1cf7e37ada fix: prevent URL encoding in postgres placeholder display (#6438) 2025-11-14 16:17:17 +00:00
Arsène Reymond
930c92365d fix: Improve recipe ingredient selection (#6518)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-14 10:05:54 -06:00
Aurelien
6f1fee5511 fix: Make Ingredients and Instructions independently scrollable in cook mode (#6358)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-14 09:45:36 -06:00
renovate[bot]
f5de126d86 chore(deps): update node.js to 42ce5b9 (#6539)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-13 05:15:20 +00:00
renovate[bot]
725dae41b1 chore(deps): update dependency pytest to v9 (#6525)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-12 23:04:56 -06:00
github-actions[bot]
39e919526a chore(auto): Update pre-commit hooks (#6528)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-12 17:19:19 +00:00
renovate[bot]
1978ad2c96 chore(deps): update node.js to e5bbac0 (#6507)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-12 11:04:49 -06:00
github-actions[bot]
23e8dc1941 chore(l10n): Crowdin locale sync (#6524) 2025-11-08 22:15:51 -06:00
Hayden
96b408a661 chore(l10n): New Crowdin updates (#6508) 2025-11-05 09:39:12 +01:00
Hayden
20a9a94770 chore(l10n): New Crowdin updates (#6506) 2025-11-04 21:30:09 +01:00
renovate[bot]
b280e2d1a0 chore(deps): update node.js to 55b6bbe (#6503)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-04 11:09:32 -06:00
Hayden
735162d042 chore(l10n): New Crowdin updates (#6502) 2025-11-04 09:03:03 -06:00
gpotter@gmail.com
60d9294861 feat: Add recipe as ingredient (#4800)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-03 23:57:57 -06:00
Michael Genson
ff42964537 fix: Brute parser fails if unit or food is empty (#6500) 2025-11-03 23:44:13 -06:00
Christian Hollinger
bb67d993a0 feat: Add DELETE /{slug}/image (#6259)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-03 19:41:54 -06:00
Michael Genson
7bb0f0801a fix: Stabilize shopping list queuing (#6498) 2025-11-03 18:38:33 -06:00
Hayden
3a4875a54f chore(l10n): New Crowdin updates (#6495) 2025-11-03 20:53:45 +00:00
Michael Genson
0371874670 fix: Refactor Recipe Zip File Flow (#6170) 2025-11-03 14:43:22 -06:00
Tom Strange
3d177566ed fix: Include contents of purpose field when parsing ingredients (#6494) 2025-11-03 18:09:00 +00:00
github-actions[bot]
14e87918fb chore(auto): Update pre-commit hooks (#6493)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2025-11-03 16:15:38 +00:00
Hayden
ac75b0254d chore(l10n): New Crowdin updates (#6492) 2025-11-03 09:12:57 +01:00
Michael Genson
7f2927600b chore: Update some frontend deps (#6490) 2025-11-02 22:42:19 -06:00
aliyyanWijaya
5e8c4a6cee fix: Update the random button flow (#6248)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-03 02:52:17 +00:00
Arsène Reymond
a460c32674 fix: Locale dates format (#6211)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-11-02 20:39:33 -06:00
Hayden
973cd5ab02 chore(l10n): New Crowdin updates (#6487) 2025-11-02 20:08:02 +01:00
Hayden
ac355c1071 chore(l10n): New Crowdin updates (#6486) 2025-11-02 01:07:56 -05:00
github-actions[bot]
3a617cd3c3 chore(l10n): Crowdin locale sync (#6485)
Co-authored-by: GitHub Action <action@github.com>
2025-11-01 23:05:26 -05:00
Hayden
3c874c2f85 chore(l10n): New Crowdin updates (#6478) 2025-11-01 20:11:17 +00:00
renovate[bot]
fb3be73163 chore(deps): update dependency types-python-slugify to v8 (#6480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-01 20:00:36 +00:00
renovate[bot]
14b783852e fix(deps): update dependency tzdata to v2025 (#6481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-01 19:49:51 +00:00
Michael Genson
75616d66b8 dev: Migrate to uv (#6470) 2025-11-01 14:36:40 -05:00
github-actions[bot]
01713b0416 docs(auto): Update image tag, for release v3.4.0 (#6471)
Co-authored-by: michael-genson <71845777+michael-genson@users.noreply.github.com>
2025-10-31 19:29:05 +00:00
Hayden
123a8b99f8 chore(l10n): New Crowdin updates (#6469) 2025-10-31 19:15:33 +00:00
renovate[bot]
6732fcd696 chore(deps): update dependency fastapi to v0.120.3 (#6465)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-31 11:08:41 -05:00
Hayden
5fcbfbf361 chore(l10n): New Crowdin updates (#6464) 2025-10-31 01:06:46 +05:45
Hayden
1318998bc9 chore(l10n): New Crowdin updates (#6462) 2025-10-30 12:59:57 +05:45
renovate[bot]
0947212271 chore(deps): update dependency fastapi to v0.120.2 (#6457) 2025-10-29 14:39:33 +00:00
renovate[bot]
92ac5c6253 chore(deps): update node.js to v24 (#6451) 2025-10-29 09:27:00 -05:00
renovate[bot]
5f96f4b47f chore(deps): update dependency fastapi to v0.120.1 (#6450)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-29 08:49:32 -05:00
renovate[bot]
dbcd430425 chore(deps): update dependency alembic to v1.17.1 (#6456)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-29 04:52:13 +00:00
renovate[bot]
4c9164594b chore(deps): update dependency python-dotenv to v1.2.1 (#6442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 23:39:37 -05:00
renovate[bot]
e5a13f8b43 chore(deps): update dependency ingredient-parser-nlp to v2.4.0 (#6448)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-29 01:34:43 +00:00
github-actions[bot]
726ad10c7e chore(auto): Update pre-commit hooks (#6445)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2025-10-29 01:22:51 +00:00
Hayden
df53310f2e chore(l10n): New Crowdin updates (#6455) 2025-10-28 22:12:48 +05:45
Hayden
82bf5c1bae chore(l10n): New Crowdin updates (#6446) 2025-10-28 10:32:51 +05:45
Hayden
c70a63f0ff chore(l10n): New Crowdin updates (#6444) 2025-10-27 12:16:52 +05:45
Hayden
14bfa6bcae chore(l10n): New Crowdin updates (#6441) 2025-10-26 09:52:59 -05:00
github-actions[bot]
adbafef157 chore(l10n): Crowdin locale sync (#6440)
Co-authored-by: GitHub Action <action@github.com>
2025-10-26 04:06:16 +00:00
Hayden
62d52f53e4 chore(l10n): New Crowdin updates (#6439) 2025-10-25 22:55:47 -05:00
Florian Fischer
4370319fec fix: Food seed only works for American English (#6204) (#6436)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-25 12:40:02 -05:00
Hayden
15908d190d chore(l10n): New Crowdin updates (#6435) 2025-10-25 10:07:21 -05:00
Hayden
fcb909e072 chore(l10n): New Crowdin updates (#6434) 2025-10-25 01:50:15 +00:00
Aurelien
8e532af4d9 fix: Heart and Ranking Stars overlap each other (#6359)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-24 17:35:07 -05:00
Richard vL
831cb6dd17 fix: Changed sorting icons (#6354)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-24 21:51:11 +00:00
Michael Genson
089bb24c0f fix: Make docs:gen consistent regardless of timestamp (again) (#6432) 2025-10-24 16:34:44 -05:00
Fernando Muñoz Paredes
107dfc34de fix: dash slug names (#5709)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-24 16:01:55 -05:00
renovate[bot]
144d4caea6 chore(deps): update dependency orjson to v3.11.4 (#6431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-24 14:02:45 -05:00
renovate[bot]
b3db81b9a4 chore(deps): update dependency openai to v2.6.1 (#6429)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-24 18:29:53 +00:00
renovate[bot]
dc2bbdc494 fix(deps): update dependency fastapi to ^0.120.0 (#6426)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-24 13:17:47 -05:00
Hayden
8f17a08923 chore(l10n): New Crowdin updates (#6396) 2025-10-24 15:44:12 +00:00
renovate[bot]
f6209bff54 chore(deps): update node.js to 23c24e8 (#6424)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-24 15:31:16 +00:00
Michael Genson
33865285d1 fix: Use crossorigin: "use-credentials" with PWA manifest (#6430) 2025-10-24 10:20:04 -05:00
renovate[bot]
e226b9b1d5 fix(deps): update dependency vite to v7 [security] (#6412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-24 14:55:04 +00:00
miah
201c63d1e4 feat: Improve shopping list label sections (#6345)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-24 09:43:55 -05:00
renovate[bot]
a242f567ad chore(deps): update dependency ruff to v0.14.2 (#6425)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-23 23:08:29 -05:00
renovate[bot]
67ead2e8a1 chore(deps): update node.js to a2a7dcc (#6422)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-22 13:54:33 +00:00
renovate[bot]
7b273b77e2 chore(deps): update node.js to 58644f2 (#6418)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-22 08:42:55 -05:00
renovate[bot]
b4cd095360 chore(deps): update dependency pylint to v4.0.2 (#6409)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 18:22:02 +00:00
renovate[bot]
a9bb27c782 chore(deps): update dependency fastapi to v0.119.1 (#6408)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 13:08:10 -05:00
renovate[bot]
9df1523911 fix(deps): update dependency uvicorn to ^0.38.0 (#6400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 12:47:15 -05:00
renovate[bot]
0c8a1ae608 chore(deps): update dependency openai to v2.6.0 (#6398)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 17:26:57 +00:00
renovate[bot]
7d54404bf0 chore(deps): update dependency ruff to v0.14.1 (#6397)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 12:04:13 -05:00
github-actions[bot]
8bbe70d245 chore(auto): Update pre-commit hooks (#6407)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2025-10-21 16:16:07 +00:00
renovate[bot]
6c87f7fe33 chore(deps): update dependency pydantic to v2.12.3 (#6377)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 11:04:10 -05:00
miah
7e168eb75b feat: Support User-Level Default Activities (#5125) 2025-10-15 21:30:08 -05:00
Hayden
64d481b4fc chore(l10n): New Crowdin updates (#6395) 2025-10-15 21:08:22 +00:00
renovate[bot]
a9926557bc fix(deps): update dependency pillow to v12 (#6394)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 15:55:25 -05:00
renovate[bot]
2a908c0dd2 chore(deps): update dependency coverage to v7.11.0 (#6392) 2025-10-15 14:50:55 -05:00
renovate[bot]
c64a0dc769 chore(deps): update dependency mkdocs-material to v9.6.22 (#6391) 2025-10-15 10:46:58 -05:00
renovate[bot]
7ce9c35ef5 chore(deps): update dependency pylint to v4.0.1 (#6389) 2025-10-15 13:17:11 +00:00
Hayden
0acca2021d chore(l10n): New Crowdin updates (#6388) 2025-10-15 08:05:19 -05:00
Michael Genson
5de0b48aa9 fix: Upgrade Pydantic and remove manual Postgres URL parsing (#6385) 2025-10-14 15:52:50 -05:00
Hayden
ffe199c083 chore(l10n): New Crowdin updates (#6384) 2025-10-14 20:25:34 +00:00
Michael Genson
215a18be42 fix: Check x-forwarded-proto header when determining auth cookie samesite attribute (#6383) 2025-10-14 12:38:03 -05:00
github-actions[bot]
a1b065e5d1 chore(auto): Update pre-commit hooks (#6370)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2025-10-14 16:22:22 +00:00
Hayden
d660d89a1b chore(l10n): New Crowdin updates (#6381) 2025-10-14 10:22:03 -05:00
Hayden
ade1f797a9 chore(l10n): New Crowdin updates (#6376) 2025-10-13 19:45:53 +00:00
Ritoban Dutta
192872b9ec fix: Change 'Units' to 'Unit' in shopping list item editor (#6372) 2025-10-13 17:41:29 +00:00
renovate[bot]
25ebcb1a05 chore(deps): update dependency pylint to v4 (#6366)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-13 15:21:26 +00:00
Hayden
89d95ca5e1 chore(l10n): New Crowdin updates (#6371) 2025-10-13 10:09:53 -05:00
Hayden
b705652af3 chore(l10n): New Crowdin updates (#6367) 2025-10-12 14:28:54 -05:00
github-actions[bot]
b0c78de2da chore(l10n): Crowdin locale sync (#6364)
Co-authored-by: GitHub Action <action@github.com>
2025-10-12 04:15:09 +00:00
renovate[bot]
c4b1f9fd01 fix(deps): update dependency fastapi to ^0.119.0 (#6362)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-11 23:01:45 -05:00
renovate[bot]
2b0d8227f4 chore(deps): update dependency alembic to v1.17.0 (#6361)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-11 19:14:31 +00:00
Hayden
42517e9f8a chore(l10n): New Crowdin updates (#6357) 2025-10-11 14:01:21 -05:00
renovate[bot]
37c97c8aba chore(deps): update dependency python-ldap to v3.4.5 [security] (#6356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 22:52:36 -05:00
Hayden
64d36a2608 chore(l10n): New Crowdin updates (#6353) 2025-10-10 12:49:24 -05:00
renovate[bot]
563defe074 chore(deps): update dependency sqlalchemy to v2.0.44 (#6352)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 12:14:59 -05:00
renovate[bot]
f5ffb760d3 chore(deps): update dependency psycopg2-binary to v2.9.11 (#6351)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 16:34:05 +00:00
renovate[bot]
3118a0c0cf fix(deps): update dependency aiofiles to v25 (#6344)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 11:19:52 -05:00
renovate[bot]
444beb68f9 chore(deps): update dependency rich to v14.2.0 (#6341)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 16:03:34 +00:00
renovate[bot]
49a97ebc0e chore(deps): update dependency fastapi to v0.118.3 (#6336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 10:46:29 -05:00
renovate[bot]
6f682b742e chore(deps): update dependency pydantic to v2.12.0 (#6310)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-10 10:24:12 -05:00
Hayden
32d4d22bb8 chore(l10n): New Crowdin updates (#6347)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-10 05:33:04 +00:00
Dallin Miner
71d86489f4 feat: Add new migration for DVO Cook'n (#5085)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-10-10 00:22:51 -05:00
github-actions[bot]
a95eaf3d2e docs(auto): Update image tag, for release v3.3.2 (#6346)
Co-authored-by: michael-genson <71845777+michael-genson@users.noreply.github.com>
2025-10-10 04:14:06 +00:00
renovate[bot]
414af989e7 chore(deps): update dependency openai to v2.3.0 (#6330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 23:02:07 -05:00
223 changed files with 11603 additions and 10993 deletions

View File

@@ -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

View File

@@ -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": {

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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: |

View File

@@ -12,7 +12,7 @@ repos:
exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.13.3
rev: v0.14.4
hooks:
- id: ruff
- id: ruff-format

View File

@@ -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"
},

View File

@@ -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:

View File

@@ -1,7 +1,8 @@
import json
from datetime import UTC, datetime
from typing import Any
from fastapi import FastAPI
from freezegun import freeze_time
from mealie.app import app
from mealie.core.config import determine_data_dir
@@ -37,14 +38,43 @@ HTML_TEMPLATE = """<!-- Custom HTML site displayed as the Home chapter -->
"""
HTML_PATH = DATA_DIR.parent.parent.joinpath("docs/docs/overrides/api.html")
CONSTANT_DT = datetime(2025, 10, 24, 15, 53, 0, 0, tzinfo=UTC)
def normalize_timestamps(s: dict[str, Any]) -> dict[str, Any]:
field_format = s.get("format")
is_timestamp = field_format in ["date-time", "date", "time"]
has_default = s.get("default")
if not is_timestamp:
for k, v in s.items():
if isinstance(v, dict):
s[k] = normalize_timestamps(v)
elif isinstance(v, list):
s[k] = [normalize_timestamps(i) if isinstance(i, dict) else i for i in v]
return s
elif not has_default:
return s
if field_format == "date-time":
s["default"] = CONSTANT_DT.isoformat()
elif field_format == "date":
s["default"] = CONSTANT_DT.date().isoformat()
elif field_format == "time":
s["default"] = CONSTANT_DT.time().isoformat()
return s
def generate_api_docs(my_app: FastAPI):
openapi_schema = my_app.openapi()
openapi_schema = normalize_timestamps(openapi_schema)
with open(HTML_PATH, "w") as fd:
text = HTML_TEMPLATE.replace("MY_SPECIFIC_TEXT", json.dumps(my_app.openapi()))
text = HTML_TEMPLATE.replace("MY_SPECIFIC_TEXT", json.dumps(openapi_schema))
fd.write(text)
if __name__ == "__main__":
with freeze_time("2024-01-20T17:00:55Z"):
generate_api_docs(app)
generate_api_docs(app)

View File

@@ -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__":

View File

@@ -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__":

View File

@@ -1,7 +1,7 @@
###############################################
# Frontend Build
###############################################
FROM node:22@sha256:2bb201f33898d2c0ce638505b426f4dd038cc00e5b2b4cbba17b069f0fff1496 \
FROM node:24@sha256:7f80506b8225bcce2ce8202b1026fcde8f0bfb716b1b833f20250d79d4463276 \
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

View File

@@ -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:

View File

@@ -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)

View File

@@ -22,6 +22,7 @@ Mealie supports importing recipes from a few other sources besides websites. Cur
- Recipe Keeper
- Copy Me That
- My Recipe Box
- DVO Cook'n X3
You can access these options on your installation at the `/group/migrations` page on your installation. If you'd like to see another source added, feel free to request so on Github.

View File

@@ -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.1`
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.4.0`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container

View File

@@ -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.1 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.4.0 # (3)
container_name: mealie
restart: always
ports:

View File

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

View File

@@ -28,6 +28,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
- Copy Me That
- Paprika
- Tandoor Recipes
- DVO Cook'n X3
- Random Meal Plan generation
- Advanced rule configuration to fine tune random recipes

View File

File diff suppressed because one or more lines are too long

View File

@@ -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"

View File

@@ -49,7 +49,6 @@
>
<RecipeFavoriteBadge
v-if="isOwnGroup"
class="absolute"
:recipe-id="recipeId"
show-always
/>

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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;

View File

@@ -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>

View File

@@ -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>

View File

@@ -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,
() => {

View File

@@ -32,7 +32,7 @@
v-bind="props"
>
<v-icon :start="!$vuetify.display.xs">
{{ state.orderDirection === "asc" ? $globals.icons.sortAscending : $globals.icons.sortDescending }}
{{ state.orderDirection === "asc" ? $globals.icons.sortDescending : $globals.icons.sortAscending }}
</v-icon>
{{ $vuetify.display.xs ? null : sortText }}
</v-btn>
@@ -42,7 +42,7 @@
<v-list-item
slim
density="comfortable"
:prepend-icon="state.orderDirection === 'asc' ? $globals.icons.sortDescending : $globals.icons.sortAscending"
:prepend-icon="state.orderDirection === 'asc' ? $globals.icons.sortAscending : $globals.icons.sortDescending"
:title="state.orderDirection === 'asc' ? $t('general.sort-descending') : $t('general.sort-ascending')"
@click="toggleOrderDirection"
/>
@@ -53,10 +53,23 @@
:active="state.orderBy === v.value"
slim
density="comfortable"
:prepend-icon="v.icon"
:title="v.name"
@click="setOrderBy(v.value)"
/>
@click="v.value === 'random' ? setRandomOrderByWrapper() : setOrderBy(v.value)"
>
<template #prepend>
<v-icon>{{ v.icon }}</v-icon>
</template>
<template #title>
<span>{{ v.name }}</span>
<v-icon
v-if="v.value === 'random' && showRandomLoading"
size="small"
class="ml-3"
>
{{ $globals.icons.refreshCircle }}
</v-icon>
</template>
</v-list-item>
</v-list>
</v-card>
</v-menu>
@@ -131,6 +144,7 @@ const $auth = useMealieAuth();
const route = useRoute();
const { $globals } = useNuxtApp();
const i18n = useI18n();
const showRandomLoading = ref(false);
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
@@ -141,6 +155,7 @@ const {
reset,
toggleOrderDirection,
setOrderBy,
setRandomOrderBy,
filterItems,
initialize,
} = useRecipeExplorerSearch(groupSlug);
@@ -205,6 +220,14 @@ const input: Ref<any> = ref(null);
function hideKeyboard() {
input.value?.blur();
}
// function to show refresh icon
async function setRandomOrderByWrapper() {
if (!showRandomLoading.value) {
showRandomLoading.value = true;
}
await setRandomOrderBy();
}
</script>
<style scoped>

View File

@@ -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")],
);

View File

@@ -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

View File

@@ -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>

View File

@@ -20,6 +20,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 +55,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 +125,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 +189,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 +288,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 +337,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"));
}

View File

@@ -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'"
className="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>;
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();

View File

@@ -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

View File

@@ -47,7 +47,7 @@
left
color="primary"
>
{{ $globals.icons.knfife }}
{{ $globals.icons.knife }}
</v-icon>
<p class="my-0">
<span class="font-weight-bold opacity-80">{{ validatePrepTime.name }}</span><br>{{ validatePrepTime.value }}

View File

@@ -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">

View File

@@ -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>

View File

@@ -10,7 +10,7 @@
v-model="listItem.unit"
v-model:item-id="listItem.unitId!"
:items="units"
:label="$t('general.units')"
:label="$t('recipe.unit')"
:icon="$globals.icons.units"
create
@create="createAssignUnit"

View File

@@ -59,7 +59,6 @@
<BaseButton
v-if="canDelete"
delete
secondary
@click="deleteEvent"
/>
<BaseButton

View File

@@ -0,0 +1,17 @@
<template>
<v-expansion-panels v-model="open">
<slot />
</v-expansion-panels>
</template>
<script setup lang="ts">
interface Props {
startOpen?: boolean;
}
const props = withDefaults(defineProps<Props>(), {
startOpen: false,
});
const open = ref(props.startOpen ? [0] : []);
</script>

View File

@@ -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;

View File

@@ -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;
@@ -62,15 +82,16 @@ export function useParsedIngredientText(ingredient: RecipeIngredient, scale = 1,
}
}
// TODO: Add support for sub-recipes here?
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),
};
}

View File

@@ -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) {

View File

@@ -1,5 +1,5 @@
import { useToggle } from "@vueuse/core";
import type { ShoppingListOut, ShoppingListItemOut } from "~/lib/api/types/household";
import type { ShoppingListOut } from "~/lib/api/types/household";
/**
* Composable for managing shopping list label state and operations
@@ -36,14 +36,24 @@ export function useShoppingListLabels(shoppingList: Ref<ShoppingListOut | null>)
);
});
const labelColorByName = computed(() => {
const map: Record<string, string | undefined> = {};
shoppingList.value?.listItems?.forEach((item) => {
if (!item.label) return;
const labelName = item.label?.name || t("shopping-list.no-label");
map[labelName] = item.label.color;
});
return map;
});
watch(labelNames, initializeLabelOpenStates, { immediate: true });
function toggleShowLabel(key: string) {
labelOpenState.value[key] = !labelOpenState.value[key];
}
function getLabelColor(item: ShoppingListItemOut | null) {
return item?.label?.color;
function getLabelColor(label: string) {
return labelColorByName.value[label];
}
const presentLabels = computed(() => {

View File

@@ -0,0 +1,63 @@
import type { Activity, I18n, TranslationResult } from "~/lib/api/types/activity";
import { ActivityKey } from "~/lib/api/types/activity";
export const DEFAULT_ACTIVITY = "/g/home" as const;
type ActivityRegistry = {
recipes: Activity;
mealplanner: Activity;
shopping_list: Activity;
};
const selectableActivities: ActivityRegistry = {
recipes: {
key: ActivityKey.RECIPES,
route: groupSlug => groupSlug ? `/g/${groupSlug}` : DEFAULT_ACTIVITY,
label: i18n => i18n.t("general.recipes"),
},
mealplanner: {
key: ActivityKey.MEALPLANNER,
route: () => "/household/mealplan/planner/view",
label: i18n => i18n.t("meal-plan.meal-planner"),
},
shopping_list: {
key: ActivityKey.SHOPPING_LIST,
route: () => "/shopping-lists",
label: i18n => i18n.t("shopping-list.shopping-lists"),
},
};
function getDefaultActivityRoute(activityKey?: ActivityKey, groupSlug?: string): string {
if (!activityKey) {
return DEFAULT_ACTIVITY;
}
const route = selectableActivities[activityKey]?.route ?? (() => DEFAULT_ACTIVITY);
return route(groupSlug);
}
function getDefaultActivityLabels(i18n: I18n): TranslationResult[] {
return Object.values(selectableActivities).map(
({ label }) => label(i18n),
);
}
function getActivityKey(i18n: I18n, target: TranslationResult = ""): ActivityKey | undefined {
return Object.values(selectableActivities)
.find(({ label }) => label(i18n) === target)?.key;
}
function getActivityLabel(i18n: I18n, target?: ActivityKey): TranslationResult {
return Object.values(selectableActivities)
.find(({ key }) => key === target)
?.label(i18n) ?? "";
}
export default function useDefaultActivity() {
return {
selectableActivities,
getDefaultActivityRoute,
getDefaultActivityLabels,
getActivityKey,
getActivityLabel,
};
}

View File

@@ -21,19 +21,19 @@ export const LOCALES = [
{
name: "Українська (Ukrainian)",
value: "uk-UA",
progress: 55,
progress: 61,
dir: "ltr",
},
{
name: "Türkçe (Turkish)",
value: "tr-TR",
progress: 36,
progress: 35,
dir: "ltr",
},
{
name: "Svenska (Swedish)",
value: "sv-SE",
progress: 53,
progress: 66,
dir: "ltr",
},
{
@@ -57,13 +57,13 @@ export const LOCALES = [
{
name: "Pусский (Russian)",
value: "ru-RU",
progress: 41,
progress: 43,
dir: "ltr",
},
{
name: "Română (Romanian)",
value: "ro-RO",
progress: 37,
progress: 36,
dir: "ltr",
},
{
@@ -81,19 +81,19 @@ export const LOCALES = [
{
name: "Polski (Polish)",
value: "pl-PL",
progress: 42,
progress: 43,
dir: "ltr",
},
{
name: "Norsk (Norwegian)",
value: "no-NO",
progress: 40,
progress: 41,
dir: "ltr",
},
{
name: "Nederlands (Dutch)",
value: "nl-NL",
progress: 52,
progress: 53,
dir: "ltr",
},
{
@@ -117,25 +117,25 @@ export const LOCALES = [
{
name: "日本語 (Japanese)",
value: "ja-JP",
progress: 37,
progress: 36,
dir: "ltr",
},
{
name: "Italiano (Italian)",
value: "it-IT",
progress: 43,
progress: 46,
dir: "ltr",
},
{
name: "Íslenska (Icelandic)",
value: "is-IS",
progress: 10,
progress: 37,
dir: "ltr",
},
{
name: "Magyar (Hungarian)",
value: "hu-HU",
progress: 45,
progress: 47,
dir: "ltr",
},
{
@@ -147,7 +147,7 @@ export const LOCALES = [
{
name: "עברית (Hebrew)",
value: "he-IL",
progress: 73,
progress: 72,
dir: "rtl",
},
{
@@ -171,25 +171,25 @@ export const LOCALES = [
{
name: "Belge (Belgian)",
value: "fr-BE",
progress: 41,
progress: 40,
dir: "ltr",
},
{
name: "Suomi (Finnish)",
value: "fi-FI",
progress: 37,
progress: 40,
dir: "ltr",
},
{
name: "Eesti (Estonian)",
value: "et-EE",
progress: 37,
progress: 43,
dir: "ltr",
},
{
name: "Español (Spanish)",
value: "es-ES",
progress: 45,
progress: 46,
dir: "ltr",
},
{
@@ -213,13 +213,13 @@ export const LOCALES = [
{
name: "Deutsch (German)",
value: "de-DE",
progress: 80,
progress: 96,
dir: "ltr",
},
{
name: "Dansk (Danish)",
value: "da-DK",
progress: 43,
progress: 46,
dir: "ltr",
},
{
@@ -231,13 +231,13 @@ export const LOCALES = [
{
name: "Català (Catalan)",
value: "ca-ES",
progress: 37,
progress: 38,
dir: "ltr",
},
{
name: "Български (Bulgarian)",
value: "bg-BG",
progress: 44,
progress: 47,
dir: "ltr",
},
{

View File

@@ -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,
};

View File

@@ -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);
}
});
}

View File

@@ -1,4 +1,5 @@
import { useLocalStorage, useSessionStorage } from "@vueuse/core";
import { ActivityKey } from "~/lib/api/types/activity";
import type { RegisteredParser, TimelineEventType } from "~/lib/api/types/recipe";
import type { QueryFilterJSON } from "~/lib/api/types/response";
@@ -7,6 +8,7 @@ export interface UserPrintPreferences {
showDescription: boolean;
showNotes: boolean;
showNutrition: boolean;
expandChildRecipes: boolean;
}
export interface UserSearchQuery {
@@ -65,6 +67,10 @@ export interface UserRecipeCreatePreferences {
parseRecipe: boolean;
}
export interface UserActivityPreferences {
defaultActivity: ActivityKey;
}
export function useUserMealPlanPreferences(): Ref<UserMealPlanPreferences> {
const fromStorage = useLocalStorage(
"meal-planner-preferences",
@@ -86,6 +92,7 @@ export function useUserPrintPreferences(): Ref<UserPrintPreferences> {
imagePosition: "left",
showDescription: true,
showNotes: true,
expandChildRecipes: false,
},
{ mergeDefaults: true },
// we cast to a Ref because by default it will return an optional type ref
@@ -115,6 +122,20 @@ export function useUserSortPreferences(): Ref<UserRecipePreferences> {
return fromStorage;
}
export function useUserActivityPreferences(): Ref<UserActivityPreferences> {
const fromStorage = useLocalStorage(
"activity-preferences",
{
defaultActivity: ActivityKey.RECIPES,
},
{ mergeDefaults: true },
// we cast to a Ref because by default it will return an optional type ref
// but since we pass defaults we know all properties are set.
) as Ref<UserActivityPreferences>;
return fromStorage;
}
export function useUserSearchQuerySession(): Ref<UserSearchQuery> {
const fromStorage = useSessionStorage(
"search-query",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie kan resepte van Tandoor invoer. Voer jou data uit in die \"Standaardformaat\" en laai dan die .zip-lêer op.",
"title": "Tandoor resepte"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Resep migrasie",
"recipe-data-migrations-explanation": "Jy kan resepte vanaf 'n ander program in Mealie invoer. Op hierdie manier kan jy vinnig aan die gang kom.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Pogings om 'n paragraaf te verdeel deur die '1)' of '1.' patrone om te gebruik",
"import-by-url": "Voer 'n resep vanaf 'n webwerf in",
"create-manually": "Skep 'n resep met die hand",
"make-recipe-image": "Maak dit die prentjie vir hierdie resep"
"make-recipe-image": "Maak dit die prentjie vir hierdie resep",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Bladsy nie gevind nie",
@@ -511,6 +517,9 @@
"recipe-deleted": "Resep uitgevee",
"recipe-image": "Resep foto",
"recipe-image-updated": "Resep foto is opgedateer",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Resepnaam",
"recipe-settings": "Resep verstellings",
"recipe-update-failed": "Kon nie resep opdateer nie",
@@ -583,6 +592,7 @@
"made-this": "Ek het dit gemaak",
"how-did-it-turn-out": "Hoe het dit uitgedraai?",
"user-made-this": "{user} het dit gemaak",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "vertaal",

View File

@@ -399,6 +399,10 @@
"description-long": "يمكن لميلي استيراد الوصفات من تندور. يجب تصدير بياناتك بالتنسيق \"الافتراضي\"، ثم يجب تحميل المِلَفّ المضغوط أدناه.",
"title": "وصفات تاندور"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "وصفة 2",
"recipe-data-migrations-explanation": "يمكن نقل الوصفات من تطبيق آخر مدعوم إلى ميلي. هذه طريقة رائعة للبدء مع ميلي.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "هل تأتي من تطبيق آخر أو حتى إصدار قديم من ميلي؟ يجب التحقق من عمليات الترحيل لمعرفة ما إذا كان يمكن استيراد بياناتك.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "استيراد وصفة عن طريق عنوان URL",
"create-manually": "إنشاء وصفة يدوياً",
"make-recipe-image": "اجعل هذه صورة الوصفة"
"make-recipe-image": "اجعل هذه صورة الوصفة",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404: لم يتم العثور على الصفحة",
@@ -511,6 +517,9 @@
"recipe-deleted": "تم حذف الوصفة",
"recipe-image": "صورة الوصفة",
"recipe-image-updated": "تم تحديث صورة الوصفة",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "اسم الوصفة",
"recipe-settings": "إعدادات الوصفة",
"recipe-update-failed": "فشل تحديث الوصفة",
@@ -583,6 +592,7 @@
"made-this": "لقد طبخت هذا",
"how-did-it-turn-out": "كيف كانت النتيجة؟",
"user-made-this": "{user} طبخ هذه",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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": "البحث عن الوصفات",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "لا تريد رؤية هذه الرسالة بعد الآن؟ تأكد من تغيير بريدك الإلكتروني في إعدادات المستخدم الخاصة بك!",
"forgot-password": "نسيت كلمة المرور",
"forgot-password-text": "الرجاء إدخال بريدك الإلكتروني وسنرسل لك رابطًا لإعادة تعيين كلمة المرور الخاصة بك.",
"changes-reflected-immediately": "التغييرات التي ستطرأ على هذا المستخدم ستنعكس على الفور."
"changes-reflected-immediately": "التغييرات التي ستطرأ على هذا المستخدم ستنعكس على الفور.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "مترجم",

View File

@@ -10,19 +10,19 @@
"default-group": "Група по подразбиране",
"default-household": "Домакинство по подразбиране",
"demo": "Демо",
"demo-status": "Статус на Демото",
"demo-status": "Статус на демо-версията",
"development": "Разработване",
"docs": "Документи",
"download-log": "Дневник на изтеглянията",
"download-recipe-json": "Последно обработен json файл",
"github": "GitHub",
"log-lines": "Редове от лога",
"not-demo": "Не е демо",
"not-demo": "Не е демо-версия",
"portfolio": "Портфолио",
"production": "Производствена среда",
"support": "Поддръжка",
"version": "Версия",
"unknown-version": "неизвестно",
"unknown-version": "неизвестен",
"sponsor": "Спонсори"
},
"asset": {
@@ -55,16 +55,16 @@
"database": "База данни",
"delete-event": "Изтриване на събитие",
"event-delete-confirmation": "Наистина ли искате да премахнете това събитие?",
"event-deleted": "Събитието изтрито",
"event-updated": "Събитие Обновено",
"event-deleted": "Събитието бе изтрито",
"event-updated": "Събитието бе обновено",
"new-notification-form-description": "Mealie използва библиотеката Apprise да генерира нотификации. Тя предлага много опции за услуги и нотификации. Прегледайте нейната Wiki страница за подробен гайд как да създадете URL за вашата услуга. Ако е налично, селектирайки типа на нотификацията може да са налични допълнителни функционалности.",
"new-version": "Налична е нова версия!",
"notification": "Известие",
"refresh": "Опресни",
"refresh": "Опресняване",
"scheduled": "Планирано",
"something-went-wrong": "Нещо се обърка!",
"subscribed-events": "Планирани събития",
"test-message-sent": "Тестово съобщение е изпратено",
"test-message-sent": "Тестовото съобщение бе изпратено",
"message-sent": "Съобщението е изпратено",
"new-notification": "Ново известие",
"event-notifiers": "Известия за събитие",
@@ -97,11 +97,11 @@
"custom": "Персонализиран",
"dashboard": "Табло",
"delete": "Изтриване",
"disabled": "Деактивирано",
"disabled": "Изключено",
"download": "Изтегли",
"duplicate": "Дублиране",
"edit": "Редактирай",
"enabled": "Активиран",
"enabled": "Включено",
"exception": "Грешка",
"failed-count": "Неуспешни: {count}",
"failure-uploading-file": "Неуспешно качване на файл",
@@ -129,7 +129,7 @@
"monday": "Понеделник",
"name": "Име",
"new": "Нов",
"never": икога",
"never": яма данни",
"no": "Не",
"no-recipe-found": "Няма намерени рецепти",
"ok": "Добре",
@@ -145,9 +145,9 @@
"rename-object": "Преименувай {0}",
"reset": "По подразбиране",
"saturday": "Събота",
"save": "Запази",
"save": "Запазване",
"settings": "Настройки",
"share": "Сподели",
"share": "Споделяне",
"show-all": "Покажи всички",
"shuffle": "Разбъркано",
"sort": "Сортирай",
@@ -165,7 +165,7 @@
"themes": "Теми",
"thursday": "четвъртък",
"title": "Заглавие",
"token": "Токън",
"token": "Токен",
"tuesday": "Вторник",
"type": "Тип",
"update": "Актуализация",
@@ -180,7 +180,7 @@
"back": "Назад",
"next": "Напред",
"start": "Начало",
"toggle-view": "Превключване на режим",
"toggle-view": "Смяна на изгледа",
"date": "Дата",
"id": "Id",
"owner": "Собственик",
@@ -340,7 +340,7 @@
"rule-day": "Ден от седмицата",
"meal-type": "Вид ястие",
"breakfast": "Закуска",
"lunch": "обяд",
"lunch": "Обяд",
"dinner": "Вечеря",
"type-any": "Всички",
"day-any": "Всички",
@@ -399,6 +399,10 @@
"description-long": "Mealie може да импортира рецепти от Tandoor. Експортирайте данните в стандартния формат и ги качете като .zip файл по-долу.",
"title": "Tandoor рецепти"
},
"cookn": {
"description-long": "Mealie може да импортира рецепти от DVO Cook'n X3. Експортирайте готварска книга или меню във формат \"Cook'n\", преименувайте разширението за експортиране на .zip и след това качете .zip файла по-долу.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Миграция на данни на рецепти",
"recipe-data-migrations-explanation": "Рецептите могат да бъдат мигрирани от други приложения поддържани от Mealie. Това е добър начин да започнете използването си на Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Идваш от друго приложение или дори по-стара версия на Mealie? Провери миграциите и виж дали данните ти могат да бъдат импорторани.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Опитва се да раздели параграф по '1)' or '1.' модел",
"import-by-url": "Импортиране на рецепта от линк",
"create-manually": "Създай рецепта ръчно",
"make-recipe-image": "Задай като изображението на рецептата"
"make-recipe-image": "Задай като изображението на рецептата",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Страницата не е намерена",
@@ -490,7 +496,7 @@
"insert-ingredient": "Въведете съставка",
"insert-section": "Въведете раздел",
"insert-above": "Вмъкни отгоре",
"insert-below": "Вмъкни по-долу",
"insert-below": "Вмъкни отдолу",
"instructions": "Инструкции",
"key-name-required": "Ключовото име е задължително",
"landscape-view-coming-soon": "Пейзажен изглед",
@@ -506,11 +512,14 @@
"prep-time": "Време за подготовка",
"protein-content": "Белтъци",
"public-recipe": "Публична рецепта",
"recipe-created": "Рецептата е създадена",
"recipe-created": "Нова рецепта",
"recipe-creation-failed": "Създаването на рецепта беше неуспешно",
"recipe-deleted": "Рецептата е изтрита",
"recipe-image": "Изображение на рецептата",
"recipe-image-updated": "Изображението на рецептата беше обновено",
"delete-image": "Delete 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": "Обновяването на рецептата беше неуспешно",
@@ -553,7 +562,7 @@
"yields-amount-with-text": "Порции {amount} {text}",
"yield-text": "Забележка",
"quantity": "Количество",
"choose-unit": "Избери единица",
"choose-unit": "Избери мерна единица",
"press-enter-to-create": "Натисните Enter за да създадете",
"choose-food": "Избери продукт",
"notes": "Бележки",
@@ -565,8 +574,8 @@
"linked-to-other-step": "Свързано към друга стъпка",
"auto": "Автоматично",
"cook-mode": "Начин на приготвяне",
"link-ingredients": "Свържи съставките",
"merge-above": "Обедини с по-горната",
"link-ingredients": "Свържи съставки",
"merge-above": "Обедини с по-горната стъпка",
"move-to-bottom": "Премести най-долу",
"move-to-top": "Премести най-горе",
"reset-scale": "Оригинален мащаб",
@@ -583,6 +592,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": "Неуспешно актуализиране на рецептата",
@@ -624,7 +634,7 @@
"scrape-recipe-you-can-import-from-raw-data-directly": "Можете да импортирате директно от сурови данни",
"import-original-keywords-as-tags": "Добави оригиналните ключови думи като етикети",
"stay-in-edit-mode": "Остани в режим на редакция",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Анализиране на съставките на рецептата след импортиране",
"import-from-zip": "Импортирай от Zip",
"import-from-zip-description": "Импортирай рецепта, която е била експортирана от друга инстанция на Mealie.",
"import-from-html-or-json": "Импортиране от HTML или JSON",
@@ -671,12 +681,12 @@
"this-unit-could-not-be-parsed-automatically": "Тази мерна единица не може да бъде анализирана автоматично",
"this-food-could-not-be-parsed-automatically": "Тази храна не може да бъде анализирана автоматично",
"no-food": "Не е зададен вид храна",
"review-parsed-ingredients": "Review parsed ingredients",
"confidence-score": "Confidence Score",
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
"delete-item": "Delete Item"
"review-parsed-ingredients": "Прегледайте анализираните съставки",
"confidence-score": "Индекс на доверие",
"ingredient-parser-description": "Съставките бяха успешно анализирани. Моля, прегледайте съставките, за които не сме сигурни.",
"ingredient-parser-final-review-description": "След като всички съставки бъдат прегледани, ще имате още една възможност да ги прегледате, преди да приложите промените към рецептата си.",
"add-text-as-alias-for-item": "Добавете „{text}“ като псевдоним за {item}",
"delete-item": "Изтриване"
},
"reset-servings-count": "Нулиране на броя на порциите",
"not-linked-ingredients": "Допълнителни съставки",
@@ -684,7 +694,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 +738,7 @@
},
"settings": {
"add-a-new-theme": "Добавяне на нова тема",
"admin-settings": "Административни настройки",
"admin-settings": "Системни настройки",
"backup": {
"backup-created": "Архивът е създаден успешно",
"backup-created-at-response-export_path": "Резервно копие е създадено в {path}",
@@ -737,7 +750,7 @@
"delete-backup": "Изтрий резервно копие",
"error-creating-backup-see-log-file": "Грешка при създаването на резервно копие. Виж лог файла",
"full-backup": "Пълно резервно копие",
"import-summary": "Обобщение на импортирането",
"import-summary": "Преглед на импортирането",
"partial-backup": "Частично резервно копие",
"unable-to-delete-backup": "Невъзможно е да се изтрие това резервно копие.",
"experimental-description": "Резервните копия са моменти копия на базата данни и директорията за данни на сайта. Това включва цялата информация и е невъзможно да изключите определени раздели от информация. Може да гледате на това като моменти копия на Mealie за специфично време. Те служат като агностичен начин за експортиране на базата данни и импортиране на данни или архивиране на сайта към външна локация.",
@@ -751,7 +764,7 @@
},
"backup-and-exports": "Резервни копия",
"change-password": "Смяна на парола",
"current": "Версия:",
"current": "Версия на приложението:",
"custom-pages": "Допълнителни страници",
"edit-page": "Редактиране на страница",
"events": "Събития",
@@ -864,7 +877,7 @@
"ldap-ready": "Използва LDAP",
"ldap-ready-error-text": "Не всички LDAP стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате LDAP удостоверяване.",
"ldap-ready-success-text": "Задължителните LDAP променливи са зададени.",
"build": "Компилинирана версия",
"build": "GitHub версия",
"recipe-scraper-version": "Версия на скрепер на рецепти",
"oidc-ready": "Готов за OIDC",
"oidc-ready-error-text": "Не всички OIDC стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате OIDC удостоверяване.",
@@ -932,7 +945,7 @@
},
"signup": {
"error-signing-up": "Грешка при регистирането",
"sign-up": "Регистриране",
"sign-up": "Регистрация",
"sign-up-link-created": "Линкът за регистриране е създаден",
"sign-up-link-creation-failed": "Линкът за регистриране не беше създаден",
"sign-up-links": "Линкове за регистриране",
@@ -1001,8 +1014,8 @@
"password-strength": "Сигурността на паролата е {strength}",
"please-enter-password": "Моля, въведете новата си парола.",
"register": "Регистриране",
"reset-password": "Нулиране на паролата",
"sign-in": "Влизане",
"reset-password": "Забравена парола",
"sign-in": "Вписване",
"total-mealplans": "Хранителни планове общо",
"total-users": "Общо потребители",
"upload-photo": "Качете снимка",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Искате ли да виждате това по-често? Уверете се, че сте конфигурирали настройките си за email известяване правилно!",
"forgot-password": "Забравена Парола",
"forgot-password-text": "Въведете Вашият имейл адрес и ние ще ви изпратим линк, с който да промените Вашата парола.",
"changes-reflected-immediately": "Промените по този потребител ще бъдат отразени моментално."
"changes-reflected-immediately": "Промените по този потребител ще бъдат отразени моментално.",
"default-activity": "Действие по подразбиране",
"default-activity-hint": "Изберете коя страница искате да отворите, след като влезете от това устройство"
},
"language-dialog": {
"translated": "преведено",
@@ -1251,8 +1266,8 @@
"maintenance": {
"storage-details": "Подробности за мястото за съхранение",
"page-title": "Поддръжка на сайта",
"summary-title": "Обобщение",
"button-label-get-summary": "Вземи обобщение",
"summary-title": "Преглед на ресурсите",
"button-label-get-summary": "Опресняване",
"button-label-open-details": "Подробности",
"info-description-data-dir-size": "Размер на директорията с данни",
"info-description-log-file-size": "Размер на лог файла",
@@ -1319,9 +1334,9 @@
"welcome-user": "👋 Добре дошъл(а), {0}!",
"description": "Настройки на профил, рецепти и настройки на групата.",
"invite-link": "Линк за Покана",
"get-invite-link": "Вземи линк за покана",
"get-public-link": "Вземи публичен линк",
"account-summary": "Обобщение на акаунта",
"get-invite-link": "Създай линк за покана",
"get-public-link": "Създай публичен линк",
"account-summary": "Преглед на потребителския профил",
"account-summary-description": "Обобщение на информацията за Вашата група.",
"group-statistics": "Статистики на групата",
"group-statistics-description": "Вашата статистика на групата дава известна представа как използвате Mealie.",
@@ -1344,7 +1359,7 @@
"members": "Участници",
"members-description": "Вижте кой е във вашето домакинство и управлявайте техните разрешения.",
"webhooks-description": "Настройте webhooks, които се задействат в дните, в които имате планиран план за хранене.",
"notifiers": "Уведомители",
"notifiers": "Уведомления",
"notifiers-description": "Настройте имейл и push известия, които се задействат при конкретни събития.",
"manage-data": "Управление на данни",
"manage-data-description": "Управлявай данните в Mealie: Храни, Единици, Категории, Тагове и други.",
@@ -1362,7 +1377,7 @@
"manage-cookbooks": "Управление на готварските книги",
"manage-members": "Управление на потребителите",
"manage-webhooks": "Управление на Webhooks",
"manage-notifiers": "Управление на уведомители",
"manage-notifiers": "Настройки на уведомленията",
"manage-data-migrations": "Управление на миграцията на данни"
},
"cookbook": {

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie pot importar les receptes de Tandoor. Exporta les dades en format \"Default\", i carrega el .zip a sota.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migració de receptes",
"recipe-data-migrations-explanation": "Les receptes es poden migrar des d'una altra aplicació suportada cap a Mealie. És una manera genial de començar a utilitzar el Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Véns d'una altra aplicació o una versió més antiga de Mealia? Fés un cop d'ull a migracions i mira si pots importar les teves dades.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Intenta separar per paràgrafs, utilitzant com a patró '1)' o '1.'",
"import-by-url": "Importa per URL",
"create-manually": "Crea una recepta manualment",
"make-recipe-image": "Fes-la la imatge de la recepta"
"make-recipe-image": "Fes-la la imatge de la recepta",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 - Pàgina no trobada",
@@ -511,6 +517,9 @@
"recipe-deleted": "S'ha suprimit la recepta",
"recipe-image": "Imatge de la recepta",
"recipe-image-updated": "S'ha actualitzat la imatge de la recepta",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Nom de la recepta",
"recipe-settings": "Opcions de la recepta",
"recipe-update-failed": "S'ha produït un error a l'actualitzar la recepta",
@@ -583,6 +592,7 @@
"made-this": "Ho he fet",
"how-did-it-turn-out": "Com ha sortit?",
"user-made-this": "{user} ha fet això",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "No vols tornar a veure això? Assegura't de canviar el teu correu electrònic a les configuracions del teu usuari!",
"forgot-password": "Contrasenya oblidada",
"forgot-password-text": "Introdueix siusplau la teva adreça de correu electrònic i t'enviarem un enllaç per restablir la teva contrassenya.",
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament."
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "traduït",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie může importovat recepty z Tandoor. Exportujte data ve výchozím formátu, poté nahrajte soubor ve formátu .zip.",
"title": "Recepty Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrace dat receptů",
"recipe-data-migrations-explanation": "Recepty mohou být migrovány z jiné podporované aplikace na Mealie. To je skvělý způsob, jak začít s Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Migrujete z jiné aplikace nebo starší verze Mealie? Podívejte se na migrace a zjistěte, zda lze vaše data importovat.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Pokusí se rozdělit odstavec na místech odpovídajících vzorům '1)' a '1.'",
"import-by-url": "Importovat recept podle URL",
"create-manually": "Vytvořit recept ručně",
"make-recipe-image": "Nastavit jako obrázek receptu"
"make-recipe-image": "Nastavit jako obrázek receptu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Stránka nebyla nalezena",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept smazán",
"recipe-image": "Obrázek receptu",
"recipe-image-updated": "Obrázek receptu aktualizován",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Název receptu",
"recipe-settings": "Nastavení receptu",
"recipe-update-failed": "Aktualizace receptu se nezdařila",
@@ -583,6 +592,7 @@
"made-this": "Toto jsem uvařil",
"how-did-it-turn-out": "Jak to dopadlo?",
"user-made-this": "{user} udělal toto",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Přidáno na časovou osu",
"failed-to-add-to-timeline": "Přidání na časovou osu selhalo",
"failed-to-update-recipe": "Aktualizace receptu selhala",
@@ -684,7 +694,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ů",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Už to nechcete vidět? Nezapomeňte si změnit svůj e-mail v uživatelském nastavení!",
"forgot-password": "Zapomenuté heslo",
"forgot-password-text": "Zadejte prosím svou e-mailovou adresu a my vám zašleme odkaz pro obnovení hesla.",
"changes-reflected-immediately": "Změny tohoto uživatele budou okamžitě zohledněny."
"changes-reflected-immediately": "Změny tohoto uživatele budou okamžitě zohledněny.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "přeloženo",

View File

@@ -8,7 +8,7 @@
"database-type": "Database-type",
"database-url": "Database-url",
"default-group": "Standardgruppe",
"default-household": "Standard Husholdning",
"default-household": "Standard Husstand",
"demo": "Demo",
"demo-status": "Demo status",
"development": "Udvikling",
@@ -57,7 +57,7 @@
"event-delete-confirmation": "Er du sikker på, at du vil slette denne begivenhed?",
"event-deleted": "Hændelse slettet",
"event-updated": "Hændelse opdateret",
"new-notification-form-description": "Mealie bruger Apprise-biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
"new-notification-form-description": "Mealie bruger Apprise biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
"new-version": "Ny opdatering er tilgængelig!",
"notification": "Notifikation",
"refresh": "Opdater",
@@ -248,7 +248,7 @@
"manage-members": "Administrer medlemmer",
"manage-members-description": "Administrer tilladelser for medlemmerne i din husstand. {manage} giver brugeren adgang til datastyringssiden, og {invite} giver brugeren mulighed for at generere invitationslinks til andre brugere. Gruppeejere kan ikke ændre deres egne tilladelser.",
"manage": "Administrer",
"manage-household": "Administrer husholdning",
"manage-household": "Administrer Husstand",
"invite": "Invitér",
"looking-to-update-your-profile": "Ønsker du at opdatere din profil?",
"default-recipe-preferences-description": "Dette er standardindstillingerne, når en ny opskrift oprettes i din gruppe. Indstillingerne kan ændres for en opskrift i menuen Opskriftindstillinger.",
@@ -278,30 +278,30 @@
"admin-group-management": "Administratorgruppeadministration",
"admin-group-management-text": "Ændringer i denne gruppe vil træde i kraft øjeblikkeligt.",
"group-id-value": "Gruppe-ID: {0}",
"total-households": "Husholdninger i Alt",
"total-households": "Husstande i Alt",
"you-must-select-a-group-before-selecting-a-household": "Du skal vælge en gruppe, før du vælger en husstand"
},
"household": {
"household": "Husholdning",
"households": "Husholdninger",
"user-household": "Husholdning",
"create-household": "Opret husholdning",
"household-name": "Husholdningens navn",
"household-group": "Husholdnings Gruppe",
"household-management": "Husholdningsadministration",
"manage-households": "Administrer husholdninger",
"admin-household-management": "Husholdningsadministration",
"household": "Husstand",
"households": "Husstande",
"user-household": "Bruger Husstand",
"create-household": "Opret Husstand",
"household-name": "Husstandens Navn",
"household-group": "Husstandens Gruppe",
"household-management": "Husstands Administration",
"manage-households": "Administrer Husstande",
"admin-household-management": "Admin Husstands Administration",
"admin-household-management-text": "Ændringer ved denne husholdning vil træde i kraft øjeblikkeligt.",
"household-id-value": "Id: {0}",
"private-household": "Privat husholdning",
"private-household-description": "Sættes din husholdning til private vil det deaktivere alle indstillinger for offentlig visning. Dette tilsidesætter individuelle indstillinger for offentlig visning",
"lock-recipe-edits-from-other-households": "Lås ændringer fra andre husholdninger",
"lock-recipe-edits-from-other-households-description": "Når aktiveret kan kun husholdningens brugere ændre dens opskrifter",
"household-recipe-preferences": "Husholdningens opskriftspræferencer",
"default-recipe-preferences-description": "Disse er standardindstillingerne, når en ny opskrift er oprettet i din husstand. Disse kan ændres for individuelle opskrifter i menuen Opsætninger.",
"household-id-value": "Husstand Id: {0}",
"private-household": "Privat Husstand",
"private-household-description": "Sættes din Husstand til privat, vil det deaktivere alle indstillinger for offentlig visning. Dette overskriver individuelle indstillinger for offentlig visning",
"lock-recipe-edits-from-other-households": "Lås opskriftredigeringer fra andre husstande",
"lock-recipe-edits-from-other-households-description": "Når denne funktion er aktiveret, kan kun brugere i din husstand redigere opskrifter, der er oprettet af din husstand.",
"household-recipe-preferences": "Husstandens opskriftspræferencer",
"default-recipe-preferences-description": "Dette er standardindstillingerne, når der oprettes en ny opskrift i din husstand. Disse kan ændres for individuelle opskrifter i menuen med opskriftindstillinger.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Tillad brugere udenfor din husholdning at se dine opskrifter",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Når det er aktiveret kan du bruge et link til offentlig deling af specifikke opskrifter uden at godkende brugeren. Når deaktiveret, kan du kun dele opskrifter med brugere, der er i din husstand eller med et forudgenereret privat link",
"household-preferences": "Præferencer"
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Når denne funktion er aktiveret, kan du bruge et offentligt delingslink til at dele bestemte opskrifter uden at godkende brugeren. Når funktionen er deaktiveret, kan du kun dele opskrifter med brugere, der bor i din husstand, eller med et forudgenereret privat link.",
"household-preferences": "Husstands præferencer"
},
"meal-plan": {
"create-a-new-meal-plan": "Opret madplan",
@@ -326,7 +326,7 @@
"mealplan-households-description": "Hvis ingen husstand er valgt, kan opskrifter tilføjes fra enhver husstand",
"any-category": "Alle kategorier",
"any-tag": "Alle tags",
"any-household": "Alle husholdninger",
"any-household": "Alle husstande",
"no-meal-plan-defined-yet": "Ingen madplaner er oprettet endnu",
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
"numberOfDays-hint": "Antal dage ved sideindlæsning",
@@ -399,6 +399,10 @@
"description-long": "Mealie kan importere opskrifter fra Tandoor. Eksporter dine data i \"Standard\" format, og upload derefter Zip filen nedenfor.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie kan importere opskrifter fra DVO Cook'n X3. Eksportér en kogebog eller menu i \"Cook'n\" formatet, omdøb filtypen .dvo til .zip, og upload derefter .zip nedenfor.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrering af opskrifter",
"recipe-data-migrations-explanation": "Opskrifter kan migreres fra et andet understøttet program til Mealie. Dette er en fantastisk måde at komme i gang med Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer fra en anden applikation eller en endnu ældre version af Mealie? Tjek migrationer og se om dine data kan importeres.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Forsøger at opdele et afsnit ved at matche '1)' eller '1.' mønstre",
"import-by-url": "Importér opskrift fra en webside",
"create-manually": "Opret opskrift manuelt",
"make-recipe-image": "Gør dette til opskriftsbillede"
"make-recipe-image": "Gør dette til opskriftsbillede",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Siden blev ikke fundet",
@@ -511,6 +517,9 @@
"recipe-deleted": "Opskrift slettet",
"recipe-image": "Opskriftsbillede",
"recipe-image-updated": "Opskriftsbillede ændret",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Opskriftens navn",
"recipe-settings": "Opskriftsindstillinger",
"recipe-update-failed": "Opdatering af opskrift fejlede",
@@ -583,6 +592,7 @@
"made-this": "Jeg har lavet denne",
"how-did-it-turn-out": "Hvordan blev det?",
"user-made-this": "{user} lavede denne",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Tilføjet til tidslinjen",
"failed-to-add-to-timeline": "Kunne ikke tilføje til tidslinjen",
"failed-to-update-recipe": "Kunne ikke opdatere opskrift",
@@ -624,7 +634,7 @@
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere direkte fra rå data",
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
"stay-in-edit-mode": "Bliv i redigeringstilstand",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Fortolk opskrift ingredienser efter import",
"import-from-zip": "Importer fra zip-fil",
"import-from-zip-description": "Importer en enkelt opskrift, der blev eksporteret fra en anden Mealie instans.",
"import-from-html-or-json": "Importer fra HTML eller JSON",
@@ -671,12 +681,12 @@
"this-unit-could-not-be-parsed-automatically": "Denne enhed kunne ikke fortolkes automatisk",
"this-food-could-not-be-parsed-automatically": "Denne fødevare kunne ikke fortolkes automatisk",
"no-food": "Ingen fødevarer",
"review-parsed-ingredients": "Review parsed ingredients",
"confidence-score": "Confidence Score",
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
"delete-item": "Delete Item"
"review-parsed-ingredients": "Gennemgå fortolkede ingredienser",
"confidence-score": "Tillidsscore",
"ingredient-parser-description": "Dine ingredienser er blevet fortolket. Gennemgå de ingredienser, vi ikke er sikker på.",
"ingredient-parser-final-review-description": "Når alle ingredienser er blevet gennemgået, har du endnu en chance for at gennemgå alle ingredienser, før du anvender ændringerne til din opskrift.",
"add-text-as-alias-for-item": "Tilføj \"{text}\" som alias for {item}",
"delete-item": "Slet Element"
},
"reset-servings-count": "Nulstil antal serveringer",
"not-linked-ingredients": "Yderligere ingredienser",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Opskriftssøger",
@@ -1052,14 +1065,16 @@
"administrator": "Administrator",
"user-can-invite-other-to-group": "Bruger kan invitere andre til gruppen",
"user-can-manage-group": "Bruger kan administrere gruppen",
"user-can-manage-household": "Bruger kan administrere husholdningen",
"user-can-manage-household": "Brugeren kan administrere husstande",
"user-can-organize-group-data": "Bruger kan organisere gruppedata",
"enable-advanced-features": "Aktiver avancerede funktioner",
"it-looks-like-this-is-your-first-time-logging-in": "Det ser ud til, at det er første gang, at du logger ind.",
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vil du ikke længere se dette? Sørg for at ændre din e-mail i dine brugerindstillinger!",
"forgot-password": "Glemt adgangskode",
"forgot-password-text": "Indtast venligst din e-mail-adresse. Vi sender dig en e-mail, så at du kan nulstille din adgangskode.",
"changes-reflected-immediately": "Ændringer til denne bruger vil have effekt med det samme."
"changes-reflected-immediately": "Ændringer til denne bruger vil have effekt med det samme.",
"default-activity": "",
"default-activity-hint": "Vælg den side, du vil navigere til, når du logger ind fra denne enhed"
},
"language-dialog": {
"translated": "oversat",
@@ -1176,7 +1191,7 @@
"provide-registration-token-description": "Angiv venligst det registreringstoken, der er knyttet til den gruppe, du gerne vil deltage i. Du skal indhente dette fra et eksisterende gruppemedlem.",
"group-details": "Gruppeoplysninger",
"group-details-description": "Før du opretter en konto, skal du oprette en gruppe. Din gruppe vil kun indeholde dig, men du vil kunne invitere andre senere. Medlemmer i din gruppe kan dele madplaner, indkøbslister, opskrifter og meget mere!",
"use-seed-data": "Anved standard data",
"use-seed-data": "Anvend standard data",
"use-seed-data-description": "Mealie kommer med en samling af Fødevarer, Enheder, og Etiketter som kan blive brugt til at udfylde din gruppe med nyttig data til at organisere dine opskrifter. De er oversat til det sprog, du i øjeblikket har valgt. Du kan altid tilføje og ændre disse data senere.",
"account-details": "Kontodetaljer"
},
@@ -1312,8 +1327,8 @@
"debug-openai-services-description": "Brug denne side til at fejlsøge OpenAI-tjenester. Du kan teste din OpenAI-forbindelse og se resultaterne her. Hvis du har billedetjenester aktiveret, kan du også prøve med et billede.",
"run-test": "Kør test",
"test-results": "Testresultater",
"group-delete-note": "Grupper med brugere eller husholdninger kan ikke slettes",
"household-delete-note": "Husholdninger med brugere kan ikke slettes"
"group-delete-note": "Grupper med brugere eller husstande kan ikke slettes",
"household-delete-note": "Husstande med brugere kan ikke slettes"
},
"profile": {
"welcome-user": "👋 Velkommen, {0}!",
@@ -1325,8 +1340,8 @@
"account-summary-description": "Her er en oversigt over din gruppes oplysninger.",
"group-statistics": "Gruppestatistik",
"group-statistics-description": "Din gruppestatistik giver indsigt i, hvordan du bruger Mealie.",
"household-statistics": "Husholdnings Statistikker",
"household-statistics-description": "Dine husstandsstatistikker giver lidt indsigt i, hvordan du bruger Mealie.",
"household-statistics": "Husstands Statistikker",
"household-statistics-description": "Din husstandsstatistik giver et indblik i, hvordan du bruger Mealie.",
"storage-capacity": "Lagerkapacitet",
"storage-capacity-description": "Din lagerkapacitet er en beregning af de billeder og elementer, du har uploadet.",
"personal": "Personlig",
@@ -1337,9 +1352,9 @@
"group-description": "Disse elementer deles i din gruppe. Redigering af et af dem vil ændre det for hele gruppen!",
"group-settings": "Gruppeindstillinger",
"group-settings-description": "Administrer dine fælles gruppeindstillinger, såsom privatlivsindstillinger.",
"household-description": "Disse elementer deles i din husstand. Redigering af en af dem vil ændre det for hele husstanden!",
"household-settings": "Husholdningsindstillinger",
"household-settings-description": "Administrer dine husholdningsindstillinger, såsom madplan og privatlivsindstillinger.",
"household-description": "Disse elementer deles inden for din husstand. Hvis du redigerer et af dem, ændres det for hele husstanden!",
"household-settings": "Husstands indstillinger",
"household-settings-description": "Administrer din husstands indstillinger, såsom madplan og privatlivsindstillinger.",
"cookbooks-description": "Administrer en samling af kategorier og opret sider til dem.",
"members": "Medlemmer",
"members-description": "Se, hvem der er i din husstand og administrer deres tilladelser.",
@@ -1368,7 +1383,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.",

View File

@@ -47,7 +47,7 @@
"category-updated": "Kategorie aktualisiert",
"uncategorized-count": "Nicht kategorisiert {count}",
"create-a-category": "Eine Kategorie erstellen",
"category-name": "Name der Kategorie",
"category-name": "Kategoriename",
"category": "Kategorie"
},
"events": {
@@ -399,6 +399,10 @@
"description-long": "Mealie kann Rezepte von Tandoor importieren. Exportiere deine Daten im 'Default' Format und lade dann unten die .zip Datei hoch.",
"title": "Tandoor Rezepte"
},
"cookn": {
"description-long": "Mealie kann Rezepte von DVO Cook'n X3 importieren. Exportieren Sie ein Kochbuch oder ein Menü im \"Cook'n\"-Format, benennen Sie die Export-Erweiterung in .zip um, dann laden Sie die .zip unten hoch.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Rezeptdatenmigration",
"recipe-data-migrations-explanation": "Rezepte können aus unterstützten Programmen nach Mealie migriert werden. Das ist eine gute Möglichkeit, um mit Mealie loszulegen.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Wechselst du von einer anderen Anwendung oder einer noch älteren Version von Mealie? Prüfe die Migrations-Optionen, vielleicht können deine Daten importiert werden.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Absätze nach dem Schema '1)' oder '1.' aufzuteilen versuchen",
"import-by-url": "Ein Rezept von einer Webseite importieren",
"create-manually": "Ein Rezept manuell erstellen",
"make-recipe-image": "Als Rezept-Titelbild verwenden"
"make-recipe-image": "Als Rezept-Titelbild verwenden",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Seite nicht gefunden",
@@ -511,6 +517,9 @@
"recipe-deleted": "Rezept entfernt",
"recipe-image": "Rezeptbild",
"recipe-image-updated": "Rezeptbild aktualisiert",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Rezeptname",
"recipe-settings": "Rezepteinstellungen",
"recipe-update-failed": "Aktualisieren des Rezepts fehlgeschlagen",
@@ -583,6 +592,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": "Made for {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",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Rezept-Suche",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Möchtest du das hier nicht mehr sehen? Bitte ändere deine E-Mail in den Benutzereinstellungen!",
"forgot-password": "Passwort vergessen",
"forgot-password-text": "Bitte gib Deine E-Mail-Adresse ein. Wir werden Dir eine E-Mail zusenden, damit Du Dein Passwort zurücksetzen kannst.",
"changes-reflected-immediately": "Änderungen an diesem Benutzer sind sofort wirksam."
"changes-reflected-immediately": "Änderungen an diesem Benutzer sind sofort wirksam.",
"default-activity": "Standardaktivität",
"default-activity-hint": "Wählen Sie die Seite, auf die Sie navigieren möchten, wenn Sie sich von diesem Gerät aus anmelden"
},
"language-dialog": {
"translated": "übersetzt",

View File

@@ -1,6 +1,6 @@
{
"about": {
"about": "Σχετικά με",
"about": "Σχετικά",
"about-mealie": "Σχετικά με το Mealie",
"api-docs": "Τεκμηρίωση API",
"api-port": "Θύρα API",
@@ -14,7 +14,7 @@
"development": "Ανάπτυξη",
"docs": "Τεκμηρίωση",
"download-log": "Λήψη αρχείου καταγραφής",
"download-recipe-json": "Τελευταίο Scraped JSON",
"download-recipe-json": "Τελευταίο αντλημένο JSON",
"github": "GitHub",
"log-lines": "Γραμμές καταγραφής",
"not-demo": "Εκτός Επίδειξης",
@@ -27,7 +27,7 @@
},
"asset": {
"assets": "Στοιχεία",
"code": "Κώδικας",
"code": "Κωδικός",
"file": "Αρχείο",
"image": "Εικόνα",
"new-asset": "Νέο Στοιχείο",
@@ -38,15 +38,15 @@
},
"category": {
"categories": "Κατηγορίες",
"category-created": "Δημιουργήθηκε η κατηγορία",
"category-created": "Η κατηγορία δημιουργήθηκε",
"category-creation-failed": "Η δημιουργία κατηγορίας απέτυχε",
"category-deleted": "Κατηγορία Διαγράφηκε",
"category-deleted": "Η κατηγορία διαγράφηκε",
"category-deletion-failed": "Η διαγραφή κατηγορίας απέτυχε",
"category-filter": "Φίλτρο κατηγορίας",
"category-update-failed": "Η ενημέρωση της κατηγορίας απέτυχε",
"category-updated": "Η κατηγορία ενημερώθηκε",
"uncategorized-count": "Μη κατηγοριοποιημένο {count}",
"create-a-category": "Δημιουργήστε μια Κατηγορία",
"create-a-category": "Δημιουργία Κατηγορίας",
"category-name": "Όνομα Κατηγορίας",
"category": "Κατηγορία"
},
@@ -399,6 +399,10 @@
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το Tandoor. Εξαγάγετε τα δεδομένα σας στην \"Προεπιλεγμένη\" (default) μορφή, στη συνέχεια, ανεβάστε το .zip παρακάτω.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το DVO Cook'n X3. Κάντε εξαγωγή ενός βιβλίου μαγειρικής ή ενός μενού σε μορφή \"Cook'n\", αλλάξτε την επέκταση του εξαγόμενου αρχείου σε .zip και, στη συνέχεια, ανεβάστε το .zip παρακάτω.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Μετεγκατάσταση Δεδομένων Συνταγής",
"recipe-data-migrations-explanation": "Συνταγές μπορούν να μετεγκατασταθούν από άλλη υποστηριζόμενη εφαρμογή στο Mealie. Αυτός είναι ένας πολύ καλός τρόπος για να ξεκινήσετε με Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Ερχόμενοι από άλλη εφαρμογή ή ακόμα και παλαιότερη έκδοση του Mealie; Ελέγξτε τις μετεγκαταστάσεις και δείτε αν τα δεδομένα σας μπορούν να εισαχθούν.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Προσπάθεια για χωρισμό μιας παραγράφου ταιριάζοντας μοτίβα '1)' ή '1.'",
"import-by-url": "Εισαγωγή μιας συνταγής από URL",
"create-manually": "Δημιουργήστε μια συνταγή χειροκίνητα",
"make-recipe-image": "Ορισμός ως εικόνας συνταγής"
"make-recipe-image": "Ορισμός ως εικόνας συνταγής",
"add-food": "Προσθήκη τρόφιμου",
"add-recipe": "Προσθήκη συνταγής"
},
"page": {
"404-page-not-found": "404. η σελίδα δεν βρέθηκε",
@@ -511,6 +517,9 @@
"recipe-deleted": "Η συνταγή διαγράφηκε",
"recipe-image": "Εικόνα Συνταγής",
"recipe-image-updated": "Η εικόνα συνταγής ενημερώθηκε",
"delete-image": "Διαγραφή Εικόνας Συνταγής",
"delete-image-confirmation": "Θέλετε σίγουρα να διαγράψετε αυτή την εικόνα συνταγής;",
"recipe-image-deleted": "Η εικόνα συνταγής διαγράφηκε",
"recipe-name": "Όνομα συνταγής",
"recipe-settings": "Ρυθμίσεις Συνταγής",
"recipe-update-failed": "Η ενημέρωση συνταγής απέτυχε",
@@ -583,6 +592,7 @@
"made-this": "Το έφτιαξα",
"how-did-it-turn-out": "Ποιό ήταν το αποτέλεσμα;",
"user-made-this": "Ο/η {user} έφτιαξε αυτό",
"made-for-recipe": "Φτιαγμένο για {recipe}",
"added-to-timeline": "Προστέθηκε στο χρονολόγιο",
"failed-to-add-to-timeline": "Αποτυχία προσθήκης στο χρονολόγιο",
"failed-to-update-recipe": "Αποτυχία ενημέρωσης συνταγής",
@@ -684,7 +694,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": "Εύρεση συνταγών",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Δεν θέλετε να το δείτε αυτό ξανά; Φροντίστε να αλλάξετε το email σας στις ρυθμίσεις χρήστη!",
"forgot-password": "Ξέχασα τον κωδικό πρόσβασης",
"forgot-password-text": "Παρακαλώ εισάγετε τη διεύθυνση email σας και θα σας στείλουμε έναν σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας.",
"changes-reflected-immediately": "Οι αλλαγές σε αυτόν τον χρήστη θα αντικατοπτρίζονται αμέσως."
"changes-reflected-immediately": "Οι αλλαγές σε αυτόν τον χρήστη θα αντικατοπτρίζονται αμέσως.",
"default-activity": "Προεπιλεγμένη Δραστηριότητα",
"default-activity-hint": "Επιλέξτε σε ποια σελίδα θα θέλατε να μεταβείτε κατά τη σύνδεση από αυτήν τη συσκευή"
},
"language-dialog": {
"translated": "μεταφρασμένο",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "Import a recipe by URL",
"create-manually": "Create a recipe manually",
"make-recipe-image": "Make this the recipe image"
"make-recipe-image": "Make this the recipe image",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page not found",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
@@ -583,6 +592,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this any more? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "Import a recipe by URL",
"create-manually": "Create a recipe manually",
"make-recipe-image": "Make this the recipe image"
"make-recipe-image": "Make this the recipe image",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page not found",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
@@ -556,6 +565,7 @@
"choose-unit": "Choose Unit",
"press-enter-to-create": "Press Enter to Create",
"choose-food": "Choose Food",
"choose-recipe": "Choose Recipe",
"notes": "Notes",
"toggle-section": "Toggle Section",
"see-original-text": "See Original Text",
@@ -583,6 +593,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +695,10 @@
"upload-images": "Upload images",
"upload-more-images": "Upload more images",
"set-as-cover-image": "Set as recipe cover image",
"cover-image": "Cover image"
"cover-image": "Cover image",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Recipe Finder",
@@ -721,7 +735,8 @@
"search-hint": "Press '/'",
"advanced": "Advanced",
"auto-search": "Auto Search",
"no-results": "No results found"
"no-results": "No results found",
"type-to-search": "Type to search..."
},
"settings": {
"add-a-new-theme": "Add a New Theme",
@@ -1059,7 +1074,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie puede importar recetas de Tandoor. Exporta tus datos en el formato \"Por defecto\" y luego sube el archivo .zip.",
"title": "Recetas de Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migración de recetas",
"recipe-data-migrations-explanation": "Las recetas pueden migrarse desde otra aplicación soportada a Mealie. Esta es una excelente manera de empezar con Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "¿Vienes de otra app o una versión previa de Mealie? Revisa migraciones para ver si tus datos pueden ser importados.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Intenta dividir un párrafo utilizando los patrones '1)' o '1.'",
"import-by-url": "Importar una receta desde URL",
"create-manually": "Crear receta manualmente",
"make-recipe-image": "Haz de esta la imagen de la receta"
"make-recipe-image": "Haz de esta la imagen de la receta",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Página no encontrada",
@@ -511,6 +517,9 @@
"recipe-deleted": "Receta eliminada",
"recipe-image": "Imagen de la receta",
"recipe-image-updated": "Imagen de la receta actualizada",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"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",
@@ -583,6 +592,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",
@@ -684,7 +694,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": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Buscador de recetas",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "¿No quieres ver esto más? ¡Asegúrate de cambiar tu correo electrónico en tu configuración de usuario!",
"forgot-password": "Olvidé mi contraseña",
"forgot-password-text": "Por favor, introduce tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.",
"changes-reflected-immediately": "Los cambios en este grupo se reflejarán inmediatamente."
"changes-reflected-immediately": "Los cambios en este grupo se reflejarán inmediatamente.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "traducido",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie saab importida retsepte Tandoor-ist. Ekspordi oma andmed \"Default\" formaadis ning lae .zip allolevasse kasti",
"title": "Tandoor-i retsptid"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Retsepti andmete ületoomised",
"recipe-data-migrations-explanation": "Retsepte saab üle tuua teisest toetatud rakendusest Mealiesse. See on hea viis tegemaks algust Mealie-ga.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Tuled teisest rakendusest või hoopis vanemast Mealie versioonist? Uuri ületoomise võimalusi ning vaata kas su andmeid saab importida.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Proovib paragrahvi poolitada sobitades \"1)\" või \"1\". mustrid",
"import-by-url": "Impordi retsept URL-lt",
"create-manually": "Loo retsept manuaalselt",
"make-recipe-image": "Sea see retsepti pildiks"
"make-recipe-image": "Sea see retsepti pildiks",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Lehte ei leitud",
@@ -511,6 +517,9 @@
"recipe-deleted": "Retsept kustutatud",
"recipe-image": "Retsepti pilt",
"recipe-image-updated": "Retsepti pilt uuendatud",
"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": "Retsepti nimi",
"recipe-settings": "Retsepti seaded",
"recipe-update-failed": "Retsepti uuendamine ebaõnnestus",
@@ -583,6 +592,7 @@
"made-this": "Olen seda valmistanud",
"how-did-it-turn-out": "Kuidas tuli see välja?",
"user-made-this": "{user} on seda valmistanud",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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": "Retsepti otsing",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Ei taha enam seda näha? Ära unusta muuta oma email kasutaja seadetes",
"forgot-password": "Unustasid salasõna",
"forgot-password-text": "Sisestage oma meiliaadress, et saada e-kiri uue salasõna määramiseks.",
"changes-reflected-immediately": "Selle kasutaja muudatused on koheselt nähtaval"
"changes-reflected-immediately": "Selle kasutaja muudatused on koheselt nähtaval",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "tõlgitud",

View File

@@ -2,7 +2,7 @@
"about": {
"about": "Tietoja",
"about-mealie": "Tietoja Mealiestä",
"api-docs": "API Docs",
"api-docs": "API-dokumentit",
"api-port": "API-portti",
"application-mode": "Sovellustila",
"database-type": "Tietokannan tyyppi",
@@ -12,12 +12,12 @@
"demo": "Demo",
"demo-status": "Demon tila",
"development": "Kehitys",
"docs": "Docs",
"docs": "Dokumentit",
"download-log": "Latausloki",
"download-recipe-json": "Viimeisin haettu JSON",
"github": "GitHub",
"log-lines": "Lokirivit",
"not-demo": "Ei esittelytilassa",
"not-demo": "Ei demotilassa",
"portfolio": "Portfolio",
"production": "Tuotanto",
"support": "Tuki",
@@ -57,7 +57,7 @@
"event-delete-confirmation": "Oletko varma että haluat poistaa tämän tapahtuman?",
"event-deleted": "Tapahtuma poistettu",
"event-updated": "Tapahtuma päivitetty",
"new-notification-form-description": "Mealie käyttää Apprise-kirjastoa ilmoitusten luomiseen. Se tarjoaa monia ilmoituspalvelveluvaihtoehtoja. Lisää tietoa siitä, kuinka luoda URL palvelua varten, Apprisen wikistä. Joihinkin ilmoitustyyppeihin voi sisältyä lisäominaisuuksia.",
"new-notification-form-description": "Mealie käyttää Apprise-kirjastoa ilmoitusten luomiseen. Se tarjoaa monia ilmoituspalvelveluvaihtoehtoja. Lisää tietoa siitä, kuinka luoda URL palvelua varten, löydät Apprisen wikistä. Joihinkin ilmoitustyyppeihin voi sisältyä lisäominaisuuksia.",
"new-version": "Uusi versio saatavilla!",
"notification": "Ilmoitus",
"refresh": "Päivitä",
@@ -69,11 +69,11 @@
"new-notification": "Uusi ilmoitus",
"event-notifiers": "Tapahtumien ilmoitukset",
"apprise-url-skipped-if-blank": "Ilmoitusverkko-osoite (voi jättää tyhjäksi)",
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
"apprise-url-is-left-intentionally-blank": "Apprise URL-osoitteet sisältävät yleensä arkaluonteisia tietoja, joten tämä kenttä on tarkoituksellisesti tyhjä muokattaessa. Jos haluat päivittää URL-osoitteen, kirjoita uusi osoite tähän, muuten jätä se tyhjäksi pitääksesi nykyisen URL-osoitteen.",
"enable-notifier": "Ota ilmoittaja käyttöön",
"what-events": "Mistä tapahtumista tulisi ilmoittaa?",
"user-events": "Käyttäjän tapahtumat",
"mealplan-events": "Ateriasuunnitelman Tapahtumat",
"mealplan-events": "Ateriasuunnittelun tapahtumat",
"when-a-user-in-your-group-creates-a-new-mealplan": "Kun ryhmäsi käyttäjä tekee ateriasuunnitelman",
"shopping-list-events": "Ostoslistatapahtumat",
"cookbook-events": "Keittokirjatapahtumat",
@@ -81,7 +81,7 @@
"category-events": "Luokkatapahtumat",
"when-a-new-user-joins-your-group": "Kun ryhmääsi liittyy uusi jäsen",
"recipe-events": "Reseptitapahtumat",
"label-events": "Label Events"
"label-events": "Merkitse Tapahtumat"
},
"general": {
"add": "Lisää",
@@ -136,7 +136,7 @@
"options": "Valinnat:",
"plural-name": "Monikollinen nimi",
"print": "Tulosta",
"print-preferences": "Tulosta asetukset",
"print-preferences": "Tulostusasetukset",
"random": "Satunnainen",
"rating": "Arvio",
"recent": "Viimeisimmät",
@@ -399,6 +399,10 @@
"description-long": "Mealie voi tuoda reseptejä Tandoorista. Vie tietosi \"Oletus\" -muodossa ja lataa sitten .zip alla.",
"title": "Tandoor Recipes -sovellus"
},
"cookn": {
"description-long": "Mealie voi tuoda reseptejä DVO Cook'n X3:sta. Vie keittokirja tai valikko \"Cook'n\"-muodossa, nimeä tiedosto uudelleen .zip-muotoon ja lataa sitten Mealieen alta.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Reseptien tietojen migraatiot",
"recipe-data-migrations-explanation": "Reseptit voidaan siirtää toisesta tuetusta sovelluksesta Mealie -sovellukseen. Tämä on hyvä tapa päästä alkuun Mealiella.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Olitko toisessa sovelluksessa tai Mealien aiemmassa versiossa? Tarkista, voidaanko tietosi siirtää.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Yrittää jakaa kappaleen vastaamalla '1)' tai '1.' kuvioita",
"import-by-url": "Tuo resepti osoitteesta",
"create-manually": "Luo resepti manuaalisesti",
"make-recipe-image": "Luo reseptikuva"
"make-recipe-image": "Luo reseptikuva",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 sivua ei löydy",
@@ -474,7 +480,7 @@
"comment": "Kommentti",
"comments": "Kommentit",
"delete-confirmation": "Haluatko varmasti poistaa reseptin?",
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
"admin-delete-confirmation": "Olet poistamassa reseptiä, joka ei ole sinun käyttäen järjestelmänvalvojan käyttöoikeuksia. Oletko varma?",
"delete-recipe": "Poista resepti",
"description": "Kuvaus",
"disable-amount": "Poista ainesosien määrät käytöstä",
@@ -511,6 +517,9 @@
"recipe-deleted": "Resepti poistettu",
"recipe-image": "Reseptikuva",
"recipe-image-updated": "Reseptikuva päivitetty",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Reseptin nimi",
"recipe-settings": "Reseptiasetukset",
"recipe-update-failed": "Reseptin päivitys epäonnistui",
@@ -561,7 +570,7 @@
"see-original-text": "Katso Alkuperäinen Teksti",
"original-text-with-value": "Alkuperäinen Teksti: {originalText}",
"ingredient-linker": "Ainesosan linkittäjä",
"unlinked": "Not linked yet",
"unlinked": "Ei vielä linkitetty",
"linked-to-other-step": "Linkitetty toiseen vaiheeseen",
"auto": "Automaattinen",
"cook-mode": "Kokkitila",
@@ -583,14 +592,15 @@
"made-this": "Tein tämän",
"how-did-it-turn-out": "Miten se onnistui?",
"user-made-this": "{user} teki tämän",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Lisätty aikajanalle",
"failed-to-add-to-timeline": "Aikajanaan lisääminen epäonnistui",
"failed-to-update-recipe": "Reseptin päivitys epäonnistui",
"added-to-timeline-but-failed-to-add-image": "Lisätty aikajanaan, mutta kuvan lisääminen epäonnistui",
"api-extras-description": "Reseptiekstrat ovat Mealien API:n tärkeä ominaisuus. Niiden avulla voidaan luoda mukautettuja JSON-avain/arvo-pareja reseptin sisällä viitaten kolmannen osapuolen sovelluksiin. Näitä avaimia voi käyttää tiedon antamiseksi, esimerkiksi automaattisen toiminnon tai mukautetun viestin käynnistämiseksi haluamaasi laitteeseen.",
"message-key": "Viestiavain",
"parse": "Jäsennä",
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
"ingredients-not-parsed-description": "Näyttää siltä, että ainesosat eivät ole vielä jäsenneltyjä. Klikkaa \"{parse}\" painiketta alla jäsentääksesi ainesosat strukturoiduiksi elintarvikkeiksi.",
"attach-images-hint": "Liitä kuvia vetämällä ja pudottamalla ne editoriin",
"drop-image": "Tuo kuva",
"enable-ingredient-amounts-to-use-this-feature": "Käytä ainesosan määriä käyttääksesi tätä ominaisuutta",
@@ -608,10 +618,10 @@
"create-recipe-from-an-image": "Luo resepti kuvasta",
"create-recipe-from-an-image-description": "Luo resepti tuomalla siitä kuva. Mealie pyrkii poimimaan tekstin kuvasta tekoälyllä ja luomaan siitä reseptin.",
"crop-and-rotate-the-image": "Rajaa ja kierrä kuvaa niin, että vain teksti näkyy, ja että se on oikein päin.",
"create-from-images": "Create from Images",
"create-from-images": "Luo resepti kuvasta",
"should-translate-description": "Käännä resepti kielelleni",
"please-wait-image-procesing": "Odota, että kuva käsitellään. Tämä voi kestää hetken.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
"please-wait-images-processing": "Odota, että kuvat käsitellään. Tämä saattaa kestää jonkin aikaa.",
"bulk-url-import": "Massa tuonti URL-osoitteesta",
"debug-scraper": "Etsi ongelmia Scraperista",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Luo resepti antamalla nimi. Kaikilla resepteillä on oltava yksilölliset nimet.",
@@ -624,7 +634,7 @@
"scrape-recipe-you-can-import-from-raw-data-directly": "Voit tuoda raakadatan suoraan",
"import-original-keywords-as-tags": "Tuo alkuperäiset avainsanat tunnisteiksi",
"stay-in-edit-mode": "Pysy muokkaustilassa",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Jäsennä reseptin ainesosat tuonnin jälkeen",
"import-from-zip": "Tuo zip-arkistosta",
"import-from-zip-description": "Tuo yksi resepti, joka on viety toisesta Mealie-asennuksesta.",
"import-from-html-or-json": "Tuo HTML- tai JSON-tiedostosta",
@@ -668,23 +678,26 @@
"no-unit": "Ei yksikköä",
"missing-unit": "Luo puuttuva yksikkö: {unit}",
"missing-food": "Luo puuttuva ruoka: {food}",
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
"this-food-could-not-be-parsed-automatically": "This food could not be parsed automatically",
"this-unit-could-not-be-parsed-automatically": "Tätä yksikköä ei voitu jäsentää automaattisesti",
"this-food-could-not-be-parsed-automatically": "Tätä ruokaa ei voitu automaattisesti jäsentää",
"no-food": "Ei ruokaa",
"review-parsed-ingredients": "Review parsed ingredients",
"confidence-score": "Confidence Score",
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
"delete-item": "Delete Item"
"review-parsed-ingredients": "Tarkastele jäsennetyt ainesosat",
"confidence-score": "Varmuuspisteet",
"ingredient-parser-description": "Ainesosat on haettu onnistuneesti. Ole hyvä ja tarkista ainesosat joista emme ole varmoja.",
"ingredient-parser-final-review-description": "Kun kaikki ainesosat on tarkistettu, sinulla on vielä yksi mahdollisuus tarkistaa kaikki ainesosat ennen kuin muokkaat reseptiäsi.",
"add-text-as-alias-for-item": "",
"delete-item": "Poista kohde"
},
"reset-servings-count": "Palauta Annoksien Määrä",
"not-linked-ingredients": "Muut ainesosat",
"upload-another-image": "Upload another image",
"upload-images": "Upload images",
"upload-more-images": "Upload more images",
"set-as-cover-image": "Set as recipe cover image",
"cover-image": "Cover image"
"upload-another-image": "Lataa toinen kuva",
"upload-images": "Lataa kuva",
"upload-more-images": "Lataa lisää kuvia",
"set-as-cover-image": "Aseta reseptin kansikuvaksi",
"cover-image": "Kansikuva",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Reseptin etsijä",
@@ -733,7 +746,7 @@
"restore-success": "Palautus onnistui",
"restore-fail": "Palautus epäonnistui. Tarkista palvelinloki saadaksesi lisätietoja",
"backup-tag": "Varmuuskopion tunniste",
"create-heading": "Create a Backup",
"create-heading": "Luo varmuuskopio",
"delete-backup": "Poista varmuuskopio",
"error-creating-backup-see-log-file": "Virhe varmuuskopiota luodessa. Katso lokitiedosto",
"full-backup": "Täysi varmuuskopiointi",
@@ -988,7 +1001,7 @@
"login": "Kirjaudu",
"login-oidc": "Kirjaudu sisään käyttäen",
"or": "tai",
"logout": "Uloskirjaudu",
"logout": "Kirjaudu ulos",
"manage-users": "Käyttäjien hallinta",
"manage-users-description": "Luo ja hallitse käyttäjiä.",
"new-password": "Uusi salasana",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vaihda sähköpostisi asetuksista, jos et halua nähdä tätä enää.",
"forgot-password": "Unohditko salasanasi",
"forgot-password-text": "Syötä sähköpostiosoitteesi, niin voit muuttaa salasanaasi linkin kautta.",
"changes-reflected-immediately": "Muutokset tähän käyttäjään astuvat välittömästi voimaan."
"changes-reflected-immediately": "Muutokset tähän käyttäjään astuvat välittömästi voimaan.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "käännetty",
@@ -1177,7 +1192,7 @@
"group-details": "Ryhmän tiedot",
"group-details-description": "Ennen kuin luot tilin, sinun on luotava ryhmä. Ryhmässäsi on vain sinä, mutta voit kutsua muita myöhemmin. Ryhmäsi jäsenet voivat jakaa ateriasuunnitelmia, ostoslistoja, reseptejä ja paljon muuta!",
"use-seed-data": "Käytä pohjatietoja",
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
"use-seed-data-description": "Mealie:ssa tulee mukana kokoelma valmiita Ruokia, Yksiköitä sekä Luokituksia, joita voidaan käyttää resepteissä sekä niiden lajittelussa. Ne on käännetty kielelle joka on tällä hetkellä valittuna. Voit aina lisätä tai muokata tätä dataa myöhemmin.",
"account-details": "Tilitiedot"
},
"validation": {

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
"title": "Recettes Tandoor"
},
"cookn": {
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléchargez le .zip ci-dessous.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migration des données de recettes",
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance dune autre application une dune version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tente de découper un paragraphe par correspondance de motifs: '1)' ou '1.'",
"import-by-url": "Importer une recette par son URL",
"create-manually": "Créer une recette manuellement",
"make-recipe-image": "Faire de cette image limage de recette"
"make-recipe-image": "Faire de cette image limage de recette",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page introuvable",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recette supprimée",
"recipe-image": "Image de la recette",
"recipe-image-updated": "Limage de la recette a été mise à jour",
"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 recette",
"recipe-settings": "Paramètres de la recette",
"recipe-update-failed": "La mise à jour de la recette a échoué",
@@ -583,6 +592,7 @@
"made-this": "Je lai cuisiné",
"how-did-it-turn-out": "Cétait bon?",
"user-made-this": "{user} la cuisiné",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Ajouté à la ligne du temps",
"failed-to-add-to-timeline": "Impossible d'ajouter à la ligne du temps",
"failed-to-update-recipe": "Impossible de modifier la recette",
@@ -674,9 +684,9 @@
"review-parsed-ingredients": "Vérifier les ingrédients analysés",
"confidence-score": "Score de confiance",
"ingredient-parser-description": "Vos ingrédients ont été analysés avec succès. Veuillez vérifier les ingrédients dont nous ne sommes pas certains.",
"ingredient-parser-final-review-description": "Une fois que tous les ingrédients ont été analysés, vous aurez encore une chance de vérifier tous les ingrédients avant de les appliquer à votre recette.",
"ingredient-parser-final-review-description": ".....",
"add-text-as-alias-for-item": "Ajouter \"{text}\" comme alias pour {item}",
"delete-item": "Delete Item"
"delete-item": "Supprimer l'élément"
},
"reset-servings-count": "Réinitialiser le nombre de portions",
"not-linked-ingredients": "Ingrédients supplémentaires",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Recherche de recette",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vous ne voulez plus voir cela ? Assurez-vous de changer votre adresse e-mail dans vos paramètres d'utilisateur !",
"forgot-password": "Mot de passe oublié",
"forgot-password-text": "Veuillez entrer votre adresse e-mail. Un e-mail vous sera envoyé afin de réinitialiser votre mot de passe.",
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte."
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
"default-activity": "Activité par défaut",
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
},
"language-dialog": {
"translated": "traduit",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
"title": "Recettes Tandoor"
},
"cookn": {
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléchargez le .zip ci-dessous.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migration des données de recettes",
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance dune autre application une dune version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "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 limage de recette"
"make-recipe-image": "Faire de cette image limage de recette",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page introuvable",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recette supprimée",
"recipe-image": "Image de la recette",
"recipe-image-updated": "L'image de la recette a été mise à jour",
"delete-image": "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 recette",
"recipe-settings": "Paramètres de la recette",
"recipe-update-failed": "La mise à jour de la recette a échoué",
@@ -583,6 +592,7 @@
"made-this": "Je lai cuisiné",
"how-did-it-turn-out": "Cétait bon?",
"user-made-this": "{user} la cuisiné",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Ajouté à lhistorique",
"failed-to-add-to-timeline": "Ajout dans lhistorique en échec",
"failed-to-update-recipe": "Impossible de mettre à jour la recette",
@@ -676,7 +686,7 @@
"ingredient-parser-description": "Vos ingrédients ont été analysés avec succès. Veuillez vérifier les ingrédients dont nous ne sommes pas certains.",
"ingredient-parser-final-review-description": "Une fois que tous les ingrédients ont été analysés, vous aurez encore une chance de vérifier tous les ingrédients avant de les appliquer à votre recette.",
"add-text-as-alias-for-item": "Ajouter \"{text}\" comme alias pour {item}",
"delete-item": "Delete Item"
"delete-item": "Supprimer l'élément"
},
"reset-servings-count": "Réinitialiser le nombre de portions",
"not-linked-ingredients": "Ingrédients supplémentaires",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Recherche de recette",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vous ne voulez plus voir cela? Assurez-vous de changer votre adresse courriel dans vos paramètres d'utilisateur!",
"forgot-password": "Mot de passe oublié",
"forgot-password-text": "Veuillez entrer votre adresse e-mail. Un e-mail vous sera envoyé afin de réinitialiser votre mot de passe.",
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte."
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
"default-activity": "Activité 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",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie peut importer des recettes à partir de Tandoor. Exportez vos données dans le format « Défaut », puis téléchargez le .zip ci-dessous.",
"title": "Recettes Tandoor"
},
"cookn": {
"description-long": "Mealie peut importer des recettes de DVO Cook'n X3. Exportez un livre de recettes ou un menu au format \"Cook'n\", renommez l'extension d'exportation en .zip, puis téléchargez le .zip ci-dessous.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migration des données de recettes",
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance dune autre application une dune version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tente de découper un paragraphe par correspondance de motifs: '1)' ou '1.'",
"import-by-url": "Importer une recette par son URL",
"create-manually": "Créer une recette manuellement",
"make-recipe-image": "Faire de cette image limage de recette"
"make-recipe-image": "Faire de cette image limage de recette",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page introuvable",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recette supprimée",
"recipe-image": "Image de la recette",
"recipe-image-updated": "Limage de la recette a été mise à jour",
"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 recette",
"recipe-settings": "Paramètres de la recette",
"recipe-update-failed": "La mise à jour de la recette a échoué",
@@ -583,6 +592,7 @@
"made-this": "Je lai cuisiné",
"how-did-it-turn-out": "Cétait bon?",
"user-made-this": "{user} la cuisiné",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Ajouté à lhistorique",
"failed-to-add-to-timeline": "Ajout dans lhistorique en échec",
"failed-to-update-recipe": "Impossible de mettre à jour la recette",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Recherche de recette",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vous ne voulez plus voir cela ? Assurez-vous de changer votre adresse e-mail dans vos paramètres d'utilisateur !",
"forgot-password": "Mot de passe oublié",
"forgot-password-text": "Veuillez entrer votre adresse e-mail. Un e-mail vous sera envoyé afin de réinitialiser votre mot de passe.",
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte."
"changes-reflected-immediately": "Les changements apportés à cet utilisateur seront immédiatement pris en compte.",
"default-activity": "Activité par défaut",
"default-activity-hint": "Sélectionnez la page que vous souhaitez ouvrir lors de la connexion sur cet appareil"
},
"language-dialog": {
"translated": "traduit",

View File

@@ -399,6 +399,10 @@
"description-long": "O Mealie pode importar receitas do Tandoor. Exporte os seus datos no formato \"Padrón\" e despois cargue o . zip abaixo.",
"title": "Receitas do Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migracións de Datos de Receita",
"recipe-data-migrations-explanation": "As receitas poden ser migradas desde outra aplicación compatível a Mealie. Esta é unha boa forma de comezar a usar o Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Ven de outra aplicación ou de unha versión ainda mais antiga do Mealie? Verifique as migracións e vexa se os seus datos poden ser importados.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tenta dividir un parágrafo facendo corresponder os padróns '1)' ou '1.'",
"import-by-url": "Importar unha receita por URL",
"create-manually": "Cree unha receita manualmente",
"make-recipe-image": "Faga desta a imaxen da receita"
"make-recipe-image": "Faga desta a imaxen da receita",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Páxina non encontrada",
@@ -511,6 +517,9 @@
"recipe-deleted": "Eliminouse a receita",
"recipe-image": "Imaxe da Receita",
"recipe-image-updated": "Actualizouse a imaxe da receita",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Nome da Receita",
"recipe-settings": "Configuración da Receita",
"recipe-update-failed": "Produciuse un erro na actualización da receita",
@@ -583,6 +592,7 @@
"made-this": "Eu fixen isto",
"how-did-it-turn-out": "Que tal ficou?",
"user-made-this": "{user} fixo isto",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Adicionado ao histórico",
"failed-to-add-to-timeline": "Falla ao adicionar ao histórico",
"failed-to-update-recipe": "Falla ao atualizar a receita",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Non quer voltar a ver isto? Non se esqueza de alterar o seu email nas suas definicións de usuario!",
"forgot-password": "Esquecin a miña seña",
"forgot-password-text": "Por favor, dixite o seu enderezo de email para enviarmos un link para redefinir a sua seña.",
"changes-reflected-immediately": "As alteracións deste usuario serán aplicadas imediatamente."
"changes-reflected-immediately": "As alteracións deste usuario serán aplicadas imediatamente.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "traducido",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie יכול לייבא מתכונים מ-Tandoor, תייצא את המתכון בפורמט הדיפולטיבי ולאחר מכן העלאה אותם בחזרה בפורמט zip.",
"title": "מתכוני Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "מגרציית מידע מתכונים",
"recipe-data-migrations-explanation": "ניתן לייבא מתכונים מאפליקציות תומכות אחרות אל Mealie. זו דרך מעולה להתחיל במילי.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "הגעת מתוכנה אחרת או גרסה ישנה יותר של Mealie? מומלץ לבדוק מיגרציות ולראות אם ניתן לייבא את המידע שלך.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "מנסה לפצל את הפסקה עם תבניות '1)' או '1.'",
"import-by-url": "ייבוא מתכון באמצעות לינק",
"create-manually": "יצירת מתכון ידנית",
"make-recipe-image": "הפוך תמונה זאת לתמונת המתכון"
"make-recipe-image": "הפוך תמונה זאת לתמונת המתכון",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 העמוד אינו נמצא",
@@ -511,6 +517,9 @@
"recipe-deleted": "מתכון נמחק",
"recipe-image": "תמונת המתכון",
"recipe-image-updated": "תמונת המתכון עודכנה",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "שם המתכון",
"recipe-settings": "הגדרות המתכון",
"recipe-update-failed": "עדכון מתכון נכשל",
@@ -583,6 +592,7 @@
"made-this": "הכנתי את זה",
"how-did-it-turn-out": "איך יצא?",
"user-made-this": "{user} הכין את זה",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "נוסף לציר הזמן",
"failed-to-add-to-timeline": "כישלון בהוספה לציר הזמן",
"failed-to-update-recipe": "כישלון בעדכון מתכון",
@@ -684,7 +694,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": "מצא מתכון",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "לא רוצה לראות את זה יותר? ניתן לשנות את המייל שלך בהגדרות המשתמש!",
"forgot-password": "שכחתי סיסמא",
"forgot-password-text": "נא לספק כתובת דוא\"ל. אנו נשלח לך הודעת דוא\"ל לצורך איפוס הסיסמה שלך.",
"changes-reflected-immediately": "שינויים למשתמש זה ישתקפו מיידית."
"changes-reflected-immediately": "שינויים למשתמש זה ישתקפו מיידית.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "תורגם",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie može inportirati recepte iz Tandoor-a. Izvezite Vaše recepte u uobičajnom formatu, pa učitajte .zip ispod.",
"title": "Tandoor Recepti"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migracije Podataka Recepata",
"recipe-data-migrations-explanation": "Recepti se mogu prenijeti s druge podržane aplikacije na Mealie. To je sjajan način za započetak korištenja Mealieja.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Pokušava podijeliti odlomak prepoznavanjem obrazaca '1)' ili '1.'",
"import-by-url": "Učitaj recept preko URL linka",
"create-manually": "Ručno kreirajte recept",
"make-recipe-image": "Postavite ovo kao sliku recepta"
"make-recipe-image": "Postavite ovo kao sliku recepta",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 - Stranica nije pronađena",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept obrisan",
"recipe-image": "Slika Recepta",
"recipe-image-updated": "Slika recepta ažurirana",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Naziv Recepta",
"recipe-settings": "Postavke Recepta",
"recipe-update-failed": "Ažuriranje polja recepta",
@@ -583,6 +592,7 @@
"made-this": "Napravio/la sam ovo",
"how-did-it-turn-out": "Kako je ispalo?",
"user-made-this": "{user} je napravio/la ovo",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "prevedeno",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie képes recepteket importálni a Tandoorból. Exportálja adatait az \"Alapértelmezett\" formátumban, majd töltse fel a .zip fájlt lentebb.",
"title": "Tandoor receptek"
},
"cookn": {
"description-long": "Mealie képes importálni a DVO Cook'n X3 receptjeit. Exportáljon egy szakácskönyvet vagy menüt „Cook'n” formátumban, nevezze át az exportált fájl kiterjesztését .zip-re, majd töltse fel az alábbi .zip fájlt.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Receptadatok migrációja",
"recipe-data-migrations-explanation": "A receptek átemelhetők más támogatott alkalmazásból Mealie-be. Ez egy remek módja a Mealie használatának elkezdésére.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "A Mealie egy másik verzióját használtad vagy valami teljesen más applikációt? Nézd meg az adat importálási lehetőségeinket.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "A bekezdés felosztására tesz kísérletet az '1)' vagy '1.' mintákkal való egyezéssel",
"import-by-url": "Recept importálása URL-cím alapján",
"create-manually": "Recept kézi létrehozása",
"make-recipe-image": "Ez legyen a recept képe"
"make-recipe-image": "Ez legyen a recept képe",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404. Az oldal nem található",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept törölve",
"recipe-image": "Recept képe",
"recipe-image-updated": "Recept képe frissítve",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recept neve",
"recipe-settings": "Recept beállítások",
"recipe-update-failed": "Recept frissítése sikertelen",
@@ -583,6 +592,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": "Made for {recipe}",
"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",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Receptkereső",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nem akarja ezt többé látni? Mindenképpen változtassa meg az e-mail címét a felhasználói beállítások között!",
"forgot-password": "Elfelejtett jelszó",
"forgot-password-text": "Írja be e-mail címét és mi küldünk egy linket a jelszó visszaállításához.",
"changes-reflected-immediately": "Ehhez a felhasználóhoz tartozó változtatások azonnal megjelennek."
"changes-reflected-immediately": "Ehhez a felhasználóhoz tartozó változtatások azonnal megjelennek.",
"default-activity": "Alapértelmezett tevékenység",
"default-activity-hint": "Válassza ki, melyik oldalra szeretne navigálni, amikor bejelentkezik erről az eszközről"
},
"language-dialog": {
"translated": "lefordítva",

View File

File diff suppressed because it is too large Load Diff

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie può importare ricette da Tandoor. Esporta i tuoi dati nel formato \"Predefinito\", quindi carica il file .zip sottostante.",
"title": "Ricette Del Tandoore"
},
"cookn": {
"description-long": "Mealie può importare ricette da DVO Cook'n X3. Per esportare un ricettario o un menu nel formato \"Cook'n\", rinominare l'estensione di esportazione in .zip, quindi caricare il file .zip qui sotto.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrazione Dati Ricetta",
"recipe-data-migrations-explanation": "Le ricette possono essere migrate da un'altra applicazione supportata da Mealie. Questo è un ottimo modo per iniziare con Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Arrivi da un'altra applicazione o da una versione più vecchia di Mealie? Scopri le migrazioni e scopri se i tuoi dati possono essere importati.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tenta di dividere un paragrafo con i modelli '1)' o '1.'",
"import-by-url": "Importa una ricetta tramite URL",
"create-manually": "Crea una ricetta manualmente",
"make-recipe-image": "Usa come immagine della ricetta"
"make-recipe-image": "Usa come immagine della ricetta",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Pagina non Trovata",
@@ -511,6 +517,9 @@
"recipe-deleted": "Ricetta eliminata",
"recipe-image": "Immagine Ricetta",
"recipe-image-updated": "Immagine ricetta aggiornata",
"delete-image": "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 Ricetta",
"recipe-settings": "Impostazioni Ricetta",
"recipe-update-failed": "Aggiornamento ricetta fallito",
@@ -583,6 +592,7 @@
"made-this": "L'Ho Preparato",
"how-did-it-turn-out": "Come è venuto?",
"user-made-this": "{user} l'ha preparato",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Aggiunto alla cronologia",
"failed-to-add-to-timeline": "Impossibile aggiungere alla cronologia",
"failed-to-update-recipe": "Impossibile aggiornare la ricetta",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Trova ricette",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Non vuoi più vederlo? Assicurati di modificare la tua email nelle impostazioni utente!",
"forgot-password": "Password Dimenticata",
"forgot-password-text": "Inserisci il tuo indirizzo email e ti invieremo un collegamento per reimpostare la tua password.",
"changes-reflected-immediately": "Le modifiche a questo utente diventeranno immediatamente effettive."
"changes-reflected-immediately": "Le modifiche a questo utente diventeranno immediatamente effettive.",
"default-activity": "Attività Predefinita",
"default-activity-hint": "Seleziona a quale pagina vuoi navigare al momento dell'accesso da questo dispositivo"
},
"language-dialog": {
"translated": "tradotto",

View File

@@ -399,6 +399,10 @@
"description-long": "MealieはTandoorからレシピをインポートすることができます。「デフォルト」形式でデータをエクスポートし、以下に.zipをアップロードしてください。",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "レシピの移行",
"recipe-data-migrations-explanation": "レシピは、サポートされている別のアプリケーションからMealieに移行できます。これはMealieを始めるのに最適な方法です。",
"coming-from-another-application-or-an-even-older-version-of-mealie": "別のアプリケーションもしくは古いバージョンのMealieからですか移行をチェックして、データをインポートできるかどうかを確認してください。",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "「1)」または「1.」に一致する段落を分割しようとします。",
"import-by-url": "URLからレシピをインポート",
"create-manually": "レシピを手動で作成",
"make-recipe-image": "これをレシピ画像にします"
"make-recipe-image": "これをレシピ画像にします",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 ページが見つかりません",
@@ -511,6 +517,9 @@
"recipe-deleted": "レシピを削除しました",
"recipe-image": "レシピの画像",
"recipe-image-updated": "レシピ画像を更新しました",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "レシピ名",
"recipe-settings": "レシピの設定",
"recipe-update-failed": "レシピの更新に失敗しました",
@@ -583,6 +592,7 @@
"made-this": "これを作りました",
"how-did-it-turn-out": "どうなりましたか?",
"user-made-this": "{user} がこれを作りました",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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": "レシピ検索",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "これ以上表示したくないですか?ユーザー設定でメールアドレスを変更してください!",
"forgot-password": "パスワードを忘れた",
"forgot-password-text": "メールアドレスを入力すると、パスワードをリセットするためのリンクが送信されます。",
"changes-reflected-immediately": "このユーザーへの変更はすぐに反映されます。"
"changes-reflected-immediately": "このユーザーへの変更はすぐに反映されます。",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "翻訳済み",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "'1)' 또는 '1.' 패턴을 일치시켜 문단을 분할하려고 시도합니다.",
"import-by-url": "URL로 레시피 가져오기",
"create-manually": "수동으로 레시피 만들기",
"make-recipe-image": "이것을 레시피 이미지로 만드세요."
"make-recipe-image": "이것을 레시피 이미지로 만드세요.",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404. 페이지를 찾을 수 없음",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
@@ -583,6 +592,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie gali importuoti receptus iš \"Tandoor\". Eksportuokite savo duomenis \"Default\" formatu ir įkelkite .ZIP failą žemiau.",
"title": "\"Tandoor\" receptai"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Receptų duomenų migracijos",
"recipe-data-migrations-explanation": "Receptai gali būti importuojami į Mealie iš kitų palaikomų sistemų. Tai - puikus būdas pradėti naudotis Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Bandyti atskirti pastraipas pagal \"1)\" ar \"1.\" numeraciją",
"import-by-url": "Importuokite receptą iš URL",
"create-manually": "Sukurti receptą rankiniu būdu",
"make-recipe-image": "Padaryti pagrindine recepto nuotrauka"
"make-recipe-image": "Padaryti pagrindine recepto nuotrauka",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Puslapis nerastas",
@@ -511,6 +517,9 @@
"recipe-deleted": "Receptas ištrintas",
"recipe-image": "Recepto paveikslėlis",
"recipe-image-updated": "Recepto paveikslėlis atnaujintas",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recepto pavadinimas",
"recipe-settings": "Recepto nustatymai",
"recipe-update-failed": "Nepavyko atnaujinti recepto",
@@ -583,6 +592,7 @@
"made-this": "Aš tai gaminau",
"how-did-it-turn-out": "Kaip tai pavyko?",
"user-made-this": "{user} gamino šį patiekalą",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "išversta",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie var importēt receptes no Tandoor. Eksportējiet savus datus formātā “Noklusējums”, pēc tam augšupielādējiet zemāk esošu.zip.",
"title": "Tandoor receptes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recepšu datu migrācija",
"recipe-data-migrations-explanation": "Receptes var migrēt no citas atbalstītas lietojumprogrammas uz Mealie. Tas ir lielisks veids, kā sākt darbu ar Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vai nāk no citas lietojumprogrammas vai vēl vecākas Mealie versijas? Pārbaudiet migrācijas un pārbaudiet, vai jūsu datus var importēt.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Mēģinājumi sadalīt rindkopu, saskaņojot modeļus “1)” vai “1.”",
"import-by-url": "Receptes importēšana pēc URL",
"create-manually": "Izveidojiet recepti manuāli",
"make-recipe-image": "Padariet šo par receptes attēlu"
"make-recipe-image": "Padariet šo par receptes attēlu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Lapa nav atrasta",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recepte izdzēsta",
"recipe-image": "Receptes attēls",
"recipe-image-updated": "Receptes attēls atjaunināts",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Receptes nosaukums",
"recipe-settings": "Receptes iestatījumi",
"recipe-update-failed": "Receptes atjaunināšana neizdevās",
@@ -583,6 +592,7 @@
"made-this": "Es to pagatavoju",
"how-did-it-turn-out": "Kā tas izrādījās?",
"user-made-this": "{user}izdarīja šo",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vai nevēlaties to vairs redzēt? Noteikti mainiet savu e-pastu lietotāja iestatījumos!",
"forgot-password": "Aizmirsāt paroli",
"forgot-password-text": "Lūdzu, ievadiet savu e-pasta adresi, un mēs jums nosūtīsim saiti, lai atiestatītu jūsu paroli.",
"changes-reflected-immediately": "Izmaiņas šim lietotājam tiks atspoguļotas nekavējoties."
"changes-reflected-immediately": "Izmaiņas šim lietotājam tiks atspoguļotas nekavējoties.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "tulkots",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie kan recepten importeren van Tandoor. Exporteer je gegevens in het \"Standaardformaat\" (\"Default\") en upload het .zip bestand hieronder.",
"title": "Tandoor-recepten"
},
"cookn": {
"description-long": "Mealie kan recepten importeren van DVO Cook'n X3. Exporteer een cookboek of menu in het \"Cook'n\" formaat. Verander de naam van de export extensie naar .zip. En upload daarna de .zip.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Receptmigratie",
"recipe-data-migrations-explanation": "Je kunt recepten van een ander programma importeren in Mealie. Zo kun je snel aan de slag.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kom je van een andere toepassing of een oudere versie van Mealie? Kijk eens naar de migraties. Misschien kunnen we je gegevens importeren.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Probeert om een alinea te splitsen door de '1)' of '1.' patronen te gebruiken",
"import-by-url": "Importeer een recept van een website",
"create-manually": "Maak handmatig een recept aan",
"make-recipe-image": "Maak dit de afbeelding voor dit recept"
"make-recipe-image": "Maak dit de afbeelding voor dit recept",
"add-food": "Voeg eten toe",
"add-recipe": "Voeg recept toe"
},
"page": {
"404-page-not-found": "404 Pagina niet gevonden",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept verwijderd",
"recipe-image": "Receptafbeelding",
"recipe-image-updated": "Receptafbeelding bijgewerkt",
"delete-image": "Verwijder Recept Afbeelding",
"delete-image-confirmation": "Weet je zeker dat je deze afbeelding wil verwijderen?",
"recipe-image-deleted": "Receptafbeelding verwijderd",
"recipe-name": "Receptnaam",
"recipe-settings": "Receptinstellingen",
"recipe-update-failed": "Recept bijwerken mislukt",
@@ -583,6 +592,7 @@
"made-this": "Ik heb dit gemaakt",
"how-did-it-turn-out": "Hoe was je gerecht?",
"user-made-this": "{user} heeft dit gemaakt",
"made-for-recipe": "Gemaakt voor {recipe}",
"added-to-timeline": "Toevoegen aan tijdlijn",
"failed-to-add-to-timeline": "Toegevoegd aan tijdlijn",
"failed-to-update-recipe": "Updaten recept mislukt",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Wil je dit niet meer zien? Verander dan je e-mailadres in je gebruikersinstellingen!",
"forgot-password": "Wachtwoord vergeten",
"forgot-password-text": "Voer je e-mailadres in, dan sturen we je een link om het wachtwoord te herstellen.",
"changes-reflected-immediately": "Wijzigingen in deze groep zijn meteen zichtbaar."
"changes-reflected-immediately": "Wijzigingen in deze groep zijn meteen zichtbaar.",
"default-activity": "Standaard activiteit",
"default-activity-hint": "Kies de pagina waar u naar toe wilt, na inloggen op dit apparaat"
},
"language-dialog": {
"translated": "vertaald",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp zip-filen nedenfor.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie kan importere oppskrifter fra DVO Cook'n X3. Eksporter en cookbook eller meny i \"Cook'n\" formatet, endre navnet på eksporten til .zip, og last så opp .zip-filen nedenfor.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Overføring av oppskrifter",
"recipe-data-migrations-explanation": "Oppskrifter kan overføres fra et annet støttet program til Mealie. Dette er en flott måte å komme i gang med Mealie på.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer du fra en annen applikasjon eller en enda eldre versjon av Mealie? Sjekk ut overføringer og se om dine data kan importeres.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Forsøk å dele opp et avsnitt ved å matche mønsteret '1)' eller '1.'",
"import-by-url": "Importer en oppskrift via nettadresse",
"create-manually": "Opprett en oppskrift manuelt",
"make-recipe-image": "Bruk dette som oppskriftsbilde"
"make-recipe-image": "Bruk dette som oppskriftsbilde",
"add-food": "Legg til mat",
"add-recipe": "Legg til oppskrift"
},
"page": {
"404-page-not-found": "404 Siden ble ikke funnet",
@@ -511,6 +517,9 @@
"recipe-deleted": "Oppskrift slettet",
"recipe-image": "Oppskriftsbilde",
"recipe-image-updated": "Oppskriftsbilde oppdatert",
"delete-image": "Slett oppskriftsbilde",
"delete-image-confirmation": "Er du sikker på at du vil slette dette oppskriftsbilde?",
"recipe-image-deleted": "Oppskriftsbilde slettet",
"recipe-name": "Navn på oppskrift",
"recipe-settings": "Oppskriftsinnstillinger",
"recipe-update-failed": "Oppdatering av oppskrift mislyktes",
@@ -583,6 +592,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",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Ønsker du ikke å se dette lenger? Sørg for å endre e-posten din i brukerinnstillingene dine!",
"forgot-password": "Glemt passord",
"forgot-password-text": "Skriv inn e-postadressen din. Vi sender deg en e-post slik at du kan tilbakestille passordet ditt.",
"changes-reflected-immediately": "Endringer på denne brukeren gjenspeiles umiddelbart."
"changes-reflected-immediately": "Endringer på denne brukeren gjenspeiles umiddelbart.",
"default-activity": "Standard aktivitet",
"default-activity-hint": "Velg hvilken side du vil navigere til når du logger inn fra denne enheten"
},
"language-dialog": {
"translated": "oversatt",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie może zaimportować przepisy z Tandoor. Wyeksportuj swoje przepisy w formacie HTML, a następnie prześlij plik .zip poniżej.",
"title": "Przepisy Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migracja danych przepisów",
"recipe-data-migrations-explanation": "Receptury mogą być przeniesione z innej wspieranej aplikacji na Mealie. To świetny sposób na rozpoczęcie z Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Przechodzisz z innej aplikacji, bądź starszej wersji Mealie? Sprawdź dostępne migracje i zobacz czy dane mogą zostać zaimportowane.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Próbuj podzielić paragrafy poprzez dopasowanie po wzorcach '1)' i '1.'",
"import-by-url": "Importuj przepis przez URL",
"create-manually": "Stwórz przepis ręcznie",
"make-recipe-image": "Niech to będzie obraz przepisu"
"make-recipe-image": "Niech to będzie obraz przepisu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404. Nie znaleziono strony",
@@ -511,6 +517,9 @@
"recipe-deleted": "Przepis został usunięty",
"recipe-image": "Zdjęcie do przepisu",
"recipe-image-updated": "Zdjęcie przepisu zostało zaktualizowane",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Nazwa przepisu",
"recipe-settings": "Ustawienia przepisu",
"recipe-update-failed": "Aktualizacja przepisu nie powiodła się",
@@ -583,6 +592,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": "Made for {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",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Wyszukiwarka przepisów",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nie chcesz już tego widzieć? Pamiętaj, aby zmienić swój adres e-mail w ustawieniach użytkownika!",
"forgot-password": "Nie pamiętam hasła",
"forgot-password-text": "Podaj adres e-mail konta, do którego chcesz odzyskać hasło.",
"changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo."
"changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "przetłumaczone",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie pode importar receitas do Tandoor. Exporte seus dados no formato \"Padrão\" e faça o upload do arquivo .zip abaixo.",
"title": "Receitas do Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrações de Dados de Receita",
"recipe-data-migrations-explanation": "Receitas podem ser migradas de outro aplicativo suportado para o Mealie. Esta é uma ótima maneira de começar com Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vindo de outra aplicação ou de uma versão mais antiga do Mealie? Confira as migrações e veja se seus dados podem ser importados.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tenta dividir um parágrafo correspondendo aos padrões '1)' ou '1.'",
"import-by-url": "Importar uma receita por URL",
"create-manually": "Crie uma receita manualmente",
"make-recipe-image": "Tornar esta a imagem da receita"
"make-recipe-image": "Tornar esta a imagem da receita",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Página não encontrada",
@@ -511,6 +517,9 @@
"recipe-deleted": "Receita excluída",
"recipe-image": "Imagem da Receita",
"recipe-image-updated": "Imagem da receita atualizada",
"delete-image": "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": "Configurações da Receita",
"recipe-update-failed": "Falha ao atualizar a receita",
@@ -583,6 +592,7 @@
"made-this": "Eu Fiz Isso",
"how-did-it-turn-out": "Como que ficou?",
"user-made-this": "{user} fez isso",
"made-for-recipe": "Made for {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",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Localizador de Receitas",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Não quer mais ver isto? Não se esqueça de alterar seu e-mail nas configurações do seu usuário!",
"forgot-password": "Esqueci minha senha",
"forgot-password-text": "Digite seu endereço de e-mail e enviaremos um link para redefinir sua senha.",
"changes-reflected-immediately": "As alterações deste usuário serão refletidas imediatamente."
"changes-reflected-immediately": "As alterações deste usuário serão refletidas imediatamente.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "traduzido",

View File

@@ -399,6 +399,10 @@
"description-long": "O Mealie pode importar receitas a partir da Tandoor. Exporte os seus dados no formato \"Padrão\" e faça o upload do .zip abaixo.",
"title": "Receitas do Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrações de dados de receita",
"recipe-data-migrations-explanation": "Podem ser migradas receitas de outra aplicação suportada para o Mealie. Esta é uma ótima maneira de começar com o Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Vem de outra aplicação ou de uma versão ainda mais antiga do Mealie? Consulte as migrações e veja se os seus dados podem ser importados.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Tenta dividir um parágrafo fazendo corresponder os padrões '1)' ou '1.'",
"import-by-url": "Importar uma receita do URL",
"create-manually": "Crie uma receita manualmente",
"make-recipe-image": "Faça desta a imagem da receita"
"make-recipe-image": "Faça desta a imagem da receita",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Página não encontrada",
@@ -511,6 +517,9 @@
"recipe-deleted": "Receita apagada",
"recipe-image": "Imagem da Receita",
"recipe-image-updated": "Imagem da receita atualizada",
"delete-image": "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": "Definições da receita",
"recipe-update-failed": "Falha na atualização da receita",
@@ -583,6 +592,7 @@
"made-this": "Eu fiz isto",
"how-did-it-turn-out": "Que tal ficou?",
"user-made-this": "{user} fez isto",
"made-for-recipe": "Made for {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",
@@ -684,7 +694,10 @@
"upload-images": "Carregar imagens",
"upload-more-images": "Carregar mais imagens",
"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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Não quer voltar a ver isto? Não se esqueça de alterar o seu email nas suas definições de utilizador!",
"forgot-password": "Esqueceu-se da palavra-passe",
"forgot-password-text": "Por favor, digite o seu endereço de email para enviarmos um link para redefinir a sua palavra-passe.",
"changes-reflected-immediately": "As alterações a este utilizador serão aplicadas imediatamente."
"changes-reflected-immediately": "As alterações a este utilizador serão aplicadas imediatamente.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "traduzido",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie poate importa rețete din Tandoor. Exportă datele în formatul \"Implicit\", apoi încarcă fișierul de tip \".ZIP\" folosind câmpul de mai jos.",
"title": "Rețete Tandoor"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrarea datelor rețetelor",
"recipe-data-migrations-explanation": "Rețetele pot fi migrate de la o altă aplicație ce este suportată de Mealie. Acesta este un mod excelent de a începe să folosiți Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Veniți dintr-o altă aplicație sau o versiune și mai veche a Mealie? Uitați-vă la migrări și vedeți dacă datele dvs. pot fi importate.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Încearcă să împartă un paragraf prin potrivirea modelelor \"1)\" sau \"1.\"",
"import-by-url": "Importă rețetă prin URL",
"create-manually": "Creează o rețetă manual",
"make-recipe-image": "Setează ca imaginea rețetei"
"make-recipe-image": "Setează ca imaginea rețetei",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Pagina nu a fost găsită",
@@ -511,6 +517,9 @@
"recipe-deleted": "Rețeta a fost ștearsă",
"recipe-image": "Imagine rețetă",
"recipe-image-updated": "Imagine rețetă actualizată",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Numele rețetei",
"recipe-settings": "Setări rețetă",
"recipe-update-failed": "Actualizarea rețetei a eșuat",
@@ -583,6 +592,7 @@
"made-this": "Am făcut asta",
"how-did-it-turn-out": "Cum a ieșit?",
"user-made-this": "{user} a făcut asta",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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": "Căutător de rețete",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nu mai vrei să vezi acest lucru? Asigură-te că îți schimbi adresa de e-mail în setările de utilizator!",
"forgot-password": "Recuperare parola",
"forgot-password-text": "Va rugam introduceti adresa de e-mail pentru a va trimite un link de resetare parola.",
"changes-reflected-immediately": "Modificările aduse acestui utilizator vor fi reflectate imediat."
"changes-reflected-immediately": "Modificările aduse acestui utilizator vor fi reflectate imediat.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "tradus",

View File

@@ -14,7 +14,7 @@
"development": "В разработке",
"docs": "Справка",
"download-log": "Скачать журнал",
"download-recipe-json": "Последний распаршенный JSON",
"download-recipe-json": "Последний извлеченный JSON",
"github": "GitHub",
"log-lines": "Строки журнала",
"not-demo": "Не демо",
@@ -51,7 +51,7 @@
"category": "Категория"
},
"events": {
"apprise-url": "Apprise URL",
"apprise-url": "Apprise URL-адрес",
"database": "База данных",
"delete-event": "Удалить событие",
"event-delete-confirmation": "Вы уверены, что хотите удалить данное событие?",
@@ -399,6 +399,10 @@
"description-long": "Mealie может импортировать рецепты из Tandoor. Экспортируйте ваши данные в формате «По умолчанию», затем загрузите .zip ниже.",
"title": "Рецепты Tandoor"
},
"cookn": {
"description-long": "Mealie может импортировать рецепты из DVO Cook'n X3. Экспортируйте книгу рецептов или меню в формате \"Cook'n\", переименуйте расширение файла экспорта в .zip, затем загрузите .zip ниже.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Перенос данных рецептов",
"recipe-data-migrations-explanation": "Рецепты могут быть перенесены из другого поддерживаемого приложения в Mealie. Это отличный способ начать работу с Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Переходите из другого приложения или с более поздней версии Mealie? Проверьте \"миграции\", чтобы убедиться, что ваши данные могут быть перенесены.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Попытка разделить параграф с помощью шаблонов '1)' или '1.'",
"import-by-url": "Импортировать рецепт по URL",
"create-manually": "Создать рецепт вручную",
"make-recipe-image": "Сделать это изображением рецепта"
"make-recipe-image": "Сделать это изображением рецепта",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 - страница не найдена",
@@ -511,6 +517,9 @@
"recipe-deleted": "Рецепт удален",
"recipe-image": "Изображение рецепта",
"recipe-image-updated": "Изображение рецепта обновлено",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Название рецепта",
"recipe-settings": "Настройки рецепта",
"recipe-update-failed": "Ошибка обновления рецепта",
@@ -521,7 +530,7 @@
"save-recipe-before-use": "Сохранить рецепт перед использованием",
"section-title": "Название раздела",
"servings": "Порций",
"serves-amount": "Серверов {amount}",
"serves-amount": "Порции {amount}",
"share-recipe-message": "Я хотел(а) поделиться с тобой моим рецептом {0}.",
"show-nutrition-values": "Показать пищевую ценность",
"sodium-content": "Соль",
@@ -583,6 +592,7 @@
"made-this": "Я приготовил это",
"how-did-it-turn-out": "Что получилось?",
"user-made-this": "{user} приготовил это",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Добавлено в ленту",
"failed-to-add-to-timeline": "Не удалось добавить в ленту",
"failed-to-update-recipe": "Не удалось обновить рецепт",
@@ -684,7 +694,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": "Поиск рецептов",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Больше не хотите видеть это сообщение? Не забудьте изменить адрес электронной почты в настройках пользователя!",
"forgot-password": "Забыли Пароль",
"forgot-password-text": "Введите адрес вашей почты, и мы отправим на неё ссылку для сброса пароля.",
"changes-reflected-immediately": "Изменения в этом пользователе будут отражены немедленно."
"changes-reflected-immediately": "Изменения в этом пользователе будут отражены немедленно.",
"default-activity": "Действие по умолчанию",
"default-activity-hint": "Выберите, на какую страницу вы хотели бы перейти при входе в систему с этого устройства"
},
"language-dialog": {
"translated": "переведено",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie dokáže importovať recepty z Tandoor. Exportujte recepty v prednastavenom formáte a zip-súbor nahrajte nižšie.",
"title": "Tandoor recepty"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrácie dát receptov",
"recipe-data-migrations-explanation": "Recepty je možné prenášať do Mealie z inej podporovanej aplikácie. Je to výborný spôsob ako začať s používaním Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Prichádzate z inej aplikácie alebo dokonca staršej verzie Mealie? Pozrite si možnosti migrácie a zistite, či je možné importovať vaše pôvodné dáta.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Pokúsiť sa rozdeliť odsek pomocou vzoru '1)' alebo '1.'",
"import-by-url": "Importovať recept z URL",
"create-manually": "Vytvoriť recept manuálne",
"make-recipe-image": "Nastaviť ako obrázok receptu"
"make-recipe-image": "Nastaviť ako obrázok receptu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "Chyba 404 - Stránka nenájdená",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept bol odstránený",
"recipe-image": "Obrázok receptu",
"recipe-image-updated": "Obrázok receptu aktualizovaný",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Názov receptu",
"recipe-settings": "Nastavenia receptu",
"recipe-update-failed": "Aktualizácia receptu zlyhala",
@@ -583,6 +592,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ť",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Želáte si, aby sa vám toto už viackrát nezobrazovalo? Zmeňte si prosím váš e-mail v nastaveniach používateľa!",
"forgot-password": "Zabudnuté heslo",
"forgot-password-text": "Prosím zadajte svoju e-mailovú adresu a my vám zašleme odkaz, ktorý vám umožní heslo obnoviť.",
"changes-reflected-immediately": "Zmeny týkajúce sa tohto používateľa budú vykonané okamžite."
"changes-reflected-immediately": "Zmeny týkajúce sa tohto používateľa budú vykonané okamžite.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "preložené",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie lahko uvozi recepte iz aplikacije Tandoor. Izvozi podatke v \"Default\" formatu, nato spodaj naloži .zip datoteko.",
"title": "Tandoor recepti"
},
"cookn": {
"description-long": "Mealie lahko uvozi recepte iz DVO Cook'n X3. Izvozite kuharsko knjigo ali jedilnik v formatu »Cook'n«, preimenujte izvozno končnico v .zip in nato naložite spodnjo datoteko .zip.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migracije receptov",
"recipe-data-migrations-explanation": "Recepte lahko migriraš iz drugih podprtih aplikacij v Mealie. To je super način za čim hitrejši začetek z Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Prihajaš iz druge aplijacije ali celo starejše verzije Mealie aplikacije? Poglej podprte migracije in preveri, če lahko uvoziš svoje podatke.",
@@ -444,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": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 strani ni mogoče najti",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept je izbrisan",
"recipe-image": "Slika recepta",
"recipe-image-updated": "Slika recepta je posodobljena",
"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": "Naslov recepta",
"recipe-settings": "Nastavitve recepta",
"recipe-update-failed": "Napaka pri posodobitvi recepta",
@@ -583,6 +592,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": "Made for {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",
@@ -624,7 +634,7 @@
"scrape-recipe-you-can-import-from-raw-data-directly": "Uvoziš lahko neposredno iz surovih podatkov",
"import-original-keywords-as-tags": "Uvozi izvorne ključne besede kot značke",
"stay-in-edit-mode": "Urejaj naprej",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Razčlenitev sestavin recepta po uvozu",
"import-from-zip": "Uvozi z Zip",
"import-from-zip-description": "Uvozi posamezen recept, ki je bil izvožen iz druge instance Mealie aplikacije.",
"import-from-html-or-json": "Uvozi iz HTML ali JSON",
@@ -671,12 +681,12 @@
"this-unit-could-not-be-parsed-automatically": "Te enote ni bilo mogoče samodejno razčleniti",
"this-food-could-not-be-parsed-automatically": "Te hrane ni bilo mogoče samodejno razčleniti",
"no-food": "Ni živila",
"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": "Pregled razčlenjenih sestavin",
"confidence-score": "Stopnja zaupanja",
"ingredient-parser-description": "Vaše sestavine so bile uspešno razčlenjene. Prosimo, preglejte sestavine, glede katerih nismo prepričani.",
"ingredient-parser-final-review-description": "Ko bodo vse sestavine pregledane, boste imeli še eno priložnost, da jih pregledate, preden spremembe uveljavite v svojem receptu.",
"add-text-as-alias-for-item": "Dodaj \"{text}\" kot vzdevek za {item}",
"delete-item": "Izbriši element"
},
"reset-servings-count": "Ponastavi števec obrokov",
"not-linked-ingredients": "Dodatne sestavine",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Iskalnik receptov",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Ne želiš več videti tega sporočila? Spremeni svoj email v uporabiških nastavitvah!",
"forgot-password": "Ste pozabili geslo",
"forgot-password-text": "Vnesi svoj email naslov, poslali ti bomo povezavo za ponastavitev gesla.",
"changes-reflected-immediately": "Spremembe na tem uporabniku se poznajo takoj."
"changes-reflected-immediately": "Spremembe na tem uporabniku se poznajo takoj.",
"default-activity": "Privzeta dejavnost",
"default-activity-hint": "Izberite, na katero stran želite priti ob prijavi iz te naprave"
},
"language-dialog": {
"translated": "prevedeno",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "Увези рецепт помоћу 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",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
@@ -583,6 +592,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -69,7 +69,7 @@
"new-notification": "Ny avisering",
"event-notifiers": "Händelseavisering",
"apprise-url-skipped-if-blank": "Apprise-URL (hoppa över om tom)",
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
"apprise-url-is-left-intentionally-blank": "Eftersom Apprise URL:er vanligtvis innehåller känslig information lämnas detta fält medvetet tomt vid redigering. Om du vill uppdatera webbadressen, ange det nya här, annars lämna det tomt för att behålla den aktuella webbadressen.",
"enable-notifier": "Aktivera avisering",
"what-events": "Vilka händelser ska denna avisering prenumerera på?",
"user-events": "Användarhändelser",
@@ -81,7 +81,7 @@
"category-events": "Kategorihändelser",
"when-a-new-user-joins-your-group": "När en ny användare går med i din grupp",
"recipe-events": "Recepthändelser",
"label-events": "Label Events"
"label-events": "Etiketthändelser"
},
"general": {
"add": "Lägg till",
@@ -399,6 +399,10 @@
"description-long": "Mealie kan importera recept från Tandoor. Exportera dina data i \"Standard\"-format, ladda sedan upp .zip nedan.",
"title": "Tandoor-recept"
},
"cookn": {
"description-long": "Mealie kan importera recept från DVO Cook'n X3. Exportera en kokbok eller meny i \"Cook'n\" format, byt namn på exporttillägget till .zip, sedan ladda upp .zip nedan.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrering av receptdata",
"recipe-data-migrations-explanation": "Recept kan migreras från en annan applikation som stöds till Mealie. Detta är ett bra sätt att komma igång med Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer från en annan app, program eller tidigare version av Mealie? Kika på migrationer och se om din data kan bli importerad.",
@@ -444,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": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 sidan hittades inte",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recept raderat",
"recipe-image": "Recept bild",
"recipe-image-updated": "Recept bild uppdaterad",
"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": "Receptets namn",
"recipe-settings": "Recept inställningar",
"recipe-update-failed": "Receptet gick inte att uppdatera",
@@ -561,7 +570,7 @@
"see-original-text": "Visa originaltext",
"original-text-with-value": "Originaltext: {originalText}",
"ingredient-linker": "Länka ingredienser",
"unlinked": "Not linked yet",
"unlinked": "Ännu inte länkad",
"linked-to-other-step": "Kopplat till annat steg",
"auto": "Auto",
"cook-mode": "Matlagningsläge",
@@ -583,6 +592,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": "Made for {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",
@@ -624,7 +634,7 @@
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importera från rådata direkt",
"import-original-keywords-as-tags": "Importera ursprungliga sökord som taggar",
"stay-in-edit-mode": "Stanna kvar i redigeringsläge",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Tolka receptingredienser efter import",
"import-from-zip": "Importera från zip",
"import-from-zip-description": "Importera ett enstaka recept som exporterades från en annan Mealie-instans.",
"import-from-html-or-json": "Importera från HTML eller JSON",
@@ -671,12 +681,12 @@
"this-unit-could-not-be-parsed-automatically": "Enheten kunde inte översättas automatiskt",
"this-food-could-not-be-parsed-automatically": "Maten kunde inte översättas automatiskt",
"no-food": "Ingen mat",
"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": "Granska tolkade ingredienser",
"confidence-score": "Konfidenspoäng",
"ingredient-parser-description": "Dina ingredienser har blivit tolkade. Se över ingredienserna vi inte är säkra på.",
"ingredient-parser-final-review-description": "När alla ingredienser har granskats har du ytterligare en chans att granska alla ingredienser innan du tillämpar ändringarna i ditt recept.",
"add-text-as-alias-for-item": "Lägg till \"{text}\" som alias för {item}",
"delete-item": "Radera objekt"
},
"reset-servings-count": "Nollställ antal portioner",
"not-linked-ingredients": "Ytterligare ingredienser",
@@ -684,7 +694,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": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
"recipe-finder": "Sök recept",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vill du inte se detta längre? Se till att ändra din e-post i dina användarinställningar!",
"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."
"changes-reflected-immediately": "Ändringar av denna användare kommer att ske omedelbart.",
"default-activity": "Standard aktivitet",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "översatt",
@@ -1177,7 +1192,7 @@
"group-details": "Gruppuppgifter",
"group-details-description": "Innan du skapar ett konto måste du skapa en grupp. Din grupp kommer bara att innehålla dig, men du kommer att kunna bjuda in andra senare. Medlemmarna i din grupp kan dela måltidsplaner, inköpslistor, recept och mycket mer!",
"use-seed-data": "Använd exempeldata",
"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 kommer med en samling av ingridienser, enheter och etiketter som kan användas för att fylla din grupp med användbara data för att organisera dina recept. Dessa översätts till det språk du just nu har valt. Du kan alltid lägga till eller ändra dessa data senare.",
"account-details": "Kontouppgifter"
},
"validation": {

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie, Tandoor'dan tarifleri içe aktarabilir. Verilerinizi \"Varsayılan\" biçimde dışa aktarın, ardından aşağıdaki .zip dosyasını yükleyin.",
"title": "Tandoor Tarifleri"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Tarif Verilerini Taşı",
"recipe-data-migrations-explanation": "Tarifler desteklenen başka bir uygulamadan Mealie'ye taşınabilir. Bu Mealie kullanmaya başlamak için mükemmel bir yöntemdir.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Başka bir uygulamadan mı yoksa Mealie'nin daha eski bir sürümünden mi geliyorsunuz? Taşıma işlemlerine göz atın ve verilerinizin içe aktarılıp aktarılamayacağını görün.",
@@ -444,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ı",
@@ -511,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",
@@ -583,6 +592,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",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Artık bunu görmek istemiyor musunuz? Kullanıcı ayarlarınızda e-postanızı değiştirmeyi unutmayın!",
"forgot-password": "Şifreni mi Unuttun?",
"forgot-password-text": "Lütfen e-posta adresinizi girin, size şifrenizi sıfırlamanız için bir bağlantı göndereceğiz.",
"changes-reflected-immediately": "Bu kullanıcıda yapılan değişiklikler hemen yansıtılacaktır."
"changes-reflected-immediately": "Bu kullanıcıda yapılan değişiklikler hemen yansıtılacaktır.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "çevirilmiş",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie може імпортувати рецепти з Tandoor. Експортуйте свої дані в формат \"Default\", а потім завантажте .zip нижче.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie може імпортувати рецепти з DVO Cook'n X3. Експортуйте кулінарну книгу або меню у форматі «Cook'n», перейменуйте розширення експорту на .zip, а потім завантажте файл .zip нижче.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Міграція рецептів",
"recipe-data-migrations-explanation": "Рецепти можна мігрувати з іншого застосунку до Mealie. Це чудовий спосіб розпочати роботу з Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Використовуєте іншу програму або іще старішу версію Mealie? Перевірте документацію з міграції та подивіться, чи можуть Ваші дані бути імпортовані.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Пробує розділити абзац по '1)' або '1.' шаблону",
"import-by-url": "Імпортувати рецепт з URL",
"create-manually": "Створити рецепт вручну",
"make-recipe-image": "Зробити це зображенням рецепту"
"make-recipe-image": "Зробити це зображенням рецепту",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 - Сторінка не знайдена",
@@ -511,6 +517,9 @@
"recipe-deleted": "Рецепт видалено",
"recipe-image": "Зображення рецепту",
"recipe-image-updated": "Зображення рецепту оновлено",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Назва рецепта",
"recipe-settings": "Налаштування рецепта",
"recipe-update-failed": "Не вдалося оновити рецепт",
@@ -583,6 +592,7 @@
"made-this": "Я це приготував",
"how-did-it-turn-out": "Як вийшло?",
"user-made-this": "{user} зробив це",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Додати до хроніки",
"failed-to-add-to-timeline": "Не вдалося додати до хроніки",
"failed-to-update-recipe": "Не вдалося оновити рецепт",
@@ -684,7 +694,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": "Шукач рецептів",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Більше не хочете це бачити? Обов'язково змініть адресу електронної пошти в налаштуваннях користувача!",
"forgot-password": "Нагадати пароль",
"forgot-password-text": "Будь ласка, введіть адресу вашої електронної пошти й вам надійде повідомлення, щоб відновити пароль.",
"changes-reflected-immediately": "Зміни для цього користувача будуть негайно відображені."
"changes-reflected-immediately": "Зміни для цього користувача будуть негайно відображені.",
"default-activity": "Дія за замовчуванням",
"default-activity-hint": "Виберіть, на яку сторінку ви хочете перейти після входу з цього пристрою"
},
"language-dialog": {
"translated": "перекладено",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "Import a recipe by URL",
"create-manually": "Create a recipe manually",
"make-recipe-image": "Make this the recipe image"
"make-recipe-image": "Make this the recipe image",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 Page not found",
@@ -511,6 +517,9 @@
"recipe-deleted": "Recipe deleted",
"recipe-image": "Recipe Image",
"recipe-image-updated": "Recipe image updated",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Recipe Name",
"recipe-settings": "Recipe Settings",
"recipe-update-failed": "Recipe update failed",
@@ -583,6 +592,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie支持从Tandoor中导入食谱。在Tandoor中以“默认”格式导出数据并在下方上传zip文件。",
"title": "Tandoor食谱"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "食谱数据迁移",
"recipe-data-migrations-explanation": "你可以从受支持的应用中将食谱迁移至Mealie这是上手Mealie的好方法。",
"coming-from-another-application-or-an-even-older-version-of-mealie": "之前使用其他食谱应用或是旧版本Mealie吗检查迁移设置来确认你的原有数据是否可以导入。",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "尝试匹配 “1)” 或 “1.” 的格式来分割段落",
"import-by-url": "通过网址导入食谱",
"create-manually": "手动创建食谱",
"make-recipe-image": "将此设为食谱图片"
"make-recipe-image": "将此设为食谱图片",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404-页面未找到",
@@ -511,6 +517,9 @@
"recipe-deleted": "食谱已删除",
"recipe-image": "食谱图片",
"recipe-image-updated": "食谱图片已更新",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "食谱名称",
"recipe-settings": "食谱设置",
"recipe-update-failed": "食谱更新失败",
@@ -583,6 +592,7 @@
"made-this": "我做了这道菜",
"how-did-it-turn-out": "成品怎么样?",
"user-made-this": "{user}制作了这个",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "添加到时间轴",
"failed-to-add-to-timeline": "未能添加到时间轴",
"failed-to-update-recipe": "更新配方失败",
@@ -684,7 +694,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": "食谱搜索",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "不想再看到这条消息了吗?请务必在用户设置中更改你的邮箱!",
"forgot-password": "忘记密码",
"forgot-password-text": "请输入你的邮箱地址,我们会发给你重置密码的链接。",
"changes-reflected-immediately": "对用户的更改将立即生效。"
"changes-reflected-immediately": "对用户的更改将立即生效。",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "已翻译",

View File

@@ -399,6 +399,10 @@
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Recipe Data Migrations",
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
@@ -444,7 +448,9 @@
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"import-by-url": "Import a recipe by URL",
"create-manually": "Create a recipe manually",
"make-recipe-image": "Make this the recipe image"
"make-recipe-image": "Make this the recipe image",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
},
"page": {
"404-page-not-found": "404 找不到頁面",
@@ -511,6 +517,9 @@
"recipe-deleted": "食譜已刪除",
"recipe-image": "食譜封面",
"recipe-image-updated": "食譜封面已更新",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "食譜名稱",
"recipe-settings": "食譜設定",
"recipe-update-failed": "食譜更新失敗",
@@ -583,6 +592,7 @@
"made-this": "I Made This",
"how-did-it-turn-out": "How did it turn out?",
"user-made-this": "{user} made this",
"made-for-recipe": "Made for {recipe}",
"added-to-timeline": "Added to timeline",
"failed-to-add-to-timeline": "Failed to add to timeline",
"failed-to-update-recipe": "Failed to update recipe",
@@ -684,7 +694,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",
@@ -1059,7 +1072,9 @@
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
"forgot-password": "Forgot Password",
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
"changes-reflected-immediately": "Changes to this user will be reflected immediately.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
"translated": "translated",

View File

@@ -0,0 +1,18 @@
export type I18n = ReturnType<typeof useI18n>;
export type TRoute = string;
export type TranslationResult = string;
export type ActivityRoute = (groupSlug?: string) => TRoute;
export type ActivityLabel = (i18n: I18n) => TranslationResult;
export type Activity = {
key: ActivityKey;
route: ActivityRoute;
label: ActivityLabel;
};
export const enum ActivityKey {
RECIPES = "recipes",
MEALPLANNER = "mealplanner",
SHOPPING_LIST = "shopping_list",
}

View File

@@ -14,7 +14,8 @@ export type SupportedMigrations =
| "tandoor"
| "plantoeat"
| "myrecipebox"
| "recipekeeper";
| "recipekeeper"
| "cookn";
export interface CreateGroupPreferences {
privateGroup?: boolean;

View File

@@ -309,6 +309,7 @@ export interface RecipeIngredient {
quantity?: number | null;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
title?: string | null;
@@ -396,6 +397,129 @@ export interface CreateIngredientFoodAlias {
name: string;
[k: string]: unknown;
}
export interface Recipe {
id?: string | null;
userId?: string;
householdId?: string;
groupId?: string;
name?: string | null;
slug?: string;
image?: unknown;
recipeServings?: number;
recipeYieldQuantity?: number;
recipeYield?: string | null;
totalTime?: string | null;
prepTime?: string | null;
cookTime?: string | null;
performTime?: string | null;
description?: string | null;
recipeCategory?: RecipeCategory[] | null;
tags?: RecipeTag[] | null;
tools?: RecipeTool[];
rating?: number | null;
orgURL?: string | null;
dateAdded?: string | null;
dateUpdated?: string | null;
createdAt?: string | null;
updatedAt?: string | null;
lastMade?: string | null;
recipeIngredient?: RecipeIngredient[];
recipeInstructions?: RecipeStep[] | null;
nutrition?: Nutrition | null;
settings?: RecipeSettings | null;
assets?: RecipeAsset[] | null;
notes?: RecipeNote[] | null;
extras?: {
[k: string]: unknown;
} | null;
comments?: RecipeCommentOut[] | null;
[k: string]: unknown;
}
export interface RecipeCategory {
id?: string | null;
groupId?: string | null;
name: string;
slug: string;
[k: string]: unknown;
}
export interface RecipeTag {
id?: string | null;
groupId?: string | null;
name: string;
slug: string;
[k: string]: unknown;
}
export interface RecipeTool {
id: string;
groupId?: string | null;
name: string;
slug: string;
householdsWithTool?: string[];
[k: string]: unknown;
}
export interface RecipeStep {
id?: string | null;
title?: string | null;
summary?: string | null;
text: string;
ingredientReferences?: IngredientReferences[];
[k: string]: unknown;
}
export interface IngredientReferences {
referenceId?: string | null;
[k: string]: unknown;
}
export interface Nutrition {
calories?: string | null;
carbohydrateContent?: string | null;
cholesterolContent?: string | null;
fatContent?: string | null;
fiberContent?: string | null;
proteinContent?: string | null;
saturatedFatContent?: string | null;
sodiumContent?: string | null;
sugarContent?: string | null;
transFatContent?: string | null;
unsaturatedFatContent?: string | null;
[k: string]: unknown;
}
export interface RecipeSettings {
public?: boolean;
showNutrition?: boolean;
showAssets?: boolean;
landscapeView?: boolean;
disableComments?: boolean;
locked?: boolean;
[k: string]: unknown;
}
export interface RecipeAsset {
name: string;
icon: string;
fileName?: string | null;
[k: string]: unknown;
}
export interface RecipeNote {
title: string;
text: string;
[k: string]: unknown;
}
export interface RecipeCommentOut {
recipeId: string;
text: string;
id: string;
createdAt: string;
updatedAt: string;
userId: string;
user: UserBase;
[k: string]: unknown;
}
export interface UserBase {
id: string;
username?: string | null;
admin: boolean;
fullName?: string | null;
[k: string]: unknown;
}
export interface ShoppingListAddRecipeParamsBulk {
recipeIncrementQuantity?: number;
recipeIngredients?: RecipeIngredient[] | null;
@@ -413,6 +537,7 @@ export interface ShoppingListItemBase {
quantity?: number;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
shoppingListId: string;
@@ -429,6 +554,7 @@ export interface ShoppingListItemCreate {
quantity?: number;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
shoppingListId: string;
@@ -453,6 +579,7 @@ export interface ShoppingListItemOut {
quantity?: number;
unit?: IngredientUnit | null;
food?: IngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
shoppingListId: string;
@@ -492,6 +619,7 @@ export interface ShoppingListItemUpdate {
quantity?: number;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
shoppingListId: string;
@@ -509,6 +637,7 @@ export interface ShoppingListItemUpdateBulk {
quantity?: number;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
shoppingListId: string;
@@ -595,28 +724,6 @@ export interface RecipeSummary {
updatedAt?: string | null;
lastMade?: string | null;
}
export interface RecipeCategory {
id?: string | null;
groupId?: string | null;
name: string;
slug: string;
[k: string]: unknown;
}
export interface RecipeTag {
id?: string | null;
groupId?: string | null;
name: string;
slug: string;
[k: string]: unknown;
}
export interface RecipeTool {
id: string;
groupId?: string | null;
name: string;
slug: string;
householdsWithTool?: string[];
[k: string]: unknown;
}
export interface ShoppingListRemoveRecipeParams {
recipeDecrementQuantity?: number;
}
@@ -682,6 +789,7 @@ export interface RecipeIngredientBase {
quantity?: number | null;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
}

View File

@@ -214,6 +214,7 @@ export interface RecipeIngredient {
quantity?: number | null;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
title?: string | null;
@@ -349,6 +350,7 @@ export interface RecipeIngredientBase {
quantity?: number | null;
unit?: IngredientUnit | CreateIngredientUnit | null;
food?: IngredientFood | CreateIngredientFood | null;
referencedRecipe?: Recipe | null;
note?: string | null;
display?: string;
}
@@ -470,9 +472,6 @@ export interface RecipeToolSave {
householdsWithTool?: string[];
groupId: string;
}
export interface RecipeZipTokenResponse {
token: string;
}
export interface SaveIngredientFood {
id?: string | null;
name: string;

View File

@@ -6,9 +6,14 @@ const prefix = "/api";
const routes = {
shareToken: `${prefix}/shared/recipes`,
shareTokenId: (id: string) => `${prefix}/shared/recipes/${id}`,
shareTokenIdZip: (id: string) => `${prefix}/recipes/shared/${id}/zip`,
};
export class RecipeShareApi extends BaseCRUDAPI<RecipeShareTokenCreate, RecipeShareToken> {
baseRoute: string = routes.shareToken;
itemRoute = routes.shareTokenId;
getZipRedirectUrl(tokenId: string) {
return routes.shareTokenIdZip(tokenId);
}
}

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