Compare commits

...

117 Commits

Author SHA1 Message Date
renovate[bot]
85fb7c603a chore(deps): update dependency types-python-dateutil to v2.9.0.20260124 2026-01-24 04:40:32 +00:00
renovate[bot]
a3d64c0761 fix(deps): update dependency pillow-heif to v1.2.0 (#6910)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-23 08:50:03 -06:00
Hayden
73c664649d chore(l10n): New Crowdin updates (#6911) 2026-01-23 18:08:07 +07:00
renovate[bot]
d887e68228 chore(deps): update dependency ruff to v0.14.14 (#6909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-22 19:59:48 -06:00
Hayden
a8d3ed3310 chore(l10n): New Crowdin updates (#6908) 2026-01-22 15:43:48 -06:00
Hayden
00bd45c8f1 chore(l10n): New Crowdin updates (#6905) 2026-01-22 14:35:50 +00:00
renovate[bot]
05003a5c6f fix(deps): update dependency sqlalchemy to v2.0.46 (#6903)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-22 03:50:27 +00:00
renovate[bot]
e2be09b5d3 chore(deps): update dependency setuptools to v80.10.1 (#6901)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-21 21:39:54 -06:00
github-actions[bot]
b81e0ac03b chore(l10n): Crowdin locale sync (#6891)
Co-authored-by: GitHub Action <action@github.com>
2026-01-22 03:24:04 +00:00
renovate[bot]
c5d822cded chore(deps): update node.js to b2b2184 (#6879)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-21 21:13:45 -06:00
Hayden
0fc66fee9a chore(l10n): New Crowdin updates (#6888) 2026-01-21 03:44:18 +00:00
github-actions[bot]
612c07e6f3 chore(auto): Update pre-commit hooks (#6895) 2026-01-21 02:52:58 +00:00
renovate[bot]
a0ac2923d6 fix(deps): update dependency apprise to v1.9.7 (#6898) 2026-01-20 20:42:15 -06:00
Hayden
7107c08021 chore(l10n): New Crowdin updates (#6886) 2026-01-16 17:13:20 -06:00
renovate[bot]
a0e336edcb fix(deps): update dependency alembic to v1.18.1 (#6878)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-16 13:29:38 -06:00
Hayden
3e306638d0 fix: prevent XSS via javascript: URIs in recipe actions (#6885) 2026-01-16 12:19:27 -06:00
Patrick Lehner (he/him)
a72641b32e feat: Use toggle button for switching any/all mode for search filters (#6833) 2026-01-16 15:52:11 +00:00
renovate[bot]
f4ed9d92bf chore(deps): update dependency ruff to v0.14.13 (#6881)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-16 09:38:32 -06:00
Hayden
5ae35c3500 chore(l10n): New Crowdin updates (#6870) 2026-01-14 23:36:27 +00:00
renovate[bot]
08666e6c21 chore(deps): update node.js to 0ab63ca (#6872) 2026-01-14 17:26:34 -06:00
Hayden
5ae530a637 chore(l10n): New Crowdin updates (#6867) 2026-01-12 14:44:13 -06:00
github-actions[bot]
2b07497486 chore(auto): Update pre-commit hooks (#6866)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2026-01-12 18:34:46 +00:00
github-actions[bot]
3b65642325 chore(l10n): Crowdin locale sync (#6862)
Co-authored-by: GitHub Action <action@github.com>
2026-01-12 18:20:16 +00:00
Hayden
fdd1057e79 chore(l10n): New Crowdin updates (#6864) 2026-01-12 12:10:00 -06:00
Hayden
f1afebcc04 chore(l10n): New Crowdin updates (#6863) 2026-01-11 17:00:15 +07:00
Hayden
e711be7efa chore(l10n): New Crowdin updates (#6861) 2026-01-10 19:51:06 +00:00
renovate[bot]
ec94b8179c fix(deps): update dependency openai to v2.15.0 (#6859)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-09 22:32:27 -06:00
renovate[bot]
a7c1d6f486 fix(deps): update dependency alembic to v1.18.0 (#6858)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-10 03:54:14 +00:00
renovate[bot]
df0b792c52 chore(deps): update dependency ruff to v0.14.11 (#6852)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-09 21:43:04 -06:00
Hayden
1f5054fcbd chore(l10n): New Crowdin updates (#6843) 2026-01-10 03:24:28 +00:00
renovate[bot]
ca483b9cbe chore(deps): update dependency types-requests to v2.32.4.20260107 (#6846) 2026-01-09 21:14:02 -06:00
Mike Nguyen
03dc459162 docs: fix authentik oidc link (#6851) 2026-01-08 20:47:15 +00:00
Michael Genson
cf8f5fe2a2 docs: Fix typo and remove unused tip (#6849) 2026-01-07 14:31:57 -06:00
Hayden
760350ef88 chore(l10n): New Crowdin updates (#6840) 2026-01-05 23:47:44 -06:00
Michael Genson
706d4ee0b5 fix: Coerce null servings into 0 servings (#6839) 2026-01-05 17:49:34 -06:00
Patrick Lehner (he/him)
5fd8545cbe fix: Tags can't be renamed (#6835) 2026-01-05 09:46:48 -06:00
Hayden
3397c06db2 chore(l10n): New Crowdin updates (#6832) 2026-01-04 20:00:39 -06:00
Hayden
22df7a1ec7 chore(l10n): New Crowdin updates (#6827) 2026-01-04 09:58:19 -06:00
renovate[bot]
e87b0c75b6 fix(deps): update dependency pillow to v12.1.0 (#6816)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-03 23:34:36 -06:00
Hayden
b406b7fa16 chore(l10n): New Crowdin updates (#6806)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-04 03:18:35 +00:00
github-actions[bot]
7114ed1122 chore(l10n): Crowdin locale sync (#6825)
Co-authored-by: GitHub Action <action@github.com>
2026-01-03 21:08:10 -06:00
mealie-commit-bot[bot]
70b5865dce chore: bump version to v3.9.2 2026-01-02 19:40:19 +00:00
Michael Genson
3be7056f2c fix: Exception handling for recipe image reprocessing (#6822) 2026-01-02 13:17:07 -06:00
Arsène Reymond
1b57310535 fix: allow start attribute on ordered lists (SafeMarkdown) (#6820)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-02 19:02:11 +00:00
Patrick Lehner (he/him)
2b15d9a515 fix: Make quantity input in shopping list item editor visually consistent with other inputs (#6810) 2026-01-02 12:51:53 -06:00
Hayden
adc9c0b970 chore(l10n): New Crowdin updates (#6804) 2025-12-31 00:36:01 +00:00
renovate[bot]
bec1708891 chore(deps): update node.js to b52a8d1 (#6800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-30 10:33:30 -06:00
Patrick Lehner (he/him)
66bb545454 dev: Small .gitignore fixes (#6796) 2025-12-30 15:42:38 +00:00
renovate[bot]
c1ebf04291 chore(deps): update node.js to 33587cf (#6795)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-30 05:20:34 +00:00
mealie-commit-bot[bot]
3166060644 chore: bump version to v3.9.1 2025-12-30 01:56:10 +00:00
Michael Genson
bde7cf6f9d fix: Revert extended touch on shopping list (#6794) 2025-12-29 19:24:03 -06:00
Hayden
8ea9bb19f6 chore(l10n): New Crowdin updates (#6792) 2025-12-29 17:11:05 -06:00
mealie-commit-bot[bot]
6d0f9b0d35 chore: bump version to v3.9.0 2025-12-29 20:46:19 +00:00
Hayden
df541c1924 chore(l10n): New Crowdin updates (#6789) 2025-12-29 14:34:07 -06:00
Hayden
9af92ff397 chore(l10n): New Crowdin updates (#6788) 2025-12-28 21:54:38 +00:00
renovate[bot]
554d50b079 chore(deps): update dependency coverage to v7.13.1 (#6787) 2025-12-28 15:43:41 -06:00
github-actions[bot]
a00e2e8b68 chore(l10n): Crowdin locale sync (#6786)
Co-authored-by: GitHub Action <action@github.com>
2025-12-28 00:02:46 -06:00
renovate[bot]
4fcfbaff3b fix(deps): update dependency fastapi to v0.128.0 (#6783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-27 12:56:10 -06:00
renovate[bot]
7792f0504d fix(deps): update dependency fastapi to v0.127.1 (#6779) 2025-12-26 12:13:31 -06:00
Hayden
3ca6c67f25 chore(l10n): New Crowdin updates (#6778) 2025-12-25 14:30:16 +00:00
Arsène Reymond
2eb0fdc863 fix: resize pwa maskable icons (#6777) 2025-12-24 18:20:10 +00:00
Hayden
192d48c4a6 chore(l10n): New Crowdin updates (#6776) 2025-12-24 09:42:26 -06:00
Michael Genson
e4f38685b3 fix(deps): Bump various frontend deps (#6774) 2025-12-23 17:12:52 -06:00
Michael Genson
d02023e12c fix: Only fetch recipes with a household id (#6773) 2025-12-23 16:48:27 -06:00
Michael Genson
64d8786d8f fix: Improve recipe bulk deletion (#6772) 2025-12-23 12:31:53 -06:00
Michael Genson
0971d59fa6 fix: Can't remove organizer (#6771) 2025-12-23 11:32:14 -06:00
Hayden
9b799ca441 chore(l10n): New Crowdin updates (#6768) 2025-12-22 23:36:50 -06:00
Michael Genson
193b823688 feat: Replace number inputs with new v-number-input compontent (#6767) 2025-12-22 18:45:52 -06:00
Michael Genson
c64c2d25e7 fix: Add resiliency to LDAP admin filter (#6766) 2025-12-22 15:37:15 -06:00
onemustpersist
8b4111d68f fix: Imported API keys not working on a new server #6477 (#6496)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Co-authored-by: Michael Genson <genson.michael@gmail.com>
2025-12-22 12:08:44 -06:00
miah
9d601ea4b5 feat: Animate shopping list and increase touch target (#6569)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-22 11:55:25 -06:00
gitolicious
95e1bbce2b feat: persist selected dates in meal planner (#6512)
Co-authored-by: Michael Genson <genson.michael@gmail.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-22 11:10:23 -06:00
Aurelien
7b32508201 fix: the add_pagination_to_query now always returns the correct count (#6505)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-22 10:39:35 -06:00
Hayden
6ed85d72d7 chore(l10n): New Crowdin updates (#6765) 2025-12-22 15:59:19 +00:00
github-actions[bot]
cd2a522f25 chore(auto): Update pre-commit hooks (#6760)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2025-12-22 15:48:53 +00:00
Arsène Reymond
6bd6400aba fix: add loader for create backup button (#6763) 2025-12-22 09:38:44 -06:00
Michael Genson
8b92d6ee04 fix: Backup selection doesn't work sometimes (#6759) 2025-12-21 20:56:51 -06:00
Michael Genson
7cc2ed75e5 fix: Consistant Shopping List Recipe State (#6758) 2025-12-21 20:27:00 -06:00
renovate[bot]
cb7f46c0ad fix(deps): update dependency fastapi to v0.127.0 (#6756)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 13:52:34 -06:00
renovate[bot]
cb12aedf72 fix(deps): update dependency openai to v2.14.0 (#6745) 2025-12-21 12:48:06 -06:00
renovate[bot]
8c35a26ab0 chore(deps): update dependency mkdocs-material to v9.7.1 (#6741)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 18:05:50 +00:00
github-actions[bot]
b2d0f46dd2 chore(l10n): Crowdin locale sync (#6754)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-21 11:53:25 -06:00
Hayden
2c4b7bf611 chore(l10n): New Crowdin updates (#6748)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-21 11:52:47 -06:00
renovate[bot]
38e542bcd3 fix(deps): update dependency python-multipart to v0.0.21 (#6737)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 11:52:15 -06:00
renovate[bot]
e53452c19c fix(deps): update dependency uvicorn to v0.40.0 (#6757)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 11:35:48 -06:00
Hayden
13213476d8 docs: add --no-project flags to skip mealie installation (#6755) 2025-12-20 21:23:11 -06:00
Hayden
9925450173 docs: isolate docs dependencies to avoid python-ldap build (#6753) 2025-12-20 20:45:59 -06:00
Hayden
efb9dae681 docs: add GitHub Actions workflow for docs deployment (#6752) 2025-12-20 20:26:14 -06:00
renovate[bot]
cee93d2a87 fix(deps): update dependency fastapi to v0.126.0 (#6750)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-20 16:06:03 -06:00
Arsène Reymond
0d4a8654c1 fix: PWA maskable android icons & enctype shared_target (#6731)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-19 05:06:27 +00:00
Hayden
95b1be07bb chore(l10n): New Crowdin updates (#6744)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-19 04:53:09 +00:00
mealie-commit-bot[bot]
a6fc98fc82 chore: bump version to v3.8.0 2025-12-19 01:37:16 +00:00
Michael Genson
6f03010f6c fix: Security Patches (#6743) 2025-12-18 22:54:16 +00:00
renovate[bot]
69397c91b8 fix(deps): update dependency openai to v2.13.0 (#6726)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-18 21:45:42 +00:00
Hayden
798792dcdc chore(l10n): New Crowdin updates (#6736)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-18 15:32:22 -06:00
renovate[bot]
cc32dd9fa6 chore(deps): update dependency ruff to v0.14.10 (#6742)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-18 15:32:00 -06:00
renovate[bot]
0c64eb29f9 fix(deps): update dependency fastapi to v0.125.0 (#6740)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-17 17:37:43 -06:00
renovate[bot]
8baa5cc315 chore(deps): update dependency pre-commit to v4.5.1 (#6734)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-17 00:07:49 +00:00
Hayden
6f3a5c6c8f chore(l10n): New Crowdin updates (#6733) 2025-12-16 17:42:13 +00:00
Hayden
778078590b chore(l10n): New Crowdin updates (#6729) 2025-12-15 22:54:37 -06:00
github-actions[bot]
53c82e5491 chore(auto): Update pre-commit hooks (#6724) 2025-12-15 18:16:59 +00:00
Hayden
fef114d97f chore(l10n): New Crowdin updates (#6725) 2025-12-15 08:55:48 -06:00
Hayden
e80cbfad7f chore(l10n): New Crowdin updates (#6722)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-14 23:31:48 -06:00
renovate[bot]
99527ce738 chore(deps): update dependency mypy to v1.19.1 (#6723)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-14 23:31:34 -06:00
Arsène Reymond
08ccced734 fix: localize text validators message (#6719) 2025-12-14 09:56:11 -06:00
github-actions[bot]
43c2c9552b chore(l10n): Crowdin locale sync (#6716)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-12-13 22:10:43 -06:00
Hayden
db5741c7ee chore(l10n): New Crowdin updates (#6710) 2025-12-13 22:10:23 -06:00
renovate[bot]
a1e394cf36 fix(deps): update dependency tzdata to v2025.3 (#6713) 2025-12-13 15:21:42 -06:00
Michael Genson
bdbef1ab9e fix: More lenient postgres override parsing (#6712) 2025-12-13 14:21:54 -06:00
Michael Genson
e5276f6c20 fix: Put tooltips behind app bar (#6711) 2025-12-13 10:56:18 -06:00
Michael Genson
20a6e71b31 feat: Optionally include URL when importing via HTML/JSON (#6709) 2025-12-12 23:20:26 -06:00
Michael Genson
24c111af7b chore: Miscellaneous cleanup (#6708) 2025-12-12 22:48:49 -06:00
davidschinkel
ab4559319e fix: Improved bulk deletion by reducing refreshs (#6634)
Co-authored-by: David Schinkel <david@zollsoft.de>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2025-12-13 04:08:04 +00:00
Michael Genson
2f8625ac44 fix: Disable submit on enter when editing timeline events (#6707) 2025-12-12 21:56:36 -06:00
Hayden
dd146afa57 chore(l10n): New Crowdin updates (#6706) 2025-12-12 21:20:34 -06:00
renovate[bot]
91d15f671e fix(deps): update dependency authlib to v1.6.6 (#6700)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-13 01:54:41 +00:00
renovate[bot]
7008b13246 fix(deps): update dependency fastapi to v0.124.4 (#6702)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-12 19:43:35 -06:00
176 changed files with 6409 additions and 5868 deletions

View File

@@ -13,6 +13,7 @@ RUN echo "export PROMPT_COMMAND='history -a'" >> /home/vscode/.bashrc \
&& chown vscode:vscode -R /home/vscode/
RUN npm install -g @go-task/cli
RUN npm install -g json-schema-to-typescript
# Install additional OS packages
RUN apt-get update \

View File

@@ -23,7 +23,6 @@
"settings": {
"python.defaultInterpreterPath": "/usr/local/bin/python",
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"mypy.runUsingActiveInterpreter": true
},
@@ -34,6 +33,7 @@
"ms-python.pylint",
"ms-python.python",
"ms-python.vscode-pylance",
"streetsidesoftware.code-spell-checker-cspell-bundled-dictionaries",
"Vue.volar"
]
}
@@ -41,6 +41,7 @@
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [
3000,
8000, // used by mkdocs
9000,
9091, // used by docker production
24678 // used by nuxt when hot-reloading using polling

50
.github/workflows/docs.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
name: Deploy Documentation
on:
push:
branches: [mealie-next]
paths:
- 'docs/**'
- '.github/workflows/docs.yml'
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
- name: Install dependencies
run: uv sync --only-group docs --no-install-project
- name: Build docs
run: uv run --no-project mkdocs build -d site
working-directory: docs
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: docs/site
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

6
.gitignore vendored
View File

@@ -20,6 +20,7 @@ dev/data/backups/*
dev/data/debug/*
dev/data/img/*
dev/data/migration/*
dev/data/templates/*
dev/data/users/*
dev/data/groups/*
@@ -69,8 +70,11 @@ wheels/
.installed.cfg
*.egg
# packaged output - temporarily written here by `uv build`
/mealie-*
# frontend copied into Python module for packaging purposes
/mealie/frontend/
/mealie/frontend
# PyInstaller
# Usually these files are written by a python script from a template

View File

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

View File

@@ -1,7 +1,7 @@
###############################################
# Frontend Build
###############################################
FROM node:24@sha256:20988bcdc6dc76690023eb2505dd273bdeefddcd0bde4bfd1efe4ebf8707f747 \
FROM node:24@sha256:b2b2184ba9b78c022e1d6a7924ec6fba577adf28f15c9d9c457730cc4ad3807a \
AS frontend-builder
WORKDIR /frontend

View File

@@ -9,7 +9,7 @@
Mealie supports 3rd party authentication via [OpenID Connect (OIDC)](https://openid.net/connect/), an identity layer built on top of OAuth2. OIDC is supported by many Identity Providers (IdP), including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authentik](https://integrations.goauthentik.io/documentation/mealie/)
- [Authelia](https://www.authelia.com/integration/openid-connect/mealie/)
- [Keycloak](https://www.keycloak.org/docs/latest/securing_apps/#_oidc)
- [Okta](https://www.okta.com/openid-connect/)
@@ -68,7 +68,6 @@ Example configurations for several Identity Providers have been provided by the
If you don't see your provider and have successfully set it up, please consider [creating your own example](https://github.com/mealie-recipes/mealie/discussions/new?category=oauth-provider-example) so that others can have a smoother setup.
## Migration from Mealie v1.x
**High level changes**

View File

@@ -85,13 +85,13 @@ The meal planner has the concept of plan rules. These offer a flexible way to us
The shopping lists feature is a great way to keep track of what you need to buy for your next meal. You can add items directly to the shopping list or link a recipe and all of it's ingredients to track meals during the week.
Managing shopping lists can be done from the Sidebar > Shopping Lists.
Managing shopping lists can be done from the Sidebar > Shopping Lists.
Here you will be able to:
- See items already on the Shopping List
- See linked recipes with ingredients
- Toggling via the 'Pot' icon will show you the linked recipe, allowing you to click to access it.
- Toggling via the 'Pot' icon will show you the linked recipe, allowing you to click to access it.
- Check off an item
- Add / Change / Remove / Sort Items via the grid icon
- Be sure if you are modifying an ingredient to click the 'Save' icon.
@@ -103,13 +103,10 @@ Here you will be able to:
!!! tip
You can use Labels to categorize your ingredients. You may want to Label by Food Type (Frozen, Fresh, etc), by Store, Tool, Recipe, or more. Play around with this to see what works best for you.
!!! tip
You can toggle 'Food' on items so that if you add multiple of the same food / ingredient, Mealie will automatically combine them together. Do this by editing an item in the Shopping List and clicking the 'Apple' icon. If you then have recipes that contain "1 | cup | cheese" and "2 | cup | cheese" this would be combined to show "3 cups of cheese."
[See FAQ for more information](../getting-started/faq.md)
[Shopping List Demo](https://demo.mealie.io/shopping-lists){ .md-button .md-button--primary }
## Integrations
@@ -198,7 +195,7 @@ Mealie lets you fully customize how you organize your users. You can use Groups
### Groups
Groups are fully isolated instances of Mealie. Think of a goup as a completely separate, fully self-contained site. There is no data shared between groups. Each group has its own users, recipes, tags, categories, etc. A user logged-in to one group cannot make any changes to another.
Groups are fully isolated instances of Mealie. Think of a group as a completely separate, fully self-contained site. There is no data shared between groups. Each group has its own users, recipes, tags, categories, etc. A user logged-in to one group cannot make any changes to another.
Common use cases for groups include:

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.7.0`
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.9.2`
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.7.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.9.2 # (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.7.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.9.2 # (3)
container_name: mealie
restart: always
ports:

View File

File diff suppressed because one or more lines are too long

View File

@@ -32,8 +32,8 @@ theme:
markdown_extensions:
- pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
- def_list
- pymdownx.highlight
- pymdownx.superfences

View File

@@ -14,7 +14,7 @@
<BaseButton
download
size="small"
:download-url="`/api/recipes/bulk-actions/export/download?path=${item.path}`"
:download-url="`/api/recipes/bulk-actions/export/${item.id}/download`"
/>
</template>
</v-data-table>

View File

@@ -144,11 +144,13 @@
variant="underlined"
@update:model-value="setFieldValue(field, index, $event)"
/>
<v-text-field
<v-number-input
v-else-if="field.type === 'number'"
:model-value="field.value"
type="number"
variant="underlined"
control-variant="stacked"
inset
:precision="null"
@update:model-value="setFieldValue(field, index, $event)"
/>
<v-checkbox

View File

@@ -126,7 +126,7 @@ withDefaults(defineProps<Props>(), {
canEdit: false,
});
const emit = defineEmits(["print", "input", "delete", "close", "edit"]);
const emit = defineEmits(["print", "input", "save", "delete", "close", "json", "edit"]);
const deleteDialog = ref(false);

View File

@@ -6,7 +6,7 @@
:title="$t('recipe.add-to-list')"
:icon="$globals.icons.cartCheck"
>
<v-container v-if="!shoppingListChoices.length">
<v-container v-if="!filteredShoppingLists.length">
<BasePageTitle>
<template #title>
{{ $t('shopping-list.no-shopping-lists-found') }}
@@ -15,7 +15,7 @@
</v-container>
<v-card-text>
<v-card
v-for="list in shoppingListChoices"
v-for="list in filteredShoppingLists"
:key="list.id"
hover
class="my-2 left-border"
@@ -222,6 +222,10 @@ const api = useUserApi();
const preferences = useShoppingListPreferences();
const ready = ref(false);
// Capture values at initialization to avoid reactive updates
const currentHouseholdSlug = ref("");
const filteredShoppingLists = ref<ShoppingListSummary[]>([]);
const state = reactive({
shoppingListDialog: true,
shoppingListIngredientDialog: false,
@@ -230,31 +234,25 @@ const state = reactive({
const { shoppingListDialog, shoppingListIngredientDialog, shoppingListShowAllToggled: _shoppingListShowAllToggled } = toRefs(state);
const userHousehold = computed(() => {
return $auth.user.value?.householdSlug || "";
});
const shoppingListChoices = computed(() => {
return props.shoppingLists.filter(list => preferences.value.viewAllLists || list.userId === $auth.user.value?.id);
});
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
watchEffect(
() => {
if (shoppingListChoices.value.length === 1 && !state.shoppingListShowAllToggled) {
selectedShoppingList.value = shoppingListChoices.value[0];
watch(dialog, (newVal, oldVal) => {
if (newVal && !oldVal) {
currentHouseholdSlug.value = $auth.user.value?.householdSlug || "";
filteredShoppingLists.value = props.shoppingLists.filter(
list => preferences.value.viewAllLists || list.userId === $auth.user.value?.id,
);
if (filteredShoppingLists.value.length === 1 && !state.shoppingListShowAllToggled) {
selectedShoppingList.value = filteredShoppingLists.value[0];
openShoppingListIngredientDialog(selectedShoppingList.value);
}
else {
ready.value = true;
}
},
);
watch(dialog, (val) => {
if (!val) {
}
else if (!newVal) {
initState();
}
});
@@ -274,22 +272,26 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
continue;
}
if (!(recipe.id && recipe.name && recipe.recipeIngredient)) {
const { data } = await api.recipes.getOne(recipe.slug);
// Create a local copy to avoid mutating props
let recipeData = { ...recipe };
if (!(recipeData.id && recipeData.name && recipeData.recipeIngredient)) {
const { data } = await api.recipes.getOne(recipeData.slug);
if (!data?.recipeIngredient?.length) {
continue;
}
recipe.id = data.id || "";
recipe.name = data.name || "";
recipe.recipeIngredient = data.recipeIngredient;
recipeData = {
...recipeData,
id: data.id || "",
name: data.name || "",
recipeIngredient: data.recipeIngredient,
};
}
else if (!recipe.recipeIngredient.length) {
else if (!recipeData.recipeIngredient.length) {
continue;
}
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) => {
@@ -303,8 +305,9 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
}
else {
// Regular ingredient
const householdsWithFood = ing.food?.householdsWithIngredientFood || [];
return [{
checked: !householdsWithFood.includes(userHousehold.value),
checked: !householdsWithFood.includes(currentHouseholdSlug.value),
ingredient: {
...ing,
title: ing.title || parentTitle,
@@ -313,7 +316,7 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
}
}
recipe.recipeIngredient.forEach((ing) => {
recipeData.recipeIngredient.forEach((ing) => {
const flattened = flattenRecipeIngredients(ing, "");
shoppingListIngredients.push(...flattened);
});
@@ -343,7 +346,7 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
// Store the on-hand ingredients for later
const householdsWithFood = (ing.ingredient?.food?.householdsWithIngredientFood || []);
if (householdsWithFood.includes(userHousehold.value)) {
if (householdsWithFood.includes(currentHouseholdSlug.value)) {
onHandIngs.push(ing);
return sections;
}
@@ -357,9 +360,9 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
shoppingListIngredientSections[shoppingListIngredientSections.length - 1].ingredients.push(...onHandIngs);
recipeSectionMap.set(recipe.slug, {
recipeId: recipe.id,
recipeName: recipe.name,
recipeScale: recipe.scale,
recipeId: recipeData.id,
recipeName: recipeData.name,
recipeScale: recipeData.scale,
ingredientSections: shoppingListIngredientSections,
});
}

View File

@@ -101,4 +101,14 @@ const { store: tags } = isOwnGroup.value ? useTagStore() : usePublicTagStore(gro
const { store: tools } = isOwnGroup.value ? useToolStore() : usePublicToolStore(groupSlug.value);
const { store: foods } = isOwnGroup.value ? useFoodStore() : usePublicFoodStore(groupSlug.value);
const { store: households } = isOwnGroup.value ? useHouseholdStore() : usePublicHouseholdStore(groupSlug.value);
watch(
households,
() => {
// if exactly one household exists, then we shouldn't be filtering by household
if (households.value.length == 1) {
selectedHouseholds.value = [];
}
},
);
</script>

View File

@@ -22,12 +22,15 @@
cols="12"
class="flex-grow-0 flex-shrink-0"
>
<v-text-field
<v-number-input
v-model="model.quantity"
variant="solo"
:precision="null"
:min="0"
hide-details
control-variant="stacked"
inset
density="compact"
type="number"
:placeholder="$t('recipe.quantity')"
@keypress="quantityFilter"
>
@@ -38,7 +41,7 @@
{{ $globals.icons.arrowUpDown }}
</v-icon>
</template>
</v-text-field>
</v-number-input>
</v-col>
<v-col
v-if="!state.isRecipe"

View File

@@ -10,14 +10,17 @@
v-for="(item, key, index) in modelValue"
:key="index"
>
<v-text-field
density="compact"
<v-number-input
:model-value="modelValue[key]"
:label="labels[key].label"
:suffix="labels[key].suffix"
type="number"
density="compact"
autocomplete="off"
variant="underlined"
control-variant="stacked"
inset
:precision="null"
:min="0"
@update:model-value="updateValue(key, $event)"
/>
</div>

View File

@@ -48,8 +48,7 @@
</template>
<script setup lang="ts">
import type { IngredientFood, RecipeCategory, RecipeTag } from "~/lib/api/types/recipe";
import type { RecipeTool } from "~/lib/api/types/admin";
import type { IngredientFood, RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/recipe";
import { Organizer, type RecipeOrganizer } from "~/lib/api/types/non-generated";
import type { HouseholdSummary } from "~/lib/api/types/household";
import { useCategoryStore, useFoodStore, useHouseholdStore, useTagStore, useToolStore } from "~/composables/store";
@@ -166,6 +165,15 @@ const items = computed<any[]>(() => {
return list;
});
function removeByIndex(index: number) {
if (selected.value === undefined) {
return;
}
const newSelected = selected.value.filter((_, i) => i !== index);
selected.value = [...newSelected];
}
function appendCreated(item: any) {
if (selected.value === undefined) {
return;

View File

@@ -47,7 +47,7 @@ const props = withDefaults(defineProps<Props>(), {
landscape: false,
});
defineEmits(["save", "delete"]);
defineEmits(["save", "delete", "print"]);
const { recipeImage } = useStaticRoutes();
const { imageKey, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug);

View File

@@ -11,27 +11,27 @@
<v-container class="ma-0 pa-0">
<v-row>
<v-col cols="3">
<v-text-field
:model-value="recipeServings"
type="number"
<v-number-input
:model-value="recipe.recipeServings"
:min="0"
hide-spin-buttons
:precision="null"
density="compact"
:label="$t('recipe.servings')"
variant="underlined"
@update:model-value="validateInput($event, 'recipeServings')"
control-variant="hidden"
@update:model-value="recipe.recipeServings = $event"
/>
</v-col>
<v-col cols="3">
<v-text-field
:model-value="recipeYieldQuantity"
type="number"
<v-number-input
:model-value="recipe.recipeYieldQuantity"
:min="0"
hide-spin-buttons
:precision="null"
density="compact"
:label="$t('recipe.yield')"
variant="underlined"
@update:model-value="validateInput($event, 'recipeYieldQuantity')"
control-variant="hidden"
@update:model-value="recipe.recipeYieldQuantity = $event"
/>
</v-col>
<v-col cols="6">
@@ -85,37 +85,4 @@ import type { NoUndefinedField } from "~/lib/api/types/non-generated";
import type { Recipe } from "~/lib/api/types/recipe";
const recipe = defineModel<NoUndefinedField<Recipe>>({ required: true });
const recipeServings = computed<number>({
get() {
return recipe.value.recipeServings;
},
set(val) {
validateInput(val.toString(), "recipeServings");
},
});
const recipeYieldQuantity = computed<number>({
get() {
return recipe.value.recipeYieldQuantity;
},
set(val) {
validateInput(val.toString(), "recipeYieldQuantity");
},
});
function validateInput(value: string | null, property: "recipeServings" | "recipeYieldQuantity") {
if (!value) {
recipe.value[property] = 0;
return;
}
const number = parseFloat(value.replace(/[^0-9.]/g, ""));
if (isNaN(number) || number <= 0) {
recipe.value[property] = 0;
return;
}
recipe.value[property] = number;
}
</script>

View File

@@ -65,13 +65,13 @@
</v-card-title>
<v-card-text class="mt-n5">
<div class="mt-4 d-flex align-center">
<v-text-field
<v-number-input
:model-value="yieldQuantity"
type="number"
:precision="null"
:min="0"
variant="underlined"
hide-spin-buttons
@update:model-value="recalculateScale(parseFloat($event) || 0)"
control-variant="hidden"
@update:model-value="recalculateScale($event || 0)"
/>
<v-tooltip
location="end"

View File

@@ -5,6 +5,7 @@
:title="$t('recipe.edit-timeline-event')"
:icon="$globals.icons.edit"
can-submit
disable-submit-on-enter
:submit-text="$t('general.save')"
@submit="submitEdit"
>

View File

@@ -37,21 +37,27 @@
:label="$t('search.search')"
clearable
/>
<div class="d-flex py-4 px-1">
<v-switch
<div />
<div class="d-flex py-4 px-1 align-center">
<v-btn-toggle
v-if="requireAll != undefined"
v-model="requireAllValue"
v-model="combinator"
mandatory
density="compact"
hide-details
class="my-auto"
variant="outlined"
color="primary"
:label="requireAllValue ? $t('search.has-all') : $t('search.has-any')"
/>
>
<v-btn value="hasAll">
{{ $t('search.has-all') }}
</v-btn>
<v-btn value="hasAny">
{{ $t('search.has-any') }}
</v-btn>
</v-btn-toggle>
<v-spacer />
<v-btn
size="small"
color="accent"
class="mr-2 my-auto"
@click="clearSelection"
>
{{ $t("search.clear-selection") }}
@@ -174,10 +180,10 @@ export default defineNuxtComponent({
// Use shallowRef for better performance with arrays
const debouncedSearch = shallowRef("");
const requireAllValue = computed({
get: () => props.requireAll,
const combinator = computed({
get: () => (props.requireAll ? "hasAll" : "hasAny"),
set: (value) => {
context.emit("update:requireAll", value);
context.emit("update:requireAll", value === "hasAll");
},
});
@@ -246,7 +252,7 @@ export default defineNuxtComponent({
}
return {
requireAllValue,
combinator,
state,
selected,
selectedRadio,

View File

@@ -15,7 +15,10 @@
density="compact"
class="mt-0 flex-shrink-0"
color="null"
@change="$emit('checked', listItem)"
@click="() => {
listItem.checked = !listItem.checked
$emit('checked', listItem)
}"
/>
<div
class="ml-2 text-truncate"

View File

@@ -4,7 +4,16 @@
<v-card-text class="pb-3 pt-1">
<div class="d-md-flex align-center mb-2" style="gap: 20px">
<div>
<InputQuantity v-model="listItem.quantity" />
<v-number-input
v-model="listItem.quantity"
hide-details
:label="$t('form.quantity-label-abbreviated')"
:min="0"
:precision="null"
control-variant="stacked"
inset
style="width: 100px;"
/>
</div>
<InputLabelType
v-model="listItem.unit"
@@ -158,6 +167,15 @@ export default defineNuxtComponent({
},
});
watch(
() => props.modelValue.quantity,
() => {
if (!props.modelValue.quantity) {
listItem.value.quantity = 0;
}
},
);
watch(
() => props.modelValue.food,
(newFood) => {

View File

@@ -149,6 +149,6 @@ export default defineNuxtComponent({
<style scoped>
.v-toolbar {
z-index: 1010 !important;
z-index: 2010 !important;
}
</style>

View File

@@ -1,61 +0,0 @@
<template>
<div
class="d-flex align-center"
style="max-width: 60px"
>
<v-text-field
v-model.number="quantity"
hide-details
:label="$t('form.quantity-label-abbreviated')"
:min="min"
:max="max"
type="number"
variant="plain"
density="compact"
style="width: 60px;"
/>
</div>
</template>
<script lang="ts">
export default defineNuxtComponent({
name: "VInputNumber",
props: {
min: {
type: Number,
default: 0,
},
max: {
type: Number,
default: 9999,
},
rules: {
type: Array,
default: () => [],
},
step: {
type: Number,
default: 1,
},
modelValue: {
type: Number,
default: 0,
},
},
emits: ["update:modelValue"],
setup(props, context) {
const quantity = computed({
get: () => {
return Number(props.modelValue);
},
set: (val) => {
context.emit("update:modelValue", val);
},
});
return {
quantity,
};
},
});
</script>

View File

@@ -29,9 +29,9 @@ export default defineNuxtComponent({
"ul", "ol", "li", "dl", "dt", "dd", "abbr", "a", "img", "blockquote", "iframe",
"del", "ins", "table", "thead", "tbody", "tfoot", "tr", "th", "td", "colgroup",
],
ADD_ATTR: [
ALLOWED_ATTR: [
"href", "src", "alt", "height", "width", "class", "allow", "title", "allowfullscreen", "frameborder",
"scrolling", "cite", "datetime", "name", "abbr", "target", "border",
"scrolling", "cite", "datetime", "name", "abbr", "target", "border", "start",
],
});

View File

@@ -0,0 +1,58 @@
import { describe, expect, test, vi } from "vitest";
import { ref } from "vue";
import { useStoreActions } from "./use-actions-factory";
import type { BaseCRUDAPI } from "~/lib/api/base/base-clients";
describe("useStoreActions", () => {
const mockApi = {
getAll: vi.fn(),
createOne: vi.fn(),
updateOne: vi.fn(),
deleteOne: vi.fn(),
} as unknown as BaseCRUDAPI<unknown, unknown, unknown>;
const mockStore = ref([]);
const mockLoading = ref(false);
test("deleteMany calls deleteOne for each ID and refreshes once", async () => {
const actions = useStoreActions("test-store", mockApi, mockStore, mockLoading);
mockApi.deleteOne = vi.fn().mockResolvedValue({ response: { data: {} } });
mockApi.getAll = vi.fn().mockResolvedValue({ data: { items: [] } });
const ids = ["1", "2", "3"];
await actions.deleteMany(ids);
expect(mockApi.deleteOne).toHaveBeenCalledTimes(3);
expect(mockApi.deleteOne).toHaveBeenCalledWith("1");
expect(mockApi.deleteOne).toHaveBeenCalledWith("2");
expect(mockApi.deleteOne).toHaveBeenCalledWith("3");
expect(mockApi.getAll).toHaveBeenCalledTimes(1);
});
test("deleteMany handles empty array", async () => {
const actions = useStoreActions("test-store", mockApi, mockStore, mockLoading);
mockApi.deleteOne = vi.fn();
mockApi.getAll = vi.fn().mockResolvedValue({ data: { items: [] } });
await actions.deleteMany([]);
expect(mockApi.deleteOne).not.toHaveBeenCalled();
expect(mockApi.getAll).toHaveBeenCalledTimes(1);
});
test("deleteMany sets loading state", async () => {
const actions = useStoreActions("test-store", mockApi, mockStore, mockLoading);
mockApi.deleteOne = vi.fn().mockResolvedValue({});
mockApi.getAll = vi.fn().mockResolvedValue({ data: { items: [] } });
const promise = actions.deleteMany(["1"]);
expect(mockLoading.value).toBe(true);
await promise;
expect(mockLoading.value).toBe(false);
});
});

View File

@@ -12,6 +12,7 @@ interface StoreActions<T extends BoundT> extends ReadOnlyStoreActions<T> {
createOne(createData: T): Promise<T | null>;
updateOne(updateData: T): Promise<T | null>;
deleteOne(id: string | number): Promise<T | null>;
deleteMany(ids: (string | number)[]): Promise<void>;
}
/**
@@ -165,11 +166,23 @@ export function useStoreActions<T extends BoundT>(
return response?.data || null;
}
async function deleteMany(ids: (string | number)[]) {
loading.value = true;
for (const id of ids) {
await api.deleteOne(id);
}
if (allRef?.value) {
await refresh();
}
loading.value = false;
}
return {
getAll,
refresh,
createOne,
updateOne,
deleteOne,
deleteMany,
};
}

View File

@@ -15,19 +15,19 @@ export const LOCALES = [
{
name: "Tiếng Việt (Vietnamese)",
value: "vi-VN",
progress: 1,
progress: 2,
dir: "ltr",
},
{
name: "Українська (Ukrainian)",
value: "uk-UA",
progress: 99,
progress: 100,
dir: "ltr",
},
{
name: "Türkçe (Turkish)",
value: "tr-TR",
progress: 36,
progress: 41,
dir: "ltr",
},
{
@@ -63,19 +63,19 @@ export const LOCALES = [
{
name: "Română (Romanian)",
value: "ro-RO",
progress: 41,
progress: 45,
dir: "ltr",
},
{
name: "Português (Portuguese)",
value: "pt-PT",
progress: 40,
progress: 39,
dir: "ltr",
},
{
name: "Português do Brasil (Brazilian Portuguese)",
value: "pt-BR",
progress: 46,
progress: 49,
dir: "ltr",
},
{
@@ -87,31 +87,31 @@ export const LOCALES = [
{
name: "Norsk (Norwegian)",
value: "no-NO",
progress: 41,
progress: 42,
dir: "ltr",
},
{
name: "Nederlands (Dutch)",
value: "nl-NL",
progress: 55,
progress: 59,
dir: "ltr",
},
{
name: "Latviešu (Latvian)",
value: "lv-LV",
progress: 36,
progress: 35,
dir: "ltr",
},
{
name: "Lietuvių (Lithuanian)",
value: "lt-LT",
progress: 27,
progress: 31,
dir: "ltr",
},
{
name: "한국어 (Korean)",
value: "ko-KR",
progress: 9,
progress: 39,
dir: "ltr",
},
{
@@ -123,19 +123,19 @@ export const LOCALES = [
{
name: "Italiano (Italian)",
value: "it-IT",
progress: 47,
progress: 51,
dir: "ltr",
},
{
name: "Íslenska (Icelandic)",
value: "is-IS",
progress: 44,
progress: 46,
dir: "ltr",
},
{
name: "Magyar (Hungarian)",
value: "hu-HU",
progress: 47,
progress: 48,
dir: "ltr",
},
{
@@ -147,7 +147,7 @@ export const LOCALES = [
{
name: "עברית (Hebrew)",
value: "he-IL",
progress: 73,
progress: 72,
dir: "rtl",
},
{
@@ -159,7 +159,7 @@ export const LOCALES = [
{
name: "Français (French)",
value: "fr-FR",
progress: 69,
progress: 71,
dir: "ltr",
},
{
@@ -189,7 +189,7 @@ export const LOCALES = [
{
name: "Español (Spanish)",
value: "es-ES",
progress: 46,
progress: 47,
dir: "ltr",
},
{
@@ -201,13 +201,13 @@ export const LOCALES = [
{
name: "British English",
value: "en-GB",
progress: 44,
progress: 45,
dir: "ltr",
},
{
name: "Ελληνικά (Greek)",
value: "el-GR",
progress: 41,
progress: 42,
dir: "ltr",
},
{
@@ -219,31 +219,31 @@ export const LOCALES = [
{
name: "Dansk (Danish)",
value: "da-DK",
progress: 52,
progress: 61,
dir: "ltr",
},
{
name: "Čeština (Czech)",
value: "cs-CZ",
progress: 42,
progress: 44,
dir: "ltr",
},
{
name: "Català (Catalan)",
value: "ca-ES",
progress: 38,
progress: 41,
dir: "ltr",
},
{
name: "Български (Bulgarian)",
value: "bg-BG",
progress: 49,
progress: 51,
dir: "ltr",
},
{
name: "العربية (Arabic)",
value: "ar-SA",
progress: 23,
progress: 25,
dir: "rtl",
},
{

View File

@@ -1,12 +1,13 @@
import type { RequestResponse } from "~/lib/api/types/non-generated";
import type { ValidationResponse } from "~/lib/api/types/response";
import { required, email, whitespace, url, minLength, maxLength } from "~/lib/validators";
import { required, email, whitespace, url, urlOptional, minLength, maxLength } from "~/lib/validators";
export const validators = {
required,
email,
whitespace,
url,
urlOptional,
minLength,
maxLength,
};

View File

@@ -4,10 +4,10 @@
"about-mealie": "Meer oor Mealie",
"api-docs": "API Dokumentasie",
"api-port": "API Poort",
"application-mode": "Applikasie modues",
"application-mode": "Applikasie Modus",
"database-type": "Databasis Tipe",
"database-url": "Databasis URL",
"default-group": "Standaard groep",
"default-group": "Standaard Groep",
"default-household": "Default Household",
"demo": "Demonstrasie",
"demo-status": "Demonstrasie Status",
@@ -65,7 +65,7 @@
"something-went-wrong": "Iets het verkeerd geloop!",
"subscribed-events": "Ingetekende Gebeure",
"test-message-sent": "Toets Boodskap Gestuur",
"message-sent": "Message Sent",
"message-sent": "Boodskap Gestuur",
"new-notification": "Nuwe kennisgewing",
"event-notifiers": "Gebeurteniskennisgewers",
"apprise-url-skipped-if-blank": "Apprise URL (oorgeslaan indien leeg)",
@@ -84,12 +84,12 @@
"label-events": "Label Events"
},
"general": {
"add": "Add",
"add": "Voeg by",
"cancel": "Kanselleer",
"clear": "Maak skoon",
"close": "Maak toe",
"confirm": "Bevestig",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Hoe lyk alles?",
"confirm-delete-generic": "Is jy seker jy wil dit uitvee?",
"copied_message": "Gekopieër!",
"create": "Skep",
@@ -120,9 +120,9 @@
"json": "JSON",
"keyword": "Sleutelwoord",
"link-copied": "Skakel gekopieer",
"loading": "Loading",
"loading": "Laai tans",
"loading-events": "Besig om gebeurtenisse te laai",
"loading-recipe": "Loading recipe...",
"loading-recipe": "Laai tans resep...",
"loading-ocr-data": "Loading OCR data...",
"loading-recipes": "Besig om resepte te laai",
"message": "Boodskap",
@@ -134,7 +134,7 @@
"no-recipe-found": "Geen resep gevind nie",
"ok": "OK",
"options": "Opsies:",
"plural-name": "Plural Name",
"plural-name": "Meervoudsnaam",
"print": "Druk",
"print-preferences": "Drukvoorkeure",
"random": "Willekeurig",
@@ -148,23 +148,23 @@
"save": "Stoor",
"settings": "Verstellings",
"share": "Deel",
"show-all": "Show All",
"show-all": "Wys Alles",
"shuffle": "Skommel",
"sort": "Sorteer",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Sorteer Oplopend",
"sort-descending": "Sorteer Aflopend",
"sort-alphabetically": "Alfabeties",
"status": "Status",
"subject": "Onderwerp",
"submit": "Dien in",
"success-count": "Sukses: {count}",
"sunday": "Sondag",
"system": "System",
"system": "Sisteem",
"templates": "Sjablone:",
"test": "Toets",
"themes": "Temas",
"thursday": "Donderdag",
"title": "Title",
"title": "Titel",
"token": "Token",
"tuesday": "Dinsdag",
"type": "Tipe",
@@ -179,12 +179,12 @@
"units": "Eenhede",
"back": "Terug",
"next": "Volgende",
"start": "Start",
"start": "Begin",
"toggle-view": "Wissel aansig",
"date": "Datum",
"id": "Id",
"owner": "Eienaar",
"change-owner": "Change Owner",
"change-owner": "Verander Eienaar",
"date-added": "Datum bygevoeg",
"none": "Geen",
"run": "Hardloop",
@@ -212,14 +212,14 @@
"upload-file": "Laai dokument op",
"created-on-date": "Geskep op: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers",
"caution": "Caution",
"show-advanced": "Show Advanced",
"add-field": "Add Field",
"date-created": "Date Created",
"date-updated": "Date Updated"
"clipboard-copy-failure": "Kon nie kopieer na die knipbord toe nie.",
"confirm-delete-generic-items": "Is jy seker jy wil die volgende items verwyder?",
"organizers": "Organiseerders",
"caution": "Versigtig",
"show-advanced": "Wys uitgebreide",
"add-field": "Voeg veld by",
"date-created": "Datum Geskep",
"date-updated": "Datum Opgedateer"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Is jy seker jy wil <b>{groupName}<b/> uitvee?",
@@ -326,11 +326,11 @@
"mealplan-households-description": "If no household is selected, recipes can be added from any household",
"any-category": "Any Category",
"any-tag": "Any Tag",
"any-household": "Any Household",
"any-household": "Enide Huishouding",
"no-meal-plan-defined-yet": "Nog geen maaltydplan opgestel nie",
"no-meal-planned-for-today": "Geen maaltyd beplan vir vandag nie",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"numberOfDays-label": "Standaard dae",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Slegs resepte met hierdie kategorieë sal in maaltydplanne gebruik word",
"planner": "Beplanner",
"quick-week": "Vinnige week",
@@ -343,8 +343,8 @@
"lunch": "Middagete",
"dinner": "Aandete",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"drink": "Drank",
"dessert": "Nagereg",
"type-any": "Enige",
"day-any": "Enige",
"editor": "Editor",
@@ -441,10 +441,11 @@
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Plak jou resepdata in. Elke reël sal as 'n item in 'n lys hanteer word",
"recipe-markup-specification": "Resep formaat spesifikasie",
"recipe-url": "Resep URL",
"recipe-html-or-json": "Recipe HTML or JSON",
"recipe-html-or-json": "Resep HTML of JSON",
"upload-a-recipe": "Laai 'n resep op",
"upload-individual-zip-file": "Laai 'n .zip-lêer op wat vanaf 'n ander Mealie-instansie uitgevoer is.",
"url-form-hint": "Kopieer en plak 'n skakel vanaf jou gunstelingresepwebwerf",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Bekyk opgespoorde data",
"trim-whitespace-description": "Knip voorste en agterste witspasie sowel as leë reëls",
"trim-prefix-description": "Knip die eerste karakter van elke reël af",
@@ -452,8 +453,8 @@
"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",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
"add-food": "Voeg Voedsel",
"add-recipe": "Voeg Resep By"
},
"page": {
"404-page-not-found": "404 Bladsy nie gevind nie",
@@ -520,8 +521,8 @@
"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?",
"delete-image": "Verwyder Resep Beeld",
"delete-image-confirmation": "Is jy seker jy wil dié beeld van die resep verwyder?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-name": "Resepnaam",
"recipe-settings": "Resep verstellings",
@@ -555,7 +556,7 @@
"add-to-plan": "Voeg by plan",
"add-to-timeline": "Voeg by tydlyn",
"recipe-added-to-list": "Resep by lys gevoeg",
"recipes-added-to-list": "Recipes added to list",
"recipes-added-to-list": "Resepte toegevoeg tot lys",
"successfully-added-to-list": "Successfully added to list",
"recipe-added-to-mealplan": "Resep is by die maaltydplan gevoeg",
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
@@ -568,7 +569,7 @@
"choose-unit": "Kies 'n eenheid",
"press-enter-to-create": "Druk Enter om te skep",
"choose-food": "Keuse van kos",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Kies Resep",
"notes": "Notas",
"toggle-section": "Wissel afdeling",
"see-original-text": "Sien oorspronklike teks",
@@ -659,7 +660,7 @@
"report-deletion-failed": "Kon nie verslag uitvee nie",
"recipe-debugger": "Resep debugger",
"recipe-debugger-description": "Gryp die URL van die resep wat jy wil debug en plak dit hier. Die URL sal deur die resepskraper geskraap word en die resultate sal vertoon word. As jy nie enige data terugstuur sien nie, word die webwerf wat jy probeer skraap nie deur Mealie of sy skraperbiblioteek ondersteun nie.",
"use-openai": "Use OpenAI",
"use-openai": "Gebruik OpenAI",
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Debug",
"tree-view": "Boomstruktuur",
@@ -670,8 +671,8 @@
"upload-image": "Laai prent",
"screen-awake": "Hou die skerm aan",
"remove-image": "Verwyder prent",
"nextStep": "Next step",
"recipe-actions": "Recipe Actions",
"nextStep": "Volgende stap",
"recipe-actions": "Resep Aksies",
"parser": {
"ingredient-parser": "Ingredient Parser",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
@@ -681,7 +682,7 @@
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"parse-all": "Parse All",
"no-unit": "No unit",
"no-unit": "Geen eenheid",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
@@ -692,12 +693,12 @@
"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"
"delete-item": "Verwyder Item"
},
"reset-servings-count": "Reset Servings Count",
"not-linked-ingredients": "Additional Ingredients",
"not-linked-ingredients": "Bykomende Bestanddele",
"upload-another-image": "Upload another image",
"upload-images": "Upload images",
"upload-images": "Laai beelde op",
"upload-more-images": "Upload more images",
"set-as-cover-image": "Set as recipe cover image",
"cover-image": "Cover image",
@@ -889,7 +890,7 @@
"oidc-ready": "OIDC Klar",
"oidc-ready-error-text": "Ikke alle OIDC værdier er konfigureret. Dette kan ignoreres hvis du ikke bruger OIDC godkendelse.",
"oidc-ready-success-text": "Krævede OIDC variabler er udfyldt.",
"openai-ready": "OpenAI Ready",
"openai-ready": "OpenAI Gereed",
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
"openai-ready-success-text": "Required OpenAI variables are all set."
},
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -342,9 +342,9 @@
"breakfast": "الإفطار",
"lunch": "الغداء",
"dinner": "العشاء",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "وجبة خفيفة",
"drink": "مشروب",
"dessert": "حلوى",
"type-any": "أي",
"day-any": "أي",
"editor": "المحرر",
@@ -438,22 +438,23 @@
"github-issues": "مشاكل GitHub",
"google-ld-json-info": "معرف Google + معلومات json",
"must-be-a-valid-url": "يجب أن يكون عنوان URL صالحًا",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "لصق بيانات الوصفة الخاصة بك. سيتم التعامل مع كل سطر كعنصر في قائمة",
"recipe-markup-specification": "Recipe Markup Specification",
"recipe-url": "رابط الوصفة",
"recipe-html-or-json": "وصفة HTML أو JSON",
"upload-a-recipe": "تحميل وصفة",
"upload-individual-zip-file": "تحميل مِلَفّ zip فردي تم تصديره من مثيل Malie آخر.",
"url-form-hint": "نسخ ولصق رابط من موقعك المفضل للوصفة",
"copy-and-paste-the-source-url-of-your-data-optional": "نسخ ولصق عنوان URL المصدر لبياناتك (اختياري)",
"view-scraped-data": "عرض البيانات المحللة",
"trim-whitespace-description": "قص المسافات البيضاء البادئة واللاحقة وكذلك الأسطر الفارغة",
"trim-prefix-description": "قص الحرف الأول من كل سطر",
"split-by-numbered-line-description": "Attempts to split a paragraph by matching '1)' or '1.' patterns",
"split-by-numbered-line-description": "محاولات تقسيم فقرة عن طريق مطابقة أنماط '1)' أو '1.'",
"import-by-url": "استيراد وصفة عن طريق عنوان URL",
"create-manually": "إنشاء وصفة يدوياً",
"make-recipe-image": "اجعل هذه صورة الوصفة",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
"add-food": "إضافة طعام",
"add-recipe": "إضافة وصفة"
},
"page": {
"404-page-not-found": "404: لم يتم العثور على الصفحة",
@@ -483,7 +484,7 @@
"comment": "أضف تعليق ",
"comments": "التعليقات",
"delete-confirmation": "هل انت متأكد من رغبتك بحذف هذه الوصفة؟",
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
"admin-delete-confirmation": "أنت على وشك حذف وصفة ليست لك استخدام أذونات المشرف. هل أنت متأكد؟",
"delete-recipe": "حذف الوصفة",
"description": "الوصف",
"disable-amount": "إيقاف إظهار كميات المكونات",
@@ -520,9 +521,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",
"delete-image": "حذف صورة الوصفة",
"delete-image-confirmation": "هل أنت متأكد أنك تريد حذف صورة الوصفة هذه؟",
"recipe-image-deleted": "تم حذف صورة الوصفة",
"recipe-name": "اسم الوصفة",
"recipe-settings": "إعدادات الوصفة",
"recipe-update-failed": "فشل تحديث الوصفة",
@@ -555,10 +556,10 @@
"add-to-plan": "أضف إلى الخُطة",
"add-to-timeline": "إضافة إلى الخط الزمني",
"recipe-added-to-list": "تم إضافة الوصفة إلى القائمة",
"recipes-added-to-list": "Recipes added to list",
"successfully-added-to-list": "Successfully added to list",
"recipe-added-to-mealplan": "Recipe added to mealplan",
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
"recipes-added-to-list": "تم إضافة الوصفات إلى القائمة",
"successfully-added-to-list": "تمت الإضافة إلى القائمة بنجاح",
"recipe-added-to-mealplan": "تم إضافة الوصفة إلى خطة الوجبات",
"failed-to-add-recipes-to-list": "فشل في إضافة وصفة إلى القائمة",
"failed-to-add-recipe-to-mealplan": "فشل في إضافة الوصفة إلى خطة الوجبة",
"failed-to-add-to-list": "فشل في الإضافة إلى القائمة",
"yield": "العائد",
@@ -568,13 +569,13 @@
"choose-unit": "اختر الوحدة",
"press-enter-to-create": "",
"choose-food": "اختيار الطعام",
"choose-recipe": "Choose Recipe",
"choose-recipe": "اختر وصفة",
"notes": "ملاحظات",
"toggle-section": "",
"see-original-text": "عرض النص الأصلي",
"original-text-with-value": "النص الأصلي: {originalText}",
"ingredient-linker": "رابط المكون",
"unlinked": "Not linked yet",
"unlinked": "غير مرتبط بعد",
"linked-to-other-step": "مرتبط بخطوة أخرى",
"auto": "تلقائي",
"cook-mode": "وضع الطبخ",
@@ -596,23 +597,23 @@
"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",
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
"made-for-recipe": "صُنع لـ {recipe}",
"added-to-timeline": "تمت الإضافة إلى الجدول الزمني",
"failed-to-add-to-timeline": "فشلت الإضافة إلى الجدول الزمني",
"failed-to-update-recipe": "فشل تحديث الوصفة",
"added-to-timeline-but-failed-to-add-image": "تمت الإضافة إلى الجدول الزمني، ولكن فشل في إضافة صورة",
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
"message-key": "مفتاح الرساله",
"parse": "تحليل",
"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.",
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
"attach-images-hint": "إرفاق الصور عن طريق سحبها وإسقاطها في المحرر",
"drop-image": "وضع الصورة",
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
"parse-ingredients": "تحليل المكونات",
"edit-markdown": "تعديل Markdown",
"recipe-creation": "إنشاء الوصفة",
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
"select-one-of-the-various-ways-to-create-a-recipe": "اختر واحدة من الطرق المختلفة لإنشاء وصفة",
"looking-for-migrations": "هل تبحث عن نقل المعلومات؟",
"import-with-url": "الاستيراد باستخدام URL",
"create-recipe": "إنشاء وصفة",
@@ -622,14 +623,14 @@
"create-recipe-from-an-image": "إنشاء وصفة عن طريق صورة",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-images": "Create from Images",
"should-translate-description": "Translate the recipe into my language",
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
"create-from-images": "إنشاء عن طريق صور",
"should-translate-description": "ترجمة الوصفة إلى لغتي",
"please-wait-image-procesing": "الرجاء الانتظار، تتم معالجة الصورة. قد يستغرق هذا بعض الوقت.",
"please-wait-images-processing": "الرجاء الانتظار، يتم معالجة الصور. قد يستغرق هذا بعض الوقت.",
"bulk-url-import": "الاستيراد باستخدام أكثر من URL ",
"debug-scraper": "تصحيح أخطاء المحلل\n",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
"new-recipe-names-must-be-unique": "New recipe names must be unique",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "قم بإنشاء وصفة عن طريق تقديم الاسم. يجب أن يكون لجميع الوصفات أسماء فريدة.",
"new-recipe-names-must-be-unique": "يجب أن تكون أسماء الوصفات فريدة",
"scrape-recipe": "تحليل الوصفة",
"scrape-recipe-description": "أضف الوصفة عن طريق الرابط. قم بتوفير عنوان الURL للموقع الذي تريد أخذ الوصفة منه، وسيحاول Mealie إستخراج الوصفة من ذلك الموقع وإضافتها إلى مجموعتك.",
"scrape-recipe-have-a-lot-of-recipes": "هل لديك الكثير من الوصفات التي تريد أن تحللها في نفس الوقت؟",
@@ -692,15 +693,15 @@
"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"
"delete-item": "حذف العنصر"
},
"reset-servings-count": "إعادة تعيين عدد الحصص",
"not-linked-ingredients": "مكونات إضافية",
"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": "رفع صورة أخرى",
"upload-images": "رفع الصور",
"upload-more-images": "رفع المزيد من الصور",
"set-as-cover-image": "تعيين كصورة غلاف الوصفة",
"cover-image": "صورة الغلاف",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
@@ -741,7 +742,7 @@
"advanced": "الإعدادات المتقدمة",
"auto-search": "البحث التلقائي",
"no-results": "لم يتم العثور على نتائج",
"type-to-search": "Type to search..."
"type-to-search": "اكتب للبحث ..."
},
"settings": {
"add-a-new-theme": "إضافة سمة جديدة",
@@ -775,8 +776,8 @@
"custom-pages": "الصفحات الخاصة",
"edit-page": "تعديل الصفحة",
"events": "الأحداث",
"first-day-of-week": "First day of the week",
"group-settings-updated": "Group Settings Updated",
"first-day-of-week": "اليوم الأول من الأسبوع",
"group-settings-updated": "تم تحديث إعدادات المجموعة",
"homepage": {
"all-categories": "جميع التصنيفات",
"card-per-section": "Card Per Section",
@@ -798,29 +799,29 @@
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
"set-new-time": "تعيين وقت جديد",
"settings-update-failed": "فشل تحديث الإعدادات",
"settings-updated": "Settings updated",
"settings-updated": "تم تحديث الإعدادات",
"site-settings": "إعدادات الموقع",
"theme": {
"accent": "Accent",
"accent": "لون التمييز",
"dark": "الوضع الليلي",
"default-to-system": "مطابقة وضع الجهاز",
"error": "حدث خطأ",
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
"error-deleting-theme": "Error deleting theme",
"error-updating-theme": "Error updating theme",
"info": "Info",
"error-creating-theme-see-log-file": "خطأ في إنشاء السمة. راجع ملف السجل.",
"error-deleting-theme": "خطأ في حذف السمة",
"error-updating-theme": "خطأ في تحديث السمة",
"info": "معلومات",
"light": "الوضع النهاري",
"primary": "رئيسي",
"secondary": "ثانوي",
"success": "Success",
"success": "تم بنجاح",
"switch-to-dark-mode": "التحويل إلى الوضع الليلي",
"switch-to-light-mode": "التحويل إلى الوضع النهاري",
"theme-deleted": "Theme deleted",
"theme-name": "Theme Name",
"theme-name-is-required": "Theme Name is required.",
"theme-saved": "Theme Saved",
"theme-updated": "Theme updated",
"warning": "Warning",
"theme-deleted": "تم حذف السمة",
"theme-name": "اسم السمة",
"theme-name-is-required": "اسم السمة مطلوب.",
"theme-saved": "تم حفظ السمة",
"theme-updated": "تم تحديث السمة",
"warning": "تحذير",
"light-mode": "الوضع النهاري",
"dark-mode": "الوضع الليلي"
},
@@ -857,7 +858,7 @@
"bug-report": "الإبلاغ عن الأخطاء البرمجية",
"bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.",
"tracker": "Tracker",
"configuration": "Configuration",
"configuration": "الإعدادات",
"docker-volume": "Docker Volume",
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
"volumes-are-misconfigured": "Volumes are misconfigured.",
@@ -1112,21 +1113,21 @@
"seed-dialog-text": "Seed the database with common units based on your local language.",
"combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.",
"combine-unit": "دمج الوحدة",
"source-unit": "Source Unit",
"target-unit": "Target Unit",
"merging-unit-into-unit": "Merging {0} into {1}",
"source-unit": "الوحدة المصدر",
"target-unit": "الوحدة الهدف",
"merging-unit-into-unit": "دمج {0} مع {1}",
"create-unit": "إنشاء وحدة",
"abbreviation": "Abbreviation",
"abbreviation": "الاختصار",
"plural-abbreviation": "Plural Abbreviation",
"description": "Description",
"description": "الوصف",
"display-as-fraction": "Display as Fraction",
"use-abbreviation": "Use Abbreviation",
"edit-unit": "تعديل الوحدة",
"unit-data": "بيانات الوحدة",
"use-abbv": "Use Abbv.",
"fraction": "Fraction",
"example-unit-singular": "ex: Tablespoon",
"example-unit-plural": "ex: Tablespoons",
"example-unit-singular": "مثال: ملعقة",
"example-unit-plural": "مثال: ملاعق",
"example-unit-abbreviation-singular": "ex: Tbsp",
"example-unit-abbreviation-plural": "ex: Tbsps"
},
@@ -1144,18 +1145,18 @@
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
"recipe-data": "Recipe Data",
"recipe-data": "بيانات الوصفة",
"recipe-data-description": "استخدم هذا القسم لإدارة البيانات المرتبطة بوصفاتك. يمكنك تنفيذ العديد من الإجراءات بالجملة على وصفاتك بما في ذلك التصدير والحذف وتعيين الوسوم وتعيين التصنيفات.",
"recipe-columns": "Recipe Columns",
"recipe-columns": "أعمدة الوصفة",
"data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.",
"data-exports": "Data Exports",
"data-exports": "صادرات البيانات",
"tag": "وسم",
"categorize": "Categorize",
"update-settings": "Update Settings",
"tag-recipes": "وسم الوصفات",
"categorize-recipes": "Categorize Recipes",
"export-recipes": "Export Recipes",
"delete-recipes": "Delete Recipes",
"categorize-recipes": "تصنيف الوصفات",
"export-recipes": "تصدير الوصفات",
"delete-recipes": "حذف الوصفات",
"source-unit-will-be-deleted": "Source Unit will be deleted"
},
"recipe-actions": {
@@ -1165,15 +1166,15 @@
"action-type": "Action Type"
},
"create-alias": "Create Alias",
"manage-aliases": "Manage Aliases",
"manage-aliases": "إدارة الأسماء المستعارة",
"seed-data": "Seed Data",
"seed": "Seed",
"data-management": "Data Management",
"data-management-description": "Select which data set you want to make changes to.",
"select-data": "Select Data",
"select-language": "Select Language",
"columns": "Columns",
"combine": "Combine",
"select-data": " اختر البيانات",
"select-language": "اختر اللغة",
"columns": "الأعمدة",
"combine": "دمج",
"categories": {
"edit-category": "تعديل التصنيف",
"new-category": "تصنيف جديد",
@@ -1203,15 +1204,15 @@
"account-details": "تفاصيل الحساب"
},
"validation": {
"group-name-is-taken": "Group name is taken",
"group-name-is-taken": "اسم المجموعة مأخوذ",
"username-is-taken": "اسم المستخدم مستعمل",
"email-is-taken": "Email is taken",
"this-field-is-required": "This Field is Required"
"email-is-taken": "هذا البريد الإلكتروني مأخوذ",
"this-field-is-required": "هذا الحقل مطلوب"
},
"export": {
"export": "Export",
"file-name": "File Name",
"size": "Size",
"export": "تصدير",
"file-name": "اسم الملف",
"size": "الحجم",
"link-expires": "Link Expires"
},
"recipe-share": {
@@ -1340,12 +1341,12 @@
"profile": {
"welcome-user": "مرحبًا 👋، {0}!",
"description": "Manage your profile, recipes, and group settings.",
"invite-link": "Invite Link",
"get-invite-link": "Get Invite Link",
"invite-link": "رابط الدعوة",
"get-invite-link": "الحصول على رابط الدعوة",
"get-public-link": "Get Public Link",
"account-summary": "Account Summary",
"account-summary-description": "Here's a summary of your group's information.",
"group-statistics": "Group Statistics",
"account-summary": "ملخص الحساب",
"account-summary-description": "إليك ملخص لمعلومات مجموعتك.",
"group-statistics": "إحصائيات المجموعة",
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
"household-statistics": "Household Statistics",
"household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.",
@@ -1357,32 +1358,32 @@
"user-settings-description": "إدارة تفضيلاتك، وتغيير كلمة المرور الخاصة بك، وتحديث بريدك الإلكتروني.",
"api-tokens-description": "Manage your API Tokens for access from external applications.",
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
"group-settings": "Group Settings",
"group-settings": "إعدادات المجموعة",
"group-settings-description": "Manage your common group settings, like privacy settings.",
"household-description": "These items are shared within your household. Editing one of them will change it for the whole household!",
"household-settings": "Household Settings",
"household-settings": "إعدادات الأسرة",
"household-settings-description": "Manage your household settings, like mealplan and privacy settings.",
"cookbooks-description": "إدارة مجموعة من تصنيفات الوصفات وإنشاء صفحات لها.",
"members": "Members",
"members": "الأعضاء",
"members-description": "See who's in your household and manage their permissions.",
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
"notifiers": "Notifiers",
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
"manage-data": "Manage Data",
"manage-data": "إدارة البيانات",
"manage-data-description": "إدارة بيانات Mealie الخاصة بك؛ الأطعمة، الوحدات، التصنيفات، الوسوم وأكثر من ذلك.",
"data-migrations": "Data Migrations",
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
"email-sent": "Email Sent",
"error-sending-email": "Error Sending Email",
"personal-information": "Personal Information",
"preferences": "Preferences",
"email-sent": "تم إرسال البريد الإلكتروني",
"error-sending-email": "خطأ في إرسال البريد الإلكتروني",
"personal-information": "المعلومات الشخصية",
"preferences": "التفضيلات",
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
"back-to-profile": "Back to Profile",
"back-to-profile": "العودة إلى الملف الشخصي",
"looking-for-privacy-settings": "Looking for Privacy Settings?",
"manage-your-api-tokens": "Manage Your API Tokens",
"manage-user-profile": "إدارة الملف الشخصي للمستخدم",
"manage-cookbooks": "إدارة كتب الطبخ",
"manage-members": "Manage Members",
"manage-members": "إدارة الأعضاء",
"manage-webhooks": "Manage Webhooks",
"manage-notifiers": "Manage Notifiers",
"manage-data-migrations": "Manage Data Migrations"
@@ -1427,5 +1428,13 @@
"is-like": "هو مثل",
"is-not-like": "ليس مثل"
}
},
"validators": {
"required": "هذا الحقل مطلوب",
"invalid-email": "يجب أن يكون البريد الإلكتروني صالحاً",
"invalid-url": "يجب أن يكون عنوان URL صالحًا",
"no-whitespace": "لا يسمح باستخدام المسافات",
"min-length": "يجب أن يكون على الأقل {min} أحرف",
"max-length": "يجب أن يكون على الأكثر {max} أحرف"
}
}

View File

@@ -156,7 +156,7 @@
"sort-alphabetically": "По азбучен ред",
"status": "състояние",
"subject": "Относно",
"submit": "Изпрати",
"submit": "Потвърди",
"success-count": "Успешни: {count}",
"sunday": "Неделя",
"system": "В хронологичен ред",
@@ -216,7 +216,7 @@
"confirm-delete-generic-items": "Сигурни ли сте, че желаете да изтриете следните елементи?",
"organizers": "Органайзер",
"caution": "Внимание",
"show-advanced": "Покажи разширени",
"show-advanced": "Разширени настройки",
"add-field": "Добави поле",
"date-created": "Дата на създаване",
"date-updated": "Дата на актуализация"
@@ -445,6 +445,7 @@
"upload-a-recipe": "Качи рецепта",
"upload-individual-zip-file": "Качи като индивидуален .zip файлов формат от друга инстанция на Mealie.",
"url-form-hint": "Копирай и постави линк от твоя любим сайт за рецепти",
"copy-and-paste-the-source-url-of-your-data-optional": "Копирайте и поставете URL адреса на източника на вашите данни (по избор)",
"view-scraped-data": "Виж събраните данни",
"trim-whitespace-description": "Премахни интервалите в началото и края на текста, също така и празните редове",
"trim-prefix-description": "Премахни първия символ от всеки ред",
@@ -1177,17 +1178,17 @@
"categories": {
"edit-category": "Редактиране на категория",
"new-category": "Нова категория",
"category-data": "Категория за данните"
"category-data": "Категории"
},
"tags": {
"new-tag": "Нов етикет",
"edit-tag": "Редакция на етикет",
"tag-data": "Данни на етикета"
"tag-data": "Етикети"
},
"tools": {
"new-tool": "Нов инструмент",
"edit-tool": "Редактирай инструмента",
"tool-data": "Данни на инструмента"
"tool-data": "Прибори"
}
},
"user-registration": {
@@ -1427,5 +1428,13 @@
"is-like": "е като",
"is-not-like": "не е като"
}
},
"validators": {
"required": "Това поле е задължително",
"invalid-email": "Email адресът трябва да бъде валиден",
"invalid-url": "Линкът трябва да е валиден",
"no-whitespace": "Не са позволени интервали",
"min-length": "Трябва да съдържа поне {min} знака",
"max-length": "Трябва да съдържа най-много {max} знака"
}
}

View File

@@ -69,7 +69,7 @@
"new-notification": "Nova notificació",
"event-notifiers": "Notificacions d'esdeveniments",
"apprise-url-skipped-if-blank": "Apprise URL (si es deixa buit, s'ignorarà)",
"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": "Com que les URLs de Apprise contenen informació sensible, aquest camp es deixa intencionadament en blanc a l'editar. Si vols actualitzar la URL, per favor, introdueix-ne una nova ací, si no, deixa-ho en blanc per a mantenir la URL actual.",
"enable-notifier": "Habilita la notificació",
"what-events": "Què esdeveniments vols que utilitzen aquest notificador?",
"user-events": "Esdeveniments d'usuari",
@@ -81,7 +81,7 @@
"category-events": "Esdeveniments de les categories",
"when-a-new-user-joins-your-group": "Quan un nou usuari s'afegeix al grup",
"recipe-events": "Esdeveniments de receptes",
"label-events": "Label Events"
"label-events": "Etiquetar Esdeveniments"
},
"general": {
"add": "Afegeix",
@@ -403,7 +403,7 @@
"title": "Tandoor Recipes"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"description-long": "Mealie pot importar receptes des de DVO Cook'n K3. Exporta un receptari o menú en el format \"Cook'n\", canvia la extensió d'exportació a .zip, i després puja el .zip a sota.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migració de receptes",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Puja una recepta",
"upload-individual-zip-file": "Puja només un arxiu zip, exportat d'altre Mealie.",
"url-form-hint": "Copia i enganxa l'enllaç del teu lloc web de receptes preferit",
"copy-and-paste-the-source-url-of-your-data-optional": "Copia i enganxa la URL font a les teues dades (opcional)",
"view-scraped-data": "Visualitza les dades recuperades",
"trim-whitespace-description": "Elimina els espais a principi i final; i elimina les línies buides",
"trim-prefix-description": "Elimina el primer caràcter de cada línia",
@@ -596,10 +597,10 @@
"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",
"made-for-recipe": "Fet per a {recipe}",
"added-to-timeline": "Afegit a la cronologia",
"failed-to-add-to-timeline": "No s'ha pogut afegir a la cronologia",
"failed-to-update-recipe": "No s'ha pogut actualitzar la recepta",
"added-to-timeline-but-failed-to-add-image": "S'ha afegit a la línia de temps, però no s'ha pogut afegir la imatge",
"api-extras-description": "Els extres de receptes són una funcionalitat clau de l'API de Mealie. Permeten crear parells clau/valor JSON personalitzats dins una recepta, per referenciar-los des d'aplicacions de tercers. Pots emprar aquestes claus per proveir informació, per exemple per a desencadenar automatitzacions o missatges personlitzats per a propagar al teu dispositiu desitjat.",
"message-key": "Clau del missatge",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prova l'importador a granel",
"scrape-recipe-have-raw-html-or-json-data": "Teniu dades HTML o JSON pla?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Podeu importar directament des de les dades planes",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "S'està bloquejant el lloc web?",
"scrape-recipe-try-importing-raw-html-instead": "Prova important l'HTML directament.",
"import-original-keywords-as-tags": "Importa les paraules clau originals com a tags",
"stay-in-edit-mode": "Segueix en el mode d'edició",
"parse-recipe-ingredients-after-import": "Analitza els ingredients de la recepta després d'importar",
@@ -1427,5 +1428,13 @@
"is-like": "és com",
"is-not-like": "no és com"
}
},
"validators": {
"required": "Aquest camp és obligatori",
"invalid-email": "El correu electrònic ha de ser vàlid",
"invalid-url": "La URL ha de ser vàlida",
"no-whitespace": "No es permeten espais en blanc",
"min-length": "Ha de tenir almenys {min} caràcters",
"max-length": "Ha de tenir com a màxim {max} caràcters"
}
}

View File

@@ -5,8 +5,8 @@
"api-docs": "Dokumentace API",
"api-port": "Port API",
"application-mode": "Režim aplikace",
"database-type": "Database Type",
"database-url": "Adresa URL databáze",
"database-type": "Typ databáze",
"database-url": "URL databáze",
"default-group": "Výchozí skupina",
"default-household": "Výchozí domácnost",
"demo": "Demo",
@@ -102,7 +102,7 @@
"duplicate": "Duplikovat",
"edit": "Upravit",
"enabled": "Povoleno",
"exception": "Vyjimka",
"exception": "Výjimka",
"failed-count": "Chyba: {count}",
"failure-uploading-file": "Nahrávání souboru se nezdařilo",
"favorites": "Oblíbené",
@@ -192,7 +192,7 @@
"a-name-is-required": "Název je povinný",
"delete-with-name": "Odstranit {name}",
"confirm-delete-generic-with-name": "Opravdu chcete smazat {name}?",
"confirm-delete-own-admin-account": "Prosím, vemte na vědomí, že se pokoušíte odstranit svůj vlastní účet správce! Tato akce nemůže být odvolána a trvale smaže váš účet?",
"confirm-delete-own-admin-account": "Prosím, vezměte na vědomí, že se pokoušíte odstranit svůj vlastní účet správce! Tato akce nemůže být odvolána a trvale smaže váš účet?",
"organizer": "Organizátor",
"transfer": "Přenos",
"copy": "Kopírovat",
@@ -292,7 +292,7 @@
"manage-households": "Spravovat domácnosti",
"admin-household-management": "Administrátorská správa domácnosti",
"admin-household-management-text": "Změny v této domácnosti budou okamžitě zohledněny.",
"household-id-value": "Id domácnosti: {0}",
"household-id-value": "ID domácnosti: {0}",
"private-household": "Soukromá domácnost",
"private-household-description": "Nastavení domácnosti na soukromou zakáže všechny možnosti veřejného zobrazení. To má přednost před individuálním nastavením veřejného zobrazení",
"lock-recipe-edits-from-other-households": "Uzamknout úpravy receptů z ostatních domácností",
@@ -342,9 +342,9 @@
"breakfast": "Snídaně",
"lunch": "Oběd",
"dinner": "Večeře",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Svačina",
"drink": "Nápoje",
"dessert": "Dezerty",
"type-any": "Libovolné",
"day-any": "Libovolný",
"editor": "Editor",
@@ -403,7 +403,7 @@
"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.",
"description-long": "Mealie může importovat recept z DVO Cook'n X3. Exportujte kuchařku nebo menu ve formátu \"Cook'n\", přejmenujte rozšíření exportu na .zip, poté nahrajte .zip níže.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrace dat receptů",
@@ -435,7 +435,7 @@
"error-details": "Pouze webové stránky obsahující Id+json nebo mikrodata mohou být přeneseny do Mealie. Většina hlavních webových stránek s recepty tuto datovou strukturu podporuje. Pokud vaše stránka nemůže být převedena ale json data jsou uvedena v logu, prosím nahlašte nám chybu do githubu a přiložte URL a data.",
"error-title": "Vypadá to, že se nám nic nepodařilo najít",
"from-url": "Přenést recept",
"github-issues": "Hlášení chyb na Githubu",
"github-issues": "Hlášení chyb na GitHubu",
"google-ld-json-info": "Google ld+json Info",
"must-be-a-valid-url": "Musí být validní URL",
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Vložte data receptu. Každý řádek bude považován za položku v seznamu",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Nahrát recept",
"upload-individual-zip-file": "Nahrát individuální .zip soubor exportovaný z jiné instance Mealie.",
"url-form-hint": "Zkopírujte a vložte odkaz z vaší oblíbené stránky s recepty",
"copy-and-paste-the-source-url-of-your-data-optional": "Zkopírujte a vložte zdrojovou adresu URL vašich dat (volitelné)",
"view-scraped-data": "Zobrazit scrapovaná data",
"trim-whitespace-description": "Oříznout počáteční a koncové mezery stejně jako prázdné řádky",
"trim-prefix-description": "Oříznout první znak z každé řádky",
@@ -452,8 +453,8 @@
"import-by-url": "Importovat recept podle URL",
"create-manually": "Vytvořit recept ručně",
"make-recipe-image": "Nastavit jako obrázek receptu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
"add-food": "Přidat jídlo",
"add-recipe": "Přidat recept"
},
"page": {
"404-page-not-found": "404 Stránka nebyla nalezena",
@@ -502,7 +503,7 @@
"insert-below": "Vložit pod",
"instructions": "Postup",
"key-name-required": "Je vyžadován název klíče",
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
"landscape-view-coming-soon": "Horizontální orientace (Coming Soon)",
"milligrams": "miligramy",
"new-key-name": "Nový název klíče",
"no-white-space-allowed": "Prázdná místa nejsou povolena",
@@ -520,9 +521,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",
"delete-image": "Smazat recept",
"delete-image-confirmation": "Opravdu chcete smazat tento recept?",
"recipe-image-deleted": "Recept smazán",
"recipe-name": "Název receptu",
"recipe-settings": "Nastavení receptu",
"recipe-update-failed": "Aktualizace receptu se nezdařila",
@@ -549,7 +550,7 @@
"join-the-conversation": "Připojit se ke konverzaci",
"add-recipe-to-mealplan": "Přidat recept do jídelníčku",
"entry-type": "Typ položky",
"date-format-hint": "Formát data MM/DD/YYYY",
"date-format-hint": "Formát data MM/DD/RRRR",
"date-format-hint-yyyy-mm-dd": "Formát RRRR-MM-DD",
"add-to-list": "Přidat na seznam",
"add-to-plan": "Přidat do jídelníčku",
@@ -568,7 +569,7 @@
"choose-unit": "Vybrat jednotku",
"press-enter-to-create": "Stiskněte enter pro vytvoření",
"choose-food": "Zvolte jídlo",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Vybrat recept",
"notes": "Poznámky",
"toggle-section": "Přidat/odebrat název sekce",
"see-original-text": "Zobrazit původní text",
@@ -596,7 +597,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}",
"made-for-recipe": "Vytvořeno pro {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",
@@ -631,16 +632,16 @@
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Vytvořte recept zadáním názvu. Všechny recepty musí mít jedinečná jména.",
"new-recipe-names-must-be-unique": "Názvy receptů musí být jedinečné",
"scrape-recipe": "Zpracovat recept",
"scrape-recipe-description": "Zpracovat recept na url. Uveďte adresu url pro str8nku, kterou chcete zpracovat a Mealie se pokusí zpracovat recept z tohoto webu a přidat jej do vaší sbírky.",
"scrape-recipe-description": "Zpracovat recept z URL. Uveďte adresu URL pro stránku, kterou chcete zpracovat a Mealie se pokusí zpracovat recept z tohoto webu a přidat jej do vaší sbírky.",
"scrape-recipe-have-a-lot-of-recipes": "Máte spoustu receptů, které chcete zpracovat najednou?",
"scrape-recipe-suggest-bulk-importer": "Vyzkoušejte hromadný import",
"scrape-recipe-have-raw-html-or-json-data": "Máte surová data HTML nebo JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Můžete importovat přímo ze surových dat",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Webové stránky jsou blokovány?",
"scrape-recipe-try-importing-raw-html-instead": "Zkuste namísto toho importovat raw HTML.",
"import-original-keywords-as-tags": "Importovat původní klíčová slova jako štítky",
"stay-in-edit-mode": "Zůstat v režimu úprav",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Po importu analyzovat ingredience receptu",
"import-from-zip": "Importovat ze zipu",
"import-from-zip-description": "Importovat jeden recept, který byl exportován z jiné instance Mealie.",
"import-from-html-or-json": "Importovat z HTML nebo JSON",
@@ -687,12 +688,12 @@
"this-unit-could-not-be-parsed-automatically": "Tuto jednotku nelze analyzovat automaticky",
"this-food-could-not-be-parsed-automatically": "Toto jídlo nelze analyzovat automaticky",
"no-food": "Žádné jídlo",
"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": "Zkontrolovat analyzované ingredience",
"confidence-score": "Skóre spolehlivosti",
"ingredient-parser-description": "Vaše suroviny byly úspěšně analyzovány. Prosím zkontrolujte ingredience, o kterých si nejsme jisti.",
"ingredient-parser-final-review-description": "Jakmile budou všechny ingredience zkontrolovány, budete mít ještě jednu šanci zkontrolovat všechny ingredience před použitím změn ve vašem receptu.",
"add-text-as-alias-for-item": "Přidat \"{text}\" jako alias pro {item}",
"delete-item": "Odstranit položku"
},
"reset-servings-count": "Resetovat počet porcí",
"not-linked-ingredients": "Další ingredience",
@@ -701,9 +702,9 @@
"upload-more-images": "Nahrát více obrázků",
"set-as-cover-image": "Nastavit recept jako ú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"
"include-linked-recipes": "Zahrnout připojené recepty",
"include-linked-recipe-ingredients": "Zahrnout připojené ingredience",
"toggle-recipe": "Přepnout na recept/jídlo"
},
"recipe-finder": {
"recipe-finder": "Vyhledávač receptů",
@@ -741,7 +742,7 @@
"advanced": "Pokročilé",
"auto-search": "Automatické vyhledávání",
"no-results": "Nebyly nalezeny žádné výsledky",
"type-to-search": "Type to search..."
"type-to-search": "Zadejte hledaný výraz..."
},
"settings": {
"add-a-new-theme": "Přidat nový motiv",
@@ -753,7 +754,7 @@
"restore-success": "Obnovení bylo úspěšné",
"restore-fail": "Obnovení se nezdařilo. Pro více informací zkontrolujte protokoly serveru",
"backup-tag": "Štítek zálohy",
"create-heading": "Create a Backup",
"create-heading": "Vytvořit zálohy",
"delete-backup": "Smazat zálohu",
"error-creating-backup-see-log-file": "Chyba při vytváření zálohy. Viz log soubor",
"full-backup": "Úplná záloha",
@@ -1041,7 +1042,7 @@
"users-header": "UŽIVATELÉ",
"users": "Uživatelé",
"user-not-found": "Uživatel nebyl nalezen",
"webhook-time": "Čas Webhooku",
"webhook-time": "Čas webhooku",
"webhooks-enabled": "Povolené webhooky",
"you-are-not-allowed-to-create-a-user": "Nemáte oprávnění k vytvoření uživatele",
"you-are-not-allowed-to-delete-this-user": "Nemáte oprávnění k odstranění tohoto uživatele",
@@ -1067,7 +1068,7 @@
"user-details": "Detaily uživatele",
"user-name": "Uživatelské jméno",
"authentication-method": "Metoda ověření",
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
"authentication-method-hint": "Toto specifikuje, jak se uživatel přihlásí do Mealie. Pokud si nejste jistí, vyberte 'Mealie'",
"permissions": "Oprávnění",
"administrator": "Správce",
"user-can-invite-other-to-group": "Uživatel může pozvat ostatní do skupiny",
@@ -1076,12 +1077,12 @@
"user-can-organize-group-data": "Uživatel může organizovat data skupiny",
"enable-advanced-features": "Povolit pokročilé funkce",
"it-looks-like-this-is-your-first-time-logging-in": "Vypadá to, že toto je vaše první přihlášení.",
"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í!",
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Už toto 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.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
"default-activity": "Výchozí aktivita",
"default-activity-hint": "Vyberte stránku, na kterou chcete přejít po přihlášení z tohoto zařízení"
},
"language-dialog": {
"translated": "přeloženo",
@@ -1094,7 +1095,7 @@
"foods": {
"merge-dialog-text": "Zkombinování zvolených potravin způsobí smazání zdrojové potraviny a veškeré odkazy na ni budou přesměrovány do cílové potraviny.",
"merge-food-example": "Sloučení {food1} do {food2}",
"seed-dialog-text": "Naplňte databázi potravinami z vašeho jazyka. Tímto vytvoříte přes 200 běžných potravin, které můžete použít k organizaci vaší databáze. Potravny jsou přeloženy skrze komunitní úsilí.",
"seed-dialog-text": "Naplňte databázi potravinami z vašeho jazyka. Tímto vytvoříte přes 200 běžných potravin, které můžete použít k organizaci vaší databáze. Potraviny jsou přeloženy skrze komunitní úsilí.",
"seed-dialog-warning": "Již v databázi máte nějaká data. Tato akce neodstraní duplicity, budete je muset odstranit ručně.",
"combine-food": "Kombinovat jídlo",
"source-food": "Zdrojové jídlo",
@@ -1307,7 +1308,7 @@
},
"ingredients-natural-language-processor": "Zpracování přirozeného jazyka přísad",
"ingredients-natural-language-processor-explanation": "Mealie používá podmíněná náhodná pole (CRF) pro rozbor a zpracování ingrediencí. Model používaný pro ingredience je založen na datovém souboru s více než 100 000 ingrediencemi sestaveného New York Times. Vzhledem k tomu, že model je natrénován pouze v angličtině, můžete mít při používání variabilní výsledky. Tato stránka slouží jako hřiště pro testování tohoto modelu.",
"ingredients-natural-language-processor-explanation-2": "Není to dokonalé, ale obecně to přináší skvělé výsledky a je dobrým výchozím bodem pro ruční zpracování ingrediencí do jednotlivých polí. Alternativně můžete také použít procesor \"Brute\", který používá metodu porovnávání vzorců pro idenfikaci ingrediencí.",
"ingredients-natural-language-processor-explanation-2": "Není to dokonalé, ale obecně to přináší skvělé výsledky a je dobrým výchozím bodem pro ruční zpracování ingrediencí do jednotlivých polí. Alternativně můžete také použít procesor \"Brute\", který používá metodu porovnávání vzorců pro identifikaci ingrediencí.",
"nlp": "ZPJ",
"brute": "Brute",
"openai": "OpenAI",
@@ -1379,9 +1380,9 @@
"show-advanced-description": "Zobrazit pokročilé funkce (API klíče, Webhooky a správa dat)",
"back-to-profile": "Zpět na profil",
"looking-for-privacy-settings": "Hledáte nastavení ochrany soukromí?",
"manage-your-api-tokens": "Správa API tokenů",
"manage-user-profile": "Správa uživatelského profilu",
"manage-cookbooks": "Správa kuchařek",
"manage-your-api-tokens": "Spravovat API tokeny",
"manage-user-profile": "Spravovat uživatelský profil",
"manage-cookbooks": "Spravovat kuchařky",
"manage-members": "Spravovat členy",
"manage-webhooks": "Spravovat webhooky",
"manage-notifiers": "Spravovat oznámení",
@@ -1427,5 +1428,13 @@
"is-like": "je jako",
"is-not-like": "není jako"
}
},
"validators": {
"required": "Toto pole je povinné",
"invalid-email": "E-mail musí být platný",
"invalid-url": "Musí být platná URL adresa",
"no-whitespace": "Mezery nejsou povoleny",
"min-length": "Musí být alespoň {min} znaků",
"max-length": "Musí být nejvíce {max} znaků"
}
}

View File

@@ -2,38 +2,38 @@
"about": {
"about": "Om",
"about-mealie": "Om Mealie",
"api-docs": "API dokumentation",
"api-port": "API port",
"api-docs": "API-dokumentation",
"api-port": "API-port",
"application-mode": "Applikationstilstand",
"database-type": "Database-type",
"database-url": "Database-url",
"database-url": "Database-URL",
"default-group": "Standardgruppe",
"default-household": "Standard Husstand",
"default-household": "Standardhusstand",
"demo": "Demo",
"demo-status": "Demo status",
"demo-status": "Demo-status",
"development": "Udvikling",
"docs": "Dokumenter",
"docs": "Dokumentation",
"download-log": "Download log",
"download-recipe-json": "Senest hentede JSON",
"github": "GitHub",
"log-lines": "Log-linjer",
"log-lines": "Loglinjer",
"not-demo": "Ikke demo",
"portfolio": "Portefølje",
"production": "Produktion",
"support": "Hjælp",
"version": "Version",
"unknown-version": "ukendt",
"sponsor": "Sponsor"
"sponsor": "Sponsorér"
},
"asset": {
"assets": "Ekstramateriale",
"assets": "Aktiver",
"code": "Kode",
"file": "Fil",
"image": "Billede",
"new-asset": "Nyt aktiv",
"pdf": "PDF",
"recipe": "Opskrift",
"show-assets": "Vis ekstramateriale",
"show-assets": "Vis aktiver",
"error-submitting-form": "Fejl ved indsendelse af data"
},
"category": {
@@ -51,11 +51,11 @@
"category": "Kategori"
},
"events": {
"apprise-url": "Apprise URL",
"apprise-url": "Apprise-URL",
"database": "Database",
"delete-event": "Slet hændelse",
"delete-event": "Slet begivenhed",
"event-delete-confirmation": "Er du sikker på, at du vil slette denne begivenhed?",
"event-deleted": "Hændelse slettet",
"event-deleted": "Begivenhed 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-version": "Ny opdatering er tilgængelig!",
@@ -343,7 +343,7 @@
"lunch": "Frokost",
"dinner": "Aftensmad",
"snack": "Snack",
"drink": "Drink",
"drink": "Drik",
"dessert": "Dessert",
"type-any": "Alle",
"day-any": "Alle",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload en opskrift",
"upload-individual-zip-file": "Upload en individuel .zip-fil, eksporteret fra en anden Mealie-instans.",
"url-form-hint": "Kopiér og indsæt et link fra din foretrukne opskrifts hjemmeside",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopiér og indsæt kilde-URL'en til dine data (valgfrit)",
"view-scraped-data": "Vis dataudtræk",
"trim-whitespace-description": "Fjern indledende og efterfølgende mellemrum samt blanke linjer",
"trim-prefix-description": "Beskær første tegn fra hver linje",
@@ -561,9 +562,9 @@
"failed-to-add-recipes-to-list": "Kunne ikke tilføje opskrift til listen",
"failed-to-add-recipe-to-mealplan": "Kunne ikke tilføje opskrift til madplanen",
"failed-to-add-to-list": "Kunne ikke tilføje opskrift til listen",
"yield": "Portioner",
"yields-amount-with-text": "{amount} {text}",
"yield-text": "Portionsenhed (eks. pers./stk.)",
"yield": "Mængde",
"yields-amount-with-text": "Mængde {amount} {text}",
"yield-text": "Hvor mange enheder giver opskriften?",
"quantity": "Antal",
"choose-unit": "Vælg enhed",
"press-enter-to-create": "Tryk enter for at oprette",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prøv masseimport",
"scrape-recipe-have-raw-html-or-json-data": "Har rå HTML- eller JSON-data?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere direkte fra rå data",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Bliver hjemmesiden blokeret?",
"scrape-recipe-try-importing-raw-html-instead": "Forsøg at importere den rå HTML i stedet.",
"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": "Fortolk opskrift ingredienser efter import",
@@ -658,14 +659,14 @@
"bulk-import-process-has-failed": "Der opstod en fejl ved import af opskrifter",
"report-deletion-failed": "Sletning af rapport mislykkedes",
"recipe-debugger": "Fejlsøgning af opskrifter",
"recipe-debugger-description": "Indsæt URL'en på hjemmesiden, der indeholder den opskrift, du vil fejlsøge. URL-adressen vil blive læst og resultaterne vil blive vist. Hvis ingen data bliver vist, er indhentning af opskrifter fra hjemmesiden endnu ikke understøttet af Mealie.",
"recipe-debugger-description": "Indsæt URL'en på hjemmesiden, der indeholder den opskrift, du vil fejlsøge. URL-adressen vil blive læst og resultaterne vil blive vist. Hvis ingen data bliver vist, er indhentning af opskrifter fra hjemmesiden endnu ikke understøttet af Mealie.",
"use-openai": "Brug OpenAI",
"recipe-debugger-use-openai-description": "Brug OpenAI til at fortolke resultaterne i stedet for at stole på scraper biblioteket. Når du opretter en opskrift via URL, gøres dette automatisk, hvis skraberbiblioteket fejler, men du kan teste det manuelt her.",
"recipe-debugger-use-openai-description": "Brug OpenAI til at fortolke resultaterne i stedet for at stole på scraperbiblioteket. Når du opretter en opskrift via URL, gøres dette automatisk, hvis skraberbiblioteket fejler, men du kan teste det manuelt her.",
"debug": "Fejlsøgning",
"tree-view": "Træ visning",
"recipe-servings": "Opskrift Servinger",
"recipe-yield": "Udbytte af opskrift",
"recipe-yield-text": "Portioner",
"recipe-yield-text": "Mængde",
"unit": "Enhed",
"upload-image": "Upload billede",
"screen-awake": "Hold skærmen tændt",
@@ -1307,7 +1308,7 @@
},
"ingredients-natural-language-processor": "Ingredienser Naturlig Sprogprocessor",
"ingredients-natural-language-processor-explanation": "Mealie bruger Conditional Random Fields felter (CRF'er) til berarbejdning af ingredienser. Den model, der anvendes til ingredienser er baseret ud fra et datasæt på over 100.000 ingredienser fra et datasæt udarbejdet af New York Times. Bemærk, at da modellen kun er trænet på engelsk, kan du have forskellige resultater, når du bruger modellen på andre sprog. På denne side kan du teste modellen.",
"ingredients-natural-language-processor-explanation-2": "Det er ikke perfekt, men giver generelt gode resultater og er et godt udgangspunkt for manuel redigering af ingredienser i individuelle felter. Alternativt kan du også bruge \"Brute\" metoden, der bruger en mønstermatchende teknik til at identificere ingredienser.",
"ingredients-natural-language-processor-explanation-2": "Det er ikke perfekt, men giver generelt gode resultater og er et godt udgangspunkt for manuel redigering af ingredienser i individuelle felter. Alternativt kan du også bruge \"Brute\"-metoden, der bruger en mønstermatchende teknik til at identificere ingredienser.",
"nlp": "NLP",
"brute": "Brute",
"openai": "OpenAI",
@@ -1427,5 +1428,13 @@
"is-like": "er ligesom",
"is-not-like": "er ikke som"
}
},
"validators": {
"required": "Dette felt er påkrævet",
"invalid-email": "E-mailen skal være gyldig",
"invalid-url": "URL'en skal være gyldig",
"no-whitespace": "Mellemrum er ikke tilladt",
"min-length": "Der skal mindst være {min} tegn",
"max-length": "Der må højst være {max} tegn"
}
}

View File

@@ -51,7 +51,7 @@
"category": "Kategorie"
},
"events": {
"apprise-url": "Apprise-URL",
"apprise-url": "Apprise URL",
"database": "Datenbank",
"delete-event": "Ereignis löschen",
"event-delete-confirmation": "Bist du dir sicher, dass du dieses Ereignis löschen möchtest?",
@@ -69,7 +69,7 @@
"new-notification": "Neue Benachrichtigung",
"event-notifiers": "Ereignis-Benachrichtigungen",
"apprise-url-skipped-if-blank": "Apprise-URL (wird übersprungen, wenn leer)",
"apprise-url-is-left-intentionally-blank": "Da Apprise-URLs normalerweise sensible Informationen enthalten, wird dieses Feld während der Bearbeitung absichtlich leer gelassen. Wenn Sie die URL aktualisieren möchten, geben Sie hier die neue ein. Andernfalls lassen Sie diese leer, um die aktuelle URL zu behalten.",
"apprise-url-is-left-intentionally-blank": "Da Apprise-URLs normalerweise sensible Informationen enthalten, wird dieses Feld während der Bearbeitung absichtlich leer gelassen. Wenn du die URL aktualisieren möchtest, gib hier die neue ein. Andernfalls lasse diese leer, um die aktuelle URL zu behalten.",
"enable-notifier": "Benachrichtigen aktivieren",
"what-events": "Welche Ereignisse soll diese Benachrichtigung abonnieren?",
"user-events": "Benutzer-Ereignisse",
@@ -191,7 +191,7 @@
"menu": "Menü",
"a-name-is-required": "Ein Name wird benötigt",
"delete-with-name": "{name} löschen",
"confirm-delete-generic-with-name": "Bist du dir sicher, dass du dies löschen möchtest?",
"confirm-delete-generic-with-name": "Bist du dir sicher, dass du {name} löschen möchtest?",
"confirm-delete-own-admin-account": "Bitte beachte, dass du versuchst, dein eigenes Administrator-Konto zu löschen! Diese Aktion kann nicht rückgängig gemacht werden und wird dein Konto dauerhaft löschen?",
"organizer": "Organisator",
"transfer": "Übertragen",
@@ -279,7 +279,7 @@
"admin-group-management-text": "Änderungen an dieser Gruppe sind sofort wirksam.",
"group-id-value": "Gruppen ID: {0}",
"total-households": "Haushalte insgesamt",
"you-must-select-a-group-before-selecting-a-household": "Sie müssen eine Gruppe auswählen, bevor Sie einen Haushalt auswählen"
"you-must-select-a-group-before-selecting-a-household": "Du musst eine Gruppe auswählen, bevor du einen Haushalt auswählst"
},
"household": {
"household": "Haushalt",
@@ -342,9 +342,9 @@
"breakfast": "Frühstück",
"lunch": "Mittagessen",
"dinner": "Abendessen",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Zwischenmahlzeit ",
"drink": "Getränk",
"dessert": "Nachspeise",
"type-any": "Alle",
"day-any": "Alle",
"editor": "Bearbeiten",
@@ -403,7 +403,7 @@
"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.",
"description-long": "Mealie kann Rezepte von DVO Cook'n X3 importieren. Exportiere ein Kochbuch oder ein Menü im \"Cook'n\"-Format, benenne die Export-Erweiterung in .zip um, dann lade die .zip unten hoch.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Rezeptdatenmigration",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Rezept hochladen",
"upload-individual-zip-file": "Lade eine individuelle .zip-Datei hoch, die von einer anderen Mealie-Instanz exportiert wird.",
"url-form-hint": "Kopiere einen Link von deiner Lieblingsrezept-Website und füge ihn ein",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopiere und füge die Quell-URL deiner Daten ein (optional)",
"view-scraped-data": "Gesammelte Daten anzeigen",
"trim-whitespace-description": "Leerzeichen am Anfang und Ende sowie leere Zeilen entfernen",
"trim-prefix-description": "Erste Zeichen aus jeder Zeile entfernen",
@@ -521,7 +522,7 @@
"recipe-image": "Rezeptbild",
"recipe-image-updated": "Rezeptbild aktualisiert",
"delete-image": "Rezeptbild löschen",
"delete-image-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
"delete-image-confirmation": "Bist du dir sicher, dass du dieses Rezeptbild löschen möchtest?",
"recipe-image-deleted": "Rezeptbild gelöscht",
"recipe-name": "Rezeptname",
"recipe-settings": "Rezepteinstellungen",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Probiere den Massenimporter aus",
"scrape-recipe-have-raw-html-or-json-data": "Hast du Roh-HTML oder JSON Daten?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kannst direkt von Rohdaten importieren",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Die Website wird blockiert?",
"scrape-recipe-try-importing-raw-html-instead": "Versuche stattdessen das reine HTML zu importieren.",
"import-original-keywords-as-tags": "Importiere ursprüngliche Stichwörter als Schlagwörter",
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
"parse-recipe-ingredients-after-import": "Zutaten nach dem Import parsen",
@@ -764,7 +765,7 @@
"backup-restore": "Wiederherstellen aus Sicherung",
"back-restore-description": "Das Wiederherstellen dieser Sicherung wird alle vorhandenen Daten in deiner Datenbank und im Datenverzeichnis überschreiben und durch den Inhalt dieser Sicherung ersetzen. {cannot-be-undone} Wenn die Wiederherstellung erfolgreich war, wirst du abgemeldet.",
"cannot-be-undone": "Diese Aktion kann nicht rückgängig gemacht werden - verwende sie mit Vorsicht.",
"postgresql-note": "Falls Sie PostgreSQL verwenden, überprüfen Sie bitte den {backup-restore-process} vor dem Wiederherstellen.",
"postgresql-note": "Falls du PostgreSQL verwendest, überprüfe bitte den {backup-restore-process} vor dem Wiederherstellen.",
"backup-restore-process-in-the-documentation": "Sichern- und Wiederherstellen-Prozess in der Dokumentation",
"irreversible-acknowledgment": "Ich verstehe, dass diese Maßnahme unumkehrbar und destruktiv ist und Datenverlust verursachen kann",
"restore-backup": "Sicherung wiederherstellen"
@@ -1081,7 +1082,7 @@
"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.",
"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"
"default-activity-hint": "Wähle die Seite, auf die du navigieren möchtest, wenn du dich von diesem Gerät aus anmeldest"
},
"language-dialog": {
"translated": "übersetzt",
@@ -1095,7 +1096,7 @@
"merge-dialog-text": "Zusammenführen der ausgewählten Lebensmittel führt diese zusammen in ein einzelnes Lebensmittel. Die Ausgangslebensmittel werden gelöscht und alle Verweise werden auf das zusammengeführte Lebensmittel angepasst.",
"merge-food-example": "{food1} wird zu {food2} zusammengeführt",
"seed-dialog-text": "Füllt die Datenbank mit Lebensmitteln basierend auf deiner Landessprache. Hierdurch werden mehr als 200 gängige Lebensmittel eingetragen, die verwendet werden können, um die Datenbank zu organisieren. Die Lebensmittel werden von der Community übersetzt.",
"seed-dialog-warning": "Sie haben bereits einige Einträge in der Datenbank. Diese Aktion wird Doppelungen nicht berücksichtigen. Sie müssen diese selbst beheben.",
"seed-dialog-warning": "Du hast bereits einige Einträge in der Datenbank. Diese Aktion wird Doppelungen nicht berücksichtigen. Du musst diese selbst beheben.",
"combine-food": "Lebensmittel zusammenführen",
"source-food": "Quell-Lebensmittel",
"target-food": "Ziel-Lebensmittel",
@@ -1427,5 +1428,13 @@
"is-like": "ist wie",
"is-not-like": "ist nicht wie"
}
},
"validators": {
"required": "Dieses Feld ist erforderlich",
"invalid-email": "E-Mail muss gültig sein",
"invalid-url": "Muss eine gültige URL sein",
"no-whitespace": "Kein Leerzeichen erlaubt",
"min-length": "Muss mindestens {min} Zeichen haben",
"max-length": "Darf mindestens {max} Zeichen haben"
}
}

View File

@@ -334,7 +334,7 @@
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Μόνο συνταγές με αυτές τις κατηγορίες θα χρησιμοποιηθούν στα προγράμματα γευμάτων",
"planner": "Προγραμματισμός",
"quick-week": "Γρήγορη προβολή",
"side": "Πλευρά",
"side": "Συνοδευτικό",
"sides": "Πλευρές",
"start-date": "Ημερομηνία έναρξης",
"rule-day": "Ημέρα/ες Κανόνα",
@@ -362,7 +362,7 @@
"for-type-meal-types": "για γεύματα τύπου {0}",
"meal-plan-rules": "Κανόνες Προγράμματος Γευμάτων",
"new-rule": "Νέος κανόνας",
"meal-plan-rules-description": "Μπορείτε να δημιουργήσετε κανόνες για την αυτόματη επιλογή συνταγών για τα προγράμματα γευμάτων. Αυτοί οι κανόνες χρησιμοποιούνται από το διακομιστή για τον προσδιορισμό της τυχαίας δεξαμενής συνταγών από τις οποίες μπορείτε να επιλέξετε κατά τη δημιουργία προγραμμάτων γευμάτων. Σημειώστε ότι αν οι κανόνες έχουν τους ίδιους περιορισμούς ημέρας/τύπου τότε τα φίλτρα κανόνων θα συγχωνευθούν. Στην πράξη, είναι περιττή η δημιουργία διπλότυπων κανόνων, είναι όμως εφικτή.",
"meal-plan-rules-description": "Μπορείτε να δημιουργήσετε κανόνες για την αυτόματη επιλογή συνταγών για τα προγράμματα γευμάτων. Αυτοί οι κανόνες χρησιμοποιούνται από το διακομιστή για τον προσδιορισμό της δεξαμενής τυχαίας επιλογής συνταγής, κατά τη δημιουργία προγραμμάτων γευμάτων. Σημειώστε ότι αν οι κανόνες έχουν τους ίδιους περιορισμούς ημέρας/τύπου τότε τα φίλτρα κανόνων θα συγχωνευθούν. Στην πράξη, είναι περιττή η δημιουργία διπλότυπων κανόνων, είναι όμως εφικτή.",
"new-rule-description": "Κατά τη δημιουργία ενός νέου κανόνα για ένα σχέδιο γεύματος, μπορείτε να περιορίσετε τον κανόνα ώστε να ισχύει για μια συγκεκριμένη ημέρα της εβδομάδας ή/και ένα συγκεκριμένο τύπο γεύματος. Για να εφαρμόσετε έναν κανόνα σε όλες τις ημέρες ή σε όλους τους τύπους γεύματος μπορείτε να ορίσετε τον κανόνα σε \"Ολα\" που θα τον εφαρμόσει σε όλες τις πιθανές τιμές για την ημέρα ή/και τον τύπο γεύματος.",
"recipe-rules": "Κανόνες Συνταγής",
"applies-to-all-days": "Εφαρμόζεται για όλες τις ημέρες",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Ανεβάστε μια συνταγή",
"upload-individual-zip-file": "Ανεβάστε ένα μεμονωμένο αρχείο .zip που εξάγεται από μια άλλη περίπτωση Mealie.",
"url-form-hint": "Αντιγράψτε και επικολλήστε έναν σύνδεσμο από την αγαπημένη σας ιστοσελίδα συνταγών",
"copy-and-paste-the-source-url-of-your-data-optional": "Αντιγράψτε και επικολλήστε το πηγαίο URL των δεδομένων σας (προαιρετικό)",
"view-scraped-data": "Προβολή Παραγόμενων Δεδομένων",
"trim-whitespace-description": "Περικοπή κενών στην αρχή και το τέλος καθώς και των κενών γραμμών",
"trim-prefix-description": "Περικοπή πρώτου χαρακτήρα από κάθε γραμμή",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Δοκιμάστε τον μαζικό εισαγωγέα συνταγών μας",
"scrape-recipe-have-raw-html-or-json-data": "Εχουν ακατέργαστα δεδομένα HTML ή JSON;",
"scrape-recipe-you-can-import-from-raw-data-directly": "Μπορείτε να κάνετε εισαγωγή απευθείας από ακατέργαστα δεδομένα",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Η ιστοσελίδα μπλοκάρεται;",
"scrape-recipe-try-importing-raw-html-instead": "Δοκιμάστε να εισάγετε τον ακατέργαστο κώδικα HTML.",
"import-original-keywords-as-tags": "Εισαγωγή αρχικών λέξεων-κλειδιών ως ετικέτες",
"stay-in-edit-mode": "Παραμονή σε λειτουργία επεξεργασίας",
"parse-recipe-ingredients-after-import": "Ανάλυση συστατικών συνταγής μετά την εισαγωγή",
@@ -878,9 +879,9 @@
"secure-site": "Ασφαλής Ιστοσελίδα",
"secure-site-error-text": "Παροχή μέσω localhost ή ασφάλεια με https. Το πρόχειρο και τα πρόσθετα API προγράμματος περιήγησης μπορεί να μην λειτουργούν.",
"secure-site-success-text": "Ο ιστότοπος έχει πρόσβαση από localhost ή https",
"server-side-base-url": "Βασική Διεύθυνση URL Πλευράς Διακομιστή",
"server-side-base-url": "Βασική διεύθυνση URL πλευράς διακομιστή",
"server-side-base-url-error-text": "Το `BASE_URL` εξακολουθεί να είναι η προεπιλεγμένη τιμή στο διακομιστή API. Αυτό θα προκαλέσει προβλήματα με τις συνδέσεις ειδοποιήσεων που δημιουργούνται στο διακομιστή για email, κλπ.",
"server-side-base-url-success-text": "Το URL Πλευράς Διακομιστή δεν ταιριάζει με την προεπιλογή",
"server-side-base-url-success-text": "Η διεύθυνση URL πλευράς διακομιστή δεν ταιριάζει με την προεπιλεγμένη",
"ldap-ready": "Ετοιμο για LDAP",
"ldap-ready-error-text": "Δεν έχουν ρυθμιστεί όλες οι τιμές LDAP. Αυτό μπορεί να αγνοηθεί αν δεν χρησιμοποιείτε έλεγχο ταυτότητας LDAP.",
"ldap-ready-success-text": "Ολες οι απαιτούμενες μεταβλητές LDAP έχουν οριστεί.",
@@ -1427,5 +1428,13 @@
"is-like": "είναι όμοιο με",
"is-not-like": "δεν είναι όμοιο με"
}
},
"validators": {
"required": "Αυτό το πεδίο είναι υποχρεωτικό",
"invalid-email": "Το e-mail πρέπει να είναι έγκυρο",
"invalid-url": "Πρέπει να είναι μια έγκυρη διεύθυνση URL",
"no-whitespace": "Δεν επιτρέπονται κενοί χαρακτήρες",
"min-length": "Πρέπει να αποτελείται από τουλάχιστον {min} χαρακτήρες",
"max-length": "Πρέπει να αποτελείται το πολύ από {max} χαρακτήρες"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favourite recipe website",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "View Scraped Data",
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
"trim-prefix-description": "Trim first character from each line",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "View Scraped Data",
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
"trim-prefix-description": "Trim first character from each line",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -343,8 +343,8 @@
"lunch": "Comida principal",
"dinner": "Cena",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"drink": "Bebida",
"dessert": "Postre",
"type-any": "Cualquiera",
"day-any": "Cualquier",
"editor": "Editor",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Subir una receta",
"upload-individual-zip-file": "Sube un archivo .zip individual exportado desde otra instancia de Mealie.",
"url-form-hint": "Copia y pega un enlace desde tu página web favorita",
"copy-and-paste-the-source-url-of-your-data-optional": "Copia y pega la URL de origen de tus datos (opcional)",
"view-scraped-data": "Ver información recuperada",
"trim-whitespace-description": "Eliminar espacios en blanco iniciales y finales así como líneas en blanco",
"trim-prefix-description": "Eliminar el primer carácter de cada línea",
@@ -452,7 +453,7 @@
"import-by-url": "Importar una receta desde URL",
"create-manually": "Crear receta manualmente",
"make-recipe-image": "Haz de esta la imagen de la receta",
"add-food": "Add Food",
"add-food": "Agregar comida",
"add-recipe": "Agregar receta"
},
"page": {
@@ -522,7 +523,7 @@
"recipe-image-updated": "Imagen de la receta actualizada",
"delete-image": "Borra la imagen de la receta",
"delete-image-confirmation": "¿Estás seguro de que quieres borrar esta imagen de la receta?",
"recipe-image-deleted": "Recipe image deleted",
"recipe-image-deleted": "Imagen de receta eliminada",
"recipe-name": "Nombre de la receta",
"recipe-settings": "Ajustes de la receta",
"recipe-update-failed": "Error al actualizar la receta",
@@ -568,7 +569,7 @@
"choose-unit": "Elija unidad",
"press-enter-to-create": "Presione Intro para crear",
"choose-food": "Elija comida",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Elige la receta",
"notes": "Notas",
"toggle-section": "Activar sección",
"see-original-text": "Mostrar Texto Original",
@@ -596,7 +597,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}",
"made-for-recipe": "Hecha para {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",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prueba el importador masivo",
"scrape-recipe-have-raw-html-or-json-data": "¿Tiene datos HTML o JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Puede importar directamente desde datos brutos",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "¿Sitio web bloqueado?",
"scrape-recipe-try-importing-raw-html-instead": "Intenta importar el HTML en bruto.",
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
"stay-in-edit-mode": "Permanecer en modo edición",
"parse-recipe-ingredients-after-import": "Analizar los ingredientes de la receta después de importarla",
@@ -701,8 +702,8 @@
"upload-more-images": "Subir más imágenes",
"set-as-cover-image": "Establecer como imagen de portada de receta",
"cover-image": "Imagen de portada",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"include-linked-recipes": "Incluye recetas vinculadas",
"include-linked-recipe-ingredients": "Incluye ingredientes de receta vinculados",
"toggle-recipe": "Alternar Receta"
},
"recipe-finder": {
@@ -741,7 +742,7 @@
"advanced": "Avanzado",
"auto-search": "Búsqueda automática",
"no-results": "No se encontraron resultados",
"type-to-search": "Type to search..."
"type-to-search": "Escribe para buscar..."
},
"settings": {
"add-a-new-theme": "Añadir un nuevo tema",
@@ -1427,5 +1428,13 @@
"is-like": "es como",
"is-not-like": "no es como"
}
},
"validators": {
"required": "Este campo es requerido",
"invalid-email": "El email debe ser válido",
"invalid-url": "Debe ser una URL válida",
"no-whitespace": "No se permiten espacios en blanco",
"min-length": "Debe ser como mínimo {min} caracteres",
"max-length": "Debe ser como máximo {max} caracteres"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Retsepti üleslaadimne",
"upload-individual-zip-file": "Lae üles üksik .zip fail, mis eksporditi teisest Mealie ekspemplarist.",
"url-form-hint": "Kopeeri ja kleebi link oma lemmikust retsepti leheküljest",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Kuva omandatud andmed",
"trim-whitespace-description": "Eemalda alguses ning lõpus olevad tühikud ning tühjad read",
"trim-prefix-description": "Eemalda esimene tähemärk igast reast",
@@ -1427,5 +1428,13 @@
"is-like": "on nagu",
"is-not-like": "ei ole nagu"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -2,7 +2,7 @@
"about": {
"about": "Tietoja",
"about-mealie": "Tietoja Mealiestä",
"api-docs": "API-dokumentit",
"api-docs": "API-dokumentaatio",
"api-port": "API-portti",
"application-mode": "Sovellustila",
"database-type": "Tietokannan tyyppi",
@@ -54,7 +54,7 @@
"apprise-url": "Apprise URL",
"database": "Tietokanta",
"delete-event": "Poista tapahtuma",
"event-delete-confirmation": "Oletko varma että haluat poistaa tämän tapahtuman?",
"event-delete-confirmation": "Haluatko varmasti 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, löydät Apprisen wikistä. Joihinkin ilmoitustyyppeihin voi sisältyä lisäominaisuuksia.",
@@ -342,9 +342,9 @@
"breakfast": "Aamiainen",
"lunch": "Lounas",
"dinner": "Päivällinen",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Välipala",
"drink": "Juoma",
"dessert": "Jälkiruoka",
"type-any": "Mikä tahansa",
"day-any": "Koska tahansa",
"editor": "Editori",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Lataa resepti",
"upload-individual-zip-file": "Tuo yksittäinen pakattu kansio toisesta Mealie instanssista.",
"url-form-hint": "Liitä linkki lempireseptiverkkosivultasi",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Näytä hankittu data",
"trim-whitespace-description": "Leikkaa alussa ja lopussa olevat välilyönnit sekä tyhjät rivit",
"trim-prefix-description": "Poista joka rivin ensimmäinen merkki",
@@ -636,7 +637,7 @@
"scrape-recipe-suggest-bulk-importer": "Kokeile massasiirtotyökalua",
"scrape-recipe-have-raw-html-or-json-data": "Onko sinulla raakaa HTML- tai JSON-dataa?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Voit tuoda raakadatan suoraan",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-website-being-blocked": "Onko sivusto estetty?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Tuo alkuperäiset avainsanat tunnisteiksi",
"stay-in-edit-mode": "Pysy muokkaustilassa",
@@ -1080,7 +1081,7 @@
"forgot-password": "Unohditko salasanasi",
"forgot-password-text": "Syötä sähköpostiosoitteesi, niin voit muuttaa salasanaasi linkin kautta.",
"changes-reflected-immediately": "Muutokset tähän käyttäjään astuvat välittömästi voimaan.",
"default-activity": "Oletus Toiminta",
"default-activity": "Oletusnäkymä",
"default-activity-hint": "Valitse haluamasi sivu, johon haluat navigoida kirjautuessasi tältä laitteelta"
},
"language-dialog": {
@@ -1427,5 +1428,13 @@
"is-like": "on kuin",
"is-not-like": "ei ole kuin"
}
},
"validators": {
"required": "Tämä kenttä on pakollinen",
"invalid-email": "Sähköpostiosoite ei ole kelvollinen",
"invalid-url": "URL ei ole kelvollinen",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Vähimmäispituus on {min} merkkiä",
"max-length": "Enimmäispituus on {max} merkkiä"
}
}

View File

@@ -342,8 +342,8 @@
"breakfast": "Petit-déjeuner",
"lunch": "Déjeuner",
"dinner": "Souper",
"snack": "Snack",
"drink": "Drink",
"snack": "Goûter",
"drink": "Boissons",
"dessert": "Dessert",
"type-any": "Tous",
"day-any": "Tous",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Télécharger une recette",
"upload-individual-zip-file": "Chargez un fichier .zip exporté depuis une autre instance Mealie.",
"url-form-hint": "Copiez et collez un lien depuis votre site de recettes favori",
"copy-and-paste-the-source-url-of-your-data-optional": "Copiez et collez l'URL source de vos données (facultatif)",
"view-scraped-data": "Voir les données récupérées",
"trim-whitespace-description": "Ajuster les espaces de début et de fin ainsi que les lignes vides",
"trim-prefix-description": "Couper le premier caractère de chaque ligne",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Essayez limportateur de masse",
"scrape-recipe-have-raw-html-or-json-data": "Vous avez des données brutes en HTML ou JSON ?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Vous pouvez directement importer des données brutes",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Le site web est bloqué ?",
"scrape-recipe-try-importing-raw-html-instead": "Essayez plutôt d'importer le code HTML brut.",
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
"stay-in-edit-mode": "Rester en mode édition",
"parse-recipe-ingredients-after-import": "Analyser les ingrédients de la recette après l'import",
@@ -1427,5 +1428,13 @@
"is-like": "est comme",
"is-not-like": "n'est pas similaire à"
}
},
"validators": {
"required": "Ce champ est obligatoire",
"invalid-email": "Le-mail doit être valide",
"invalid-url": "Doit être une URL valide",
"no-whitespace": "Aucun espace n'est autorisé",
"min-length": "Doit contenir au moins {min} caractères",
"max-length": "Doit contenir au maximum {max} caractères"
}
}

View File

@@ -342,8 +342,8 @@
"breakfast": "Petit déjeuner",
"lunch": "Dîner",
"dinner": "Souper",
"snack": "Snack",
"drink": "Drink",
"snack": "Goûter",
"drink": "Boissons",
"dessert": "Dessert",
"type-any": "Tous",
"day-any": "Tous",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Télécharger une recette",
"upload-individual-zip-file": "Téléverser un fichier .zip exporté depuis une autre instance Mealie.",
"url-form-hint": "Copiez et collez un lien depuis votre site de recettes favori",
"copy-and-paste-the-source-url-of-your-data-optional": "Copiez et collez l'URL source de vos données (facultatif)",
"view-scraped-data": "Voir les données récupérées",
"trim-whitespace-description": "Ajuster les espaces de début et de fin ainsi que les lignes vides",
"trim-prefix-description": "Couper le premier caractère de chaque ligne",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Essayez limportateur de masse",
"scrape-recipe-have-raw-html-or-json-data": "Vous avez des données brutes en HTML ou JSON ?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Vous pouvez directement importer des données brutes",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Le site web est bloqué ?",
"scrape-recipe-try-importing-raw-html-instead": "Essayez plutôt d'importer le code HTML brut.",
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
"stay-in-edit-mode": "Rester en mode édition",
"parse-recipe-ingredients-after-import": "Analyser les ingrédients de la recette après l'import",
@@ -1427,5 +1428,13 @@
"is-like": "est similaire à",
"is-not-like": "n'est pas similaire à"
}
},
"validators": {
"required": "Ce champ est obligatoire",
"invalid-email": "Le-mail doit être valide",
"invalid-url": "Doit être une URL valide",
"no-whitespace": "Aucun espace n'est autorisé",
"min-length": "Doit contenir au moins {min} caractères",
"max-length": "Doit contenir au maximum {max} caractères"
}
}

View File

@@ -337,7 +337,7 @@
"side": "Accompagnement",
"sides": "Accompagnements",
"start-date": "Date de début",
"rule-day": "Jour de la Règle",
"rule-day": "Jour de la règle",
"meal-type": "Type de repas",
"breakfast": "Petit-déjeuner",
"lunch": "Déjeuner",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Télécharger une recette",
"upload-individual-zip-file": "Chargez un fichier .zip exporté depuis une autre instance Mealie.",
"url-form-hint": "Copiez et collez un lien depuis votre site de recettes favori",
"copy-and-paste-the-source-url-of-your-data-optional": "Copiez et collez l'URL source de vos données (facultatif)",
"view-scraped-data": "Voir les données récupérées",
"trim-whitespace-description": "Ajuster les espaces de début et de fin ainsi que les lignes vides",
"trim-prefix-description": "Couper le premier caractère de chaque ligne",
@@ -1427,5 +1428,13 @@
"is-like": "est comme",
"is-not-like": "n'est pas similaire à"
}
},
"validators": {
"required": "Ce champ est obligatoire",
"invalid-email": "Le-mail doit être valide",
"invalid-url": "Doit être une URL valide",
"no-whitespace": "Aucun espace n'est autorisé",
"min-length": "Doit contenir au moins {min} caractères",
"max-length": "Doit contenir au maximum {max} caractères"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Cargar unha Receita",
"upload-individual-zip-file": "Cargar un ficheiro .zip individual, exportado de outra instancia do Mealie.",
"url-form-hint": "Copie e pegue un link do seu site de receitas favorito",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Ver datos recollidos",
"trim-whitespace-description": "Eliminar os espazos en branco no início e no fin, asi como as liñas en branco",
"trim-prefix-description": "Eliminar o primeiro caracter de cada liña",
@@ -1427,5 +1428,13 @@
"is-like": "é como",
"is-not-like": "non é como"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "העלאת מתכון",
"upload-individual-zip-file": "העלאת קובץ זיפ שיוצא ממילי אחר.",
"url-form-hint": "העתק והדבק קישור מאתר המתכונים המועדף עליך",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "צפייה במידע שנאסף",
"trim-whitespace-description": "הסר רווחים מתחילת / סוף שורה ושורות ריקות",
"trim-prefix-description": "חתוך תו ראשון מכל שורה",
@@ -1427,5 +1428,13 @@
"is-like": "דומה ל-",
"is-not-like": "לא דומה לא-"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Učitaj Recept",
"upload-individual-zip-file": "Prenesite pojedinačnu .zip datoteku koja je izvezena iz druge instance Mealie aplikacije.",
"url-form-hint": "Kopirajte i zalijepite poveznicu s vaše omiljene web stranice za recepte",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Prikaz Prikupljenih Podataka",
"trim-whitespace-description": "Ukloni vodeće i slijedeće praznine, kao i prazne linije",
"trim-prefix-description": "Ukloni prvi znak sa svake linije",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Recept feltöltése",
"upload-individual-zip-file": "Tölts fel egy .zíp archívumot, ami egy másik Mealie példányból lett exportálva.",
"url-form-hint": "Másold be a linket a kedvenc recept weboldaladról",
"copy-and-paste-the-source-url-of-your-data-optional": "Másolja és illessze be az adatok forrás URL-jét (opcionális)",
"view-scraped-data": "Letöltött adat megtekintése",
"trim-whitespace-description": "Vágja le a kezdő és a záró fehérjeleket, valamint az üres sorokat",
"trim-prefix-description": "Minden sor első karakterének levágása",
@@ -1427,5 +1428,13 @@
"is-like": "hasonló",
"is-not-like": "nem hasonló"
}
},
"validators": {
"required": "Ez kötelező mező",
"invalid-email": "E-mail-nek érvényesnek kell lennie",
"invalid-url": "Érvényes URL-nek kell lennie",
"no-whitespace": "Szóközt nem tartalmazhat",
"min-length": "Legalább {min} karakter legyen",
"max-length": "Legfeljebb {max} karakter legyen"
}
}

View File

@@ -69,7 +69,7 @@
"new-notification": "Ný tilkynning",
"event-notifiers": "Viðburðar tilkynningar",
"apprise-url-skipped-if-blank": "Apprise URL (sleppt ef tómt)",
"apprise-url-is-left-intentionally-blank": "Þar sem \"Apprise\" slóðir innihalda yfirleitt viðkvæmar upplýsingar, er þessum reit viljandi skilið eftir auðum við breytingar. Ef þú vilt uppfæra slóðina skaltu slá inn þá nýju hér, annars skaltu skilja reitinn eftir auðan til að halda núverandi slóð.",
"apprise-url-is-left-intentionally-blank": "Þar sem \"Apprise\" slóðir innihalda yfirleitt viðkvæmar upplýsingar, er þessi reitur viljandi skilinn eftir auður. Ef þú vilt uppfæra slóðina skaltu slá inn hana inn hér, annars skaltu skilja reitinn eftir auðan til að halda núverandi slóð.",
"enable-notifier": "Virkja tilkynningar",
"what-events": "Hvaða viðburði ætti þessi tilkynnir að vera áskrifandi að?",
"user-events": "Notenda viðburðir",
@@ -342,9 +342,9 @@
"breakfast": "Morgunverður",
"lunch": "Hádegisverður",
"dinner": "Kvöldverður",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Snarl",
"drink": "Drykkur",
"dessert": "Eftirréttur",
"type-any": "Allir",
"day-any": "Alla",
"editor": "Ritill",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Hlaða inn uppskrift",
"upload-individual-zip-file": "Hlaða inn .zip skrá sem er flutt úr annarri Mealie uppsetningu.",
"url-form-hint": "Afritaðu og límdu tengil frá uppáhalds uppskriftar síðunni þinni",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Skoða unnin gögn",
"trim-whitespace-description": "Fjarlægja bil fremst og aftast í texta sem og auðum línum",
"trim-prefix-description": "Eyða fyrsta staf úr hverri línu",
@@ -619,8 +620,8 @@
"create-recipe-description": "Stofna nýja uppskrift frá grunni.",
"create-recipes": "Stofna uppskriftir",
"import-with-zip": "Hlaða inn með .zip",
"create-recipe-from-an-image": "Create Recipe from an Image",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"create-recipe-from-an-image": "Stofna uppskrift út frá mynd",
"create-recipe-from-an-image-description": "Stofna uppskrift með því hlaða inn myndum af uppskriftartextanum. Mealie mun reyna að vinna texta úr myndunum með gervigreind og stofna nýja uppskrift út frá textanum.",
"crop-and-rotate-the-image": "Sníða og snúa mynd svo bara textinn sé sýnilegur og að myndin snúi rétt.",
"create-from-images": "Stofna uppskrift frá mynd",
"should-translate-description": "Þýða uppskrift á mitt tungumál",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prófaðu að setja inn margar uppskriftir í einu",
"scrape-recipe-have-raw-html-or-json-data": "Ertu með hrá HTML eða JSON gögn?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Það er hægt að hlaða inn hráum gögnum beint",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Er vefsíðan lokuð?",
"scrape-recipe-try-importing-raw-html-instead": "Reyndu að flytja inn HTML kóðann í staðinn.",
"import-original-keywords-as-tags": "Nota upprunanleg merki",
"stay-in-edit-mode": "Vera í breytingarham",
"parse-recipe-ingredients-after-import": "Greina innhald uppskriftar eftir að búið er að hlaða inn uppskrift",
@@ -660,7 +661,7 @@
"recipe-debugger": "Yfirfara uppskrift",
"recipe-debugger-description": "Náðu í slóðina af uppskriftinni sem þú villt yfirfara og límdu hana hér. Síðan með uppskriftinni verður greind með greiningarverkfærinu og þú munnt sjá niðurstöðuna. Ef þú sérð að engin gögn skila sér þá er slóðin sem þú ert að greina ekki studd af Mealie eða greiningarverkfærinu.",
"use-openai": "Nota OpenAI",
"recipe-debugger-use-openai-description": "Nota OpenAI til að greina í staðinn fyrir að treysta á greiningar verkfærið. Þegar er fengin af slóð þá gerist þetta sjálfkrafa ef almenn greining mistekst, en þú getur prófað þ hér.",
"recipe-debugger-use-openai-description": "Nota OpenAI til að greina í staðinn fyrir að treysta á greiningar verkfærið. Ef greiningar verkfærinu mistekst að greina uppskrift af vefslóð þá gerist það sjálfvirkt að OpenAI greinir uppskriftina en þú getur prófað þetta sjálfur hér.",
"debug": "Villuleit",
"tree-view": "Tré sýn",
"recipe-servings": "Fjöldi skammta",
@@ -701,9 +702,9 @@
"upload-more-images": "Setja inn fleiri myndir",
"set-as-cover-image": "Velja sem forsíðumynd fyrir uppskriftina",
"cover-image": "Forsíðumynd",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Víxla uppskrift"
"include-linked-recipes": "Hafa með tengda uppskrift",
"include-linked-recipe-ingredients": "Hafa með innihaldsefni úr tengdum uppskriftum",
"toggle-recipe": "Sýna/fela uppskrift"
},
"recipe-finder": {
"recipe-finder": "Uppskriftaleit",
@@ -852,7 +853,7 @@
"webhooks-caps": "WEBHOOKS",
"webhooks": "Webhook-vefkrækjur",
"webhook-name": "Vefkrækju nafn",
"description": "Vefkrækjur (webhooks) sem skilgreindar eru hér að neðan verða keyrðar þegar máltíð er skilgreind fyrir daginn. Á fyrirfram ákveðnum tíma verða vefkrækjurnar sendar með gögnum úr þeirri uppskrift sem skipulögð er í dag. Athugaðu að keyrsla vefkrækja er ekki alveg nákvæm, þær eru keyrðar á 5 mínútna fresti, þannig að sendingin getur farið fram allt að 5 mínútum fyrir eða eftir áætlaðan tíma."
"description": "Vefkrækjur sem skilgreindar eru hér að neðan verða keyrðar þegar máltíð er skilgreind fyrir daginn. Á fyrirfram ákveðnum tíma verða vefkrækjurnar sendar með gögnum úr þeirri uppskrift sem skipulögð er í dag. Athugaðu að keyrsla vefkrækja er ekki alveg nákvæm, þær eru keyrðar á 5 mínútna fresti, þannig að sendingin getur farið fram allt að 5 mínútum fyrir eða eftir áætlaðan tíma."
},
"bug-report": "Villu skýrsla",
"bug-report-information": "Notaður þessar upplýsingar til að tilkynna um villu. Með því að veita þróunaraðilum upplýsingar um þína uppsetningu hjálpar þú þeim að leysa vandamálið hraðar.",
@@ -1307,7 +1308,7 @@
},
"ingredients-natural-language-processor": "Innihaldsefna málgreining (Natural Language Processor)",
"ingredients-natural-language-processor-explanation": "Mealie notar Conditional Random Fields (CRFs) til að greina og vinna með innihaldsefni. Líkanið sem notað er byggir á gagnasafni með yfir 100.000 innihaldsefnum úr gagnasafni sem New York Times tók saman. Athugaðu að þar sem líkanið er einungis þjálfað á ensku geturðu fengið misjafnar niðurstöður þegar það er notað á önnur tungumál. Þessi síða er ætluð til að prófa líkanið.",
"ingredients-natural-language-processor-explanation-2": "Þetta er ekki fullkomið en skilar almennt góðum niðurstöðum og er góður grunnur fyrir handvirka greiningu innihaldsefna í einstaka reiti. Þú getur einnig notað „Brute“ vinnsluna, sem notar mynsturgreiningu til að bera kennsl á innihaldsefni.",
"ingredients-natural-language-processor-explanation-2": "Þetta er ekki fullkomið en skilar almennt góðum niðurstöðum og er góður grunnur fyrir handvirka greiningu innihaldsefna í einstaka reiti. Þú getur einnig notað „Grófgreinir“ vinnsluna, sem notar mynsturgreiningu til að bera kennsl á innihaldsefni.",
"nlp": "NLP",
"brute": "Grófgreinir",
"openai": "OpenAI",
@@ -1338,7 +1339,7 @@
"household-delete-note": "Heimili með notendum er ekki hægt að eyða"
},
"profile": {
"welcome-user": "👋 Velkomin/Velkominn/Velkomið, {0}!",
"welcome-user": "👋 Halló, {0}",
"description": "Umsjá með prófíl, uppskriftum og hópstillingum.",
"invite-link": "Boð tengill",
"get-invite-link": "Fá boð tengil",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "Þessi reitur er nauðsynlegur",
"invalid-email": "Verður að vera gilt netfang",
"invalid-url": "Verður að vera gild vefslóð",
"no-whitespace": "Engin bil leyfð",
"min-length": "Verður að vera að lágmarki {min} stafir",
"max-length": "Má vera að hámarki {max} stafir"
}
}

View File

@@ -343,7 +343,7 @@
"lunch": "Pranzo",
"dinner": "Cena",
"snack": "Snack",
"drink": "Drink",
"drink": "Bevanda",
"dessert": "Dessert",
"type-any": "Qualsiasi",
"day-any": "Qualsiasi",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Carica una Ricetta",
"upload-individual-zip-file": "Carica un singolo file .zip esportato da un'altra istanza di Mealie.",
"url-form-hint": "Copia e incolla un link dal tuo sito di ricette preferito",
"copy-and-paste-the-source-url-of-your-data-optional": "Copia e incolla lo URL della fonte dei dati (opzionale)",
"view-scraped-data": "Visualizza Dati Ottenuti dallo Scraping",
"trim-whitespace-description": "Tagliare lo spazio bianco iniziale e finale così come le linee vuote",
"trim-prefix-description": "Taglia il primo carattere da ogni riga",
@@ -577,7 +578,7 @@
"unlinked": "Non ancora collegato",
"linked-to-other-step": "Collegato ad un altro passaggio",
"auto": "Automatico",
"cook-mode": "Modalità di Cottura",
"cook-mode": "Modalità Cucina",
"link-ingredients": "Link Ingredienti",
"merge-above": "Unisci Sopra",
"move-to-bottom": "Sposta in fondo",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prova l'importatore massivo",
"scrape-recipe-have-raw-html-or-json-data": "Hai dei dati grezzi HTML o JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "È possibile importare direttamente dai dati grezzi",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Il sito viene bloccato?",
"scrape-recipe-try-importing-raw-html-instead": "Prova a importare l'HTML puro.",
"import-original-keywords-as-tags": "Importa parole chiave originali come tag",
"stay-in-edit-mode": "Rimani in modalità Modifica",
"parse-recipe-ingredients-after-import": "Analizza gli ingredienti della ricetta dopo l'importazione",
@@ -1427,5 +1428,13 @@
"is-like": "è simile",
"is-not-like": "non è come"
}
},
"validators": {
"required": "Questo Campo è Obbligatorio",
"invalid-email": "L'Email Deve Essere Valida",
"invalid-url": "Lo URL Deve Essere Valido",
"no-whitespace": "Gli Spazi Non Sono Ammessi",
"min-length": "Deve Essere Almeno {min} Caratteri",
"max-length": "Deve Essere Al Massimo {max} Caratteri"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "レシピのアップロード",
"upload-individual-zip-file": "別のMealieインスタンスからエクスポートされた個別の.zipファイルをアップロードします。",
"url-form-hint": "お気に入りのレシピサイトからリンクをコピーして貼り付け",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "スクライピングされたデータの表示",
"trim-whitespace-description": "先頭と末尾の空白、空白行をトリミングします。",
"trim-prefix-description": "各行の最初の文字をトリミングする",
@@ -1427,5 +1428,13 @@
"is-like": "次のようなものです",
"is-not-like": "というわけではありません"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
"database-type": "Database Type",
"database-url": "Duomenų bazės URL",
"default-group": "Numatytoji grupė",
"default-household": "Default Household",
"default-household": "Numatytasis namų ūkis",
"demo": "Demo",
"demo-status": "Demo Status",
"development": "Vystymas",
@@ -69,7 +69,7 @@
"new-notification": "Naujas pranešimas",
"event-notifiers": "Įvykių pranešimai",
"apprise-url-skipped-if-blank": "Apprise URL (praleidžiama, jei tuščia)",
"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": "Kadangi adreso URL paprastai turi jautrios informacijos, redaguojant šis laukas tyčia paliekamas tuščias.\nJei norite atnaujinti URL, įveskite naują reikšmę čia; priešingu atveju palikite lauką tuščią, kad būtų išsaugotas esamas URL.",
"enable-notifier": "Įjungti pranešiklį",
"what-events": "Kokie įvykiai turėtų būti sekami?",
"user-events": "Naudotojų įvykiai",
@@ -80,8 +80,8 @@
"tag-events": "Žymų įvykiai",
"category-events": "Kategorijų įvykiai",
"when-a-new-user-joins-your-group": "Kai prie jūsų grupės prisijungia naujas naudotojas",
"recipe-events": "Recipe Events",
"label-events": "Label Events"
"recipe-events": "Receptų įvykiai",
"label-events": "Žymų įvykiai"
},
"general": {
"add": "Pridėti",
@@ -89,7 +89,7 @@
"clear": "Išvalyti",
"close": "Uždaryti",
"confirm": "Patvirtinti",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Kaip viskas atrodo?",
"confirm-delete-generic": "Ar tikrai norite ištrinti?",
"copied_message": "Nukopijuota!",
"create": "Sukurti",
@@ -134,7 +134,7 @@
"no-recipe-found": "Nerasta receptų",
"ok": "Gerai",
"options": "Pasirinkimai:",
"plural-name": "Plural Name",
"plural-name": "Daugiskaitos pavadinimas",
"print": "Spausdinti",
"print-preferences": "Spausdinimo nustatymai",
"random": "Atsitiktinis",
@@ -164,7 +164,7 @@
"test": "Tikrinti",
"themes": "Temos",
"thursday": "Ketvirtadienis",
"title": "Title",
"title": "Pavadinimas",
"token": "Prieeigos raktas",
"tuesday": "Antradienis",
"type": "Tipas",
@@ -184,7 +184,7 @@
"date": "Data",
"id": "Id",
"owner": "Savininkas",
"change-owner": "Change Owner",
"change-owner": "Keisti savininką",
"date-added": "Įkėlimo data",
"none": "Nėra",
"run": "Paleisti",
@@ -211,11 +211,11 @@
"refresh": "Atnaujinti",
"upload-file": "Įkelti failą",
"created-on-date": "Sukurta: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"unsaved-changes": "Turite neišsaugotų pakeitimų. Ar norite juos išsaugoti prieš išeidami?\nSpauskite „Gerai“, jei norite išsaugoti, arba „Atšaukti“, jei norite atmesti pakeitimus.",
"clipboard-copy-failure": "Nepavyko nukopijuoti į iškarpinę.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers",
"caution": "Caution",
"confirm-delete-generic-items": "Ar tikrai norite ištrinti šiuos elementus?",
"organizers": "Organizatoriai",
"caution": "Įspėjimas",
"show-advanced": "Rodyti plačiau",
"add-field": "Pridėti lauką",
"date-created": "Sukūrimo data",
@@ -234,7 +234,7 @@
"group-id-with-value": "Grupės ID {groupID}",
"group-name": "Grupės pavadinimas",
"group-not-found": "Grupė nerasta",
"group-token": "Group Token",
"group-token": "Grupės raktas",
"group-with-value": "Grupė: {groupID}",
"groups": "Grupės",
"manage-groups": "Tvarkyti grupes",
@@ -246,18 +246,18 @@
"keep-my-recipes-private-description": "Nustato, kad jūsų grupė ir visi receptai joje yra privatūs pagal nutylėjimą. Visada galėsite tai pakeisti vėliau."
},
"manage-members": "Tvarkyti narius",
"manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
"manage-members-description": "Tvarkykite savo namų ūkio narių teises.\n{manage} leidžia naudotojui pasiekti duomenų tvarkymo puslapį, o {invite} generuoti kvietimų nuorodas kitiems naudotojams.\nGrupės savininkai negali keisti savo pačių teisių.",
"manage": "Tvarkyti",
"manage-household": "Manage Household",
"manage-household": "Tvarkyti namų ūkį",
"invite": "Pakviesti",
"looking-to-update-your-profile": "Ar norėtumėte atnaujinti savo profilį?",
"default-recipe-preferences-description": "Tai yra numatytosios parinktys, kai jūsų grupėje sukuriamas naujas receptas. Atskiriems receptams jie gali būti keičiami per receptų nustatymų meniu.",
"default-recipe-preferences": "Numatytosios receptų parinktys",
"group-preferences": "Grupės nustatymai",
"private-group": "Privati grupė",
"private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings",
"enable-public-access": "Enable Public Access",
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
"private-group-description": "Nustačius grupę kaip privačią, bus išjungtos visos viešo peržiūrėjimo parinktys.\nTai perrašo visus atskirus viešo peržiūrėjimo nustatymus",
"enable-public-access": "Įjungti viešą prieigą",
"enable-public-access-description": "Pagal numatymą padaryti grupės receptus viešus ir leisti lankytojams peržiūrėti receptus neprisijungus",
"allow-users-outside-of-your-group-to-see-your-recipes": "Leiskite vartotojams, nepriskirtiemsjūsų grupei, matyti jūsų receptus",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Leidžia konkretiems receptams naudoti viešai prieinamą pasidalinimui nuorodą, nereikalaujančią prisijungimo. Kai šis nustatymas išjungtas, dalintis receptais galima tik su savo grupėje esančiais naudotojais, arba per iš anksto sugeneruotą privačią nuorodą",
"show-nutrition-information": "Rodyti maistinę vertę",
@@ -269,43 +269,43 @@
"disable-users-from-commenting-on-recipes": "Neleisti vartotojams komentuoti receptų",
"disable-users-from-commenting-on-recipes-description": "Receptų komentavimas išjungiamas ir komentarų skiltis paslepiama",
"disable-organizing-recipe-ingredients-by-units-and-food": "Išjungti ingredientų organizavimą pagal matavimo vienetus ir maistą",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Paslepia maisto, vieneto ir kiekio laukus ingredientams ir apdoroja ingredientus kaip paprasto teksto laukus",
"general-preferences": "Bendrosios nuostatos",
"group-recipe-preferences": "Grupės receptų nustatymai",
"report": "Pranešti",
"report-with-id": "Report ID: {id}",
"report-with-id": "Ataskaitos ID: {id}",
"group-management": "Grupių valdymas",
"admin-group-management": "Administravimo grupės valdymas",
"admin-group-management-text": "Pakeitimai šiai grupei pritaikomi iš karto.",
"group-id-value": "Grupės ID: {0}",
"total-households": "Total Households",
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
"total-households": "Iš viso namų ūkių",
"you-must-select-a-group-before-selecting-a-household": "Prieš pasirinkdami namų ūkį, turite pasirinkti grupę"
},
"household": {
"household": "Household",
"households": "Households",
"user-household": "User Household",
"create-household": "Create Household",
"household-name": "Household Name",
"household-group": "Household Group",
"household-management": "Household Management",
"manage-households": "Manage Households",
"admin-household-management": "Admin Household Management",
"admin-household-management-text": "Changes to this household will be reflected immediately.",
"household-id-value": "Household Id: {0}",
"private-household": "Private Household",
"private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings",
"lock-recipe-edits-from-other-households": "Lock recipe edits from other households",
"lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household",
"household-recipe-preferences": "Household Recipe Preferences",
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link",
"household-preferences": "Household Preferences"
"household": "Namų ūkis",
"households": "Namų ūkiai",
"user-household": "Naudotojo namų ūkis",
"create-household": "Sukurti namų ūkį",
"household-name": "Namų ūkio pavadinimas",
"household-group": "Namų ūkio grupė",
"household-management": "Namų ūkio valdymas",
"manage-households": "Tvarkyti namų ūkius",
"admin-household-management": "Administratoriaus namų ūkio valdymas",
"admin-household-management-text": "Šio namų ūkio pakeitimai įsigalios iš karto.",
"household-id-value": "Namų ūkio Id: {0}",
"private-household": "Privatus namų ūkis",
"private-household-description": "Nustačius namų ūkį kaip privatų, bus išjungtos visos viešo peržiūrėjimo parinktys.\nTai perrašo visus atskirus viešo peržiūrėjimo nustatymus",
"lock-recipe-edits-from-other-households": "Užrakinti receptų redagavimą kitiems namų ūkiams",
"lock-recipe-edits-from-other-households-description": "Įjungus šį nustatymą, tik jūsų namų ūkio naudotojai galės redaguoti jūsų namų ūkio sukurtus receptus",
"household-recipe-preferences": "Namų ūkio receptų nuostatos",
"default-recipe-preferences-description": "Tai yra numatytieji nustatymai, taikomi kuriant naują receptą jūsų namų ūkyje.\nJuos galima pakeisti atskiriems receptams recepto nustatymų meniu.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Leisti naudotojams, nepriklausantiems jūsų namų ūkiui, matyti jūsų receptus",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Įjungus šį nustatymą, galėsite naudoti viešą bendrinimo nuorodą ir dalintis konkrečiais receptais nesuteikiant naudotojui prieigos.\nIšjungus, receptais galėsite dalintis tik su naudotojais, esančiais jūsų namų ūkyje, arba naudodami iš anksto sugeneruotą privačią nuorodą",
"household-preferences": "Namų ūkio nuostatos"
},
"meal-plan": {
"create-a-new-meal-plan": "Sukurti naują mitybos planą",
"update-this-meal-plan": "Update this Meal Plan",
"update-this-meal-plan": "Atnaujinti šį maitinimo planą",
"dinner-this-week": "Šios savaitės vakarienė",
"dinner-today": "Šiandienos vakarienė",
"dinner-tonight": "VAKARIENĖ ŠIANDIEN",
@@ -323,14 +323,14 @@
"mealplan-settings": "Mitybos plano nustatymai",
"mealplan-update-failed": "Mitybos plano atnaujinti nepavyko",
"mealplan-updated": "Mitybos planas atnaujintas",
"mealplan-households-description": "If no household is selected, recipes can be added from any household",
"mealplan-households-description": "Jei nepasirinktas joks namų ūkis, receptus galima pridėti iš bet kurio namų ūkio",
"any-category": "Bet kuri kategorija",
"any-tag": "Any Tag",
"any-household": "Any Household",
"any-tag": "Bet kuri žyma",
"any-household": "Bet kuris namų ūkis",
"no-meal-plan-defined-yet": "Nėra nustatytų mitybos planų",
"no-meal-planned-for-today": "Nėra šios dienos mitybos plano",
"numberOfDays-hint": "Number of days on page load",
"numberOfDays-label": "Default Days",
"numberOfDays-hint": "Dienų skaičius puslapio įkėlimo metu",
"numberOfDays-label": "Numatytasis dienų skaičius",
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Mitybos planuose bus naudojami tik šių kategorijų receptai",
"planner": "Planuoklis",
"quick-week": "Greitas savaitės planas",
@@ -342,7 +342,7 @@
"breakfast": "Pusryčiai",
"lunch": "Pietūs",
"dinner": "Vakarienė",
"snack": "Snack",
"snack": "Užkandis",
"drink": "Drink",
"dessert": "Dessert",
"type-any": "Bet kas",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Įkelti receptą",
"upload-individual-zip-file": "Įkelkite .zip failą, eksportuotą iš kitos \"Mealie\" sistemos.",
"url-form-hint": "Nukopijuokite ir įklijuokite nuorodą iš mėgstamų receptų svetainės",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Peržiūrėti nuskaitytus duomenis",
"trim-whitespace-description": "Pašalinti tarpus bei tuščias eilutes pradžioje ir pabaigoje",
"trim-prefix-description": "Pašalinti kiekvienos eilutės pirmąjį ženklą",
@@ -622,31 +623,31 @@
"create-recipe-from-an-image": "Create Recipe from an Image",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-images": "Create from Images",
"should-translate-description": "Translate the recipe into my language",
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
"create-from-images": "Kurti iš vaizdų",
"should-translate-description": "Išversti receptą į mano kalbą",
"please-wait-image-procesing": "Prašome palaukti, vaizdas apdorojamas. Tai gali užtrukti.",
"please-wait-images-processing": "Prašome palaukti, vaizdai apdorojami. Tai gali užtrukti.",
"bulk-url-import": "Masinis URL importavimas",
"debug-scraper": "Ieškoti nuskaitymo klaidų",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Sukurti receptą įrašant pavadinimą. Visi receptai privalo turėti unikalius pavadinimus.",
"new-recipe-names-must-be-unique": "Naujo recepto pavadinimas turi būti unikalus",
"scrape-recipe": "Nuskaityti receptą",
"scrape-recipe-description": "Nuskaityti receptą iš URL nuorodos. Pateikite recepto nuorodą, ir Mealie pabandys paimti recepto informaciją iš šios svetainės ir patalpinti ją jūsų kolekcijoje.",
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
"scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?",
"scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-have-a-lot-of-recipes": "Turite daug receptų, kuriuos norite nuskaityti vienu metu?",
"scrape-recipe-suggest-bulk-importer": "Išbandykite masinį importavimą",
"scrape-recipe-have-raw-html-or-json-data": "Turite neapdorotų HTML arba JSON duomenų?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Galite importuoti tiesiogiai iš neapdorotų duomenų",
"scrape-recipe-website-being-blocked": "Svetainė blokuojama?",
"scrape-recipe-try-importing-raw-html-instead": "Pabandykite vietoj to importuoti neapdorotą HTML.",
"import-original-keywords-as-tags": "Įkelti pradinius raktažodžius kaip žymas",
"stay-in-edit-mode": "Toliau redaguoti",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"parse-recipe-ingredients-after-import": "Analizuoti recepto ingredientus po importavimo",
"import-from-zip": "Įkelti iš .ZIP archyvo",
"import-from-zip-description": "Įkelti atskirą receptą, išsaugotą iš Mealie.",
"import-from-html-or-json": "Import from HTML or JSON",
"import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.",
"json-import-format-description-colon": "To import via JSON, it must be in valid format:",
"json-editor": "JSON Editor",
"import-from-html-or-json": "Importuoti iš HTML arba JSON",
"import-from-html-or-json-description": "Importuokite vieną receptą iš neapdoroto HTML arba JSON. Tai naudinga, jei turite receptą iš svetainės, kurios Mealie įprastai negali nuskaityti, arba iš kito išorinio šaltinio.",
"json-import-format-description-colon": "Norint importuoti per JSON, jis turi būti tinkamo formato:",
"json-editor": "JSON redaktorius",
"zip-files-must-have-been-exported-from-mealie": ".ZIP archyvai privalo būti išsaugoti iš Mealie",
"create-a-recipe-by-uploading-a-scan": "Sukurti receptą iš nuskenuoto dokumento.",
"upload-a-png-image-from-a-recipe-book": "Įkelti .PNG nuotrauką iš receptų knygos",
@@ -663,46 +664,46 @@
"recipe-debugger-use-openai-description": "Naudokite 'OpenAI', kad išanalizuoti rezultatus, o ne pasikliauti tinklalapių duomenų rinkiklio įrankiu. Kuriant receptą naudojant URL, tai padaroma automatiškai, jei duomenų rinkiklio įrankiui nepavyksta apdoroti rezultatų, tačiau čia jį galite išbandyti rankiniu būdu.",
"debug": "Šalinti klaidas",
"tree-view": "Medžio struktūra",
"recipe-servings": "Recipe Servings",
"recipe-servings": "Recepto porcijos",
"recipe-yield": "Recepto išeiga",
"recipe-yield-text": "Recipe Yield Text",
"recipe-yield-text": "Recepto išeigos tekstas",
"unit": "Vienetas",
"upload-image": "Įkelti nuotrauką",
"screen-awake": "Keep Screen Awake",
"remove-image": "Remove image",
"nextStep": "Next step",
"recipe-actions": "Recipe Actions",
"screen-awake": "Neleisti ekranui užmigti",
"remove-image": "Pašalinti vaizdą",
"nextStep": "Kitas žingsnis",
"recipe-actions": "Recepto veiksmai",
"parser": {
"ingredient-parser": "Ingredient Parser",
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
"select-parser": "Select Parser",
"natural-language-processor": "Natural Language Processor",
"brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser",
"parse-all": "Parse All",
"no-unit": "No unit",
"missing-unit": "Create missing unit: {unit}",
"missing-food": "Create missing food: {food}",
"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",
"no-food": "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"
"ingredient-parser": "Ingredientų analizatorius",
"explanation": "Norėdami naudoti ingredientų analizatorių, spustelėkite mygtuką „Analizuoti visus“, kad pradėtumėte procesą.\nKai apdoroti ingredientai bus paruošti, galėsite peržiūrėti elementus ir patikrinti, ar jie buvo teisingai išanalizuoti.\nModelio pasitikėjimo įvertinimas rodomas dešinėje nuo elemento pavadinimo. Šis įvertinimas yra visų atskirų įverčių vidurkis ir ne visada gali būti visiškai tikslus.",
"alerts-explainer": "Įspėjimai bus rodomi, jei bus rastas atitinkamas maistas arba matavimo vienetas, tačiau jo nėra duomenų bazėje.",
"select-parser": "Pasirinkti analizatorių",
"natural-language-processor": "Natūralios kalbos apdorojimo modulis",
"brute-parser": "Brutalus analizatorius",
"openai-parser": "OpenAI analizatorius",
"parse-all": "Analizuoti visus",
"no-unit": "Be vieneto",
"missing-unit": "Sukurti trūkstamą vienetą: {unit}",
"missing-food": "Sukurti trūkstamą maisto produktą: {food}",
"this-unit-could-not-be-parsed-automatically": "Šio vieneto nepavyko automatiškai išanalizuoti",
"this-food-could-not-be-parsed-automatically": "Šio maisto produkto nepavyko automatiškai išanalizuoti",
"no-food": "Be maisto produkto",
"review-parsed-ingredients": "Peržiūrėti išanalizuotus ingredientus",
"confidence-score": "Pasitikėjimo įvertinimas",
"ingredient-parser-description": "Jūsų ingredientai buvo sėkmingai išanalizuoti. Prašome peržiūrėti ingredientus, dėl kurių nesame tikri.",
"ingredient-parser-final-review-description": "Peržiūrėjus visus ingredientus, turėsite dar vieną galimybę peržiūrėti visus ingredientus prieš pritaikant pakeitimus receptui.",
"add-text-as-alias-for-item": "Pridėti \"{text}\" kaip alternatyvų pavadinimą {item}",
"delete-item": "Ištrinti elementą"
},
"reset-servings-count": "Reset Servings Count",
"not-linked-ingredients": "Additional Ingredients",
"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",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"reset-servings-count": "Atstatyti porcijų skaičių",
"not-linked-ingredients": "Papildomi ingredientai",
"upload-another-image": "Įkelti kitą vaizdą",
"upload-images": "Įkelti vaizdus",
"upload-more-images": "Įkelti daugiau vaizdų",
"set-as-cover-image": "Nustatyti kaip recepto viršelio vaizdą",
"cover-image": "Viršelio vaizdas",
"include-linked-recipes": "Įtraukti susietus receptus",
"include-linked-recipe-ingredients": "Įtraukti susietų receptų ingredientus",
"toggle-recipe": "Toggle Recipe"
},
"recipe-finder": {
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Augšupielādējiet recepti",
"upload-individual-zip-file": "Augšupielādējiet atsevišķu.zip failu, kas eksportēts no citas Mealie instances.",
"url-form-hint": "Kopējiet un ielīmējiet saiti no savas iecienītākās receptes vietnes",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Skatīt nokasītos datus",
"trim-whitespace-description": "Apgrieziet priekšējo un aizmugurējo atstarpi, kā arī tukšas rindas",
"trim-prefix-description": "Izgrieziet pirmo rakstzīmi no katras rindas",
@@ -1427,5 +1428,13 @@
"is-like": "ir kā",
"is-not-like": "nav tāds, kā"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -175,7 +175,7 @@
"view": "Weergave",
"wednesday": "woensdag",
"yes": "Ja",
"foods": "Levensmiddelen",
"foods": "Ingrediënten",
"units": "Eenheden",
"back": "Terug",
"next": "Volgende",
@@ -268,7 +268,7 @@
"default-to-landscape-view-description": "Als dit is ingeschakeld zie je de koptekst van dit recept in liggende weergave",
"disable-users-from-commenting-on-recipes": "Gebruikersreacties op recepten uitschakelen",
"disable-users-from-commenting-on-recipes-description": "Als dit is ingeschakeld zie je geen reacties op dit recept en kunnen bezoekers ook geen reacties achterlaten",
"disable-organizing-recipe-ingredients-by-units-and-food": "Het organiseren van receptingrediënten met eenheden en levensmiddelen uitschakelen",
"disable-organizing-recipe-ingredients-by-units-and-food": "Het organiseren van ingrediënten met eenheden en levensmiddelen uitschakelen",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Als dit is ingeschakeld zijn levensmiddelen, eenheden en hoeveelheden verborgen en worden ingrediënten als gewone tekstvelden behandeld",
"general-preferences": "Algemene voorkeuren",
"group-recipe-preferences": "Receptvoorkeuren voor groep",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload een recept",
"upload-individual-zip-file": "Upload een .zip-bestand dat uit een andere Mealie-instantie is geëxporteerd.",
"url-form-hint": "Kopieer en plak een link vanuit jouw favoriete receptenwebsite",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopieer en plak de bron URL van uw gegevens (optioneel)",
"view-scraped-data": "Bekijk opgehaalde data",
"trim-whitespace-description": "Haal witruimtes en witregels aan het begin en einde weg",
"trim-prefix-description": "Verwijder het eerste teken van elke regel",
@@ -1427,5 +1428,13 @@
"is-like": "is zoals",
"is-not-like": "is niet zoals"
}
},
"validators": {
"required": "Dit is een verplicht veld",
"invalid-email": "E-mailadres moet geldig zijn",
"invalid-url": "Moet een geldige URL zijn",
"no-whitespace": "Geen spaties toegestaan",
"min-length": "Moet minimaal {min} tekens bevatten",
"max-length": "Zorg dat je {max} tekens gebruikt"
}
}

View File

@@ -69,7 +69,7 @@
"new-notification": "Nytt varsel",
"event-notifiers": "Hendelsesvarsler",
"apprise-url-skipped-if-blank": "Apprise-URL (hoppes over hvis tom)",
"apprise-url-is-left-intentionally-blank": "Siden Apprise URL-er vanligvis inneholder sensitiv informasjon, må dette feltet ikke være tomt mens du redigerer. Hvis du vil oppdatere URL, skriv inn den nye her, ellers la den være tom for å beholde den gjeldende URL.",
"apprise-url-is-left-intentionally-blank": "Siden Apprise URL-er vanligvis inneholder sensitiv informasjon forblir dette feltet tomt mens du redigerer. Hvis du vil oppdatere URL, skriv inn den nye her, eller la den være tom for å beholde den gjeldende URL.",
"enable-notifier": "Aktiver varslingsagenten",
"what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?",
"user-events": "Brukerhendelser",
@@ -342,8 +342,8 @@
"breakfast": "Frokost",
"lunch": "Lunsj",
"dinner": "Middag",
"snack": "Snack",
"drink": "Drink",
"snack": "Snacks",
"drink": "Drikke",
"dessert": "Dessert",
"type-any": "Enhver",
"day-any": "Enhver",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Last opp oppskrift",
"upload-individual-zip-file": "Last opp en individuell .zip-fil eksportert fra en annen Mealie-instans.",
"url-form-hint": "Kopier og lim inn en lenke fra nettstedet med favorittoppskriftene dine",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopier og lim inn kilde-URL-en til dataene dine (valgfritt)",
"view-scraped-data": "Vis skrapte data",
"trim-whitespace-description": "Fjern innledende og etterfølgende mellomrom i tillegg til tomme linjer",
"trim-prefix-description": "Fjern første tegn fra hver linje",
@@ -568,7 +569,7 @@
"choose-unit": "Velg enhet",
"press-enter-to-create": "Trykk Enter for å opprette",
"choose-food": "Velg matvarer",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Velg oppskrift",
"notes": "Notater",
"toggle-section": "Legg til seksjon",
"see-original-text": "Se opprinnelig tekst",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Prøv masseimportering",
"scrape-recipe-have-raw-html-or-json-data": "Har du HTML- eller JSON-rådata?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere fra rådata direkte",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Er nettstedet blokkert?",
"scrape-recipe-try-importing-raw-html-instead": "Prøv å importere HTML-koden i stedet.",
"import-original-keywords-as-tags": "Importer originale søkeord som emneord",
"stay-in-edit-mode": "Forbli i redigeringsmodus",
"parse-recipe-ingredients-after-import": "Analyser oppskriftens ingredienser etter at importen er fullført",
@@ -741,7 +742,7 @@
"advanced": "Avansert",
"auto-search": "Autosøk",
"no-results": "Ingen resultater funnet",
"type-to-search": "Type to search..."
"type-to-search": "Skriv for å søke..."
},
"settings": {
"add-a-new-theme": "Legg til nytt tema",
@@ -1427,5 +1428,13 @@
"is-like": "er som",
"is-not-like": "er ikke som"
}
},
"validators": {
"required": "Dette feltet er påkrevd",
"invalid-email": "E-postadressen må være gyldig",
"invalid-url": "Må være en gyldig nettadresse",
"no-whitespace": "Ingen mellomrom tillatt",
"min-length": "Må minst ha {min} tegn",
"max-length": "Kan maksimalt ha {max} tegn"
}
}

View File

@@ -342,9 +342,9 @@
"breakfast": "Śniadanie",
"lunch": "Obiad",
"dinner": "Kolacja",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Przekąska",
"drink": "Napój",
"dessert": "Deser",
"type-any": "Dowolny",
"day-any": "Dowolny",
"editor": "Edytor",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Wrzuć przepis",
"upload-individual-zip-file": "Prześlij pojedynczy plik .zip wyeksportowany z innej instancji Mealie.",
"url-form-hint": "Skopiuj i wklej link ze swojej ulubionej strony z przepisami",
"copy-and-paste-the-source-url-of-your-data-optional": "Skopiuj i wklej źródłowy adres URL swoich danych (opcjonalnie)",
"view-scraped-data": "Wyświetl zebrane dane",
"trim-whitespace-description": "Przytnij pustą przestrzeń przed i po zawartości oraz puste linie",
"trim-prefix-description": "Przytnij pierwszy znak z każdej linii",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Wypróbuj importer zbiorczy",
"scrape-recipe-have-raw-html-or-json-data": "Masz dane HTML bądź JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Możesz zaimportować bezpośrednio z surowych danych",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Witryna jest zablokowana?",
"scrape-recipe-try-importing-raw-html-instead": "Zamiast tego spróbuj zaimportować surowy HTML.",
"import-original-keywords-as-tags": "Importuj oryginalne słowa kluczowe jako tagi",
"stay-in-edit-mode": "Pozostań w trybie edycji",
"parse-recipe-ingredients-after-import": "Analizuj składniki receptury po zaimportowaniu",
@@ -1427,5 +1428,13 @@
"is-like": "jest jak",
"is-not-like": "nie jest jak"
}
},
"validators": {
"required": "To pole jest wymagane",
"invalid-email": "E-mail musi być prawidłowy",
"invalid-url": "Musi być prawidłowym odnośnikiem",
"no-whitespace": "Niedozwolone są puste spacje",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -75,7 +75,7 @@
"user-events": "Eventos do usuário",
"mealplan-events": "Eventos do Plano Refeições",
"when-a-user-in-your-group-creates-a-new-mealplan": "Quando um usuário do seu grupo criar um plano de refeição",
"shopping-list-events": "Eventos da Lista de Compras",
"shopping-list-events": "Eventos da lista de compras",
"cookbook-events": "Eventos do Livro de Receitas",
"tag-events": "Eventos de Etiqueta",
"category-events": "Eventos de Categoria",
@@ -180,7 +180,7 @@
"back": "Voltar",
"next": "Avançar",
"start": "Iniciar",
"toggle-view": "Alternar Visualização",
"toggle-view": "Alternar visualização",
"date": "Data",
"id": "Id",
"owner": "Proprietário",
@@ -237,7 +237,7 @@
"group-token": "Token do Grupo",
"group-with-value": "Grupo: {groupID}",
"groups": "Grupos",
"manage-groups": "Gerenciar Grupos",
"manage-groups": "Gerenciar grupos",
"user-group": "Grupo de usuário",
"user-group-created": "Grupo de usuários criado",
"user-group-creation-failed": "Falha ao criar grupo de usuários",
@@ -246,9 +246,9 @@
"keep-my-recipes-private-description": "Define o seu grupo e todas as receitas padrão como privadas. Você sempre pode mudar isso mais tarde."
},
"manage-members": "Gerenciar membros",
"manage-members-description": "Gerencie as permissões dos membros da sua casa. {manage} permite ao usuário acessar a página de gerenciamento de dados, e {invite} permite ao usuário gerar links de convites para outros usuários. Os proprietários de grupos não podem mudar suas próprias permissões.",
"manage-members-description": "Gerencie as permissões dos membros do seu domicílio. {manage} permite ao usuário acessar a página de gerenciamento de dados, e {invite} permite ao usuário gerar links de convites para outros usuários. Os proprietários de grupos não podem mudar suas próprias permissões.",
"manage": "Gerenciar",
"manage-household": "Gerenciar Casa",
"manage-household": "Gerenciar domicílio",
"invite": "Convidar",
"looking-to-update-your-profile": "Procurando atualizar seu perfil?",
"default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada no seu grupo. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.",
@@ -278,30 +278,30 @@
"admin-group-management": "Gerenciamento de Grupos Administrativos",
"admin-group-management-text": "As alterações a este grupo serão refletidas imediatamente.",
"group-id-value": "ID do grupo: {0}",
"total-households": "Total de Familiares",
"you-must-select-a-group-before-selecting-a-household": "Você deve selecionar um grupo antes de selecionar uma família"
"total-households": "Total de domicílios",
"you-must-select-a-group-before-selecting-a-household": "Você deve selecionar um grupo antes de selecionar um domicílio"
},
"household": {
"household": "Casa",
"households": "Casas",
"user-household": "Família do Usuário",
"create-household": "Criar Família",
"household-name": "Nome da Família",
"household-group": "Grupo Familiar",
"household-management": "Gerenciamento Familiar",
"manage-households": "Gerenciar Família",
"admin-household-management": "Administrador de Gerenciamento Familiar",
"admin-household-management-text": "Mudanças a esta família serão aplicadas imediatamente.",
"household-id-value": "Id Familiar: {0}",
"private-household": "Família Privada",
"private-household-description": "Configurar sua família como privado desativará todas as opções de visualização pública. Isso substitui as configurações de visualização pública individual",
"lock-recipe-edits-from-other-households": "Bloquear edições de receitas de outras famílias",
"lock-recipe-edits-from-other-households-description": "Quando ativado apenas os usuários da sua família podem editar receitas criadas por sua família",
"household-recipe-preferences": "Preferências de Receita da Família",
"default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada em sua família. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Permitir que os usuários fora de sua família vejam suas receitas",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Quando ativado, você pode usar um link de compartilhamento público para compartilhar receitas específicas sem autorizar o usuário. Quando desativado, você só pode compartilhar receitas com usuários que estão na sua família ou com um link privado pré-gerado",
"household-preferences": "Preferências Familiares"
"household": "Domicílio",
"households": "Domicílios",
"user-household": "Domicílio do usuário",
"create-household": "Criar domicílio",
"household-name": "Nome do domicílio",
"household-group": "Grupo domiciliar",
"household-management": "Gerenciamento domiciliar",
"manage-households": "Gerenciar domicílio",
"admin-household-management": "Administrador de gerenciamento domiciliar",
"admin-household-management-text": "Mudanças a este domicílio serão aplicadas imediatamente.",
"household-id-value": "Identificação do domicílio: {0}",
"private-household": "Domicílio privado",
"private-household-description": "Configurar seu domicílio como privado desativará todas as opções de visualização pública. Isso substitui as configurações de visualização pública individual",
"lock-recipe-edits-from-other-households": "Bloquear edições de receitas de outros domicílios",
"lock-recipe-edits-from-other-households-description": "Quando ativado, apenas os membros do seu domicílio podem editar receitas criadas por membros do seu domicílio",
"household-recipe-preferences": "Preferências das receitas do domicílio",
"default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada em seu domicílio. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Permitir que os usuários de fora do seu domicílio vejam suas receitas",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Quando ativado, você pode usar um link de compartilhamento público para compartilhar receitas específicas sem autorizar o usuário. Quando desativado, você só pode compartilhar receitas com usuários do seu domicílio ou com um link privado pré-gerado",
"household-preferences": "Preferências do domicílio"
},
"meal-plan": {
"create-a-new-meal-plan": "Criar um novo plano de refeições",
@@ -313,20 +313,20 @@
"end-date": "Data Final",
"group": "Grupo (Beta)",
"main": "Prato Principal",
"meal-planner": "Planejador de Refeições",
"meal-planner": "Planejador de refeições",
"meal-plans": "Planos de refeições",
"mealplan-categories": "CATEGORIAS DE PLANOS DE REFEIÇÕES",
"mealplan-created": "Plano de Refeições criado",
"mealplan-creation-failed": "Falha ao criar Plano de Refeições",
"mealplan-deleted": "Plano de Refeições removido",
"mealplan-deletion-failed": "Falha ao excluir Plano de Refeições",
"mealplan-settings": "Configurações de Plano de Refeições",
"mealplan-settings": "Configurações de plano de refeições",
"mealplan-update-failed": "Falha ao atualizar Plano de Refeições",
"mealplan-updated": "Plano de Refeições atualizado",
"mealplan-households-description": "Se nenhuma família for selecionada, as receitas podem ser adicionadas por qualquer família",
"mealplan-households-description": "Se nenhum domicílio for selecionado, as receitas podem ser adicionadas por qualquer domicílio",
"any-category": "Qualquer Categoria",
"any-tag": "Qualquer Etiqueta",
"any-household": "Qualquer Família",
"any-household": "Qualquer domicílio",
"no-meal-plan-defined-yet": "Nenhum Plano de Refeições definido ainda",
"no-meal-planned-for-today": "Nenhuma refeição planejada para hoje",
"numberOfDays-hint": "Número de dias ao carregar a página",
@@ -342,9 +342,9 @@
"breakfast": "Café da manhã",
"lunch": "Almoço",
"dinner": "Jantar",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Lanche",
"drink": "Bebida",
"dessert": "Sobremesa",
"type-any": "Qualquer",
"day-any": "Qualquer",
"editor": "Editor",
@@ -367,7 +367,7 @@
"recipe-rules": "Regras das receitas",
"applies-to-all-days": "Aplica-se diariamente",
"applies-on-days": "Aplica-se em:",
"meal-plan-settings": "Configurações de Plano de Refeições"
"meal-plan-settings": "Configurações de plano de refeições"
},
"migration": {
"migration-data-removed": "Dados de migração removidos",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Enviar uma Receita",
"upload-individual-zip-file": "Enviar um arquivo .zip individual exportado a partir de outra instância do Mealie.",
"url-form-hint": "Copie e cole um link do seu site de receita favorito",
"copy-and-paste-the-source-url-of-your-data-optional": "Copie e cole o URL de origem dos seus dados (opcional)",
"view-scraped-data": "Visualizar Dados Rastreados",
"trim-whitespace-description": "Aparar o espaço em branco e à direita, bem como linhas em branco",
"trim-prefix-description": "Aparar primeiro caractere de cada linha",
@@ -524,7 +525,7 @@
"delete-image-confirmation": "Tem certeza que deseja deletar a imagem da receita?",
"recipe-image-deleted": "Imagem da receita deletada",
"recipe-name": "Nome da Receita",
"recipe-settings": "Configurações da Receita",
"recipe-settings": "Configurações da receita",
"recipe-update-failed": "Falha ao atualizar a receita",
"recipe-updated": "Receita atualizada",
"remove-from-favorites": "Remover dos Favoritos",
@@ -570,7 +571,7 @@
"choose-food": "Escolher Comida",
"choose-recipe": "Selecionar Receita",
"notes": "Notas",
"toggle-section": "Alternar Seção",
"toggle-section": "Alternar seção",
"see-original-text": "Exibir texto original",
"original-text-with-value": "Texto Original: {originalText}",
"ingredient-linker": "Ingrediente do Linker",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Tente o importador em massa",
"scrape-recipe-have-raw-html-or-json-data": "Tem dados HTML ou JSON brutos?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Você pode importar diretamente de dados brutos",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Site sendo bloqueado?",
"scrape-recipe-try-importing-raw-html-instead": "Tente importar o HTML ao invés disso.",
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
"stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar",
@@ -652,7 +653,7 @@
"upload-a-png-image-from-a-recipe-book": "Carregar uma imagem em png de um livro de receitas",
"recipe-bulk-importer": "Importador em massa de Receitas",
"recipe-bulk-importer-description": "O importador de receitas em massa permite que você importe várias receitas de uma vez enfileirando os sites no backend e executando a tarefa em segundo plano. Isso pode ser útil quando inicialmente migrar para Mealie, ou quando você quiser importar um grande número de receitas.",
"set-categories-and-tags": "Definir Categorias e Marcadores",
"set-categories-and-tags": "Definir categorias e marcadores",
"bulk-imports": "Importações em massa",
"bulk-import-process-has-started": "Processo de importação em massa iniciado",
"bulk-import-process-has-failed": "Processo de importação em massa falhou",
@@ -703,10 +704,10 @@
"cover-image": "Imagem de capa",
"include-linked-recipes": "Incluir Receita Linkada",
"include-linked-recipe-ingredients": "Incluir Ingredientes da Receita Linkada",
"toggle-recipe": "Alternar Receita"
"toggle-recipe": "Alternar receita"
},
"recipe-finder": {
"recipe-finder": "Localizador de Receitas",
"recipe-finder": "Localizador de receitas",
"recipe-finder-description": "Procure por receitas baseadas em ingredientes que você tem na mão. Você também pode filtrar por ferramentas disponíveis e definir um número máximo de ingredientes ou ferramentas que faltam.",
"selected-ingredients": "Ingredientes selecionados",
"no-ingredients-selected": "Nenhum ingrediente selecionado",
@@ -736,7 +737,7 @@
"search": "Pesquisar",
"search-mealie": "Pesquisar no Mealie (pressione /)",
"search-placeholder": "Pesquisar...",
"tag-filter": "Filtro de Marcadores",
"tag-filter": "Filtro de marcadores",
"search-hint": "Pressione '/'",
"advanced": "Avançado",
"auto-search": "Pesquisa automática",
@@ -745,7 +746,7 @@
},
"settings": {
"add-a-new-theme": "Adicionar um novo tema",
"admin-settings": "Configurações de Administrador",
"admin-settings": "Configurações de administrador",
"backup": {
"backup-created": "Backup criado com sucesso",
"backup-created-at-response-export_path": "Backup criado em {path}",
@@ -776,7 +777,7 @@
"edit-page": "Editar Página",
"events": "Eventos",
"first-day-of-week": "Primeiro dia da semana",
"group-settings-updated": "Configurações de Grupo Atualizadas",
"group-settings-updated": "Configurações de grupo atualizadas",
"homepage": {
"all-categories": "Todas as Categorias",
"card-per-section": "Cartão por Seção",
@@ -822,7 +823,7 @@
"theme-updated": "Tema atualizado",
"warning": "Atenção",
"light-mode": "Modo Claro",
"dark-mode": "Modo Escuro"
"dark-mode": "Modo escuro"
},
"token": {
"active-tokens": "TOKENS ATIVOS",
@@ -895,13 +896,13 @@
},
"shopping-list": {
"all-lists": "Todas as Listas",
"create-shopping-list": "Criar Lista de Compras",
"create-shopping-list": "Criar lista de compras",
"from-recipe": "Da Receita",
"list-name": "Nome da Lista",
"new-list": "Nova lista",
"quantity": "Quantidade: {0}",
"shopping-list": "Lista de Compras",
"shopping-lists": "Listas de Compras",
"shopping-list": "Lista de compras",
"shopping-lists": "Listas de compras",
"food": "Comida",
"note": "Nota",
"label": "Marcador",
@@ -913,8 +914,8 @@
"copy-as-text": "Copiar como texto",
"copy-as-markdown": "Copiar como Markdown",
"delete-checked": "Excluir selecionados",
"toggle-label-sort": "Alternar Ordenação de Marcador",
"reorder-labels": "Reordenar Marcadores",
"toggle-label-sort": "Alternar ordem dos marcadores",
"reorder-labels": "Reordenar marcadores",
"uncheck-all-items": "Desmarcar todos os itens",
"check-all-items": "Marcar todos os itens",
"linked-recipes-count": "Sem Receitas Vinculadas! Uma Receita Vinculada -{count} Receitas Vinculadas",
@@ -935,7 +936,7 @@
"cookbooks": "Livros de Receita",
"dashboard": "Painel",
"home-page": "Página Inicial",
"manage-users": "Gerenciar Usuários",
"manage-users": "Gerenciar usuários",
"migrations": "Migrações",
"profile": "Perfil",
"search": "Pesquisar",
@@ -1009,7 +1010,7 @@
"login-oidc": "Entrar com",
"or": "ou",
"logout": "Sair",
"manage-users": "Gerenciar Usuários",
"manage-users": "Gerenciar usuários",
"manage-users-description": "Criar e gerir usuários.",
"new-password": "Nova senha",
"new-user": "Novo Usuário",
@@ -1047,7 +1048,7 @@
"you-are-not-allowed-to-delete-this-user": "Você não tem permissão para remover esse usuário",
"enable-advanced-content": "Ativar conteúdo avançado",
"enable-advanced-content-description": "Habilita recursos avançados como Escalonamento de Receitas, chaves de API e Gerenciamento de Dados. Não se preocupe, você sempre pode mudar isso mais tarde",
"favorite-recipes": "Receitas Favoritas",
"favorite-recipes": "Receitas favoritas",
"email-or-username": "E-mail ou nome de usuário",
"remember-me": "Lembre-se de mim",
"please-enter-your-email-and-password": "Por favor, digite seu e-mail e senha",
@@ -1072,7 +1073,7 @@
"administrator": "Administrador",
"user-can-invite-other-to-group": "O usuário pode convidar outros para o grupo",
"user-can-manage-group": "Usuário pode gerenciar o grupo",
"user-can-manage-household": "O usuário pode gerenciar a família",
"user-can-manage-household": "O usuário pode gerenciar o domicílio",
"user-can-organize-group-data": "Usuário pode organizar dados do grupo",
"enable-advanced-features": "Ativar recursos avançados",
"it-looks-like-this-is-your-first-time-logging-in": "Parece que este é seu primeiro login.",
@@ -1151,7 +1152,7 @@
"data-exports": "Exportações de Dados",
"tag": "Marcador",
"categorize": "Categorizar",
"update-settings": "Atualizar Configurações",
"update-settings": "Atualizar configurações",
"tag-recipes": "Marcar Receitas",
"categorize-recipes": "Categorizar Receitas",
"export-recipes": "Exportar Receitas",
@@ -1334,8 +1335,8 @@
"debug-openai-services-description": "Use esta página para depurar serviços OpenAI. Você pode testar a sua conexão OpenAI e ver os resultados aqui. Se você tiver os serviços de imagem ativados, você também pode fornecer uma imagem.",
"run-test": "Executar teste",
"test-results": "Resultados do teste",
"group-delete-note": "Grupos com usuários ou famílias não podem ser excluídos",
"household-delete-note": "Famílias com usuários não podem ser excluídas"
"group-delete-note": "Grupos com usuários ou domicílios não podem ser excluídos",
"household-delete-note": "Domicílios com usuários não podem ser excluídos"
},
"profile": {
"welcome-user": "👋 Bem-vindo(a), {0}!",
@@ -1345,26 +1346,26 @@
"get-public-link": "Obter link público",
"account-summary": "Resumo da conta",
"account-summary-description": "Aqui está um resumo das informações do seu grupo.",
"group-statistics": "Estatísticas do Grupo",
"group-statistics": "Estatísticas do grupo",
"group-statistics-description": "Suas Estatísticas em Grupo fornecem algumas informações sobre como você está usando o Mealie.",
"household-statistics": "Estatísticas da Família",
"household-statistics-description": "Suas Estatísticas da Família fornecem algumas dicas de como você está usando o Mealie.",
"household-statistics": "Estatísticas do domicílio",
"household-statistics-description": "Suas estatísticas do domicílio fornecem algumas dicas de como você está usando o Mealie.",
"storage-capacity": "Capacidade de armazenamento",
"storage-capacity-description": "Sua capacidade de armazenamento é um cálculo das imagens e arquivos que você carregou.",
"personal": "Pessoal",
"personal-description": "Estas configurações são pessoais. Mudanças aqui não afetarão outros usuários.",
"user-settings": "Configurações de Usuário",
"user-settings": "Configurações do usuário",
"user-settings-description": "Gerencie suas preferências, altere sua senha, e atualize seu e-mail.",
"api-tokens-description": "Gerencie seus Tokens de API para acessar de aplicações externas.",
"group-description": "Esses itens são compartilhados dentro do seu grupo. Ao editar um deles vai mudá-lo para todo o grupo!",
"group-settings": "Configurações do Grupo",
"group-settings": "Configurações do grupo",
"group-settings-description": "Gerencie suas configurações comuns de grupo, como configurações de privacidade.",
"household-description": "Esses itens são compartilhados dentro de sua família. Editar um deles irá alterá-lo para toda a família!",
"household-settings": "Configurações da Família",
"household-settings-description": "Gerencie suas configurações familiares, como planos de refeição e configurações de privacidade.",
"household-description": "Esses itens são compartilhados dentro do seu domicílio. Editar um deles irá alterá-lo para todo o domicílio!",
"household-settings": "Configurações do domicílio",
"household-settings-description": "Gerencie suas configurações domiciliares, como planos de refeição e configurações de privacidade.",
"cookbooks-description": "Gerencie uma coleção de categorias de receita e gere páginas para elas.",
"members": "Membros",
"members-description": "Ver quem está na sua família e gerenciar suas permissões.",
"members-description": "Ver quem está no seu domicílio e gerenciar suas permissões.",
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
"notifiers": "Notificadores",
"notifiers-description": "Configure e-mails e notificações push que desencadeiam eventos específicos.",
@@ -1378,20 +1379,20 @@
"preferences": "Preferências",
"show-advanced-description": "Mostrar recursos avançados (Chaves de API, Webhooks, e Gerenciamento de Dados)",
"back-to-profile": "Voltar para o perfil",
"looking-for-privacy-settings": "Procurando por Configurações de Privacidade?",
"looking-for-privacy-settings": "Procurando por configurações de privacidade?",
"manage-your-api-tokens": "Gerenciar seus tokens de API",
"manage-user-profile": "Gerenciar perfil de usuário",
"manage-cookbooks": "Gerenciar Livros de Receita",
"manage-members": "Gerenciar Membros",
"manage-webhooks": "Gerenciar Webhooks",
"manage-notifiers": "Gerenciar Notificadores",
"manage-data-migrations": "Gerenciar Migrações de Dados"
"manage-cookbooks": "Gerenciar livros de receita",
"manage-members": "Gerenciar membros",
"manage-webhooks": "Gerenciar webhooks",
"manage-notifiers": "Gerenciar notificadores",
"manage-data-migrations": "Gerenciar migrações de dados"
},
"cookbook": {
"cookbooks": "Livros de Receita",
"description": "Livros de receitas são outra maneira de criar sessões cruzadas de receitas, organizadores e outros filtros. Criar um livro de receitas adicionará um acesso à barra lateral e todas as receitas com filtros selecionados serão exibidos no livro de receitas.",
"hide-cookbooks-from-other-households": "Ocultar Livros de Receitas de Outras Famílias",
"hide-cookbooks-from-other-households-description": "Quando ativo, apenas livros de receitas da sua família aparecerão na barra lateral",
"hide-cookbooks-from-other-households": "Ocultar livros de receitas de outros domicílios",
"hide-cookbooks-from-other-households-description": "Quando ativo, apenas livros de receitas do seu domicílio aparecerão na barra lateral",
"public-cookbook": "Livro de Receitas público",
"public-cookbook-description": "Cookbooks públicos podem ser compartilhados com usuários que não sejam não-mealiee serão exibidos na sua página de grupos.",
"filter-options": "Opções de filtro",
@@ -1401,7 +1402,7 @@
"require-all-tools": "Exigir todas as ferramentas",
"cookbook-name": "Nome do Livro de Receitas",
"cookbook-with-name": "Livro de Receitas {0}",
"household-cookbook-name": "{0} Livro de Receitas {1}",
"household-cookbook-name": "{0} Livro de receitas {1}",
"create-a-cookbook": "Criar um Livro de Receitas",
"cookbook": "Livro de Receitas"
},
@@ -1427,5 +1428,13 @@
"is-like": "é como",
"is-not-like": "não é como"
}
},
"validators": {
"required": "Este campo é obrigatório",
"invalid-email": "O e-mail deve ser válido",
"invalid-url": "Precisa ser uma URL válida",
"no-whitespace": "Nenhum espaço em branco é permitido",
"min-length": "Precisa ter pelo menos {min} caracteres",
"max-length": "Pode ter até {max} caracteres"
}
}

View File

@@ -343,8 +343,8 @@
"lunch": "Almoço",
"dinner": "Jantar",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"drink": "Bebida",
"dessert": "Sobremesa",
"type-any": "Qualquer",
"day-any": "Qualquer",
"editor": "Editor",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Enviar uma Receita",
"upload-individual-zip-file": "Carregar um ficheiro .zip individual, exportado de outra instância do Mealie.",
"url-form-hint": "Copie e cole um link do seu site de receitas favorito",
"copy-and-paste-the-source-url-of-your-data-optional": "Copie e cole o URL de origem dos seus dados (opcional)",
"view-scraped-data": "Ver dados recolhidos",
"trim-whitespace-description": "Eliminar os espaços em branco no início e no fim, bem como as linhas em branco",
"trim-prefix-description": "Apagar o primeiro caractere de cada linha",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Experimente o importador em massa",
"scrape-recipe-have-raw-html-or-json-data": "Tem dados HTML ou JSON em bruto?",
"scrape-recipe-you-can-import-from-raw-data-directly": "É possível importar diretamente a partir de dados em bruto",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "O site está bloqueado?",
"scrape-recipe-try-importing-raw-html-instead": "Tente importar o HTML bruto em vez disso.",
"import-original-keywords-as-tags": "Importar palavras-chave originais como etiquetas",
"stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Analisar ingredientes da receita após a importação",
@@ -1427,5 +1428,13 @@
"is-like": "é como",
"is-not-like": "não é como"
}
},
"validators": {
"required": "Este campo é obrigatório",
"invalid-email": "O Email deve ser válido",
"invalid-url": "O URL deve ser válido",
"no-whitespace": "Não são permitidos espaços em branco",
"min-length": "Deve ter pelo menos {min} caracteres",
"max-length": "Deve ter no máximo {max} caracteres"
}
}

View File

@@ -342,9 +342,9 @@
"breakfast": "Mic dejun",
"lunch": "Prânz",
"dinner": "Cină",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Gustare",
"drink": "Băutură",
"dessert": "Desert",
"type-any": "Oricare",
"day-any": "Oricare",
"editor": "Editor",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Încarcă o rețetă",
"upload-individual-zip-file": "Încărcaţi un fişier individual .zip exportat dintr-o altă instanţă de Mealie.",
"url-form-hint": "Copiază și lipește un link de pe site-ul tău web preferat de rețete",
"copy-and-paste-the-source-url-of-your-data-optional": "Copiați și lipiți adresa URL sursă a datelor dvs. (opțional)",
"view-scraped-data": "Vezi datele colectate",
"trim-whitespace-description": "Elimină spațiile albe de la început și sfârșit precum și liniile goale",
"trim-prefix-description": "Elimină primul caracter din fiecare linie",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Încearcă importatorul în bulk",
"scrape-recipe-have-raw-html-or-json-data": "Ai date de tip HTML sau JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Poți importa datele direct",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Site-ul este blocat?",
"scrape-recipe-try-importing-raw-html-instead": "Încercați în schimb să importați HTML-ul brut.",
"import-original-keywords-as-tags": "Importă cuvintele cheie originale ca tag-uri",
"stay-in-edit-mode": "Rămâi în modul Editare",
"parse-recipe-ingredients-after-import": "Analizează ingredientele rețetei după import",
@@ -1427,5 +1428,13 @@
"is-like": "este similar",
"is-not-like": "nu este similar"
}
},
"validators": {
"required": "Acest Câmp Este Obligatoriu",
"invalid-email": "E-mailul Trebuie Să Fie Valid",
"invalid-url": "Trebuie Să Fie Un URL Valid",
"no-whitespace": "Niciun Spațiu Alb Permis",
"min-length": "Trebuie Să Aibă Cel Puțin {min} Caractere",
"max-length": "Trebuie Să Aibă Cel Mult {max} Caractere"
}
}

View File

@@ -19,10 +19,10 @@
"log-lines": "Строки журнала",
"not-demo": "Не демо",
"portfolio": "Портфолио",
"production": "Production",
"production": "Продуктивная среда",
"support": "Поддержка",
"version": "Версия",
"unknown-version": "неизвестно",
"unknown-version": "Неизвестная версия",
"sponsor": "Спонсор"
},
"asset": {
@@ -342,9 +342,9 @@
"breakfast": "Завтрак",
"lunch": "Обед",
"dinner": "Ужин",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Закуска",
"drink": "Напиток",
"dessert": "Десерт",
"type-any": "Любой",
"day-any": "Любой",
"editor": "Редактор",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Загрузить рецепт",
"upload-individual-zip-file": "Загрузить отдельный .zip файл, экспортированный из другой Mealie.",
"url-form-hint": "Скопируйте и вставьте ссылку из вашего любимого сайта рецептов",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Просмотр отсканированных данных",
"trim-whitespace-description": "Обрезать ведущие и конечные пробелы, а также пустые строки",
"trim-prefix-description": "Обрезать первый символ из каждой строки",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Воспользуйтесь массовым импортом",
"scrape-recipe-have-raw-html-or-json-data": "У Вас есть данные HTML или JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Вы можете импортировать напрямую из необработанных данных",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Сайт заблокирован?",
"scrape-recipe-try-importing-raw-html-instead": "Попробуйте импортировать необработанный HTML файл.",
"import-original-keywords-as-tags": "Импортировать исходные ключевые слова как теги",
"stay-in-edit-mode": "Остаться в режиме редактирования",
"parse-recipe-ingredients-after-import": "Распознавание ингредиентов рецепта после импорта",
@@ -1427,5 +1428,13 @@
"is-like": "содержит",
"is-not-like": "не содержит"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "Без пробелов",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Nahrať recept",
"upload-individual-zip-file": "Nahrať súbor .zip exportovaný z inej Mealie inštalácie.",
"url-form-hint": "Okopírujte a zložte odkaz z vašej obľúbenej webstránky",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Náhľad získaných údajov",
"trim-whitespace-description": "Vymazať medzery a prázdne riadky na začiatku a na konci",
"trim-prefix-description": "Vymazať prvé písmeno z každého riadku",
@@ -1427,5 +1428,13 @@
"is-like": "je ako",
"is-not-like": "nie je ako"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Naloži recept",
"upload-individual-zip-file": "Naloži posamezno .zip datoteko, izvoženo iz druge Mealie namestitve.",
"url-form-hint": "Kopiraj in prilepi povezavo iz vaše priljubljene strani z recepti",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopirajte in prilepite izvorni URL svojih podatkov (neobvezno)",
"view-scraped-data": "Poglej postrgane podatke",
"trim-whitespace-description": "Poreži začetne in končne presledke, kot tudi prazne vrstice",
"trim-prefix-description": "Poreži prvi znak v vsaki vrstici",
@@ -493,7 +494,7 @@
"edit-scale": "Uredi stran",
"fat-content": "Maščoba",
"fiber-content": "Vlakna",
"grams": "grami",
"grams": "gramov",
"ingredient": "Sestavina",
"ingredients": "Sestavine",
"insert-ingredient": "Dodaj sestavino",
@@ -1427,5 +1428,13 @@
"is-like": "je kot",
"is-not-like": "ni kot"
}
},
"validators": {
"required": "To polje je obvezno",
"invalid-email": "E-pošta mora biti veljavna",
"invalid-url": "URL mora biti veljaven",
"no-whitespace": "Presledki niso dovoljeni",
"min-length": "Mora vsebovati vsaj {min} znakov",
"max-length": "Lahko je največ {max} znakov"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Копирајте и налепите везу са вашег омиљеног сајта за рецепте",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "View Scraped Data",
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
"trim-prefix-description": "Trim first character from each line",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "Ladda upp ett recept",
"upload-individual-zip-file": "Ladda upp en individuell .zip-fil som exporteras från en annan Mealie-instans.",
"url-form-hint": "Kopiera och klistra in en länk från din favorit recept webbplats",
"copy-and-paste-the-source-url-of-your-data-optional": "Kopiera och klistra in länk för din data (frivilligt)",
"view-scraped-data": "Visa skrapade data",
"trim-whitespace-description": "Ta bort inledande och avslutande blanksteg samt tomma rader",
"trim-prefix-description": "Ta bort första tecknet från varje rad",
@@ -1427,5 +1428,13 @@
"is-like": "är som",
"is-not-like": "är inte som"
}
},
"validators": {
"required": "Detta Fält Krävs",
"invalid-email": "E-post Måste Vara Giltig",
"invalid-url": "Måste var en giltig länk",
"no-whitespace": "Ingen blanksteg tillåten",
"min-length": "Måste vara minst {min} tecken",
"max-length": "Måste vara som mest {max} tecken"
}
}

View File

@@ -21,7 +21,7 @@
"portfolio": "Portföy",
"production": "Üretim",
"support": "Destek",
"version": "Versiyon",
"version": "Sürüm",
"unknown-version": "bilinmeyen",
"sponsor": "Sponsor"
},
@@ -29,7 +29,7 @@
"assets": "Malzemeler",
"code": "Kod",
"file": "Dosya",
"image": "Resim",
"image": "Görüntü",
"new-asset": "Yeni Malzeme",
"pdf": "PDF",
"recipe": "Tarif",
@@ -69,7 +69,7 @@
"new-notification": "Yeni bildirim",
"event-notifiers": "Etkinlik Bildirimleri",
"apprise-url-skipped-if-blank": "Apprise URL'si (boşsa geçilir)",
"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'leri genellikle hassas bilgiler içerdiğinden, bu alan düzenleme sırasında kasıtlı olarak boş bırakılır. URL'yi güncellemek isterseniz, lütfen yeni URL'yi buraya girin, aksi takdirde mevcut URL'yi korumak için boş bırakın.",
"enable-notifier": "Bildiriciyi Etkinleştir",
"what-events": "Bu bildirimci hangi olaylara abone olmalıdır?",
"user-events": "Kullanıcı Etkinlikleri",
@@ -109,7 +109,7 @@
"field-required": "Zorunlu Alan",
"file-folder-not-found": "Dosya/dizin bulunamadı",
"file-uploaded": "Dosya yüklendi",
"filter": "Filtre",
"filter": "Süzgeç",
"friday": "Cuma",
"general": "Genel",
"get": "Al",
@@ -189,7 +189,7 @@
"none": "Yok",
"run": "Çalıştır",
"menu": "Menü",
"a-name-is-required": "Bir İsim Gerekli",
"a-name-is-required": "Bir ad gerekli",
"delete-with-name": "Sil {name}",
"confirm-delete-generic-with-name": "{name}'i silmek istediğine emin misin?",
"confirm-delete-own-admin-account": "Lütfen kendi yönetici hesabınızı silmeye çalıştığınızı unutmayın! Bu işlem geri alınamaz ve hesabınızı kalıcı olarak siler.",
@@ -342,9 +342,9 @@
"breakfast": "Kahvaltı",
"lunch": "Öğle Yemeği",
"dinner": "Akşam Yemeği",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Atıştırmalık",
"drink": "İçecek",
"dessert": "Tatlı",
"type-any": "Herhangi",
"day-any": "Herhangi",
"editor": "Editör",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Tarif Yükle",
"upload-individual-zip-file": "Başka bir Mealie örneğinden dışa aktarılan ayrı bir .zip dosyası yükleyin.",
"url-form-hint": "Favori tarif sitenizden bir bağlantıyı kopyalayıp yapıştırın",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "Kazınmış Verileri Görüntüle",
"trim-whitespace-description": "Baştaki ve sondaki boşlukların yanı sıra boş satırları da kırpın",
"trim-prefix-description": "Her satırın ilk karakterini kırpın",
@@ -452,8 +453,8 @@
"import-by-url": "Tarifi URL'den içe aktar",
"create-manually": "Manuel olarak tarif oluştur",
"make-recipe-image": "Bunu tarif resmi yap",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
"add-food": "Yiyecek ekle",
"add-recipe": "Tarif ekle"
},
"page": {
"404-page-not-found": "404 Sayfa bulunamadı",
@@ -483,7 +484,7 @@
"comment": "Yorum",
"comments": "Yorumlar",
"delete-confirmation": "Bu tarifi silmek istediğinizden emin misiniz?",
"admin-delete-confirmation": "You're about to delete a recipe that isn't yours using admin permissions. Are you sure?",
"admin-delete-confirmation": "Size ait olmayan bir tarifi yönetici izinleriyle silmek üzeresiniz. Emin misiniz?",
"delete-recipe": "Tarifi Sil",
"description": "Açıklama",
"disable-amount": "Malzeme Miktarlarını Devre Dışı Bırak",
@@ -520,9 +521,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",
"delete-image": "Tarif Resmini Sil",
"delete-image-confirmation": "Bu tarif görselini silmek istediğinizden emin misiniz?",
"recipe-image-deleted": "Tarif Resmi Silindi",
"recipe-name": "Tarif Adı",
"recipe-settings": "Tarif Ayarları",
"recipe-update-failed": "Tarifi güncellerken hata oluştu",
@@ -568,13 +569,13 @@
"choose-unit": "Birim Seçin",
"press-enter-to-create": "Oluşturmak İçin Enter'a Basın",
"choose-food": "Yemek Seç",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Tarif Seç",
"notes": "Notlar",
"toggle-section": "Bölümü Görünürlüğünü Değiştir",
"see-original-text": "Orijinal Metni Göster",
"original-text-with-value": "Orijinal Metin: {originalText}",
"ingredient-linker": "Malzeme Bağlayıcı",
"unlinked": "Not linked yet",
"unlinked": "Henüz bağlanmadı",
"linked-to-other-step": "Başka bir adıma bağlı",
"auto": "Otomatik",
"cook-mode": "Pişirme Modu",
@@ -590,7 +591,7 @@
"edit-timeline-event": "Zaman Çizelgesi Etkinliğini Düzenle",
"timeline": "Zaman çizelgesi",
"timeline-is-empty": "Zaman çizelgesinde henüz bir şey yok. Bu tarifi yapmayı deneyin!",
"timeline-no-events-found-try-adjusting-filters": "Hiçbir etkinlik bulunamadı. Arama filtrelerinizi ayarlamayı deneyin.",
"timeline-no-events-found-try-adjusting-filters": "Hiçbir etkinlik bulunamadı. Arama süzgeçlerinizi ayarlamayı deneyin.",
"group-global-timeline": "{groupName} Küresel Zaman Çizelgesi",
"open-timeline": "Zaman Çizelgesini Aç",
"made-this": "Bunu ben yaptım",
@@ -599,12 +600,12 @@
"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",
"failed-to-update-recipe": "Tarif yenileme başarısız",
"added-to-timeline-but-failed-to-add-image": "Added to timeline, but failed to add image",
"api-extras-description": "Tarif ekstraları Mealie API'nin önemli bir özelliğidir. Üçüncü taraf uygulamalardan referans almak üzere bir tarif içinde özel JSON anahtar/değer çiftleri oluşturmanıza olanak tanır. Bu tuşları, örneğin otomasyonları tetiklemek veya istediğiniz cihaza iletilecek özel mesajları bilgi sağlamak için kullanabilirsiniz.",
"message-key": "İleti Anahtarı",
"parse": "Ayrıştırma",
"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": "Görünüşe göre içerikleriniz henüz analiz edilmemiş. Aşağıdaki \"{parse}\" butonuna tıklayarak içeriklerinizi yapılandırılmış yiyeceklere ayırabilirsiniz.",
"attach-images-hint": "Düzenleyiciye sürükleyip bırakarak görselleri ekleyin",
"drop-image": "Yüklenecek resimi sürükleyip bırakın",
"enable-ingredient-amounts-to-use-this-feature": "Bu özelliği kullanabilmek için malzeme miktarlarını etkinleştirin",
@@ -622,13 +623,13 @@
"create-recipe-from-an-image": "Görüntüden yemek tarifi oluştur",
"create-recipe-from-an-image-description": "Bir görsel yükleyerek yemek tarifi oluşturun. Mealie, yapay zekâ kullanarak görseldeki bilgileri çekip yemek tarifini oluşturmaya çalışacaktır.",
"crop-and-rotate-the-image": "Resmi sadece yazılar gözükecek şekilde kesin ve döndürün, ayrıca doğru yönde durduğuna emin olun.",
"create-from-images": "Create from Images",
"create-from-images": "Resimden Oluştur",
"should-translate-description": "Tarifi kendi dilime çevir",
"please-wait-image-procesing": "Görsel işlenirken lütfen bekleyin. Bu, biraz zaman alabilir.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
"please-wait-images-processing": "Lütfen bekleyin, görüntüler işleniyor. Bu biraz zaman alabilir.",
"bulk-url-import": "Toplu URL İçe Aktarma",
"debug-scraper": "Veri Kazıma Hata Ayıklayıcı",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "İsim vererek bir tarif oluşturun. Tüm tariflerin benzersiz isimleri olması gerekiyor.",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Oluşturmak için tarifi adlandırın. Tüm tariflerin benzersiz adları olmalı.",
"new-recipe-names-must-be-unique": "Yeni tarif ismi benzersiz olmalı",
"scrape-recipe": "Tarifi Kazı",
"scrape-recipe-description": "Url'den bir tarif kazıyın. Kazımak istediğiniz sitenin url'sini verin ve Mealie, tarifi o siteden alıp koleksiyonunuza eklemeye çalışacaktır.",
@@ -636,7 +637,7 @@
"scrape-recipe-suggest-bulk-importer": "Toplu ithalatçıyı deneyin",
"scrape-recipe-have-raw-html-or-json-data": "Ham HTML veya JSON verileriniz mi var?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Ham veriden doğrudan içe aktarabilirsiniz",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-website-being-blocked": "Web sitesi engelleniyor?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Orijinal anahtar kelimeleri etiket olarak içe aktar",
"stay-in-edit-mode": "Düzenleme modunda kalın",
@@ -645,7 +646,7 @@
"import-from-zip-description": "Başka bir Mealie örneğinden dışa aktarılmış tek bir tarifi içe aktarın.",
"import-from-html-or-json": "HTML veya JSON veriden içe aktar",
"import-from-html-or-json-description": "Ham HTML veya JSON'dan tek bir tarif içe aktar. Bu, Mealie'nin normalde veri çekemediği bir siteden ya da başka bir dış kaynaktan bir tarifin varsa faydalıdır.",
"json-import-format-description-colon": "To import via JSON, it must be in valid format:",
"json-import-format-description-colon": "JSON'dan içe aktarmak için, geçerli formatta olmalıdır:",
"json-editor": "JSON Editör",
"zip-files-must-have-been-exported-from-mealie": ".zip dosyası Mealie'den dışa aktarılmış olmalıdır",
"create-a-recipe-by-uploading-a-scan": "Bir tarama yükleyerek tarif oluşturun.",
@@ -689,16 +690,16 @@
"no-food": "Gıda yok",
"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.",
"ingredient-parser-description": "İçerikleriniz başarıyla ayrıştırıldı. Emin olmadığımız içerikleri lütfen gözden geçirin.",
"ingredient-parser-final-review-description": "Tüm malzemeler incelendikten sonra, tarifinize değişiklikleri uygulamadan önce bir kez daha tüm malzemeleri inceleme şansınız olur.",
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
"delete-item": "Delete Item"
"delete-item": "Ögeyi sil"
},
"reset-servings-count": "Reset Servings Count",
"not-linked-ingredients": "Ek Malzemeler",
"upload-another-image": "Upload another image",
"upload-images": "Upload images",
"upload-more-images": "Upload more images",
"upload-another-image": "Başka görsel yükle",
"upload-images": "Görsel yükle",
"upload-more-images": "Daha fazla görsel yükle",
"set-as-cover-image": "Set as recipe cover image",
"cover-image": "Cover image",
"include-linked-recipes": "Include Linked Recipes",
@@ -707,18 +708,18 @@
},
"recipe-finder": {
"recipe-finder": "Tarif Bulucu",
"recipe-finder-description": "Elinizdeki malzemelere göre tarif arayın. Ayrıca sahip olduğunuz araçlara göre filtreleme yapabilir ve eksik malzeme veya araç sayısı için bir üst sınır belirleyebilirsiniz.",
"recipe-finder-description": "Elinizdeki malzemelere göre tarif arayın. Ayrıca sahip olduğunuz araçlara göre süzme yapabilir ve eksik malzeme veya araç sayısı için bir üst sınır belirleyebilirsiniz.",
"selected-ingredients": "Seçilen malzemeler",
"no-ingredients-selected": "Hiçbir malzeme seçilmedi",
"missing": "Eksik",
"no-recipes-found": "Herhangi bir tarif bulunamadı",
"no-recipes-found-description": "Aramanıza daha fazla malzeme eklemeyi ya da filtrelerinizi ayarlamayı deneyin",
"no-recipes-found-description": "Aramanıza daha fazla malzeme eklemeyi ya da süzgeçlerinizi ayarlamayı deneyin",
"include-ingredients-on-hand": "Elindeki Malzemeleri Dahil Et",
"include-tools-on-hand": "Elindeki Araç Gereçleri Dahil Et",
"max-missing-ingredients": "Maksimum Eksik Malzeme Sayısı",
"max-missing-tools": "Maksimum Eksik Araç Sayısı",
"selected-tools": "Seçilen Araçlar",
"other-filters": "Diğer Filtreler",
"other-filters": "Diğer süzgeçler",
"ready-to-make": "Yapmaya Hazır",
"almost-ready-to-make": "Yapmaya Neredeyse Hazır"
},
@@ -736,12 +737,12 @@
"search": "Ara",
"search-mealie": "Mealie'de Ara (/ tuşuna basın)",
"search-placeholder": "Ara...",
"tag-filter": "Etiket Filtresi",
"tag-filter": "Etiket süzgeci",
"search-hint": "'/' Tuşuna Basın",
"advanced": "Gelişmiş",
"auto-search": "Otomatik Arama",
"no-results": "Sonuç bulunamadı",
"type-to-search": "Type to search..."
"type-to-search": "Aramak için yaz..."
},
"settings": {
"add-a-new-theme": "Yeni Tema Ekle",
@@ -837,7 +838,7 @@
"toolbox": {
"assign-all": "Tümünü Ata",
"bulk-assign": "Toplu Atama",
"new-name": "Yeni İsim",
"new-name": "Yeni ad",
"no-unused-items": "Kullanılmayan Öğe Yok",
"recipes-affected": "Hiçbir Tarif Etkilenmedi|Bir Tarif Etkilendi|{count} Tarif Etkilendi",
"remove-unused": "Kullanılmayanları Kaldır",
@@ -1000,7 +1001,7 @@
"email": "E-Posta",
"error-cannot-delete-super-user": "Hata! Süper Kullanıcı Silinemez",
"existing-password-does-not-match": "Mevcut parola eşleşmiyor",
"full-name": "İsim Soyisim",
"full-name": "Ad Soyad",
"generate-password-reset-link": "Parola Sıfırlama Bağlantısı Oluştur",
"invite-only": "Sadece Davetli",
"link-id": "Bağlantı kimliği",
@@ -1080,7 +1081,7 @@
"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.",
"default-activity": "Default Activity",
"default-activity": "Varsayılan Aktivite",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
},
"language-dialog": {
@@ -1199,7 +1200,7 @@
"group-details": "Grup Detayları",
"group-details-description": "Hesap oluşturmadan önce bir grup oluşturmanız gerekir. Grubunuzda yalnızca siz yer alacaksınız ancak daha sonra başkalarını da davet edebileceksiniz. Grubunuzdaki üyeler yemek planlarını, alışveriş listelerini, tarifleri ve daha fazlasını paylaşabilir!",
"use-seed-data": "Tohum Verisi Kullan",
"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, tariflerinizi düzenlemek için grubunuzu faydalı verilerle doldurmak için kullanılabilecek yiyecek, birim ve etiket koleksiyonuyla birlikte geliyor. Bunlar şu anda seçtiğiniz dile çevriliyor. Bu veriyi daha sonra ekleyebilir veya değiştirebilirsiniz.",
"account-details": "Hesap Detayları"
},
"validation": {
@@ -1389,12 +1390,12 @@
},
"cookbook": {
"cookbooks": "Tarif Kitapları",
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.",
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households",
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar",
"description": "Yemek kitapları, tarifler, düzenleyiciler ve diğer süzgeçlerin kesitlerini oluşturarak tarifleri düzenlemenin başka bir yoludur. Bir yemek kitabı oluşturmak, yan çubukta bir giriş ekler ve seçilmiş süzgeçlerle birlikte tüm tarifler yemek kitabında gösterilir.",
"hide-cookbooks-from-other-households": "Diğer evlerin yemek kitaplarını gizle",
"hide-cookbooks-from-other-households-description": "Etkinleştirildiğinde, yan panelde sadece evinizin yemek kitapları görünecektir",
"public-cookbook": "Herkese Açık Tarif Kitabı",
"public-cookbook-description": "Herkese Açık Tarif Kitapları, mealie kullanıcısı olmayanlarla paylaşılabilir ve grup sayfanızda görüntülenir.",
"filter-options": "Filtre Seçenekleri",
"filter-options": "Süzme seçenekleri",
"filter-options-description": "Tümünü gerektir seçildiğinde tarif kitabı yalnızca tüm öğelerin seçili olduğu tarifleri içerecektir. Bu, seçilen öğelerin bir kesiti için değil, seçicilerin her bir alt kümesi için geçerlidir.",
"require-all-categories": "Tüm Kategorileri Gerektir",
"require-all-tags": "Tüm Etiketleri Gerektir",
@@ -1415,17 +1416,25 @@
"does-not-equal": "eşit değildir",
"is-greater-than": "daha büyük",
"is-greater-than-or-equal-to": "daha büyük veya eşit",
"is-less-than": "is less than",
"is-less-than-or-equal-to": "is less than or equal to"
"is-less-than": "daha mı az",
"is-less-than-or-equal-to": "daha az veya eşit mi"
},
"relational-keywords": {
"is": "is",
"is-not": "is not",
"is-not": "değil mi",
"is-one-of": "is one of",
"is-not-one-of": "is not one of",
"contains-all-of": "contains all of",
"contains-all-of": "hepsini içeriyor mu",
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "Bu Alan Gereklidir",
"invalid-email": "E-posta Geçerli Olmalıdır",
"invalid-url": "Geçerli Bir URL Olmalıdır",
"no-whitespace": "No Whitespace Allowed",
"min-length": "En Az {min} Karakter Olmalıdır",
"max-length": "En Fazla {max} Karakter Olmalıdır"
}
}

View File

@@ -342,9 +342,9 @@
"breakfast": "Сніданок",
"lunch": "Обід",
"dinner": "Вечеря",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Закуска",
"drink": "Напій",
"dessert": "Десерт",
"type-any": "Будь-який",
"day-any": "Будь-який",
"editor": "Редактор",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Завантажити рецепт",
"upload-individual-zip-file": "Завантажити окремий .zip файл, експортований з іншого Mealie.",
"url-form-hint": "Скопіюйте та вставте посилання з вашого улюбленого кулінарного веб-сайту",
"copy-and-paste-the-source-url-of-your-data-optional": "Скопіюйте та вставте URL-адресу ваших даних (необов'язково)",
"view-scraped-data": "Переглянути зібрані дані",
"trim-whitespace-description": "Обрізати початкові та кінцеву пробілів і порожні лінії",
"trim-prefix-description": "Обрізати перший символ з кожного рядка",
@@ -636,8 +637,8 @@
"scrape-recipe-suggest-bulk-importer": "Спробуйте масовий розпізнавач",
"scrape-recipe-have-raw-html-or-json-data": "Маєте необроблені дані HTML або JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Ви можете імпортувати необроблені дані",
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"scrape-recipe-website-being-blocked": "Заблокований сайт?",
"scrape-recipe-try-importing-raw-html-instead": "Спробуйте імпортувати вихідний HTML натомість.",
"import-original-keywords-as-tags": "Імпортувати оригінальні ключові слова як теги",
"stay-in-edit-mode": "Залишитися в режимі редактора",
"parse-recipe-ingredients-after-import": "Розпізнавання інгредієнтів рецепту після імпорту",
@@ -1427,5 +1428,13 @@
"is-like": "схожий",
"is-not-like": "не схожий"
}
},
"validators": {
"required": "Це поле обовʼязкове",
"invalid-email": "Електронна адреса повинна бути дійсною",
"invalid-url": "Має бути дійсною URL-адресою",
"no-whitespace": "Пробіли заборонені",
"min-length": "Повинно бути не менше ніж {min} символів ",
"max-length": "Повинно бути не більше ніж {max} символів"
}
}

View File

@@ -7,29 +7,29 @@
"application-mode": "Application Mode",
"database-type": "Loại cơ sở dữ liệu",
"database-url": "Database URL",
"default-group": "Default Group",
"default-group": "Nhóm mặc định",
"default-household": "Default Household",
"demo": "Bản thử nghiệm",
"demo-status": "Demo Status",
"development": "Development",
"docs": "Docs",
"download-log": "Download Log",
"development": "Phát Triển",
"docs": "Tài liệu",
"download-log": "Nhật kí tải xuống",
"download-recipe-json": "Last Scraped JSON",
"github": "GitHub",
"log-lines": "Log Lines",
"not-demo": "Not Demo",
"portfolio": "Portfolio",
"portfolio": "Danh mục",
"production": "Production",
"support": "Support",
"version": "Version",
"support": "Hỗ trợ",
"version": "Phiên bản",
"unknown-version": "unknown",
"sponsor": "Sponsor"
"sponsor": "Nhà Tài Trợ"
},
"asset": {
"assets": "Assets",
"code": "Code",
"file": "File",
"image": "Image",
"image": "Hình ảnh",
"new-asset": "New Asset",
"pdf": "PDF",
"recipe": "Recipe",
@@ -445,6 +445,7 @@
"upload-a-recipe": "Upload a Recipe",
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
"url-form-hint": "Copy and paste a link from your favorite recipe website",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "View Scraped Data",
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
"trim-prefix-description": "Trim first character from each line",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "上传食谱",
"upload-individual-zip-file": "上传从Mealie导出的.zip文件。",
"url-form-hint": "从您最喜爱的食谱网站复制并粘贴链接",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "查看爬取的数据",
"trim-whitespace-description": "删除开头和结尾的空格和空行",
"trim-prefix-description": "删除每行的首个字符",
@@ -1427,5 +1428,13 @@
"is-like": "匹配",
"is-not-like": "不匹配"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -445,6 +445,7 @@
"upload-a-recipe": "上傳食譜",
"upload-individual-zip-file": "上傳從另一個Mealie匯出的zip壓縮檔",
"url-form-hint": "複製您最喜歡的食譜網站的網址並在此貼上",
"copy-and-paste-the-source-url-of-your-data-optional": "Copy and paste the source URL of your data (optional)",
"view-scraped-data": "查看網頁擷取資料",
"trim-whitespace-description": "Trim leading and trailing whitespace as well as blank lines",
"trim-prefix-description": "Trim first character from each line",
@@ -1427,5 +1428,13 @@
"is-like": "is like",
"is-not-like": "is not like"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}
}

View File

@@ -110,80 +110,6 @@ export interface CreateBackup {
options: BackupOptions;
templates?: string[] | null;
}
export interface CustomPageBase {
name: string;
slug: string | null;
position: number;
categories?: RecipeCategoryResponse[];
}
export interface RecipeCategoryResponse {
name: string;
id: string;
groupId?: string | null;
slug: string;
recipes?: RecipeSummary[];
}
export interface RecipeSummary {
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;
}
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 CustomPageImport {
name: string;
status: boolean;
exception?: string | null;
}
export interface CustomPageOut {
name: string;
slug: string | null;
position: number;
categories?: RecipeCategoryResponse[];
id: number;
}
export interface DebugResponse {
success: boolean;
response?: string | null;
@@ -248,11 +174,6 @@ export interface Migrations {
type: string;
files?: MigrationFile[];
}
export interface NotificationImport {
name: string;
status: boolean;
exception?: string | null;
}
export interface RecipeImport {
name: string;
status: boolean;

View File

@@ -44,7 +44,6 @@ export interface QueryFilterJSONPart {
attributeName?: string | null;
relationalOperator?: RelationalKeyword | RelationalOperator | null;
value?: string | string[] | null;
[k: string]: unknown;
}
export interface SaveCookBook {
name: string;

View File

@@ -334,7 +334,6 @@ export interface IngredientUnit {
}
export interface IngredientUnitAlias {
name: string;
[k: string]: unknown;
}
export interface CreateIngredientUnit {
id?: string | null;
@@ -349,11 +348,9 @@ export interface CreateIngredientUnit {
pluralAbbreviation?: string | null;
useAbbreviation?: boolean;
aliases?: CreateIngredientUnitAlias[];
[k: string]: unknown;
}
export interface CreateIngredientUnitAlias {
name: string;
[k: string]: unknown;
}
export interface IngredientFood {
id: string;
@@ -372,7 +369,6 @@ export interface IngredientFood {
}
export interface IngredientFoodAlias {
name: string;
[k: string]: unknown;
}
export interface MultiPurposeLabelSummary {
name: string;
@@ -391,11 +387,9 @@ export interface CreateIngredientFood {
labelId?: string | null;
aliases?: CreateIngredientFoodAlias[];
householdsWithIngredientFood?: string[];
[k: string]: unknown;
}
export interface CreateIngredientFoodAlias {
name: string;
[k: string]: unknown;
}
export interface Recipe {
id?: string | null;
@@ -433,21 +427,18 @@ export interface Recipe {
[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;
@@ -455,7 +446,6 @@ export interface RecipeTool {
name: string;
slug: string;
householdsWithTool?: string[];
[k: string]: unknown;
}
export interface RecipeStep {
id?: string | null;
@@ -463,11 +453,9 @@ export interface RecipeStep {
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;
@@ -481,7 +469,6 @@ export interface Nutrition {
sugarContent?: string | null;
transFatContent?: string | null;
unsaturatedFatContent?: string | null;
[k: string]: unknown;
}
export interface RecipeSettings {
public?: boolean;
@@ -490,18 +477,15 @@ export interface RecipeSettings {
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;
@@ -511,14 +495,12 @@ export interface RecipeCommentOut {
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;

View File

@@ -510,6 +510,7 @@ export interface ScrapeRecipeBase {
export interface ScrapeRecipeData {
includeTags?: boolean;
data: string;
url?: string | null;
}
export interface ScrapeRecipeTest {
url: string;

View File

@@ -146,8 +146,8 @@ export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> {
return await this.requests.post<Recipe | null>(routes.recipesTestScrapeUrl, { url, useOpenAI });
}
async createOneByHtmlOrJson(data: string, includeTags: boolean) {
return await this.requests.post<string>(routes.recipesCreateFromHtmlOrJson, { data, includeTags });
async createOneByHtmlOrJson(data: string, includeTags: boolean, url: string | null = null) {
return await this.requests.post<string>(routes.recipesCreateFromHtmlOrJson, { data, includeTags, url });
}
async createOneByUrl(url: string, includeTags: boolean) {

View File

@@ -1,2 +1,2 @@
export { scorePassword } from "./password";
export { required, email, whitespace, url, minLength, maxLength } from "./inputs";
export { required, email, whitespace, url, urlOptional, minLength, maxLength } from "./inputs";

View File

@@ -1,10 +1,33 @@
import { expect, test } from "vitest";
import { expect, test, vi } from "vitest";
import enUS from "~/lang/messages/en-US.json";
import { required, email, whitespace, url, minLength, maxLength } from "./inputs";
vi.mock("~/composables/use-global-i18n", () => {
const interpolate = (msg: string, params?: Record<string, unknown>) => {
if (!params) return msg;
return msg
.replace("{min}", String(params.min ?? ""))
.replace("{max}", String(params.max ?? ""));
};
const t = (key: string, params?: Record<string, unknown>) => {
const parts = key.split(".");
let acc: any = enUS as any;
for (const p of parts) acc = acc?.[p];
const msg: string | undefined = acc;
return interpolate(msg ?? key, params);
};
return { useGlobalI18n: () => ({ t }) };
});
export { scorePassword } from "./password";
// Tests
test("validator required", () => {
const falsey = "This Field is Required";
const falsey = enUS.validators.required;
expect(required("123")).toBe(true);
expect(required("")).toBe(falsey);
expect(required(undefined)).toBe(falsey);
@@ -14,7 +37,7 @@ test("validator required", () => {
const nulls = [undefined, null];
test("validator email", () => {
const falsey = "Email Must Be Valid";
const falsey = enUS.validators["invalid-email"];
expect(email("123")).toBe(falsey);
expect(email("email@example.com")).toBe(true);
@@ -24,7 +47,7 @@ test("validator email", () => {
});
test("whitespace", () => {
const falsey = "No Whitespace Allowed";
const falsey = enUS.validators["no-whitespace"];
expect(whitespace("123")).toBe(true);
expect(whitespace(" ")).toBe(falsey);
expect(whitespace("123 123")).toBe(falsey);
@@ -35,7 +58,7 @@ test("whitespace", () => {
});
test("url", () => {
const falsey = "Must Be A Valid URL";
const falsey = enUS.validators["invalid-url"];
expect(url("https://example.com")).toBe(true);
expect(url("")).toBe(falsey);
@@ -46,7 +69,7 @@ test("url", () => {
test("minLength", () => {
const min = 3;
const falsey = `Must Be At Least ${min} Characters`;
const falsey = enUS.validators["min-length"].replace("{min}", String(min));
const fn = minLength(min);
expect(fn("123")).toBe(true);
expect(fn("12")).toBe(falsey);
@@ -59,7 +82,7 @@ test("minLength", () => {
test("maxLength", () => {
const max = 3;
const falsey = `Must Be At Most ${max} Characters`;
const falsey = enUS.validators["max-length"].replace("{max}", String(max));
const fn = maxLength(max);
expect(fn("123")).toBe(true);
expect(fn("1234")).toBe(falsey);

View File

@@ -1,28 +1,40 @@
import { useGlobalI18n } from "~/composables/use-global-i18n";
const EMAIL_REGEX
= /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@(([[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
const URL_REGEX = /[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
const URL_REGEX = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
export function required(v: string | undefined | null) {
return !!v || "This Field is Required";
const i18n = useGlobalI18n();
return !!v || i18n.t("validators.required");
}
export function email(v: string | undefined | null) {
return (!!v && EMAIL_REGEX.test(v)) || "Email Must Be Valid";
const i18n = useGlobalI18n();
return (!!v && EMAIL_REGEX.test(v)) || i18n.t("validators.invalid-email");
}
export function whitespace(v: string | null | undefined) {
return (!!v && v.split(" ").length <= 1) || "No Whitespace Allowed";
const i18n = useGlobalI18n();
return (!!v && v.split(" ").length <= 1) || i18n.t("validators.no-whitespace");
}
export function url(v: string | undefined | null) {
return (!!v && URL_REGEX.test(v)) || "Must Be A Valid URL";
const i18n = useGlobalI18n();
return (!!v && URL_REGEX.test(v)) || i18n.t("validators.invalid-url");
}
export function urlOptional(v: string | undefined | null) {
return v ? url(v) : true;
}
export function minLength(min: number) {
return (v: string | undefined | null) => (!!v && v.length >= min) || `Must Be At Least ${min} Characters`;
const i18n = useGlobalI18n();
return (v: string | undefined | null) => (!!v && v.length >= min) || i18n.t("validators.min-length", { min });
}
export function maxLength(max: number) {
return (v: string | undefined | null) => !v || v.length <= max || `Must Be At Most ${max} Characters`;
const i18n = useGlobalI18n();
return (v: string | undefined | null) => !v || v.length <= max || i18n.t("validators.max-length", { max });
}

View File

@@ -257,6 +257,7 @@ export default defineNuxtConfig({
share_target: {
action: "/r/create/url",
method: "GET",
enctype: "application/x-www-form-urlencoded",
params: {
text: "recipe_import_url",
},

View File

@@ -1,6 +1,6 @@
{
"name": "mealie",
"version": "3.7.0",
"version": "3.9.2",
"private": true,
"scripts": {
"dev": "nuxt dev",
@@ -34,7 +34,7 @@
"vue-advanced-cropper": "^2.8.9",
"vue-draggable-plus": "^0.6.0",
"vuetify": "^3.9.7",
"vuetify-nuxt-module": "^0.18.8"
"vuetify-nuxt-module": "^0.18.9"
},
"devDependencies": {
"@nuxt/eslint": "^1.2.0",
@@ -58,6 +58,9 @@
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
"resolutions": {
"esbuild": ">=0.25.0"
"esbuild": ">=0.25.0",
"glob": ">=10.5.0",
"js-yaml": ">=4.1.1",
"node-forge": ">=1.3.2"
}
}

View File

@@ -37,7 +37,6 @@
$t('settings.backup.backup-restore-process-in-the-documentation') }}</a>
</template>
</i18n-t>
{{ $t('') }}
</p>
<v-checkbox
@@ -82,6 +81,7 @@
>
<BaseButton
class="mr-2"
:loading="runningBackup"
@click="createBackup"
>
{{ $t("settings.backup.create-heading") }}
@@ -183,6 +183,7 @@ export default defineNuxtComponent({
}
async function createBackup() {
state.runningBackup = true;
const { data } = await adminApi.backups.create();
if (data?.error === false) {
@@ -192,6 +193,7 @@ export default defineNuxtComponent({
else {
alert.error(i18n.t("settings.backup.error-creating-backup-see-log-file"));
}
state.runningBackup = false;
}
async function restoreBackup(fileName: string) {
@@ -228,6 +230,7 @@ export default defineNuxtComponent({
deleteDialog: false,
createDialog: false,
importDialog: false,
runningBackup: false,
runningRestore: false,
search: "",
headers: [
@@ -239,7 +242,7 @@ export default defineNuxtComponent({
});
function setSelected(data: { name: string; date: string }) {
if (selected.value === null || selected.value === undefined) {
if (!data.name) {
return;
}
selected.value = data.name;

View File

@@ -1,7 +1,7 @@
<template>
<v-form
ref="domUrlForm"
@submit.prevent="createFromHtmlOrJson(newRecipeData, importKeywordsAsTags)"
@submit.prevent="createFromHtmlOrJson(newRecipeData, importKeywordsAsTags, newRecipeUrl)"
>
<div>
<v-card-title class="headline">
@@ -21,14 +21,28 @@
<v-switch
v-model="isEditJSON"
:label="$t('recipe.json-editor')"
color="primary"
class="mt-2"
@change="handleIsEditJson"
/>
<v-text-field
v-model="newRecipeUrl"
:label="$t('new-recipe.recipe-url')"
:prepend-inner-icon="$globals.icons.link"
validate-on="blur"
variant="solo-filled"
clearable
rounded
:rules="[validators.urlOptional]"
:hint="$t('new-recipe.copy-and-paste-the-source-url-of-your-data-optional')"
persistent-hint
class="mt-10 mb-4"
style="max-width: 500px"
/>
<RecipeJsonEditor
v-if="isEditJSON"
v-model="newRecipeData"
height="250px"
class="mt-10"
mode="code"
:main-menu-bar="false"
/>
@@ -41,10 +55,7 @@
autofocus
variant="solo-filled"
clearable
class="rounded-lg mt-2"
rounded
:hint="$t('new-recipe.url-form-hint')"
persistent-hint
/>
<v-checkbox
v-model="importKeywordsAsTags"
@@ -124,6 +135,7 @@ export default defineNuxtComponent({
}
const newRecipeData = ref<string | object | null>(null);
const newRecipeUrl = ref<string | null>(null);
function handleIsEditJson() {
if (state.isEditJSON) {
@@ -148,8 +160,13 @@ export default defineNuxtComponent({
}
handleIsEditJson();
async function createFromHtmlOrJson(htmlOrJsonData: string | object | null, importKeywordsAsTags: boolean) {
if (!htmlOrJsonData || !domUrlForm.value?.validate()) {
async function createFromHtmlOrJson(htmlOrJsonData: string | object | null, importKeywordsAsTags: boolean, url: string | null = null) {
if (!htmlOrJsonData) {
return;
}
const isValid = await domUrlForm.value?.validate();
if (!isValid?.valid) {
return;
}
@@ -162,7 +179,7 @@ export default defineNuxtComponent({
}
state.loading = true;
const { response } = await api.recipes.createOneByHtmlOrJson(dataString, importKeywordsAsTags);
const { response } = await api.recipes.createOneByHtmlOrJson(dataString, importKeywordsAsTags, url);
handleResponse(response, importKeywordsAsTags);
}
@@ -172,6 +189,7 @@ export default defineNuxtComponent({
stayInEditMode,
parseRecipe,
newRecipeData,
newRecipeUrl,
handleIsEditJson,
createFromHtmlOrJson,
...toRefs(state),

View File

@@ -134,18 +134,22 @@
<v-card>
<v-card-text>
<div>
<v-text-field
<v-number-input
v-model="settings.maxMissingFoods"
type="number"
:precision="null"
:min="0"
control-variant="stacked"
inset
hide-details
hide-spin-buttons
:label="$t('recipe-finder.max-missing-ingredients')"
/>
<v-text-field
<v-number-input
v-model="settings.maxMissingTools"
type="number"
:precision="null"
:min="0"
control-variant="stacked"
inset
hide-details
hide-spin-buttons
:label="$t('recipe-finder.max-missing-tools')"
class="mt-4"
/>

View File

@@ -209,12 +209,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
if (!item.id) {
continue;
}
await categoryStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id).filter(id => !!id);
await categoryStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -528,9 +528,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
await foodStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id);
await foodStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -261,9 +261,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
await labelStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id);
await labelStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -249,9 +249,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
await actionStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id);
await actionStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -25,8 +25,9 @@
v-model="state.editDialog"
:icon="$globals.icons.tags"
:title="$t('data-pages.tags.edit-tag')"
:submit-icon="$globals.icons.save"
:submit-text="$t('general.save')"
can-confirm
can-submit
@submit="editSaveTag"
>
<v-card-text v-if="editTarget">
@@ -211,12 +212,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
if (!item.id) {
continue;
}
await tagStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id).filter(id => !!id);
await tagStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -263,9 +263,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
await toolStore.actions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id);
await toolStore.actions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -465,9 +465,8 @@ export default defineNuxtComponent({
}
async function deleteSelected() {
for (const item of bulkDeleteTarget.value) {
await unitActions.deleteOne(item.id);
}
const ids = bulkDeleteTarget.value.map(item => item.id);
await unitActions.deleteMany(ids);
bulkDeleteTarget.value = [];
}

View File

@@ -30,9 +30,11 @@
/>
<v-card-text>
<v-text-field
<v-number-input
v-model="numberOfDays"
type="number"
:min="1"
control-variant="stacked"
inset
:label="$t('meal-plan.numberOfDays-label')"
:hint="$t('meal-plan.numberOfDays-hint')"
persistent-hint
@@ -43,10 +45,10 @@
<div class="d-flex flex-wrap align-center justify-space-between mb-2">
<v-tabs style="width: fit-content;">
<v-tab :to="`/household/mealplan/planner/view`">
<v-tab :to="{ name: 'household-mealplan-planner-view', query: route.query }">
{{ $t('meal-plan.meal-planner') }}
</v-tab>
<v-tab :to="`/household/mealplan/planner/edit`">
<v-tab :to="{ name: 'household-mealplan-planner-edit', query: route.query }">
{{ $t('general.edit') }}
</v-tab>
</v-tabs>
@@ -69,7 +71,7 @@
</template>
<script lang="ts">
import { isSameDay, addDays, parseISO } from "date-fns";
import { isSameDay, addDays, parseISO, format, isValid } from "date-fns";
import { useHouseholdSelf } from "~/composables/use-households";
import { useMealplans } from "~/composables/use-group-mealplan";
import { useUserMealPlanPreferences } from "~/composables/use-users/preferences";
@@ -93,14 +95,31 @@ export default defineNuxtComponent({
// Force to /view if current route is /planner
if (route.path === "/household/mealplan/planner") {
router.push("/household/mealplan/planner/view");
router.push({
name: "household-mealplan-planner-view",
query: route.query,
});
}
function safeParseISO(date: string, fallback: Date | undefined = undefined) {
try {
const parsed = parseISO(date);
return isValid(parsed) ? parsed : fallback;
}
catch {
return fallback;
}
}
// Initialize dates from query parameters or defaults
const initialStartDate = safeParseISO(route.query.start as string, new Date());
const initialEndDate = safeParseISO(route.query.end as string, addDays(new Date(), adjustForToday(numberOfDays.value)));
const state = ref({
range: [new Date(), addDays(new Date(), adjustForToday(numberOfDays.value))] as [Date, Date],
start: new Date(),
range: [initialStartDate, initialEndDate] as [Date, Date],
start: initialStartDate,
picker: false,
end: addDays(new Date(), adjustForToday(numberOfDays.value)),
end: initialEndDate,
});
const firstDayOfWeek = computed(() => {
@@ -122,6 +141,20 @@ export default defineNuxtComponent({
};
});
// Update query parameters when date range changes
watch(weekRange, (newRange) => {
// Keep current route name and params, just update the query
router.replace({
name: route.name || "household-mealplan-planner-view",
params: route.params,
query: {
...route.query,
start: format(newRange.start, "yyyy-MM-dd"),
end: format(newRange.end, "yyyy-MM-dd"),
},
});
}, { immediate: true });
const { mealplans, actions } = useMealplans(weekRange);
function filterMealByDate(date: Date) {
@@ -161,6 +194,7 @@ export default defineNuxtComponent({
});
return {
route,
state,
actions,
mealsByDate,

View File

@@ -179,41 +179,45 @@
</BaseButton>
</div>
<BaseExpansionPanels v-for="(value, key) in itemsByLabel" :key="key" :v-model="0" start-open>
<v-expansion-panel class="shopping-list-section">
<v-expansion-panel-title
:color="getLabelColor(key)"
class="body-1 font-weight-bold section-title"
>
{{ key }}
</v-expansion-panel-title>
<v-expansion-panel-text eager>
<VueDraggable
:model-value="value"
handle=".handle"
:delay="250"
:delay-on-touch-only="true"
@start="loadingCounter += 1"
@end="loadingCounter -= 1"
@update:model-value="updateIndexUncheckedByLabel(key.toString(), $event)"
<TransitionGroup name="scroll-x-transition">
<BaseExpansionPanels v-for="(value, key) in itemsByLabel" :key="key" :v-model="0" start-open>
<v-expansion-panel class="shopping-list-section">
<v-expansion-panel-title
:color="getLabelColor(key)"
class="body-1 font-weight-bold section-title"
>
<ShoppingListItem
v-for="(item, index) in value"
:key="item.id"
v-model="value[index]"
class="ml-2 my-2 w-auto"
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
:recipes="recipeMap"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
/>
</VueDraggable>
</v-expansion-panel-text>
</v-expansion-panel>
</BaseExpansionPanels>
{{ key }}
</v-expansion-panel-title>
<v-expansion-panel-text eager>
<VueDraggable
:model-value="value"
handle=".handle"
:delay="250"
:delay-on-touch-only="true"
@start="loadingCounter += 1"
@end="loadingCounter -= 1"
@update:model-value="updateIndexUncheckedByLabel(key.toString(), $event)"
>
<TransitionGroup name="scroll-x-transition">
<ShoppingListItem
v-for="(item, index) in value"
:key="item.id"
v-model="value[index]"
class="ml-2 my-2 w-auto"
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
:recipes="recipeMap"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
/>
</TransitionGroup>
</VueDraggable>
</v-expansion-panel-text>
</v-expansion-panel>
</BaseExpansionPanels>
</TransitionGroup>
<!-- Checked Items -->
<v-expansion-panels flat>
<v-expansion-panel v-if="listItems.checked && listItems.checked.length > 0">
@@ -243,18 +247,20 @@
</div>
</v-expansion-panel-title>
<v-expansion-panel-text eager>
<div v-for="(item, idx) in listItems.checked" :key="item.id">
<ShoppingListItem
v-model="listItems.checked[idx]"
class="strike-through-note"
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
/>
</div>
<TransitionGroup name="scroll-x-transition">
<div v-for="(item, idx) in listItems.checked" :key="item.id">
<ShoppingListItem
v-model="listItems.checked[idx]"
class="strike-through-note"
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
/>
</div>
</TransitionGroup>
</v-expansion-panel-text>
</v-expansion-panel>
</v-expansion-panels>

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

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