Compare commits

..

111 Commits

Author SHA1 Message Date
mealie-commit-bot[bot]
3de4024619 chore: bump version to v3.10.0 2026-02-02 18:33:02 +00:00
renovate[bot]
194771653d chore(deps): pin dependency freezegun to ==1.5.5 (#6991)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-02 18:18:36 +00:00
renovate[bot]
24aa8f3525 fix(deps): update dependency orjson to v3.11.7 (#6989)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-02 17:54:33 +00:00
Michael Genson
fb8e318739 fix: Flaky $NOW tests (#6990) 2026-02-02 11:24:13 -06:00
Michael Genson
6255c71609 docs: Misc. cleanup (#6988) 2026-02-02 10:47:23 -06:00
Hayden
f2d1569488 chore(l10n): New Crowdin updates (#6987) 2026-02-02 11:18:56 +00:00
Michael Genson
987c7209fc feat: Query relative dates (#6984) 2026-02-01 21:36:46 -06:00
Hayden
f6dbd1f1f1 chore(l10n): New Crowdin updates (#6983) 2026-02-01 23:23:28 +00:00
Michael Genson
d30118899d fix: Re-enable some style tags (#6982) 2026-02-01 16:24:57 -06:00
Michael Genson
af241dad57 feat: Add range of dates to shopping list from meal planner (#6981) 2026-02-01 15:58:03 -06:00
renovate[bot]
b86de79c6f chore(deps): update dependency rich to v14.3.2 (#6980)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-01 20:28:33 +00:00
Hayden
86e86f8c81 chore(l10n): New Crowdin updates (#6979) 2026-02-01 10:58:51 +00:00
mealie-actions[bot]
d795f91938 chore(l10n): Crowdin locale sync (#6977)
Co-authored-by: GitHub Action <action@github.com>
2026-02-01 04:42:54 +00:00
Michael Genson
a59511cc81 dev: Switch to Mealie bot for auto-merging (#6978) 2026-01-31 22:42:03 -06:00
Michael Genson
a5d4cae6d0 dev: Switch approver for automated i18n merges (#6976) 2026-01-31 21:46:13 -06:00
Michael Genson
2987cf8ba6 dev: Allow locale sync path in auto merge (#6974) 2026-01-31 21:37:31 -06:00
Michael Genson
46b46978ff dev: Increase locale merge limit to 300 and allow PRs from Mealie bot (#6972) 2026-01-31 21:31:52 -06:00
Michael Genson
12857883a9 dev: Fix token vars (#6970) 2026-01-31 21:24:58 -06:00
Michael Genson
60fff3b5b8 dev: Switch to bot token for locale sync (#6969) 2026-01-31 21:21:07 -06:00
Hayden
b42e888929 chore(l10n): New Crowdin updates (#6967) 2026-02-01 00:47:50 +00:00
Michael Genson
570d6f1433 feat: Migrate OpenAI implementation to use structured outputs (#6964) 2026-01-31 11:57:05 -06:00
Morgan
dcf410739e fix: service-worker precache manifest entries not generated correctly (#6815) 2026-01-31 15:51:11 +00:00
Michael Genson
1929d630a1 fix: Remove deprecated warning from shopping list editor (#6963) 2026-01-31 09:44:34 -06:00
Michael Genson
c4c7bf2aed fix: Disable context hover (#6962) 2026-01-31 09:40:31 -06:00
Hayden
47034d18c5 chore(l10n): New Crowdin updates (#6960) 2026-01-31 15:09:56 +00:00
renovate[bot]
7ebe491f74 fix(deps): update dependency ingredient-parser-nlp to v2.5.0 (#6961)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-31 14:52:15 +00:00
Arsène Reymond
719bd89eb1 feat: Improve recipe assets preview (#6602)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-31 14:48:42 +00:00
Hayden
9030c7e6b9 chore(l10n): New Crowdin updates (#6959) 2026-01-30 23:15:01 +00:00
renovate[bot]
0202cc7ef8 fix(deps): update dependency pyjwt to v2.11.0 (#6958)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-30 20:53:19 +00:00
Patrick Lehner (he/him)
381ac9bfde dev: Improve caching in taskfile (#6798) 2026-01-30 20:52:44 +00:00
Patrick Lehner (he/him)
e9fe71c1b7 dev: Add tasks for e2e tests (#6797)
Co-authored-by: Michael Genson <genson.michael@gmail.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 14:51:40 -06:00
Arsène Reymond
79bbc20cd6 fix: recipe context menu (#6782) 2026-01-30 20:08:49 +00:00
Arsène Reymond
c7be4a452a fix: disable invitations when password login is disabled (#6781) 2026-01-30 20:05:40 +00:00
Imanuel
731ee8ae3d fix: sub-recipes in multi group setup (#6652) (#6663) 2026-01-30 18:50:08 +00:00
Imanuel
c7ae67e7cd feat: Customizable OpenAI prompts (#5146) (#6588)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Co-authored-by: Michael Genson <genson.michael@gmail.com>
2026-01-30 12:00:03 -06:00
Gtt1229
e83891e3ca feat: Added Option to Import Recipe Category During Recipe Import (#6523)
Co-authored-by: Michael Genson <genson.michael@gmail.com>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 11:18:15 -06:00
Michael Genson
e3e45c534e dev: Skip Trivy on merge queue (#6957) 2026-01-30 16:47:30 +00:00
Stevie Howard
279cf65673 fix: Seed data - en-US only - correct [some] plural names and add [some] accented characters (#6405)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 16:30:56 +00:00
Fjodor42
cb44ecf394 feat: Add "sprig" as a unit. (#6934)
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2026-01-30 16:03:41 +00:00
Michael Genson
920eeb26d6 dev: Bunch of GH workflow fixes (#6956) 2026-01-30 15:58:49 +00:00
Hayden
9738d9f363 fix: dispose AlchemyExporter engine after restore completes (#6942) 2026-01-30 15:54:38 +00:00
CodeFaux
37e6123f9e fix: Keep ingredient headers in cook mode (#6946)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 15:36:04 +00:00
Hayden
0a2cabb348 chore(l10n): New Crowdin updates (#6954) 2026-01-30 15:19:02 +00:00
Michael Genson
447a1fb239 dev: Enable CI on merge queues (#6955) 2026-01-30 09:18:52 -06:00
Hayden
b5358896eb fix: use GITHUB_TOKEN for auto-merge to respect CI checks (#6953) 2026-01-30 03:26:10 +00:00
Jérôme
78fbbf0264 fix: correct global scroll strategy to prevent menu fixation (#6577)
Co-authored-by: Jerome <jerome.roth@imt-atlantique.net>
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2026-01-30 02:27:45 +00:00
Hayden
a33d8204df chore(l10n): New Crowdin updates (#6949)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 02:10:24 +00:00
Hayden
c8046bbdf0 chore: add workflow to auto-merge l10n PRs (#6948)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-30 02:05:56 +00:00
renovate[bot]
329ad4d8ed fix(deps): update dependency alembic to v1.18.3 (#6945)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-30 00:43:47 +00:00
renovate[bot]
4ccf649aa1 chore(deps): update dependency setuptools to v80.10.2 (#6930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-29 18:32:44 -06:00
renovate[bot]
5994328a8b fix(deps): update dependency orjson to v3.11.6 (#6952)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-29 13:42:53 -06:00
Hayden
15b5917054 feat: add discard confirmation dialog for recipe editor (#6941)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-28 23:09:32 -06:00
Hayden
e48b150f7c chore(l10n): New Crowdin updates (#6944)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2026-01-28 22:57:04 -06:00
renovate[bot]
adbc66316f chore(deps): update dependency coverage to v7.13.2 (#6927)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-28 22:54:52 -06:00
Hayden
0dc7337972 chore(l10n): New Crowdin updates (#6938) 2026-01-28 19:14:41 +07:00
renovate[bot]
58d4b95a56 fix(deps): update dependency openai to v2.16.0 (#6937)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-27 20:51:07 -06:00
Hayden
0e74bc6cd0 chore(l10n): New Crowdin updates (#6936) 2026-01-27 20:29:06 +00:00
Hayden
4866eec62d chore(l10n): New Crowdin updates (#6935) 2026-01-26 18:34:52 -06:00
github-actions[bot]
c0d659724a chore(auto): Update pre-commit hooks (#6932)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2026-01-26 16:06:35 +00:00
Hayden
5f0996734a chore(l10n): New Crowdin updates (#6933) 2026-01-26 18:09:28 +07:00
Hayden
8cd0286ca1 chore(l10n): New Crowdin updates (#6929) 2026-01-25 19:49:14 -06:00
renovate[bot]
f214e8843a fix(deps): update dependency python-multipart to v0.0.22 (#6926) 2026-01-25 15:30:40 +00:00
github-actions[bot]
66fea60341 chore(l10n): Crowdin locale sync (#6924) 2026-01-25 15:19:23 +00:00
Hayden
69b4684bce chore(l10n): New Crowdin updates (#6925) 2026-01-25 18:46:24 +07:00
renovate[bot]
b75d6812a3 chore(deps): update dependency rich to v14.3.1 (#6923) 2026-01-24 18:04:27 -06:00
Hayden
ed000c2cc6 chore(l10n): New Crowdin updates (#6922) 2026-01-24 22:45:45 +00:00
Alexandre Eberhardt
d43a2020b3 docs: Add an info callout about client-side cookies. (#6830) 2026-01-24 20:33:19 +00:00
Patrick Lehner (he/him)
ff5e65b323 fix: Make 'auto-search' toggle change color to indicate state (#6809) 2026-01-24 20:21:53 +00:00
Hayden
e1b07a250b chore(l10n): New Crowdin updates (#6912) 2026-01-24 20:07:45 +00:00
renovate[bot]
e68486a0e1 chore(deps): update dependency rich to v14.3.0 (#6919)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-24 13:56:54 -06:00
renovate[bot]
271915ee23 chore(deps): update dependency types-python-dateutil to v2.9.0.20260124 (#6913)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-24 13:43:38 -06: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
242 changed files with 53958 additions and 52118 deletions

View File

@@ -1,9 +1,10 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.224.2/containers/python-3/.devcontainer/base.Dockerfile
# [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster
ARG VARIANT="3.12-bullseye"
FROM mcr.microsoft.com/devcontainers/python:${VARIANT}
# Remove outdated yarn GPG key, if it exists
RUN rm -f /etc/apt/sources.list.d/yarn.list /usr/share/keyrings/yarn-archive-keyring.gpg || true
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi

113
.github/workflows/auto-merge-l10n.yml vendored Normal file
View File

@@ -0,0 +1,113 @@
name: Auto-merge l10n PRs
on:
pull_request:
types: [opened, synchronize, labeled]
permissions:
contents: write
pull-requests: write
jobs:
auto-merge:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'l10n')
steps:
- name: Validate PR author
env:
AUTHOR: ${{ github.event.pull_request.user.login }}
run: |
if [[
"$AUTHOR" != "hay-kot" &&
"$AUTHOR" != "github-actions[bot]" &&
"$AUTHOR" != "mealie-actions[bot]"
]]; then
echo "::error::PR author must be hay-kot, github-actions[bot], or mealie-actions[bot] for auto-merge (got: $AUTHOR)"
exit 1
fi
echo "Author validated: $AUTHOR"
- name: Validate PR size
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
ADDITIONS=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json additions --jq '.additions')
DELETIONS=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json deletions --jq '.deletions')
TOTAL=$((ADDITIONS + DELETIONS))
echo "PR changes: +$ADDITIONS -$DELETIONS (total: $TOTAL lines)"
if [ "$TOTAL" -gt 400 ]; then
echo "::error::PR exceeds 400 line change limit ($TOTAL lines)"
exit 1
fi
- name: Validate file paths
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
FILES=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json files --jq '.files[].path')
for file in $FILES; do
# Check if file matches any allowed path
if [[ "$file" == "frontend/composables/use-locales/available-locales.ts" ]] || \
[[ "$file" =~ ^frontend/lang/ ]] || \
[[ "$file" =~ ^mealie/repos/seed/resources/[^/]+/locales/ ]]; then
continue
fi
# File doesn't match allowed paths
echo "::error::Invalid file path: $file"
echo "Only the following paths are allowed:"
echo " - frontend/composables/use-locales/available-locales.ts"
echo " - frontend/lang/"
echo " - mealie/repos/seed/resources/*/locales/"
exit 1
done
echo "All files are in allowed paths"
- name: Approve PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
APPROVED=$(gh pr view "$PR_NUMBER" \
--repo "$REPO" \
--json reviews \
--jq '.reviews[] | select(.state == "APPROVED") | .id' \
| wc -l)
if [ "$APPROVED" -gt 0 ]; then
echo "PR already approved"
exit 0
fi
gh pr review "$PR_NUMBER" \
--repo "$REPO" \
--approve \
--body "Auto-approved: l10n PR from trusted author with valid file paths"
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
- name: Enable auto-merge
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
gh pr merge "$PR_NUMBER" \
--repo "$REPO" \
--auto \
--squash

View File

@@ -15,10 +15,17 @@ jobs:
sync-locales:
runs-on: ubuntu-latest
steps:
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ steps.app-token.outputs.token }}
- name: Set up Python
uses: actions/setup-python@v5
@@ -105,7 +112,7 @@ jobs:
- Updated frontend locale files
- Generated from latest translation sources" \
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ steps.app-token.outputs.token }}
- name: No changes detected
if: steps.changes.outputs.has_changes == 'false'

View File

@@ -4,14 +4,19 @@ on:
pull_request:
branches:
- mealie-next
merge_group:
types: [checks_requested]
branches:
- mealie-next
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.merge_group.head_ref }}
cancel-in-progress: true
jobs:
pull-request-lint:
name: "Lint PR"
if: github.event_name == 'pull_request'
uses: ./.github/workflows/pull-request-lint.yml
backend-tests:
@@ -24,6 +29,7 @@ jobs:
container-scanning:
name: "Trivy Container Scanning"
if: github.event_name == 'pull_request'
uses: ./.github/workflows/partial-trivy-container-scanning.yml
code-ql:
@@ -47,7 +53,10 @@ jobs:
publish-image:
name: "Publish PR Image"
if: contains(github.event.pull_request.labels.*.name, 'build-image') && github.repository == 'mealie-recipes/mealie'
if: |
github.event_name == 'pull_request' &&
contains(github.event.pull_request.labels.*.name, 'build-image') &&
github.repository == 'mealie-recipes/mealie'
permissions:
contents: read
packages: write

View File

@@ -40,12 +40,18 @@ jobs:
shell: bash
run: pre-commit autoupdate --color=always
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
# This doesn't currently work for us because it creates the PR but the workflows don't run.
# TODO: Provide a personal access token as a parameter here, that solves that problem.
# https://github.com/peter-evans/create-pull-request
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
- name: Create Pull Request
id: create-pr
uses: peter-evans/create-pull-request@v6
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: "Update pre-commit hooks"
branch: "fix/update-pre-commit-hooks"
labels: |
@@ -54,3 +60,38 @@ jobs:
base: mealie-next
title: "chore(auto): Update pre-commit hooks"
body: "Auto-generated by `.github/workflows/scheduled-checks.yml`"
- name: Approve PR
if: steps.create-pr.outputs.pull-request-number
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
REPO: ${{ github.repository }}
run: |
APPROVED=$(gh pr view "$PR_NUMBER" \
--repo "$REPO" \
--json reviews \
--jq '.reviews[] | select(.state == "APPROVED") | .id' \
| wc -l)
if [ "$APPROVED" -gt 0 ]; then
echo "PR already approved"
exit 0
fi
gh pr review "$PR_NUMBER" \
--repo "$REPO" \
--approve \
--body "Auto-approved: Pre-commit hook updates"
- name: Enable auto-merge
if: steps.create-pr.outputs.pull-request-number
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
REPO: ${{ github.repository }}
run: |
gh pr merge "$PR_NUMBER" \
--repo "$REPO" \
--auto \
--squash

View File

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

View File

@@ -47,8 +47,6 @@ tasks:
sources:
- package.json
- yarn.lock
generates:
- node_modules/**
setup:py:
desc: setup python dependencies
@@ -61,6 +59,18 @@ tasks:
- pyproject.toml
- .pre-commit-config.yaml
setup:e2e:
desc: setup e2e test dependencies
dir: tests/e2e
run: once
cmds:
- yarn install
- yarn playwright install --with-deps
sources:
- package.json
- playwright.config.ts
- yarn.lock
setup:
desc: setup all dependencies
deps:
@@ -179,12 +189,21 @@ tasks:
status:
- '{{ .SKIP_PACKAGE_DEPS | default "false"}}'
py:package:
desc: builds Python packages (sdist and wheel) in top-level dist directory
py:package:build:
internal: true
deps:
- py:package:deps
cmds:
- uv build --out-dir dist
sources:
- uv.lock
- pyproject.toml
- mealie/**
py:package:
desc: builds Python packages (sdist and wheel) in top-level dist directory
cmds:
- task: py:package:build
- task: py:package:generate-requirements
py:
@@ -215,6 +234,12 @@ tasks:
dir: frontend
cmds:
- yarn build
sources:
- "**"
- exclude: .nuxt/**
- exclude: .output/**
- exclude: dist/**
- exclude: node_modules/.cache/**
ui:generate:
desc: generates a static version of the frontend in frontend/dist
@@ -223,18 +248,36 @@ tasks:
- setup:ui
cmds:
- yarn generate
sources:
- "**"
- exclude: .nuxt/**
- exclude: .output/**
- exclude: dist/**
- exclude: node_modules/.cache/**
ui:lint:
desc: runs the frontend linter
dir: frontend
cmds:
- yarn lint --max-warnings=0
sources:
- "**"
- exclude: .nuxt/**
- exclude: .output/**
- exclude: dist/**
- exclude: node_modules/.cache/**
ui:test:
desc: runs the frontend tests
dir: frontend
cmds:
- yarn test
sources:
- "**"
- exclude: .nuxt/**
- exclude: .output/**
- exclude: dist/**
- exclude: node_modules/.cache/**
ui:check:
desc: runs all frontend checks
@@ -263,3 +306,48 @@ tasks:
dir: docker
cmds:
- docker compose -f docker-compose.yml -p mealie up -d --build
e2e:build-image:
desc: builds the e2e test docker image
deps:
- py:package
cmds:
- docker build --tag mealie:e2e --file docker/Dockerfile --build-context packages=dist .
sources:
- docker/Dockerfile
- dist/**
e2e:start-server:
desc: Builds the image and starts the containers for e2e testing
dir: tests/e2e/docker
deps:
- e2e:build-image
vars:
WAIT_UNTIL_HEALTHY: '{{if .WAIT_UNTIL_HEALTHY}}--wait{{else}}{{end}}'
cmds:
- docker compose up -d {{.WAIT_UNTIL_HEALTHY}}
e2e:stop-server:
desc: Shuts down the e2e testing containers
dir: tests/e2e/docker
cmds:
- docker compose down --volumes
e2e:test:
desc: runs the e2e tests
dir: tests/e2e
deps:
- setup:e2e
vars:
PREVENT_REPORT_OPEN: '{{if .PREVENT_REPORT_OPEN}}PLAYWRIGHT_HTML_OPEN=never{{else}}{{end}}'
cmds:
- '{{.PREVENT_REPORT_OPEN}} yarn playwright test'
e2e:
desc: runs the full e2e test suite
cmds:
- task: e2e:start-server
vars: { WAIT_UNTIL_HEALTHY: true }
- defer: { task: e2e:stop-server }
- task: e2e:test
vars: { PREVENT_REPORT_OPEN: true }

View File

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

View File

@@ -6,7 +6,7 @@ While this guide aims to simplify the migration process for developers, it's not
## V1 → V2
The biggest change between V1 and V2 is the introduction of Households. For more information on how households work in relation to groups/users, check out the [Groups and Households](./features.md#groups-and-households) section in the Features guide.
The biggest change between V1 and V2 is the introduction of Households. For more information on how households work in relation to groups/users, check out the [Groups and Households](../../documentation/getting-started/features.md#groups-and-households) section in the Features guide.
### `updateAt` is now `updatedAt`

View File

@@ -16,7 +16,7 @@ Recipes extras are a key feature of the Mealie API. They allow you to create cus
For example you could add `{"message": "Remember to thaw the chicken"}` to a recipe and use the webhooks built into mealie to send that message payload to a destination to be processed.
#### Shopping List and Food Extras
Similarly to recipes, extras are supported on shopping lists, shopping list items, and foods. At this time they are only accessible through the API. Extras for these objects allow for rich integrations between the Mealie shopping list and your favorite list manager, such as Alexa, ToDoist, Trello, or any other list manager with an API.
Similarly to recipes, extras are supported on shopping lists, shopping list items, and foods. At this time they are only accessible through the API. Extras for these objects allow for rich integrations between the Mealie shopping list and your favorite list manager, such as Todoist, Trello, or any other list manager with an API.
To keep shopping lists in sync, for instance, you can store your Trello list id on your Mealie shopping list: <br />
`{"trello_list_id": "5abbe4b7ddc1b351ef961414"}`
@@ -52,6 +52,7 @@ Many applications will keep track of the query and adjust the page parameter app
Notice that the route does not contain the baseurl (e.g. `https://mymealieapplication.com/api`).
There are a few shorthands available to reduce the number of calls for certain common requests:
- if you want to return _all_ results, effectively disabling pagination, set `perPage = -1` (and fetch the first page)
- if you want to fetch the _last_ page, set `page = -1`
@@ -89,6 +90,28 @@ This filter will find all recipes that don't start with the word "Test": <br>
This filter will find all recipes that have particular slugs: <br>
`slug IN ["pasta-fagioli", "delicious-ramen"]`
##### Placeholder Keywords
You can use placeholders to insert dynamic values as opposed to static values. Currently the only supported placeholder keyword is `$NOW`, to insert the current time.
`$NOW` can optionally be paired with basic offsets. Here is an example of a filter which gives you recipes not made within the past 30 days: <br>
`lastMade <= "$NOW-30d"`
Supported offsets operations include:
- `-` for subtracting a time (i.e. in the past)
- `+` for adding a time (i.e. in the future)
Supported offset intervals include:
- `y` for years
- `m` for months
- `d` for days
- `H` for hours
- `M` for minutes
- `S` for seconds
Note that intervals are _case sensitive_ (e.g. `s` is an invalid interval).
##### Nested Property filters
When querying tables with relationships, you can filter properties on related tables. For instance, if you want to query all recipes owned by a particular user: <br>
`user.username = "SousChef20220320"`
@@ -96,7 +119,7 @@ When querying tables with relationships, you can filter properties on related ta
This timeline event filter will return all timeline events for recipes that were created after a particular date: <br>
`recipe.createdAt >= "2023-02-25"`
This recipe filter will return all recipes that contains a particular set of tags: <br>
This recipe filter will return all recipes that contain a particular set of tags: <br>
`tags.name CONTAINS ALL ["Easy", "Cajun"]`
##### Compound Filters

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

@@ -122,17 +122,18 @@ For usage, see [Usage - OpenID Connect](../authentication/oidc-v2.md)
Mealie supports various integrations using OpenAI. For more information, check out our [OpenAI documentation](./open-ai.md).
For custom mapping variables (e.g. OPENAI_CUSTOM_HEADERS) you should pass values as JSON encoded strings (e.g. `OPENAI_CUSTOM_PARAMS='{"k1": "v1", "k2": "v2"}'`)
| Variables | Default | Description |
| ------------------------------------------------- | :-----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| OPENAI_BASE_URL<super>[&dagger;][secrets]</super> | None | The base URL for the OpenAI API. If you're not sure, leave this empty to use the standard OpenAI platform |
| OPENAI_API_KEY<super>[&dagger;][secrets]</super> | None | Your OpenAI API Key. Enables OpenAI-related features |
| OPENAI_MODEL | gpt-4o | Which OpenAI model to use. If you're not sure, leave this empty |
| OPENAI_CUSTOM_HEADERS | None | Custom HTTP headers to add to all OpenAI requests. This should generally be left empty unless your custom service requires them |
| OPENAI_CUSTOM_PARAMS | None | Custom HTTP query params to add to all OpenAI requests. This should generally be left empty unless your custom service requires them |
| OPENAI_ENABLE_IMAGE_SERVICES | True | Whether to enable OpenAI image services, such as creating recipes via image. Leave this enabled unless your custom model doesn't support it, or you want to reduce costs |
| OPENAI_WORKERS | 2 | Number of OpenAI workers per request. Higher values may increase processing speed, but will incur additional API costs |
| OPENAI_SEND_DATABASE_DATA | True | Whether to send Mealie data to OpenAI to improve request accuracy. This will incur additional API costs |
| OPENAI_REQUEST_TIMEOUT | 300 | The number of seconds to wait for an OpenAI request to complete before cancelling the request. Leave this empty unless you're running into timeout issues on slower hardware |
| Variables | Default | Description |
|---------------------------------------------------|:-------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OPENAI_BASE_URL<super>[&dagger;][secrets]</super> | None | The base URL for the OpenAI API. If you're not sure, leave this empty to use the standard OpenAI platform |
| OPENAI_API_KEY<super>[&dagger;][secrets]</super> | None | Your OpenAI API Key. Enables OpenAI-related features |
| OPENAI_MODEL | gpt-4o | Which OpenAI model to use. If you're not sure, leave this empty |
| OPENAI_CUSTOM_HEADERS | None | Custom HTTP headers to add to all OpenAI requests. This should generally be left empty unless your custom service requires them |
| OPENAI_CUSTOM_PARAMS | None | Custom HTTP query params to add to all OpenAI requests. This should generally be left empty unless your custom service requires them |
| OPENAI_ENABLE_IMAGE_SERVICES | True | Whether to enable OpenAI image services, such as creating recipes via image. Leave this enabled unless your custom model doesn't support it, or you want to reduce costs |
| OPENAI_WORKERS | 2 | Number of OpenAI workers per request. Higher values may increase processing speed, but will incur additional API costs |
| OPENAI_SEND_DATABASE_DATA | True | Whether to send Mealie data to OpenAI to improve request accuracy. This will incur additional API costs |
| OPENAI_REQUEST_TIMEOUT | 300 | The number of seconds to wait for an OpenAI request to complete before cancelling the request. Leave this empty unless you're running into timeout issues on slower hardware |
| OPENAI_CUSTOM_PROMPT_DIR | None | Path to custom prompt files. Only existing files in your custom directory will override the defaults; any missing or empty custom files will automatically fall back to the system defaults. See https://github.com/mealie-recipes/mealie/tree/mealie-next/mealie/services/openai/prompts for expected file names. |
### Theming
@@ -235,6 +236,10 @@ The examples below provide copy-ready Docker Compose environment configurations
THEME_DARK_ERROR: '#E57373'
```
!!! info
Browser cookies may cause the client to keep outdated settings.
Clearing the cookies can be required for the change to take effect.
### Docker Secrets
> <super>&dagger;</super> Starting in version `2.4.2`, any environment variable in the preceding lists with a dagger

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

View File

@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.9.2 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.10.0 # (3)
container_name: mealie
restart: always
ports:

View File

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

View File

File diff suppressed because one or more lines are too long

View File

@@ -15,7 +15,6 @@
:nudge-top="menuTop ? '5' : '0'"
allow-overflow
close-delay="125"
:open-on-hover="mdAndUp"
content-class="d-print-none"
>
<template #activator="{ props: activatorProps }">
@@ -83,8 +82,6 @@ const emit = defineEmits<{
[key: string]: [];
}>();
const { mdAndUp } = useDisplay();
const i18n = useI18n();
const { $globals } = useNuxtApp();
const api = useUserApi();
@@ -94,7 +91,7 @@ const state = reactive({
shoppingListDialog: false,
menuItems: [
{
title: i18n.t("recipe.add-to-list"),
title: i18n.t("meal-plan.add-day-to-list"),
icon: $globals.icons.cartCheck,
color: undefined,
event: "shoppingList",
@@ -126,8 +123,8 @@ async function getShoppingLists() {
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
const eventHandlers: { [key: string]: () => void | Promise<any> } = {
shoppingList: () => {
getShoppingLists();
shoppingList: async () => {
await getShoppingLists();
state.shoppingListDialog = true;
},
};

View File

@@ -36,7 +36,7 @@
import QueryFilterBuilder from "~/components/Domain/QueryFilterBuilder.vue";
import type { FieldDefinition } from "~/composables/use-query-filter-builder";
import { Organizer } from "~/lib/api/types/non-generated";
import type { QueryFilterJSON } from "~/lib/api/types/response";
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
interface Props {
queryFilter?: QueryFilterJSON | null;

View File

@@ -319,7 +319,7 @@ import { useDebounceFn } from "@vueuse/core";
import { useHouseholdSelf } from "~/composables/use-households";
import RecipeOrganizerSelector from "~/components/Domain/Recipe/RecipeOrganizerSelector.vue";
import { Organizer } from "~/lib/api/types/non-generated";
import type { LogicalOperator, QueryFilterJSON, QueryFilterJSONPart, RelationalKeyword, RelationalOperator } from "~/lib/api/types/response";
import type { LogicalOperator, QueryFilterJSON, QueryFilterJSONPart, RelationalKeyword, RelationalOperator } from "~/lib/api/types/non-generated";
import { useCategoryStore, useFoodStore, useHouseholdStore, useTagStore, useToolStore } from "~/composables/store";
import { useUserStore } from "~/composables/store/use-user-store";
import { type Field, type FieldDefinition, type FieldValue, type OrganizerBase, useQueryFilterBuilder } from "~/composables/use-query-filter-builder";

View File

@@ -79,7 +79,7 @@
@print="$emit('print')"
/>
</div>
<div v-if="open" class="custom-btn-group gapped">
<div v-if="open" class="custom-btn-group gapped ma-1">
<v-btn
v-for="(btn, index) in editorButtons"
:key="index"

View File

@@ -1,60 +1,97 @@
<template>
<div v-if="model.length > 0 || edit">
<v-card class="mt-4">
<v-card-title class="py-2">
{{ $t("asset.assets") }}
</v-card-title>
<v-list-item class="pr-2 pl-0">
<v-card-title>
{{ $t("asset.assets") }}
</v-card-title>
<template #append>
<v-btn
v-if="edit"
variant="plain"
:icon="$globals.icons.create"
@click="state.newAssetDialog = true"
/>
</template>
</v-list-item>
<v-divider class="mx-2" />
<v-list
v-if="model.length > 0"
lines="two"
:flat="!edit"
>
<v-list-item
v-for="(item, i) in model"
:key="i"
:href="!edit ? assetURL(item.fileName ?? '') : ''"
target="_blank"
class="pr-2"
>
<template #prepend>
<div class="ma-auto">
<v-tooltip location="bottom">
<template #activator="{ props: tooltipProps }">
<v-icon v-bind="tooltipProps">
{{ getIconDefinition(item.icon).icon }}
</v-icon>
</template>
<span>{{ getIconDefinition(item.icon).title }}</span>
</v-tooltip>
</div>
<v-avatar size="48" rounded="lg" class="elevation-1">
<v-img
v-if="isImage(item.fileName)"
:src="assetURL(item.fileName ?? '')"
:alt="item.name"
loading="lazy"
cover
/>
<v-icon v-else size="large">
{{ getIconDefinition(item.icon).icon }}
</v-icon>
</v-avatar>
</template>
<v-list-item-title class="pl-2">
<v-list-item-title>
{{ item.name }}
</v-list-item-title>
<template #append>
<v-menu v-if="edit" location="bottom end">
<template #activator="{ props: menuProps }">
<v-btn
v-bind="menuProps"
icon
variant="plain"
>
<v-icon :icon="$globals.icons.dotsVertical" />
</v-btn>
</template>
<v-list density="compact" min-width="220">
<v-list-item
:href="assetURL(item.fileName ?? '')"
:prepend-icon="$globals.icons.eye"
:title="$t('general.view')"
target="_blank"
/>
<v-list-item
:href="assetURL(item.fileName ?? '')"
:prepend-icon="$globals.icons.download"
:title="$t('general.download')"
download
/>
<v-list-item
v-if="edit"
:prepend-icon="$globals.icons.contentCopy"
:title="$t('general.copy')"
@click="copyText(assetEmbed(item.fileName ?? ''))"
/>
<v-list-item
v-if="edit"
:prepend-icon="$globals.icons.delete"
:title="$t('general.delete')"
@click="model.splice(i, 1)"
/>
</v-list>
</v-menu>
<v-btn
v-if="!edit"
color="primary"
icon
size="small"
variant="plain"
:href="assetURL(item.fileName ?? '')"
target="_blank"
top
download
>
<v-icon> {{ $globals.icons.download }} </v-icon>
</v-btn>
<div v-else>
<v-btn
color="error"
icon
size="small"
top
@click="model.splice(i, 1)"
>
<v-icon>{{ $globals.icons.delete }}</v-icon>
</v-btn>
<AppButtonCopy
color=""
:copy-text="assetEmbed(item.fileName ?? '')"
/>
</div>
</template>
</v-list-item>
</v-list>
@@ -68,18 +105,9 @@
can-submit
@submit="addAsset"
>
<template #activator>
<BaseButton
v-if="edit"
size="small"
create
@click="state.newAssetDialog = true"
/>
</template>
<v-card-text class="pt-4">
<v-text-field
v-model="state.newAsset.name"
density="compact"
:label="$t('general.name')"
/>
<div class="d-flex justify-space-between">
@@ -92,10 +120,14 @@
item-value="name"
class="mr-2"
>
<template #item="{ item, props: itemProps }">
<template #item="{ props: itemProps, item }">
<v-list-item v-bind="itemProps">
<template #prepend>
<v-icon>{{ item.raw.icon }}</v-icon>
<v-avatar>
<v-icon>
{{ item.raw.icon }}
</v-icon>
</v-avatar>
</template>
</v-list-item>
</template>
@@ -107,7 +139,6 @@
@uploaded="setFileObject"
/>
</div>
{{ state.fileObject.name }}
</v-card-text>
</BaseDialog>
</div>
@@ -118,6 +149,7 @@
import { useStaticRoutes, useUserApi } from "~/composables/api";
import { alert } from "~/composables/use-toast";
import type { RecipeAsset } from "~/lib/api/types/recipe";
import { useCopy } from "~/composables/use-copy";
const props = defineProps({
slug: {
@@ -149,6 +181,7 @@ const state = reactive({
const i18n = useI18n();
const { $globals } = useNuxtApp();
const { copyText } = useCopy();
const iconOptions = [
{
@@ -184,21 +217,31 @@ function getIconDefinition(icon: string) {
return iconOptions.find(item => item.name === icon) || iconOptions[0];
}
function isImage(fileName?: string | null) {
if (!fileName) return false;
return /\.(png|jpe?g|gif|webp|bmp|avif)$/i.test(fileName);
}
const { recipeAssetPath } = useStaticRoutes();
function assetURL(assetName: string) {
return recipeAssetPath(props.recipeId, assetName);
}
function assetEmbed(name: string) {
return `<img src="${serverBase}${assetURL(name)}" height="100%" width="100%"> </img>`;
return `<img src="${serverBase}${assetURL(name)}" height="100%" width="100%" />`;
}
function setFileObject(fileObject: File) {
state.fileObject = fileObject;
// If the user didn't provide a name, default to the file base name
if (!state.newAsset.name?.trim()) {
state.newAsset.name = fileObject.name.substring(0, fileObject.name.lastIndexOf("."));
}
}
function validFields() {
return state.newAsset.name.length > 0 && state.fileObject.name.length > 0;
// Only require a file; name will fall back to the file name if empty
return Boolean(state.fileObject?.name);
}
async function addAsset() {
@@ -207,8 +250,10 @@ async function addAsset() {
return;
}
const nameToUse = state.newAsset.name?.trim() || state.fileObject.name;
const { data } = await api.recipes.createAsset(props.slug, {
name: state.newAsset.name,
name: nameToUse,
icon: state.newAsset.icon,
file: state.fileObject,
extension: state.fileObject.name.split(".").pop() || "",

View File

@@ -10,7 +10,6 @@
:nudge-top="menuTop ? '5' : '0'"
allow-overflow
close-delay="125"
:open-on-hover="$vuetify.display.mdAndUp"
content-class="d-print-none"
@update:model-value="onMenuToggle"
>
@@ -24,7 +23,6 @@
:fab="fab"
v-bind="activatorProps"
@click.prevent
@mouseenter="onHover"
>
<v-icon
:size="!fab ? undefined : 'x-large'"
@@ -127,12 +125,6 @@ const contentProps = computed(() => {
return rest;
});
function onHover() {
if (!isMenuContentLoaded.value) {
isMenuContentLoaded.value = true;
}
}
function onMenuToggle(isOpen: boolean) {
if (isOpen && !isMenuContentLoaded.value) {
isMenuContentLoaded.value = true;

View File

@@ -176,6 +176,7 @@ const props = withDefaults(defineProps<Props>(), {
const emit = defineEmits<{
[key: string]: any;
deleted: [slug: string];
print: [];
}>();
const api = useUserApi();

View File

@@ -227,7 +227,7 @@ const currentHouseholdSlug = ref("");
const filteredShoppingLists = ref<ShoppingListSummary[]>([]);
const state = reactive({
shoppingListDialog: true,
shoppingListDialog: false,
shoppingListIngredientDialog: false,
shoppingListShowAllToggled: false,
});
@@ -237,8 +237,8 @@ const { shoppingListDialog, shoppingListIngredientDialog, shoppingListShowAllTog
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
watch(dialog, (newVal, oldVal) => {
if (newVal && !oldVal) {
watch([dialog, () => preferences.value.viewAllLists], () => {
if (dialog.value) {
currentHouseholdSlug.value = $auth.user.value?.householdSlug || "";
filteredShoppingLists.value = props.shoppingLists.filter(
list => preferences.value.viewAllLists || list.userId === $auth.user.value?.id,
@@ -249,10 +249,11 @@ watch(dialog, (newVal, oldVal) => {
openShoppingListIngredientDialog(selectedShoppingList.value);
}
else {
state.shoppingListDialog = true;
ready.value = true;
}
}
else if (!newVal) {
else if (!dialog.value) {
initState();
}
});
@@ -371,7 +372,7 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
}
function initState() {
state.shoppingListDialog = true;
state.shoppingListDialog = false;
state.shoppingListIngredientDialog = false;
state.shoppingListShowAllToggled = false;
recipeIngredientSections.value = [];

View File

@@ -100,6 +100,7 @@
v-model="state.auto"
:label="$t('search.auto-search')"
single-line
color="primary"
/>
<v-btn
block

View File

@@ -17,15 +17,13 @@
v-for="(ingredient, index) in value"
:key="'ingredient' + index"
>
<template v-if="!isCookMode">
<h3
v-if="showTitleEditor[index]"
class="mt-2"
>
{{ ingredient.title }}
</h3>
<v-divider v-if="showTitleEditor[index]" />
</template>
<h3
v-if="showTitleEditor[index]"
class="mt-2"
>
{{ ingredient.title }}
</h3>
<v-divider v-if="showTitleEditor[index]" />
<v-list-item
density="compact"
class="pa-0"

View File

@@ -1,5 +1,18 @@
<template>
<div>
<BaseDialog
v-model="discardDialog"
:title="$t('general.discard-changes')"
color="warning"
:icon="$globals.icons.alertCircle"
can-confirm
@confirm="confirmDiscard"
@cancel="cancelDiscard"
>
<v-card-text>
{{ $t("general.discard-changes-description") }}
</v-card-text>
</BaseDialog>
<RecipePageParseDialog
:model-value="isParsing"
:ingredients="recipe.recipeIngredient"
@@ -15,6 +28,7 @@
:landscape="landscape"
@save="saveRecipe"
@delete="deleteRecipe"
@close="closeEditor"
/>
<RecipeJsonEditor
v-if="isEditJSON"
@@ -174,6 +188,7 @@
<script setup lang="ts">
import { invoke, until } from "@vueuse/core";
import type { RouteLocationNormalized } from "vue-router";
import RecipeIngredients from "../RecipeIngredients.vue";
import RecipePageEditorToolbar from "./RecipePageParts/RecipePageEditorToolbar.vue";
import RecipePageFooter from "./RecipePageParts/RecipePageFooter.vue";
@@ -205,7 +220,6 @@ import { useNavigationWarning } from "~/composables/use-navigation-warning";
const recipe = defineModel<NoUndefinedField<Recipe>>({ required: true });
const display = useDisplay();
const i18n = useI18n();
const $auth = useMealieAuth();
const route = useRoute();
const { isOwnGroup } = useLoggedInState();
@@ -231,26 +245,68 @@ const notLinkedIngredients = computed(() => {
* and prompts the user to save if they have unsaved changes.
*/
const originalRecipe = ref<Recipe | null>(null);
const discardDialog = ref(false);
const pendingRoute = ref<RouteLocationNormalized | null>(null);
invoke(async () => {
await until(recipe.value).not.toBeNull();
originalRecipe.value = deepCopy(recipe.value);
});
onUnmounted(async () => {
const isSame = JSON.stringify(recipe.value) === JSON.stringify(originalRecipe.value);
if (isEditMode.value && !isSame && recipe.value?.slug !== undefined) {
const save = window.confirm(i18n.t("general.unsaved-changes"));
if (save) {
await api.recipes.updateOne(recipe.value.slug, recipe.value);
}
function hasUnsavedChanges(): boolean {
if (originalRecipe.value === null) {
return false;
}
return JSON.stringify(recipe.value) !== JSON.stringify(originalRecipe.value);
}
function restoreOriginalRecipe() {
if (originalRecipe.value) {
recipe.value = deepCopy(originalRecipe.value) as NoUndefinedField<Recipe>;
}
}
function closeEditor() {
if (hasUnsavedChanges()) {
pendingRoute.value = null;
discardDialog.value = true;
}
else {
setMode(PageMode.VIEW);
}
}
function confirmDiscard() {
restoreOriginalRecipe();
discardDialog.value = false;
if (pendingRoute.value) {
const destination = pendingRoute.value;
pendingRoute.value = null;
router.push(destination);
}
else {
setMode(PageMode.VIEW);
}
}
function cancelDiscard() {
discardDialog.value = false;
pendingRoute.value = null;
}
onBeforeRouteLeave((to) => {
if (isEditMode.value && hasUnsavedChanges()) {
pendingRoute.value = to;
discardDialog.value = true;
return false;
}
});
onUnmounted(() => {
deactivateNavigationWarning();
toggleCookMode();
clearPageState(recipe.value.slug || "");
console.debug("reset RecipePage state during unmount");
});
const hasLinkedIngredients = computed(() => {
return recipe.value.recipeInstructions.some(
@@ -300,6 +356,8 @@ async function saveRecipe() {
if (data?.slug) {
router.push(`/g/${groupSlug.value}/r/` + data.slug);
recipe.value = data as NoUndefinedField<Recipe>;
// Update the snapshot after successful save
originalRecipe.value = deepCopy(recipe.value);
}
}

View File

@@ -16,7 +16,7 @@
:open="isEditMode"
:recipe-id="recipe.id"
class="ml-auto mt-n7 pb-4"
@close="setMode(PageMode.VIEW)"
@close="$emit('close')"
@json="toggleEditMode()"
@edit="setMode(PageMode.EDIT)"
@save="$emit('save')"
@@ -47,7 +47,7 @@ const props = withDefaults(defineProps<Props>(), {
landscape: false,
});
defineEmits(["save", "delete", "print"]);
defineEmits(["save", "delete", "print", "close"]);
const { recipeImage } = useStaticRoutes();
const { imageKey, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug);

View File

@@ -39,7 +39,6 @@
:nudge-top="props.menuTop ? '5' : '0'"
allow-overflow
close-delay="125"
:open-on-hover="!props.useMobileFormat"
content-class="d-print-none"
>
<template #activator="{ props: btnProps }">
@@ -99,7 +98,6 @@ const props = defineProps<{
color?: string;
event: RecipeTimelineEventOut;
menuIcon?: string | null;
useMobileFormat?: boolean;
}>();
const emit = defineEmits(["delete", "update"]);

View File

@@ -35,7 +35,6 @@
:menu-top="false"
:event="event"
:menu-icon="$globals.icons.dotsVertical"
:use-mobile-format="useMobileFormat"
color="transparent"
:elevation="0"
:card-menu="false"

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

@@ -56,25 +56,6 @@
width="250"
/>
</div>
<v-menu
v-if="listItem.recipeReferences && listItem.recipeReferences.length > 0"
open-on-hover
offset-y
start
top
>
<template #activator="{ props }">
<v-icon class="mt-auto" :icon="$globals.icons.alert" v-bind="props" color="warning">
{{ $globals.icons.alert }}
</v-icon>
</template>
<v-card max-width="350px" class="left-warning-border">
<v-card-text>
{{ $t("shopping-list.linked-item-warning") }}
</v-card-text>
</v-card>
</v-menu>
</div>
<BaseButton
v-if="listItem.labelId && listItem.food && listItem.labelId !== listItem.food.labelId"

View File

@@ -8,7 +8,6 @@
:nudge-top="menuTop ? '5' : '0'"
allow-overflow
close-delay="125"
open-on-hover
content-class="d-print-none"
>
<template #activator="{ props }">

View File

@@ -7,6 +7,10 @@
import DOMPurify from "isomorphic-dompurify";
import { marked } from "marked";
enum DOMPurifyHook {
UponSanitizeAttribute = "uponSanitizeAttribute",
}
export default defineNuxtComponent({
props: {
source: {
@@ -15,14 +19,26 @@ export default defineNuxtComponent({
},
},
setup(props) {
const ALLOWED_STYLE_TAGS = [
"background-color", "color", "font-style", "font-weight", "text-decoration", "text-align",
];
function sanitizeMarkdown(rawHtml: string | null | undefined): string {
if (!rawHtml) {
return "";
}
DOMPurify.addHook(DOMPurifyHook.UponSanitizeAttribute, (node, data) => {
if (data.attrName === "style") {
const styles = data.attrValue.split(";").filter((style) => {
const [property] = style.split(":");
return ALLOWED_STYLE_TAGS.includes(property.trim().toLowerCase());
});
data.attrValue = styles.join(";");
}
});
const sanitized = DOMPurify.sanitize(rawHtml, {
// List based on
// https://support.zendesk.com/hc/en-us/articles/4408824584602-Allowing-unsafe-HTML-in-help-center-articles
ALLOWED_TAGS: [
"strong", "em", "b", "i", "u", "p", "code", "pre", "samp", "kbd", "var", "sub", "sup", "dfn", "cite",
"small", "address", "hr", "br", "id", "div", "span", "h1", "h2", "h3", "h4", "h5", "h6",
@@ -31,10 +47,14 @@ export default defineNuxtComponent({
],
ALLOWED_ATTR: [
"href", "src", "alt", "height", "width", "class", "allow", "title", "allowfullscreen", "frameborder",
"scrolling", "cite", "datetime", "name", "abbr", "target", "border", "start",
"scrolling", "cite", "datetime", "name", "abbr", "target", "border", "start", "style",
],
});
Object.values(DOMPurifyHook).forEach((hook) => {
DOMPurify.removeHook(hook);
});
return sanitized;
}

View File

@@ -15,25 +15,25 @@ 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: 83,
dir: "ltr",
},
{
name: "Türkçe (Turkish)",
value: "tr-TR",
progress: 39,
progress: 40,
dir: "ltr",
},
{
name: "Svenska (Swedish)",
value: "sv-SE",
progress: 67,
progress: 61,
dir: "ltr",
},
{
@@ -45,25 +45,25 @@ export const LOCALES = [
{
name: "Slovenščina (Slovenian)",
value: "sl-SI",
progress: 41,
progress: 40,
dir: "ltr",
},
{
name: "Slovenčina (Slovak)",
value: "sk-SK",
progress: 46,
progress: 47,
dir: "ltr",
},
{
name: "Pусский (Russian)",
value: "ru-RU",
progress: 46,
progress: 44,
dir: "ltr",
},
{
name: "Română (Romanian)",
value: "ro-RO",
progress: 41,
progress: 44,
dir: "ltr",
},
{
@@ -81,19 +81,19 @@ export const LOCALES = [
{
name: "Polski (Polish)",
value: "pl-PL",
progress: 52,
progress: 49,
dir: "ltr",
},
{
name: "Norsk (Norwegian)",
value: "no-NO",
progress: 41,
progress: 42,
dir: "ltr",
},
{
name: "Nederlands (Dutch)",
value: "nl-NL",
progress: 58,
progress: 54,
dir: "ltr",
},
{
@@ -105,13 +105,13 @@ export const LOCALES = [
{
name: "Lietuvių (Lithuanian)",
value: "lt-LT",
progress: 27,
progress: 30,
dir: "ltr",
},
{
name: "한국어 (Korean)",
value: "ko-KR",
progress: 22,
progress: 38,
dir: "ltr",
},
{
@@ -123,73 +123,73 @@ export const LOCALES = [
{
name: "Italiano (Italian)",
value: "it-IT",
progress: 48,
progress: 49,
dir: "ltr",
},
{
name: "Íslenska (Icelandic)",
value: "is-IS",
progress: 45,
progress: 43,
dir: "ltr",
},
{
name: "Magyar (Hungarian)",
value: "hu-HU",
progress: 47,
progress: 46,
dir: "ltr",
},
{
name: "Hrvatski (Croatian)",
value: "hr-HR",
progress: 29,
progress: 30,
dir: "ltr",
},
{
name: "עברית (Hebrew)",
value: "he-IL",
progress: 72,
progress: 64,
dir: "rtl",
},
{
name: "Galego (Galician)",
value: "gl-ES",
progress: 39,
progress: 38,
dir: "ltr",
},
{
name: "Français (French)",
value: "fr-FR",
progress: 70,
progress: 67,
dir: "ltr",
},
{
name: "Français canadien (Canadian French)",
value: "fr-CA",
progress: 99,
progress: 83,
dir: "ltr",
},
{
name: "Belge (Belgian)",
value: "fr-BE",
progress: 40,
progress: 39,
dir: "ltr",
},
{
name: "Suomi (Finnish)",
value: "fi-FI",
progress: 41,
progress: 40,
dir: "ltr",
},
{
name: "Eesti (Estonian)",
value: "et-EE",
progress: 47,
progress: 44,
dir: "ltr",
},
{
name: "Español (Spanish)",
value: "es-ES",
progress: 46,
progress: 45,
dir: "ltr",
},
{
@@ -201,49 +201,49 @@ export const LOCALES = [
{
name: "British English",
value: "en-GB",
progress: 43,
progress: 42,
dir: "ltr",
},
{
name: "Ελληνικά (Greek)",
value: "el-GR",
progress: 42,
progress: 41,
dir: "ltr",
},
{
name: "Deutsch (German)",
value: "de-DE",
progress: 97,
progress: 83,
dir: "ltr",
},
{
name: "Dansk (Danish)",
value: "da-DK",
progress: 52,
progress: 63,
dir: "ltr",
},
{
name: "Čeština (Czech)",
value: "cs-CZ",
progress: 41,
progress: 43,
dir: "ltr",
},
{
name: "Català (Catalan)",
value: "ca-ES",
progress: 39,
progress: 40,
dir: "ltr",
},
{
name: "Български (Bulgarian)",
value: "bg-BG",
progress: 51,
progress: 49,
dir: "ltr",
},
{
name: "العربية (Arabic)",
value: "ar-SA",
progress: 23,
progress: 25,
dir: "rtl",
},
{

View File

@@ -2,6 +2,7 @@ import { useRecipeCreatePreferences } from "~/composables/use-users/preferences"
export interface UseNewRecipeOptionsProps {
enableImportKeywords?: boolean;
enableImportCategories?: boolean;
enableStayInEditMode?: boolean;
enableParseRecipe?: boolean;
}
@@ -9,6 +10,7 @@ export interface UseNewRecipeOptionsProps {
export function useNewRecipeOptions(props: UseNewRecipeOptionsProps = {}) {
const {
enableImportKeywords = true,
enableImportCategories = true,
enableStayInEditMode = true,
enableParseRecipe = true,
} = props;
@@ -27,6 +29,17 @@ export function useNewRecipeOptions(props: UseNewRecipeOptionsProps = {}) {
},
});
const importCategories = computed({
get() {
if (!enableImportCategories) return false;
return recipeCreatePreferences.value.importCategories;
},
set(v: boolean) {
if (!enableImportCategories) return;
recipeCreatePreferences.value.importCategories = v;
},
});
const stayInEditMode = computed({
get() {
if (!enableStayInEditMode) return false;
@@ -71,6 +84,7 @@ export function useNewRecipeOptions(props: UseNewRecipeOptionsProps = {}) {
return {
// Computed properties for the checkboxes
importKeywordsAsTags,
importCategories,
stayInEditMode,
parseRecipe,
@@ -79,6 +93,7 @@ export function useNewRecipeOptions(props: UseNewRecipeOptionsProps = {}) {
// Props for conditional rendering
enableImportKeywords,
enableImportCategories,
enableStayInEditMode,
enableParseRecipe,
};

View File

@@ -1,5 +1,5 @@
import { Organizer, type RecipeOrganizer } from "~/lib/api/types/non-generated";
import type { LogicalOperator, RelationalKeyword, RelationalOperator } from "~/lib/api/types/response";
import { Organizer } from "~/lib/api/types/non-generated";
import type { LogicalOperator, RecipeOrganizer, RelationalKeyword, RelationalOperator } from "~/lib/api/types/non-generated";
export interface FieldLogicalOperator {
label: string;

View File

@@ -1,7 +1,7 @@
import { useLocalStorage, useSessionStorage } from "@vueuse/core";
import { ActivityKey } from "~/lib/api/types/activity";
import type { RegisteredParser, TimelineEventType } from "~/lib/api/types/recipe";
import type { QueryFilterJSON } from "~/lib/api/types/response";
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
export interface UserPrintPreferences {
imagePosition: string;
@@ -63,6 +63,7 @@ export interface UserRecipeFinderPreferences {
export interface UserRecipeCreatePreferences {
importKeywordsAsTags: boolean;
importCategories: boolean;
stayInEditMode: boolean;
parseRecipe: boolean;
}
@@ -233,6 +234,7 @@ export function useRecipeCreatePreferences(): Ref<UserRecipeCreatePreferences> {
"recipe-create-preferences",
{
importKeywordsAsTags: false,
importCategories: false,
stayInEditMode: false,
parseRecipe: true,
},

View File

@@ -89,7 +89,7 @@
"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",
@@ -212,14 +212,16 @@
"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.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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": "Caution",
"show-advanced": "Show Advanced",
"add-field": "Add Field",
"caution": "Versigtig",
"show-advanced": "Wys uitgebreide",
"add-field": "Voeg veld by",
"date-created": "Datum Geskep",
"date-updated": "Date Updated"
"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 +328,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Resepreëls",
"applies-to-all-days": "Van toepassing op alle dae",
"applies-on-days": "Van toepassing op {0}s",
"meal-plan-settings": "Maaltydplan verstellings"
"meal-plan-settings": "Maaltydplan verstellings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migrasiedata is uitgevee",
@@ -453,7 +457,7 @@
"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-food": "Voeg Voedsel",
"add-recipe": "Voeg Resep By"
},
"page": {
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Voer oorspronklike sleutelwoorde as merkers in",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Bly in redigeer modus",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Voer vanaf zip in",

View File

@@ -212,6 +212,8 @@
"upload-file": "تحميل الملف",
"created-on-date": "تم الإنشاء في {0}",
"unsaved-changes": "لديك تغييرات غير محفوظة. هل تريد الحفظ قبل المغادرة؟ حسنًا للحفظ، قم بإلغاء تجاهل التغييرات.",
"discard-changes": "إلغاء التغييرات",
"discard-changes-description": "لديك تغييرات غير محفوظة. هل أنت متأكد من أنك تريد تجاهلها؟",
"clipboard-copy-failure": "فشل في النسخ إلى الحافظة.",
"confirm-delete-generic-items": "هل أنت متأكد أنك تريد حذف المجموعات التالية؟",
"organizers": "المنظمون",
@@ -342,9 +344,9 @@
"breakfast": "الإفطار",
"lunch": "الغداء",
"dinner": "العشاء",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "وجبة خفيفة",
"drink": "مشروب",
"dessert": "حلوى",
"type-any": "أي",
"day-any": "أي",
"editor": "المحرر",
@@ -367,7 +369,9 @@
"recipe-rules": "قواعد الوصفات",
"applies-to-all-days": "ينطبق على جميع الأيام",
"applies-on-days": "يطبق على أيام {0}",
"meal-plan-settings": "إعدادات خِطَّة الوجبات الغذائية"
"meal-plan-settings": "إعدادات خِطَّة الوجبات الغذائية",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "حذف بيانات الهجرة",
@@ -438,23 +442,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": "Copy and paste the source URL of your data (optional)",
"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: لم يتم العثور على الصفحة",
@@ -484,7 +488,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": "إيقاف إظهار كميات المكونات",
@@ -521,9 +525,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": "فشل تحديث الوصفة",
@@ -556,10 +560,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": "العائد",
@@ -569,13 +573,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": "وضع الطبخ",
@@ -597,23 +601,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": "إنشاء وصفة",
@@ -623,14 +627,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": "هل لديك الكثير من الوصفات التي تريد أن تحللها في نفس الوقت؟",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "استيراد الكلمات المفتاحية الأصلية كوسوم",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "البقاء في وضع التعديل",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "استيراد من ملف Zip",
@@ -693,15 +698,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"
@@ -742,7 +747,7 @@
"advanced": "الإعدادات المتقدمة",
"auto-search": "البحث التلقائي",
"no-results": "لم يتم العثور على نتائج",
"type-to-search": "Type to search..."
"type-to-search": "اكتب للبحث ..."
},
"settings": {
"add-a-new-theme": "إضافة سمة جديدة",
@@ -776,8 +781,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",
@@ -799,29 +804,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": "الوضع الليلي"
},
@@ -858,7 +863,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.",
@@ -1113,21 +1118,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"
},
@@ -1145,18 +1150,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": {
@@ -1166,15 +1171,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": "تصنيف جديد",
@@ -1204,15 +1209,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": {
@@ -1341,12 +1346,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.",
@@ -1358,32 +1363,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"
@@ -1430,11 +1435,11 @@
}
},
"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"
"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": "В хронологичен ред",
@@ -212,11 +212,13 @@
"upload-file": "Качване на файл",
"created-on-date": "Добавена на {0}",
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените.",
"discard-changes": "Отхвърляне на промените",
"discard-changes-description": "Имате незаписани промени, сигурни ли сте, че искате да ги отмените?",
"clipboard-copy-failure": "Линкът към рецептата е копиран в клипборда.",
"confirm-delete-generic-items": "Сигурни ли сте, че желаете да изтриете следните елементи?",
"organizers": "Органайзер",
"caution": "Внимание",
"show-advanced": "Покажи разширени",
"show-advanced": "Разширени настройки",
"add-field": "Добави поле",
"date-created": "Дата на създаване",
"date-updated": "Дата на актуализация"
@@ -367,7 +369,9 @@
"recipe-rules": "Правила на рецептата",
"applies-to-all-days": "Прилага се за всички дни",
"applies-on-days": "Всеки/всяка {0}",
"meal-plan-settings": "Настройки на плана за хранене"
"meal-plan-settings": "Настройки на плана за хранене",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Данните за мигриране са премахнати",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Блокиран ли е уебсайтът?",
"scrape-recipe-try-importing-raw-html-instead": "Опитайте вместо това да импортирате суровия HTML код.",
"import-original-keywords-as-tags": "Добави оригиналните ключови думи като етикети",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Остани в режим на редакция",
"parse-recipe-ingredients-after-import": "Анализиране на съставките на рецептата след импортиране",
"import-from-zip": "Импортирай от Zip",
@@ -1178,17 +1183,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": {

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",
@@ -212,6 +212,8 @@
"upload-file": "Puja un fitxer",
"created-on-date": "Creat el: {0}",
"unsaved-changes": "Tens canvis que no estan guardats. Vols guardar-los abans de sortir? Clica d'acord per guardar-los o cancel·lar per descartar els canvis.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "No s'ha pogut copiar al porta-retalls.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organitzadors",
@@ -367,7 +369,9 @@
"recipe-rules": "Normes per la recepta",
"applies-to-all-days": "Aplica a tots els dies",
"applies-on-days": "S'aplicarà en {0}s",
"meal-plan-settings": "Opcions de planificació de menús"
"meal-plan-settings": "Opcions de planificació de menús",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "S'han suprimit les dades migrades",
@@ -403,7 +407,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,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -597,10 +601,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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"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",
"import-from-zip": "Importa des d'un ZIP",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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",
@@ -212,6 +212,8 @@
"upload-file": "Nahrát soubor",
"created-on-date": "Vytvořeno dne: {0}",
"unsaved-changes": "Máte neuložené změny. Chcete je uložit před odchodem? Klikněte Okay pro uložení, Cancel pro smazání změn.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Zkopírování do schránky se nezdařilo.",
"confirm-delete-generic-items": "Opravdu chcete smazat následující položky?",
"organizers": "Organizace",
@@ -292,7 +294,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í",
@@ -367,7 +369,9 @@
"recipe-rules": "Pravidla receptu",
"applies-to-all-days": "Použije se na všechny dny",
"applies-on-days": "Platí pro {0}",
"meal-plan-settings": "Nastavení jídelníčku"
"meal-plan-settings": "Nastavení jídelníčku",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Data z migrace byla smazána",
@@ -435,7 +439,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",
@@ -503,7 +507,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",
@@ -550,7 +554,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",
@@ -632,7 +636,7 @@
"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?",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Zůstat v režimu úprav",
"parse-recipe-ingredients-after-import": "Po importu analyzovat ingredience receptu",
"import-from-zip": "Importovat ze zipu",
@@ -704,7 +709,7 @@
"cover-image": "Úvodní obrázek",
"include-linked-recipes": "Zahrnout připojené recepty",
"include-linked-recipe-ingredients": "Zahrnout připojené ingredience",
"toggle-recipe": "Přidat/odebrat název sekce"
"toggle-recipe": "Přepnout na recept/jídlo"
},
"recipe-finder": {
"recipe-finder": "Vyhledávač receptů",
@@ -754,7 +759,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",
@@ -1042,7 +1047,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",
@@ -1068,7 +1073,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",
@@ -1077,7 +1082,7 @@
"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.",
@@ -1095,7 +1100,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",
@@ -1308,7 +1313,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",
@@ -1380,9 +1385,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í",
@@ -1433,7 +1438,7 @@
"required": "Toto pole je povinné",
"invalid-email": "E-mail musí být platný",
"invalid-url": "Musí být platná URL adresa",
"no-whitespace": "Prázdný prostor není povolen",
"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!",
@@ -212,6 +212,8 @@
"upload-file": "Upload fil",
"created-on-date": "Oprettet den: {0}",
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?",
"organizers": "Organisatorer",
@@ -343,7 +345,7 @@
"lunch": "Frokost",
"dinner": "Aftensmad",
"snack": "Snack",
"drink": "Drink",
"drink": "Drik",
"dessert": "Dessert",
"type-any": "Alle",
"day-any": "Alle",
@@ -367,7 +369,9 @@
"recipe-rules": "Opskriftsregler",
"applies-to-all-days": "Gælder for alle dage",
"applies-on-days": "Gælder for {0}e",
"meal-plan-settings": "Indstillinger for madplanlægning"
"meal-plan-settings": "Indstillinger for madplanlægning",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migreringsdata fjernet",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -562,9 +566,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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Bliv i redigeringstilstand",
"parse-recipe-ingredients-after-import": "Fortolk opskrift ingredienser efter import",
"import-from-zip": "Importer fra zip-fil",
@@ -659,14 +664,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",
@@ -1308,7 +1313,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",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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

@@ -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",
@@ -212,6 +212,8 @@
"upload-file": "Datei hochladen",
"created-on-date": "Erstellt am: {0}",
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Fehler beim Kopieren in die Zwischenablage.",
"confirm-delete-generic-items": "Bist du dir sicher, dass du die folgenden Einträge löschen möchtest?",
"organizers": "Organisieren",
@@ -279,7 +281,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Rezeptregeln",
"applies-to-all-days": "Gilt an allen Tagen",
"applies-on-days": "Gilt {0}s",
"meal-plan-settings": "Essensplan Einstellungen"
"meal-plan-settings": "Essensplan Einstellungen",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migrationsdaten entfernt",
@@ -403,7 +407,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,7 +449,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": "Kopieren und fügen Sie die Quell-URL Ihrer Daten ein (optional)",
"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",
@@ -522,7 +526,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",
@@ -638,8 +642,9 @@
"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": "Die Website wird blockiert?",
"scrape-recipe-try-importing-raw-html-instead": "Versuchen Sie stattdessen das reine HTML zu importieren.",
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
"parse-recipe-ingredients-after-import": "Zutaten nach dem Import parsen",
"import-from-zip": "Von Zip importieren",
@@ -765,7 +770,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"
@@ -1082,7 +1087,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",
@@ -1096,7 +1101,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",
@@ -1135,7 +1140,7 @@
"seed-dialog-text": "Füllt die Datenbank mit gängigen Kategorien basierend auf deiner Sprache.",
"edit-label": "Kategorie bearbeiten",
"new-label": "Neue Kategorie",
"labels": "Kategorien",
"labels": "Bezeichnungen",
"assign-label": "Kategorie zuweisen"
},
"recipes": {

View File

@@ -212,6 +212,8 @@
"upload-file": "Μεταφόρτωση αρχείου",
"created-on-date": "Δημιουργήθηκε στις: {0}",
"unsaved-changes": "Εχετε μη αποθηκευμένες αλλαγές. Θέλετε να κάνετε αποθήκευση πριν από την αποχώρηση; Εντάξει για αποθήκευση, Ακυρο για απόρριψη των αλλαγών.",
"discard-changes": "Απόρριψη αλλαγών",
"discard-changes-description": "Εχετε μη αποθηκευμένες αλλαγές, θέλετε σίγουρα να τις απορρίψετε;",
"clipboard-copy-failure": "Η αντιγραφή στο πρόχειρο απέτυχε.",
"confirm-delete-generic-items": "Θέλετε σίγουρα να διαγράψετε τα ακόλουθα αντικείμενα;",
"organizers": "Οργανωτές",
@@ -367,7 +369,9 @@
"recipe-rules": "Κανόνες Συνταγής",
"applies-to-all-days": "Εφαρμόζεται για όλες τις ημέρες",
"applies-on-days": "Εφαρμόζεται κάθε {0}",
"meal-plan-settings": "Ρυθμίσεις προγράμματος γευμάτων"
"meal-plan-settings": "Ρυθμίσεις προγράμματος γευμάτων",
"add-all-to-list": "Προσθήκη όλων στη λίστα",
"add-day-to-list": "Προσθήκη ημέρας στη λίστα"
},
"migration": {
"migration-data-removed": "Τα δεδομένα μετεγκατάστασης καταργήθηκαν",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Η ιστοσελίδα μπλοκάρεται;",
"scrape-recipe-try-importing-raw-html-instead": "Δοκιμάστε να εισάγετε τον ακατέργαστο κώδικα HTML.",
"import-original-keywords-as-tags": "Εισαγωγή αρχικών λέξεων-κλειδιών ως ετικέτες",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Παραμονή σε λειτουργία επεξεργασίας",
"parse-recipe-ingredients-after-import": "Ανάλυση συστατικών συνταγής μετά την εισαγωγή",
"import-from-zip": "Εισαγωγή μέσω zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Upload File",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organisers",
@@ -367,7 +369,9 @@
"recipe-rules": "Recipe Rules",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-plan-settings": "Meal Plan Settings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migration data removed",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Import original keywords as tags",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Stay in Edit mode",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Import from Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Upload File",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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",
@@ -367,7 +369,9 @@
"recipe-rules": "Recipe Rules",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-plan-settings": "Meal Plan Settings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migration data removed",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Import original keywords as tags",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Stay in Edit mode",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Import from Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Subir Archivo",
"created-on-date": "Creado el {0}",
"unsaved-changes": "Tienes cambios sin guardar. ¿Quieres guardar antes de salir? Aceptar para guardar, Cancelar para descartar cambios.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "No se pudo copiar al portapapeles.",
"confirm-delete-generic-items": "¿Estás seguro que quieres eliminar los siguientes elementos?",
"organizers": "Organizadores",
@@ -343,8 +345,8 @@
"lunch": "Comida principal",
"dinner": "Cena",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"drink": "Bebida",
"dessert": "Postre",
"type-any": "Cualquiera",
"day-any": "Cualquier",
"editor": "Editor",
@@ -367,7 +369,9 @@
"recipe-rules": "Reglas de Recetas",
"applies-to-all-days": "Aplica para todos los días",
"applies-on-days": "Se aplica en {0}s",
"meal-plan-settings": "Configuración del Plan de Comidas"
"meal-plan-settings": "Configuración del Plan de Comidas",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Datos de migración eliminados",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -453,7 +457,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": {
@@ -523,7 +527,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",
@@ -569,7 +573,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",
@@ -597,7 +601,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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Permanecer en modo edición",
"parse-recipe-ingredients-after-import": "Analizar los ingredientes de la receta después de importarla",
"import-from-zip": "Importar desde zip",
@@ -702,8 +707,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": {
@@ -742,7 +747,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",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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

@@ -212,6 +212,8 @@
"upload-file": "Lae fail üles",
"created-on-date": "Loodud: {0}",
"unsaved-changes": "Sul on salvestamata muudatusi. Kas sa tahad salvestada enne lehelt lahkumist? Vajuta OK salvestamiseks või Tühista, et muudatused tühistada.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Lõikepuhvrisse kopeerimine ebaõnnestus.",
"confirm-delete-generic-items": "Kas oled kindel, et tahad kustutada järgnevad asjad?",
"organizers": "Korraldajad",
@@ -367,7 +369,9 @@
"recipe-rules": "Retsepti reeglid",
"applies-to-all-days": "Kehtib kõikide päevade kohta",
"applies-on-days": "Kehtib {0}l",
"meal-plan-settings": "Toitumisplaani sätted"
"meal-plan-settings": "Toitumisplaani sätted",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Ületoomiste andmed eemaldatud",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Impordi originaal võtmesõnad siltidena",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Püsige redigeerimisrežiimis",
"parse-recipe-ingredients-after-import": "Tuvasta retsepti koostisosad pärast importimist",
"import-from-zip": "Impordi .zip-st",

View File

@@ -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.",
@@ -212,6 +212,8 @@
"upload-file": "Tuo tiedosto",
"created-on-date": "Luotu {0}",
"unsaved-changes": "Et ole tallentanut tekemiäsi muutoksia. Tallennetaanko ne? Paina \"ok\" tallentaaksesi ja \"peruuta\", jos et halua tallentaa.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Kopioiminen leikepöydälle epäonnistui.",
"confirm-delete-generic-items": "Haluatko varmasti poistaa seuraavat kohteet?",
"organizers": "Järjestäjät",
@@ -342,9 +344,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Reseptimääritykset",
"applies-to-all-days": "Sovelletaan kaikkiin päiviin",
"applies-on-days": "Käytetään {0}",
"meal-plan-settings": "Ateriasuunnitelman asetukset"
"meal-plan-settings": "Ateriasuunnitelman asetukset",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Tuodut tiedot poistettu",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Pysy muokkaustilassa",
"parse-recipe-ingredients-after-import": "Jäsennä reseptin ainesosat tuonnin jälkeen",
"import-from-zip": "Tuo zip-arkistosta",
@@ -1081,7 +1086,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": {
@@ -1430,11 +1435,11 @@
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"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": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
"min-length": "Vähimmäispituus on {min} merkkiä",
"max-length": "Enimmäispituus on {max} merkkiä"
}
}

View File

@@ -212,6 +212,8 @@
"upload-file": "Transférer un fichier",
"created-on-date": "Créé le {0}",
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir? OK pour enregistrer, Annuler pour ignorer les modifications.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Échec de la copie dans le presse-papiers.",
"confirm-delete-generic-items": "Êtes-vous sûr de vouloir supprimer les éléments suivants ?",
"organizers": "Classification",
@@ -367,7 +369,9 @@
"recipe-rules": "Règles de recette",
"applies-to-all-days": "S'applique à tous les jours",
"applies-on-days": "S'applique les {0}s",
"meal-plan-settings": "Paramètres des menus"
"meal-plan-settings": "Paramètres des menus",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Données de migration supprimées",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Rester en mode édition",
"parse-recipe-ingredients-after-import": "Analyser les ingrédients de la recette après l'import",
"import-from-zip": "Importer depuis un zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Téléverser un fichier",
"created-on-date": "Créé le {0}",
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous les enregistrer? Ok pour enregistrer, annuler pour ignorer les modifications.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Échec de la copie vers le presse-papiers.",
"confirm-delete-generic-items": "Êtes-vous sûr de vouloir supprimer les éléments suivants ?",
"organizers": "Classification",
@@ -367,7 +369,9 @@
"recipe-rules": "Règles de recette",
"applies-to-all-days": "S'applique à tous les jours",
"applies-on-days": "S'applique les {0}s",
"meal-plan-settings": "Paramètres des menus"
"meal-plan-settings": "Paramètres des menus",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Données de migration supprimées",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Rester en mode édition",
"parse-recipe-ingredients-after-import": "Analyser les ingrédients de la recette après l'import",
"import-from-zip": "Importer depuis un zip",
@@ -1434,7 +1439,7 @@
"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",
"min-length": "",
"max-length": "Doit contenir au maximum {max} caractères"
}
}

View File

@@ -212,6 +212,8 @@
"upload-file": "Téléverser un fichier",
"created-on-date": "Créé le {0}",
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir? OK pour enregistrer, Annuler pour ignorer les modifications.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Échec de la copie dans le presse-papiers.",
"confirm-delete-generic-items": "Êtes-vous sûr de vouloir supprimer les éléments suivants ?",
"organizers": "Classification",
@@ -337,7 +339,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Règles de recette",
"applies-to-all-days": "S'applique à tous les jours",
"applies-on-days": "S'applique les {0}s",
"meal-plan-settings": "Paramètres des menus"
"meal-plan-settings": "Paramètres des menus",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Données de migration supprimées",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Rester en mode édition",
"parse-recipe-ingredients-after-import": "Analyser les ingrédients de la recette après l'import",
"import-from-zip": "Importer depuis un zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Subir Arquivo",
"created-on-date": "Creado o: {0}",
"unsaved-changes": "Tes cambios sen gardar. Queres gardar antes de saír? OK para gardar, Cancelar para descartar cambios.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Produciuse un erro ao copiar contido no portapapeis.",
"confirm-delete-generic-items": "Estás seguro de que queres eliminar os seguintes elementos?",
"organizers": "Organizadores",
@@ -367,7 +369,9 @@
"recipe-rules": "Regras da Receita",
"applies-to-all-days": "Aplícase a todos os días",
"applies-on-days": "Aplícase en {0}s",
"meal-plan-settings": "Axustes do Menú"
"meal-plan-settings": "Axustes do Menú",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Elimináronse os datos de migración",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Importar palavras-chave orixinais como etiquetas",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Permanecer no modo de edición",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Importar de Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "העלאת קבצים",
"created-on-date": "נוצר ב-{0}",
"unsaved-changes": "יש שינויים שלא נשמרו. לצאת לפני שמירה? אשר לשמירה, בטל למחיקת שינויים.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "כשלון בהעתקה ללוח ההדבקה.",
"confirm-delete-generic-items": "למחוק את הפריטים שנבחרו?",
"organizers": "מארגנים",
@@ -367,7 +369,9 @@
"recipe-rules": "חוקי מתכון",
"applies-to-all-days": "החל על כל הימים",
"applies-on-days": "חל על {0}",
"meal-plan-settings": "הגדרות תכנון ארוחות"
"meal-plan-settings": "הגדרות תכנון ארוחות",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "מידע ממוגרץ נמחק",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "ייבוא שמות מפתח מקוריות כתגיות",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "השאר במצב עריכה",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "ייבא מקובץ",

View File

@@ -212,6 +212,8 @@
"upload-file": "Prenesi Datoteku",
"created-on-date": "Kreirano dana: {0}",
"unsaved-changes": "Imate promjene koje nisu spremljene. Želite li ih spremiti prije odlaska? Ok za spremanje, Odustani za odbaciti promjene.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Pogreška prilikom spremanja u međuspremnik.",
"confirm-delete-generic-items": "Jeste li sigurni da želite izbrisati ove stavke?",
"organizers": "Organizatori",
@@ -367,7 +369,9 @@
"recipe-rules": "Pravila Recepata",
"applies-to-all-days": "Primjeni na sve dane",
"applies-on-days": "Primjeni na {0}",
"meal-plan-settings": "Postavke Plana Obroka"
"meal-plan-settings": "Postavke Plana Obroka",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Podaci o migraciji su uklonjeni",
@@ -521,9 +525,9 @@
"recipe-deleted": "Recept obrisan",
"recipe-image": "Slika Recepta",
"recipe-image-updated": "Slika recepta ažurirana",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"delete-image": "Obriši sliku recepta",
"delete-image-confirmation": "Jeste li sigurni da želite obrisati ovu sliku?",
"recipe-image-deleted": "Slika recepta obrisana",
"recipe-name": "Naziv Recepta",
"recipe-settings": "Postavke Recepta",
"recipe-update-failed": "Ažuriranje polja recepta",
@@ -554,14 +558,14 @@
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
"add-to-list": "Dodaj na Popis",
"add-to-plan": "Dodaj u Plan",
"add-to-timeline": "Add to Timeline",
"add-to-timeline": "Dodaj na vremensku crtu",
"recipe-added-to-list": "Recept je dodan na popis",
"recipes-added-to-list": "Recipes added to list",
"successfully-added-to-list": "Successfully added to list",
"recipes-added-to-list": "Recepti dodani na popis",
"successfully-added-to-list": "Uspješno dodan na popis",
"recipe-added-to-mealplan": "Recept je dodan u Plan",
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
"failed-to-add-recipes-to-list": "Neuspješno dodavanje na popis",
"failed-to-add-recipe-to-mealplan": "Nije uspjelo dodavanje recepta u plan obroka",
"failed-to-add-to-list": "Failed to add to list",
"failed-to-add-to-list": "Neuspješno dodavanje na popis",
"yield": "Konačna Količina",
"yields-amount-with-text": "Yields {amount} {text}",
"yield-text": "Yield Text",
@@ -569,19 +573,19 @@
"choose-unit": "Odaberi Jedinicu",
"press-enter-to-create": "Pritisni Enter za Kreiranje",
"choose-food": "Odaberi Hranu",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Odaberite recept",
"notes": "Bilješke",
"toggle-section": "Preklopi Odjeljak",
"see-original-text": "Prikaži Izvorni Tekst",
"original-text-with-value": "Izvorni Tekst: {originalText}",
"ingredient-linker": "Poveznik Sastojaka",
"unlinked": "Not linked yet",
"unlinked": "Nije povezano",
"linked-to-other-step": "Povezano s drugim korakom",
"auto": "Auto",
"cook-mode": "Način Kuhanja",
"link-ingredients": "Poveži Sastojke",
"merge-above": "Spoji prethodni korak",
"move-to-bottom": "Move To Bottom",
"move-to-bottom": "Pomakni na dno",
"move-to-top": "Na vrh",
"reset-scale": "Vrati skaliranje na stare postavke",
"decrease-scale-label": "Smanji skaliranje za 1",
@@ -602,7 +606,7 @@
"failed-to-add-to-timeline": "Neuspješno dodavanje na vremensku crtu",
"failed-to-update-recipe": "Neuspješno ažuriranje recepta",
"added-to-timeline-but-failed-to-add-image": "Dodano na vremensku crtu, no nije uspjelo dodavanje fotografije",
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
"api-extras-description": "Dodatci recepata su ključna značajka Mealie API-ja. Omogućuju vam stvaranje prilagođenih JSON ključ/vrijednost parova unutar recepata kako biste ih mogli koristiti iz aplikacija trećih strana. Možete koristiti ove ključeve kako biste prenijeli informacije koje će pokrenuti automatizaciju ili prilagođene poruke koje će biti prenesene na željeni uređaj.",
"message-key": "Ključ poruke",
"parse": "Razluči (parsiraj)",
"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.",
@@ -637,16 +641,17 @@
"scrape-recipe-suggest-bulk-importer": "Isprobajte masovni uvoz",
"scrape-recipe-have-raw-html-or-json-data": "Imate neobrađene HTML ili JSON podatke?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Možete uvesti iz neobrađenih podataka izravno",
"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": "Stranica ne radi?",
"scrape-recipe-try-importing-raw-html-instead": "Pokušajte s uvozom HTML-a.",
"import-original-keywords-as-tags": "Uvezi originalne ključne riječi kao oznake",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Ostanite u načinu uređivanja",
"parse-recipe-ingredients-after-import": "Parsiranje sastojaka recepta nakon uvoza",
"import-from-zip": "Uvoz iz Zip-a",
"import-from-zip-description": "Uvezi pojedinačni recept koji je izvezen iz druge instance Mealie aplikacije.",
"import-from-html-or-json": "Uvoz iz HTML-a ili JSON-a",
"import-from-html-or-json-description": "Uvezite jedan recept iz neobrađenog HTML-a ili JSON-a. Ovo je korisno ako imate recept s web-stranice koju Mealie ne može normalno preuzeti ili iz nekog drugog vanjskog izvora.",
"json-import-format-description-colon": "To import via JSON, it must be in valid format:",
"json-import-format-description-colon": "Kako biste uveli JSON, mora biti u ispravnom obliku:",
"json-editor": "JSON uređivač",
"zip-files-must-have-been-exported-from-mealie": ".zip datoteke moraju biti izvezeni iz Mealie-a",
"create-a-recipe-by-uploading-a-scan": "Izradite recept tako što ćete učitati skeniranu kopiju.",

View File

@@ -212,6 +212,8 @@
"upload-file": "Fájl feltöltése",
"created-on-date": "Létrehozva: {0}",
"unsaved-changes": "El nem mentett módosításai vannak. Szeretné elmenteni, mielőtt kilép? A mentéshez kattintson az Ok, a módosítások elvetéséhez a Mégsem gombra.",
"discard-changes": "Discard Changes",
"discard-changes-description": "Nem mentett módosításai vannak, biztos, hogy elveti?",
"clipboard-copy-failure": "Nem sikerült a vágólapra másolás.",
"confirm-delete-generic-items": "Biztos benne, hogy törölni szeretné az alábbi tételeket?",
"organizers": "Rendszerezők",
@@ -367,7 +369,9 @@
"recipe-rules": "Recept szabályok",
"applies-to-all-days": "Minden napra vonatkozóan",
"applies-on-days": "Érvényes {0}-ként",
"meal-plan-settings": "Menütervező beállításai"
"meal-plan-settings": "Menütervező beállításai",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migrációs adatok eltávolítva",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "A weboldal blokkolva van?",
"scrape-recipe-try-importing-raw-html-instead": "Próbálja meg inkább a nyers HTML-t importálni.",
"import-original-keywords-as-tags": "Eredeti kulcsszavak importálása címkeként",
"import-original-categories": "Eredeti kategóriák importálása",
"stay-in-edit-mode": "Maradjon Szerkesztés módban",
"parse-recipe-ingredients-after-import": "Recept összetevőinek elemzése importálás után",
"import-from-zip": "Importálás ZIP-ből",

View File

@@ -212,6 +212,8 @@
"upload-file": "Hlaða upp skrá",
"created-on-date": "Búið til: {0}",
"unsaved-changes": "Þú hefur ekki vistað breytingar. Viltu vista áður en þú ferð? Ýttu á \"Í lagi\" til að vista, \"Hætta við\" til að henda breytingum.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Mistókst að afrita klippispjaldið.",
"confirm-delete-generic-items": "Ertu viss um að þú viljir eyða eftirfylgjandi atriðum?",
"organizers": "Skipuleggjarar",
@@ -367,7 +369,9 @@
"recipe-rules": "Uppskriftar reglur",
"applies-to-all-days": "Á við alla daga",
"applies-on-days": "Gildir þegar er {0},",
"meal-plan-settings": "Stillingar matarplans"
"meal-plan-settings": "Stillingar matarplans",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Gagnaflutningur fjarlægður",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Vera í breytingarham",
"parse-recipe-ingredients-after-import": "Greina innhald uppskriftar eftir að búið er að hlaða inn uppskrift",
"import-from-zip": "Hlaða inn frá .zip",
@@ -702,9 +707,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",

View File

@@ -212,6 +212,8 @@
"upload-file": "Carica file",
"created-on-date": "Creato il: {0}",
"unsaved-changes": "Sono state apportate modifiche non salvate. Salvare prima di uscire? Premi Ok per salvare, Annulla per scartare le modifiche.",
"discard-changes": "Scarta le modifiche",
"discard-changes-description": "Sono state apportate modifiche non salvate. Sei sicuro di volerle scartare?",
"clipboard-copy-failure": "Impossibile copiare negli appunti.",
"confirm-delete-generic-items": "Sei sicuro di voler eliminare i seguenti elementi?",
"organizers": "Organizzatori",
@@ -367,7 +369,9 @@
"recipe-rules": "Regole per le ricette",
"applies-to-all-days": "Si applica a ogni giorno",
"applies-on-days": "Si applica ai {0}",
"meal-plan-settings": "Impostazioni del piano alimentare"
"meal-plan-settings": "Impostazioni del piano alimentare",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Dati di migrazione rimossi",
@@ -578,7 +582,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",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Importa categorie originali",
"stay-in-edit-mode": "Rimani in modalità Modifica",
"parse-recipe-ingredients-after-import": "Analizza gli ingredienti della ricetta dopo l'importazione",
"import-from-zip": "Importa da Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "ファイルのアップロード",
"created-on-date": "作成日: {0}",
"unsaved-changes": "保存されていない変更があります。移動する前に保存しますか?保存するには はい を、変更を破棄するにはキャンセルしてください。",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "クリップボードにコピーできませんでした",
"confirm-delete-generic-items": "次のアイテムを本当に削除しますか?",
"organizers": "収納",
@@ -367,7 +369,9 @@
"recipe-rules": "レシピのルール",
"applies-to-all-days": "すべての日に適用",
"applies-on-days": "{0}曜日に適用",
"meal-plan-settings": "献立設定"
"meal-plan-settings": "献立設定",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "移行データが削除されました",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "元のキーワードをタグとしてインポート",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "編集モードを維持",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Zipからインポート",

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,13 @@
"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.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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 +236,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 +248,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 +271,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 +325,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 +344,7 @@
"breakfast": "Pusryčiai",
"lunch": "Pietūs",
"dinner": "Vakarienė",
"snack": "Snack",
"snack": "Užkandis",
"drink": "Drink",
"dessert": "Dessert",
"type-any": "Bet kas",
@@ -367,7 +369,9 @@
"recipe-rules": "Recepto taisyklės",
"applies-to-all-days": "Galioja visoms dienoms",
"applies-on-days": "Galioja {0}",
"meal-plan-settings": "Valgių plano nustatymai"
"meal-plan-settings": "Valgių plano nustatymai",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Perkėlimo duomenys pašalinti",
@@ -445,7 +449,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)",
"copy-and-paste-the-source-url-of-your-data-optional": "Nukopijuokite ir įklijuokite savo duomenų šaltinio URL (nebūtina)",
"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ą",
@@ -623,31 +627,32 @@
"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",
"import-original-categories": "Import original categories",
"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",
@@ -664,46 +669,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": {

View File

@@ -212,6 +212,8 @@
"upload-file": "Augšupielādēt failu",
"created-on-date": "Izveidots: {0}",
"unsaved-changes": "Jums ir nesaglabātas izmaiņas. Vai vēlaties ietaupīt pirms aiziešanas? Labi, lai saglabātu, Atcelt, lai izmestu izmaiņas.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Neizdevās kopēt starpliktuvē.",
"confirm-delete-generic-items": "Vai tiešām vēlaties dzēst šādus vienumus?",
"organizers": "Organizatori",
@@ -367,7 +369,9 @@
"recipe-rules": "Recepšu noteikumi",
"applies-to-all-days": "Attiecas uz visām dienām",
"applies-on-days": "Attiecas uz {0} s",
"meal-plan-settings": "Maltītes plāna iestatījumi"
"meal-plan-settings": "Maltītes plāna iestatījumi",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migrācijas dati noņemti",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Importējiet oriģinālos atslēgvārdus kā tagus",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Palieciet rediģēšanas režīmā",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Importēt no Zip",

View File

@@ -175,7 +175,7 @@
"view": "Weergave",
"wednesday": "woensdag",
"yes": "Ja",
"foods": "Levensmiddelen",
"foods": "Ingrediënten",
"units": "Eenheden",
"back": "Terug",
"next": "Volgende",
@@ -212,6 +212,8 @@
"upload-file": "Bestand uploaden",
"created-on-date": "Gemaakt op: {0}",
"unsaved-changes": "Er zijn niet-opgeslagen wijzigingen. Wil je eerst opslaan voordat je vertrekt? Oké om op te slaan, Annuleren om wijzigingen ongedaan te maken.",
"discard-changes": "Sla wijzigingen niet op",
"discard-changes-description": "Je wilt je wijzigingen niet opslaan. Weet je het zeker?",
"clipboard-copy-failure": "Kopiëren naar klembord mislukt.",
"confirm-delete-generic-items": "Weet je zeker dat je de volgende items wilt verwijderen?",
"organizers": "Organisatoren",
@@ -268,7 +270,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Receptregels",
"applies-to-all-days": "Van toepassing op alle dagen",
"applies-on-days": "Van toepassing op {0}s",
"meal-plan-settings": "Maaltijdplan-instellingen"
"meal-plan-settings": "Maaltijdplan-instellingen",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migratiegegevens verwijderd",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Wordt de website geblokkeerd?",
"scrape-recipe-try-importing-raw-html-instead": "Probeer de HTML broncode te importeren.",
"import-original-keywords-as-tags": "Importeer oorspronkelijke trefwoorden als labels",
"import-original-categories": "Importeer oorspronkelijke categorieën",
"stay-in-edit-mode": "Blijf in bewerkingsmodus",
"parse-recipe-ingredients-after-import": "Ontleed de ingrediënten van het recept na importeren",
"import-from-zip": "Importeren uit zip",

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",
@@ -212,6 +212,8 @@
"upload-file": "Last opp fil",
"created-on-date": "Opprettet: {0}",
"unsaved-changes": "Du har ulagrede endringer. Ønsker du å lagre før du forlater? Trykk 'OK' for å lagre, 'Avbryt' for å forkaste endringene.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Kunne ikke kopiere til utklippstavlen.",
"confirm-delete-generic-items": "Er du sikker på at du vil slette følgende elementer?",
"organizers": "Organisatorer",
@@ -343,7 +345,7 @@
"lunch": "Lunsj",
"dinner": "Middag",
"snack": "Snacks",
"drink": "Drink",
"drink": "Drikke",
"dessert": "Dessert",
"type-any": "Enhver",
"day-any": "Enhver",
@@ -367,7 +369,9 @@
"recipe-rules": "Regler for oppskrifter",
"applies-to-all-days": "Gjelder for alle dager",
"applies-on-days": "Gjelder på {0}er",
"meal-plan-settings": "Innstillinger for måltidsplan"
"meal-plan-settings": "Innstillinger for måltidsplan",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Overføringsdata er fjernet",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -569,7 +573,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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Forbli i redigeringsmodus",
"parse-recipe-ingredients-after-import": "Analyser oppskriftens ingredienser etter at importen er fullført",
"import-from-zip": "Importer fra zip-fil",
@@ -742,7 +747,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",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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

@@ -41,9 +41,9 @@
"category-created": "Kategoria stworzona",
"category-creation-failed": "Błąd podczas tworzenia kategorii",
"category-deleted": "Usunięto kategorię",
"category-deletion-failed": "Usunięcie kategorii nie powiodło się",
"category-deletion-failed": "Nie udało się usunąć kategorii",
"category-filter": "Filtr kategorii",
"category-update-failed": "Aktualizacja kategorii nie powiodła się",
"category-update-failed": "Nie udało się zaktualizować kategorii",
"category-updated": "Zaktualizowano kategorię",
"uncategorized-count": "{count} bez kategorii",
"create-a-category": "Stwórz kategorię",
@@ -201,7 +201,7 @@
"last-made": "Ostatnio wykonane",
"learn-more": "Dowiedz się więcej",
"this-feature-is-currently-inactive": "Ta funkcja jest obecnie nieaktywna",
"clipboard-not-supported": "Schowek nieobsługiwany",
"clipboard-not-supported": "Schowek nie jest obsługiwany",
"copied-to-clipboard": "Skopiowano do schowka",
"your-browser-does-not-support-clipboard": "Twoja przeglądarka nie obsługuje schowka",
"copied-items-to-clipboard": "Nie skopiowano elementu do schowka|Jeden element skopiowany do schowka|Skopiowano {count} elementów do schowka",
@@ -212,6 +212,8 @@
"upload-file": "Prześlij plik",
"created-on-date": "Utworzono dnia: {0}",
"unsaved-changes": "Masz niezapisane zmiany. Czy chcesz zapisać przed wyjściem? Ok, aby zapisać, Anuluj, żeby odrzucić zmiany.",
"discard-changes": "Odrzuć zmiany",
"discard-changes-description": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?",
"clipboard-copy-failure": "Nie udało się skopiować do schowka.",
"confirm-delete-generic-items": "Czy na pewno chcesz usunąć następujące elementy?",
"organizers": "Organizatory",
@@ -307,8 +309,8 @@
"create-a-new-meal-plan": "Utwórz nowy plan posiłku",
"update-this-meal-plan": "Zaktualizuj plan posiłku",
"dinner-this-week": "Obiad w tym tygodniu",
"dinner-today": "Obiad dziś",
"dinner-tonight": "OBIAD DZIŚ",
"dinner-today": "Obiad na dziś",
"dinner-tonight": "Kolacja na dziś",
"edit-meal-plan": "Edytuj plan posiłku",
"end-date": "Data zakończenia",
"group": "Grupa (Beta)",
@@ -342,9 +344,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Reguły przepisów",
"applies-to-all-days": "Dotyczy wszystkich dni",
"applies-on-days": "Dotyczy {0}",
"meal-plan-settings": "Ustawienia planera posiłków"
"meal-plan-settings": "Ustawienia planera posiłków",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Dane migracji usunięte",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Importuj oryginalne kategorie",
"stay-in-edit-mode": "Pozostań w trybie edycji",
"parse-recipe-ingredients-after-import": "Analizuj składniki receptury po zaimportowaniu",
"import-from-zip": "Importuj z pliku Zip",
@@ -830,7 +835,7 @@
"api-token": "Token API",
"api-tokens": "Tokeny API",
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Skopiuj ten token w celu użycia w zewnętrznej aplikacji. Tokenu tego nie będzie można więcej wyświetlić.",
"create-an-api-token": "Utworz token API",
"create-an-api-token": "Utwórz token API",
"token-name": "Nazwa tokenu",
"generate": "Generuj",
"you-have-token-count": "Nie masz aktywnych tokenów. |Masz jeden aktywny token.|Masz {count} aktywnych tokenów."
@@ -966,8 +971,8 @@
"tag-creation-failed": "Utworzenie etykiety nie powiodło się",
"tag-deleted": "Etykieta została usunięta",
"tag-deletion-failed": "Usunięcie etykiety nie powiodło się",
"tag-update-failed": "Atkualizacja etykiety nie powiodła się",
"tag-updated": "Etykieta została zakutalizowana",
"tag-update-failed": "Aktualizacja etykiety nie powiodła się",
"tag-updated": "Etykieta została zaktualizowana",
"tags": "Tagi",
"untagged-count": "{count} bez etykiety",
"create-a-tag": "Utwórz znacznik",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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": "Musi zawierać co najmniej {min} znaków",
"max-length": "Musi zawierać co najwyżej {max} znaków"
}
}

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",
@@ -212,6 +212,8 @@
"upload-file": "Enviar arquivo",
"created-on-date": "Criado em {0}",
"unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Falha ao copiar para a área de transferência.",
"confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?",
"organizers": "Organizadores",
@@ -237,7 +239,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 +248,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 +280,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 +315,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",
@@ -367,7 +369,9 @@
"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",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Dados de migração removidos",
@@ -525,7 +529,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",
@@ -571,7 +575,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",
@@ -640,6 +644,7 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar",
"import-from-zip": "Importar do .zip",
@@ -653,7 +658,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",
@@ -704,10 +709,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",
@@ -737,7 +742,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",
@@ -746,7 +751,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}",
@@ -777,7 +782,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",
@@ -823,7 +828,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",
@@ -896,13 +901,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",
@@ -914,8 +919,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",
@@ -936,7 +941,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",
@@ -1010,7 +1015,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",
@@ -1048,7 +1053,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",
@@ -1073,7 +1078,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.",
@@ -1152,7 +1157,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",
@@ -1335,8 +1340,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}!",
@@ -1346,26 +1351,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.",
@@ -1379,20 +1384,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",
@@ -1402,7 +1407,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"
},

View File

@@ -212,6 +212,8 @@
"upload-file": "Carregar ficheiro",
"created-on-date": "Criado em: {0}",
"unsaved-changes": "Tem alterações por gravar. Quer gravar antes de sair? OK para gravar, Cancelar para descartar alterações.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Erro ao copiar para a área de transferência.",
"confirm-delete-generic-items": "Tem a certeza de que deseja eliminar os seguintes itens?",
"organizers": "Organizadores",
@@ -343,8 +345,8 @@
"lunch": "Almoço",
"dinner": "Jantar",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"drink": "Bebida",
"dessert": "Sobremesa",
"type-any": "Qualquer",
"day-any": "Qualquer",
"editor": "Editor",
@@ -367,7 +369,9 @@
"recipe-rules": "Regras das receitas",
"applies-to-all-days": "Aplica-se a todos os dias",
"applies-on-days": "Aplica-se em {0}s",
"meal-plan-settings": "Definições do Plano de Refeições"
"meal-plan-settings": "Definições do Plano de Refeições",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Dados de migração removidos",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Analisar ingredientes da receita após a importação",
"import-from-zip": "Importar de Zip",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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

@@ -212,6 +212,8 @@
"upload-file": "Încărcă fișier",
"created-on-date": "Creat pe {0}",
"unsaved-changes": "Aveți modificări nesalvate. Doriți să salvați înainte de a închide aplicația? Apăsați \"OK\" pentru a salva sau \"Anulare\" pentru a renunța la modificări.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Copierea în clipboard a eșuat.",
"confirm-delete-generic-items": "Sunteți sigur că doriți să ștergeți următoarele?",
"organizers": "Organizatori",
@@ -342,9 +344,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Reguli rețetă",
"applies-to-all-days": "Se aplică pentru toate zilele",
"applies-on-days": "Aplică pe {0}s",
"meal-plan-settings": "Setările Planului de Masă"
"meal-plan-settings": "Setările Planului de Masă",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Datele migrării au fost șterse",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -637,9 +641,10 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Rămâi în modul Editare",
"parse-recipe-ingredients-after-import": "Analizează ingredientele rețetei după import",
"import-from-zip": "Importă din zip",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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

@@ -212,6 +212,8 @@
"upload-file": "Загрузить файл",
"created-on-date": "Создано: {0}",
"unsaved-changes": "У вас есть несохраненные изменения. Вы хотите сохранить их перед выходом?",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Не удалось скопировать текст.",
"confirm-delete-generic-items": "Вы уверены, что хотите удалить следующие элементы?",
"organizers": "Органайзеры",
@@ -367,7 +369,9 @@
"recipe-rules": "Правила рецептов",
"applies-to-all-days": "Применяется к всем дням",
"applies-on-days": "Применяется по {0}",
"meal-plan-settings": "Настройки плана питания"
"meal-plan-settings": "Настройки плана питания",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Данные миграции удалены",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Сайт заблокирован?",
"scrape-recipe-try-importing-raw-html-instead": "Попробуйте импортировать необработанный HTML файл.",
"import-original-keywords-as-tags": "Импортировать исходные ключевые слова как теги",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Остаться в режиме редактирования",
"parse-recipe-ingredients-after-import": "Распознавание ингредиентов рецепта после импорта",
"import-from-zip": "Импорт из архива",
@@ -1433,7 +1438,7 @@
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"no-whitespace": "Без пробелов",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
}

View File

@@ -6,7 +6,7 @@
"api-port": "API port",
"application-mode": "Režim aplikácie",
"database-type": "Typ databázy",
"database-url": "Link databázy",
"database-url": "URL databázy",
"default-group": "Predvolená skupina",
"default-household": "Predvolená domácnosť",
"demo": "Demo",
@@ -212,6 +212,8 @@
"upload-file": "Nahrať súbor",
"created-on-date": "Vytvorené: {0}",
"unsaved-changes": "Posledne vykonané zmeny nie sú uložené. Želáte si ich uložiť alebo zrušiť?",
"discard-changes": "Zahodiť zmeny",
"discard-changes-description": "Máte neuložené zmeny, naozaj ich chcete zahodiť?",
"clipboard-copy-failure": "Skopírovanie do schránky zlyhalo.",
"confirm-delete-generic-items": "Ste si istý, že chcete odstrániť nasledujúce položky?",
"organizers": "Organizéry",
@@ -342,9 +344,9 @@
"breakfast": "Raňajky",
"lunch": "Obed",
"dinner": "Večera",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Pochutina",
"drink": "Nápoj",
"dessert": "Dezert",
"type-any": "Ľubovoľný",
"day-any": "Ľubovoľný",
"editor": "Editor",
@@ -367,7 +369,9 @@
"recipe-rules": "Pravidlá receptov",
"applies-to-all-days": "Platí pre všetky dni",
"applies-on-days": "Platí v {0}",
"meal-plan-settings": "Nastavenia jedálnička"
"meal-plan-settings": "Nastavenia jedálnička",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Prenesené dáta odstránené",
@@ -403,7 +407,7 @@
"title": "Tandoor recepty"
},
"cookn": {
"description-long": "Mealie can import recipes from DVO Cook'n X3. Export a cookbook or menu in the \"Cook'n\" format, rename the export extension to .zip, then upload the .zip below.",
"description-long": "Mealie môže importovať recepty z DVO Cook'n X3. Exportujte kuchársku knihu alebo menu vo formáte „Cook'n“, premenujte exportnú príponu na .zip a potom nahrajte súbor .zip nižšie.",
"title": "DVO Cook'n X3"
},
"recipe-data-migrations": "Migrácie dát receptov",
@@ -445,7 +449,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)",
"copy-and-paste-the-source-url-of-your-data-optional": "Skopírujte a vložte zdrojovú URL adresu vašich údajov (voliteľné)",
"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",
@@ -453,8 +457,8 @@
"import-by-url": "Importovať recept z URL",
"create-manually": "Vytvoriť recept manuálne",
"make-recipe-image": "Nastaviť ako obrázok receptu",
"add-food": "Add Food",
"add-recipe": "Add Recipe"
"add-food": "Pridať Jedlo",
"add-recipe": "Pridať Recept"
},
"page": {
"404-page-not-found": "Chyba 404 - Stránka nenájdená",
@@ -521,9 +525,9 @@
"recipe-deleted": "Recept bol odstránený",
"recipe-image": "Obrázok receptu",
"recipe-image-updated": "Obrázok receptu aktualizovaný",
"delete-image": "Delete Recipe Image",
"delete-image-confirmation": "Are you sure you want to delete this recipe image?",
"recipe-image-deleted": "Recipe image deleted",
"delete-image": "Zmazať obrázok receptu",
"delete-image-confirmation": "Ste si istý že chcete zmazať tento obrázok receptu?",
"recipe-image-deleted": "Obrázok receptu zmazaný",
"recipe-name": "Názov receptu",
"recipe-settings": "Nastavenia receptu",
"recipe-update-failed": "Aktualizácia receptu zlyhala",
@@ -569,7 +573,7 @@
"choose-unit": "Vyberte jednotku",
"press-enter-to-create": "Stlačte Enter pre vytvorenie",
"choose-food": "Vyberte potravinu",
"choose-recipe": "Choose Recipe",
"choose-recipe": "Zvoľte Recept",
"notes": "Poznámky",
"toggle-section": "Prepnúť sekciu",
"see-original-text": "Pozrieť pôvodný text",
@@ -597,7 +601,7 @@
"made-this": "Toto som uvaril",
"how-did-it-turn-out": "Ako to dopadlo?",
"user-made-this": "{user} toto uvaril(a)",
"made-for-recipe": "Made for {recipe}",
"made-for-recipe": "Vytvorené pre {recipe}",
"added-to-timeline": "Pridané na časovú os",
"failed-to-add-to-timeline": "Pridanie na časovú os skončilo chybou",
"failed-to-update-recipe": "Recept sa nepodarilo aktualizovať",
@@ -637,9 +641,10 @@
"scrape-recipe-suggest-bulk-importer": "Vyskúšajte hromadný importér",
"scrape-recipe-have-raw-html-or-json-data": "Máte surové údaje HTML alebo JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "Môžete importovať priamo nespracované údaje",
"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": "Webstránka je blokovaná?",
"scrape-recipe-try-importing-raw-html-instead": "Skúste miesto toho naimportovať čisté HTML.",
"import-original-keywords-as-tags": "Importovať pôvodné kľúčové slová ako štítky",
"import-original-categories": "Importovať pôvodné kategórie",
"stay-in-edit-mode": "Zostať v režime editovania",
"parse-recipe-ingredients-after-import": "Analyzovať ingrediencie po importe",
"import-from-zip": "Importovať zo Zip-súboru",
@@ -702,9 +707,9 @@
"upload-more-images": "Nahrať ďalšie obrázky",
"set-as-cover-image": "Nastaviť ako titulný obrázok receptu",
"cover-image": "Titulný obrázok",
"include-linked-recipes": "Include Linked Recipes",
"include-linked-recipe-ingredients": "Include Linked Recipe Ingredients",
"toggle-recipe": "Toggle Recipe"
"include-linked-recipes": "Zahrnúť prepojené Recepty",
"include-linked-recipe-ingredients": "Zahrnúť Prísady prepojených receptov",
"toggle-recipe": "Prepnúť recept"
},
"recipe-finder": {
"recipe-finder": "Hľadač receptov",
@@ -742,7 +747,7 @@
"advanced": "Rozšírené",
"auto-search": "Automatické vyhľadávanie",
"no-results": "Nenašli sa žiadne výsledky",
"type-to-search": "Type to search..."
"type-to-search": "Napíšte pre vyhľadanie..."
},
"settings": {
"add-a-new-theme": "Pridať nový motív",
@@ -1081,8 +1086,8 @@
"forgot-password": "Zabudnuté heslo",
"forgot-password-text": "Prosím zadajte svoju e-mailovú adresu a my vám zašleme odkaz, ktorý vám umožní heslo obnoviť.",
"changes-reflected-immediately": "Zmeny týkajúce sa tohto používateľa budú vykonané okamžite.",
"default-activity": "Default Activity",
"default-activity-hint": "Select which page you'd like to navigate to upon logging in from this device"
"default-activity": "Predvolená aktivita",
"default-activity-hint": "Vyberte na ktorú štránku chcete byť nasmerovaný po prihlásení z tohto zariadenia"
},
"language-dialog": {
"translated": "preložené",
@@ -1430,11 +1435,11 @@
}
},
"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"
"required": "Toto pole je požadované",
"invalid-email": "Email musí byť platný",
"invalid-url": "Musí byť platná URL",
"no-whitespace": "Prázdne znaky nepovolené",
"min-length": "Musí mať aspoň {min} znakov",
"max-length": "Musí mať najviac {max} znakov"
}
}

View File

@@ -212,6 +212,8 @@
"upload-file": "Naloži datoteko",
"created-on-date": "Ustvarjeno dne: {0}",
"unsaved-changes": "Imate neohranjene spremembe. Ali želite shraniti pred odhodom? V redu, če želite shraniti, Prekliči, če želite zavreči spremembe.",
"discard-changes": "Zavrzi spremembe",
"discard-changes-description": "Imate neshranjene spremembe. Ste prepričani, da jih želite zavreči?",
"clipboard-copy-failure": "Kopiranje na odložišče ni bilo uspešno.",
"confirm-delete-generic-items": "Ali ste prepričani, da želite izbrisati izbrane elemente?",
"organizers": "Organizatorji",
@@ -367,7 +369,9 @@
"recipe-rules": "Pravila za recepte",
"applies-to-all-days": "Velja za vse dneve",
"applies-on-days": "Velja za {0}",
"meal-plan-settings": "Nastavitve jedilnika"
"meal-plan-settings": "Nastavitve jedilnika",
"add-all-to-list": "Dodaj vse na seznam",
"add-day-to-list": "Dodaj dan na seznam"
},
"migration": {
"migration-data-removed": "Migrirani podatki so odstranjeni",
@@ -494,7 +498,7 @@
"edit-scale": "Uredi stran",
"fat-content": "Maščoba",
"fiber-content": "Vlakna",
"grams": "grami",
"grams": "gramov",
"ingredient": "Sestavina",
"ingredients": "Sestavine",
"insert-ingredient": "Dodaj sestavino",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Je spletna stran blokirana?",
"scrape-recipe-try-importing-raw-html-instead": "Poskusite namesto tega uvoziti surovi HTML.",
"import-original-keywords-as-tags": "Uvozi izvorne ključne besede kot značke",
"import-original-categories": "Uvozi izvirne kategorije",
"stay-in-edit-mode": "Urejaj naprej",
"parse-recipe-ingredients-after-import": "Razčlenitev sestavin recepta po uvozu",
"import-from-zip": "Uvozi z Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "Учитај датотеку",
"created-on-date": "Крерирано: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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",
@@ -367,7 +369,9 @@
"recipe-rules": "Правила за рецепт",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-plan-settings": "Meal Plan Settings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migration data removed",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Увези оригиналне кључне речи као ознаке",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Stay in Edit mode",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Увези из Zip архиве",

View File

@@ -62,7 +62,7 @@
"notification": "Notifiering",
"refresh": "Uppdatera",
"scheduled": "Schemalagd",
"something-went-wrong": "Någonting gick fel",
"something-went-wrong": "Någonting gick fel!",
"subscribed-events": "Prenumererade händelser",
"test-message-sent": "Testmeddelande Skickat",
"message-sent": "Meddelandet skickat",
@@ -212,6 +212,8 @@
"upload-file": "Ladda upp fil",
"created-on-date": "Skapad {0}",
"unsaved-changes": "Du har osparade ändringar. Vill du spara innan du lämnar? Tryck Okej att spara, Avbryt för att ignorera ändringar.",
"discard-changes": "Överge ändringar",
"discard-changes-description": "Du har osparade ändringar. Är du säker på att du vill överge dem?",
"clipboard-copy-failure": "Det gick inte att kopiera till urklipp.",
"confirm-delete-generic-items": "Är du säker på att du vill radera följande objekt?",
"organizers": "Organisatörer",
@@ -367,7 +369,9 @@
"recipe-rules": "Receptregler",
"applies-to-all-days": "Gäller för alla dagar",
"applies-on-days": "Gäller på {0}s",
"meal-plan-settings": "Inställningar för måltidsplanering"
"meal-plan-settings": "Inställningar för måltidsplanering",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Importerad data borttagen",
@@ -445,7 +449,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": "Copy and paste the source URL of your data (optional)",
"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",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Är websidan blockerad?",
"scrape-recipe-try-importing-raw-html-instead": "Prova att importera HTML istället.",
"import-original-keywords-as-tags": "Importera ursprungliga sökord som taggar",
"import-original-categories": "Importera ursprungliga kategorier",
"stay-in-edit-mode": "Stanna kvar i redigeringsläge",
"parse-recipe-ingredients-after-import": "Tolka receptingredienser efter import",
"import-from-zip": "Importera från zip",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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.",
@@ -212,6 +212,8 @@
"upload-file": "Dosya Yükle",
"created-on-date": "{0} tarihinde oluşturuldu",
"unsaved-changes": "Kaydedilmemiş değişiklikleriniz mevcut. Ayrılmadan önce kaydetmek ister misiniz? Kaydetmek için Tamam'ı, değişiklikleri iptal etmek için İptal'i seçin.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Panoya kopyalanamadı.",
"confirm-delete-generic-items": "Aşağıdaki öğeleri silmek istediğinizden emin misiniz?",
"organizers": "Organizatörler",
@@ -342,9 +344,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",
@@ -367,7 +369,9 @@
"recipe-rules": "Tarif Kuralları",
"applies-to-all-days": "Tüm günler için geçerlidir",
"applies-on-days": "{0} günlerine geçerlidir",
"meal-plan-settings": "Öğün Planı Ayarları"
"meal-plan-settings": "Öğün Planı Ayarları",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Taşıma verileri kaldırıldı",
@@ -453,8 +457,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ı",
@@ -484,7 +488,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",
@@ -521,9 +525,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",
@@ -569,13 +573,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",
@@ -591,7 +595,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",
@@ -600,12 +604,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",
@@ -623,13 +627,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.",
@@ -637,16 +641,17 @@
"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",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Düzenleme modunda kalın",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Zip'ten içeri aktar",
"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.",
@@ -690,16 +695,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",
@@ -708,18 +713,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"
},
@@ -737,12 +742,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",
@@ -838,7 +843,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",
@@ -1001,7 +1006,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",
@@ -1081,7 +1086,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": {
@@ -1200,7 +1205,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": {
@@ -1390,12 +1395,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",
@@ -1416,25 +1421,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": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"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": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
"min-length": "En Az {min} Karakter Olmalıdır",
"max-length": "En Fazla {max} Karakter Olmalıdır"
}
}

View File

@@ -212,6 +212,8 @@
"upload-file": "Завантажити файл",
"created-on-date": "Створено: {0}",
"unsaved-changes": "У вас є незбережені зміни. Ви хочете зберегти їх перед виходом? Гаразд, щоб зберегти, Скасувати, щоб скасувати.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Не вдалося скопіювати до буфера обміну.",
"confirm-delete-generic-items": "Ви впевнені, що хочете видалити вибрані елементи?",
"organizers": "Органайзери",
@@ -342,9 +344,9 @@
"breakfast": "Сніданок",
"lunch": "Обід",
"dinner": "Вечеря",
"snack": "Snack",
"drink": "Drink",
"dessert": "Dessert",
"snack": "Закуска",
"drink": "Напій",
"dessert": "Десерт",
"type-any": "Будь-який",
"day-any": "Будь-який",
"editor": "Редактор",
@@ -367,7 +369,9 @@
"recipe-rules": "Правила рецептів",
"applies-to-all-days": "Застосовується до всіх днів",
"applies-on-days": "Застосовується на {0}сек",
"meal-plan-settings": "Налаштування меню"
"meal-plan-settings": "Налаштування меню",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Дані міграції видалені",
@@ -445,7 +449,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)",
"copy-and-paste-the-source-url-of-your-data-optional": "Скопіюйте та вставте URL-адресу ваших даних (необов'язково)",
"view-scraped-data": "Переглянути зібрані дані",
"trim-whitespace-description": "Обрізати початкові та кінцеву пробілів і порожні лінії",
"trim-prefix-description": "Обрізати перший символ з кожного рядка",
@@ -637,9 +641,10 @@
"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": "Імпортувати оригінальні ключові слова як теги",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Залишитися в режимі редактора",
"parse-recipe-ingredients-after-import": "Розпізнавання інгредієнтів рецепту після імпорту",
"import-from-zip": "Імпортувати з Zip",
@@ -1430,11 +1435,11 @@
}
},
"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"
"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",
@@ -212,6 +212,8 @@
"upload-file": "Upload File",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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",
@@ -367,7 +369,9 @@
"recipe-rules": "Recipe Rules",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-plan-settings": "Meal Plan Settings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "Migration data removed",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Import original keywords as tags",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Stay in Edit mode",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Import from Zip",

View File

@@ -212,6 +212,8 @@
"upload-file": "上传文件",
"created-on-date": "创建于: {0}",
"unsaved-changes": "你有未保存的更改。你希望现在离开前保存吗?保存选择“是”,不保存选择“取消”。",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "未能复制到剪切板。",
"confirm-delete-generic-items": "你确定删除以下条目吗?",
"organizers": "管理器",
@@ -367,7 +369,9 @@
"recipe-rules": "食谱规则",
"applies-to-all-days": "应用到所有日期",
"applies-on-days": "应用于{0}",
"meal-plan-settings": "饮食计划设置"
"meal-plan-settings": "饮食计划设置",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "已删除迁移数据",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "导入原始关键字作为标签",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "留在编辑模式",
"parse-recipe-ingredients-after-import": "导入后解析食材",
"import-from-zip": "从Zip压缩包导入",

View File

@@ -212,6 +212,8 @@
"upload-file": "上傳文件",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"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",
@@ -367,7 +369,9 @@
"recipe-rules": "Recipe Rules",
"applies-to-all-days": "Applies to all days",
"applies-on-days": "Applies on {0}s",
"meal-plan-settings": "Meal Plan Settings"
"meal-plan-settings": "Meal Plan Settings",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
},
"migration": {
"migration-data-removed": "遷移數據已刪除",
@@ -640,6 +644,7 @@
"scrape-recipe-website-being-blocked": "Website being blocked?",
"scrape-recipe-try-importing-raw-html-instead": "Try importing the raw HTML instead.",
"import-original-keywords-as-tags": "Import original keywords as tags",
"import-original-categories": "Import original categories",
"stay-in-edit-mode": "Stay in Edit mode",
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
"import-from-zip": "Import from Zip",

View File

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

View File

@@ -53,6 +53,7 @@ export interface QueryFilterJSONPart {
attributeName?: string | null;
relationalOperator?: RelationalKeyword | RelationalOperator | null;
value?: string | string[] | null;
[k: string]: unknown;
}
export interface PlanRulesSave {
day?: PlanRulesDay;

View File

@@ -40,3 +40,20 @@ export enum Organizer {
Household = "households",
User = "users",
}
export type LogicalOperator = "AND" | "OR";
export type RelationalKeyword = "IS" | "IS NOT" | "IN" | "NOT IN" | "CONTAINS ALL" | "LIKE" | "NOT LIKE";
export type RelationalOperator = "=" | "<>" | ">" | "<" | ">=" | "<=";
export interface QueryFilterJSON {
parts?: QueryFilterJSONPart[];
}
export interface QueryFilterJSONPart {
leftParenthesis?: string | null;
rightParenthesis?: string | null;
logicalOperator?: LogicalOperator | null;
attributeName?: string | null;
relationalOperator?: RelationalKeyword | RelationalOperator | null;
value?: string | string[] | null;
}

View File

@@ -16,7 +16,7 @@ export interface OpenAIIngredients {
}
export interface OpenAIRecipe {
name: string;
description: string | null;
description?: string | null;
recipe_yield?: string | null;
total_time?: string | null;
prep_time?: string | null;
@@ -37,4 +37,7 @@ export interface OpenAIRecipeNotes {
title?: string | null;
text: string;
}
export interface OpenAIText {
text: string;
}
export interface OpenAIBase {}

View File

@@ -502,13 +502,16 @@ export interface SaveIngredientUnit {
}
export interface ScrapeRecipe {
includeTags?: boolean;
includeCategories?: boolean;
url: string;
}
export interface ScrapeRecipeBase {
includeTags?: boolean;
includeCategories?: boolean;
}
export interface ScrapeRecipeData {
includeTags?: boolean;
includeCategories?: boolean;
data: string;
url?: string | null;
}

View File

@@ -7,9 +7,6 @@
export type OrderByNullPosition = "first" | "last";
export type OrderDirection = "asc" | "desc";
export type LogicalOperator = "AND" | "OR";
export type RelationalKeyword = "IS" | "IS NOT" | "IN" | "NOT IN" | "CONTAINS ALL" | "LIKE" | "NOT LIKE";
export type RelationalOperator = "=" | "<>" | ">" | "<" | ">=" | "<=";
export interface ErrorResponse {
message: string;
@@ -28,17 +25,6 @@ export interface PaginationQuery {
page?: number;
perPage?: number;
}
export interface QueryFilterJSON {
parts?: QueryFilterJSONPart[];
}
export interface QueryFilterJSONPart {
leftParenthesis?: string | null;
rightParenthesis?: string | null;
logicalOperator?: LogicalOperator | null;
attributeName?: string | null;
relationalOperator?: RelationalKeyword | RelationalOperator | null;
value?: string | string[] | null;
}
export interface RecipeSearchQuery {
cookbook?: string | null;
requireAllCategories?: boolean;

View File

@@ -146,12 +146,12 @@ 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, url: string | null = null) {
return await this.requests.post<string>(routes.recipesCreateFromHtmlOrJson, { data, includeTags, url });
async createOneByHtmlOrJson(data: string, includeTags: boolean, includeCategories: boolean, url: string | null = null) {
return await this.requests.post<string>(routes.recipesCreateFromHtmlOrJson, { data, includeTags, includeCategories, url });
}
async createOneByUrl(url: string, includeTags: boolean) {
return await this.requests.post<string>(routes.recipesCreateUrl, { url, includeTags });
async createOneByUrl(url: string, includeTags: boolean, includeCategories: boolean) {
return await this.requests.post<string>(routes.recipesCreateUrl, { url, includeTags, includeCategories });
}
async createManyByUrl(payload: CreateRecipeByUrlBulk) {

View File

@@ -24,8 +24,9 @@ export default defineNuxtConfig({
devtools: {
enabled: false,
},
app: {
baseURL: process.env.SUB_PATH || "",
baseURL: process.env.SUB_PATH || "/",
head: {
title: "Mealie",
@@ -219,6 +220,7 @@ export default defineNuxtConfig({
workbox: {
navigateFallback: "/",
globPatterns: ["**/*.{js,css,html,png,svg,ico}"],
globIgnores: ["404.html", "200.html"],
cleanupOutdatedCaches: true,
skipWaiting: true,
clientsClaim: true,
@@ -389,6 +391,23 @@ export default defineNuxtConfig({
locale: "en-US",
fallback: "en-US",
},
defaults: {
VOverlay: {
scrollStrategy: "close",
},
VMenu: {
scrollStrategy: "close",
},
VAutocomplete: {
scrollStrategy: "close",
},
VCombobox: {
scrollStrategy: "close",
},
VSelect: {
scrollStrategy: "close",
},
},
},
},
});

View File

@@ -1,6 +1,6 @@
{
"name": "mealie",
"version": "3.9.2",
"version": "3.10.0",
"private": true,
"scripts": {
"dev": "nuxt dev",

View File

@@ -35,6 +35,7 @@
{{ $t("general.create") }}
</BaseButton>
<BaseButton
v-if="$appInfo.allowPasswordLogin"
class="mr-2"
color="info"
:icon="$globals.icons.link"

View File

@@ -1,7 +1,7 @@
<template>
<v-form
ref="domUrlForm"
@submit.prevent="createFromHtmlOrJson(newRecipeData, importKeywordsAsTags, newRecipeUrl)"
@submit.prevent="createFromHtmlOrJson(newRecipeData, importKeywordsAsTags, importCategories, newRecipeUrl)"
>
<div>
<v-card-title class="headline">
@@ -63,6 +63,12 @@
hide-details
:label="$t('recipe.import-original-keywords-as-tags')"
/>
<v-checkbox
v-model="importCategories"
color="primary"
hide-details
:label="$t('recipe.import-original-categories')"
/>
<v-checkbox
v-model="stayInEditMode"
color="primary"
@@ -116,6 +122,7 @@ export default defineNuxtComponent({
const {
importKeywordsAsTags,
importCategories,
stayInEditMode,
parseRecipe,
navigateToRecipe,
@@ -160,7 +167,7 @@ export default defineNuxtComponent({
}
handleIsEditJson();
async function createFromHtmlOrJson(htmlOrJsonData: string | object | null, importKeywordsAsTags: boolean, url: string | null = null) {
async function createFromHtmlOrJson(htmlOrJsonData: string | object | null, importKeywordsAsTags: boolean, importCategories: boolean, url: string | null = null) {
if (!htmlOrJsonData) {
return;
}
@@ -179,7 +186,7 @@ export default defineNuxtComponent({
}
state.loading = true;
const { response } = await api.recipes.createOneByHtmlOrJson(dataString, importKeywordsAsTags, url);
const { response } = await api.recipes.createOneByHtmlOrJson(dataString, importKeywordsAsTags, importCategories, url);
handleResponse(response, importKeywordsAsTags);
}
@@ -188,6 +195,7 @@ export default defineNuxtComponent({
importKeywordsAsTags,
stayInEditMode,
parseRecipe,
importCategories,
newRecipeData,
newRecipeUrl,
handleIsEditJson,

View File

@@ -2,7 +2,7 @@
<div>
<v-form
ref="domUrlForm"
@submit.prevent="createByUrl(recipeUrl, importKeywordsAsTags)"
@submit.prevent="createByUrl(recipeUrl, importKeywordsAsTags, importCategories)"
>
<div>
<v-card-title class="headline">
@@ -38,6 +38,12 @@
hide-details
:label="$t('recipe.import-original-keywords-as-tags')"
/>
<v-checkbox
v-model="importCategories"
color="primary"
hide-details
:label="$t('recipe.import-original-categories')"
/>
<v-checkbox
v-model="stayInEditMode"
color="primary"
@@ -148,6 +154,7 @@ export default defineNuxtComponent({
const {
importKeywordsAsTags,
importCategories,
stayInEditMode,
parseRecipe,
navigateToRecipe,
@@ -219,7 +226,7 @@ export default defineNuxtComponent({
router.replace({ query: undefined }).then(() => router.push(to));
});
async function createByUrl(url: string | null, importKeywordsAsTags: boolean) {
async function createByUrl(url: string | null, importKeywordsAsTags: boolean, importCategories: boolean) {
if (url === null) {
return;
}
@@ -229,7 +236,7 @@ export default defineNuxtComponent({
return;
}
state.loading = true;
const { response } = await api.recipes.createOneByUrl(url, importKeywordsAsTags);
const { response } = await api.recipes.createOneByUrl(url, importKeywordsAsTags, importCategories);
handleResponse(response, importKeywordsAsTags);
}
@@ -238,6 +245,7 @@ export default defineNuxtComponent({
htmlOrJsonImporterTarget,
recipeUrl,
importKeywordsAsTags,
importCategories: importCategories,
stayInEditMode,
parseRecipe,
domUrlForm,

View File

@@ -422,7 +422,7 @@ import { Organizer } from "~/lib/api/types/non-generated";
import QueryFilterBuilder from "~/components/Domain/QueryFilterBuilder.vue";
import RecipeSuggestion from "~/components/Domain/Recipe/RecipeSuggestion.vue";
import SearchFilter from "~/components/Domain/SearchFilter.vue";
import type { QueryFilterJSON } from "~/lib/api/types/response";
import type { QueryFilterJSON } from "~/lib/api/types/non-generated";
import type { FieldDefinition } from "~/composables/use-query-filter-builder";
import { useRecipeFinderPreferences } from "~/composables/use-users/preferences";

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

View File

@@ -1,5 +1,11 @@
<template>
<v-container>
<RecipeDialogAddToShoppingList
v-if="shoppingLists"
v-model="state.shoppingListDialog"
:recipes="weekRecipesWithScales"
:shopping-lists="shoppingLists"
/>
<v-menu
v-model="state.picker"
:close-on-content-click="false"
@@ -45,13 +51,23 @@
<div class="d-flex flex-wrap align-center justify-space-between mb-2">
<v-tabs style="width: fit-content;">
<v-tab :to="{ name: 'household-mealplan-planner-view', query: route.query }">
<v-tab :to="{ name: TABS.view, query: route.query }">
{{ $t('meal-plan.meal-planner') }}
</v-tab>
<v-tab :to="{ name: 'household-mealplan-planner-edit', query: route.query }">
<v-tab :to="{ name: TABS.edit, query: route.query }">
{{ $t('general.edit') }}
</v-tab>
</v-tabs>
<BaseButton
v-if="route.name === TABS.view"
color="info"
:icon="$globals.icons.cartCheck"
:text="$t('meal-plan.add-all-to-list')"
:disabled="!hasRecipes"
:loading="state.addAllLoading"
class="ml-auto mr-4"
@click="addAllToList"
/>
<ButtonLink
:icon="$globals.icons.calendar"
:to="`/household/mealplan/settings`"
@@ -72,15 +88,27 @@
<script lang="ts">
import { isSameDay, addDays, parseISO, format, isValid } from "date-fns";
import RecipeDialogAddToShoppingList from "~/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue";
import { useHouseholdSelf } from "~/composables/use-households";
import { useMealplans } from "~/composables/use-group-mealplan";
import { useUserMealPlanPreferences } from "~/composables/use-users/preferences";
import type { ShoppingListSummary } from "~/lib/api/types/household";
import { useUserApi } from "~/composables/api";
export default defineNuxtComponent({
components: {
RecipeDialogAddToShoppingList,
},
setup() {
const TABS = {
view: "household-mealplan-planner-view",
edit: "household-mealplan-planner-edit",
};
const route = useRoute();
const router = useRouter();
const i18n = useI18n();
const api = useUserApi();
const { household } = useHouseholdSelf();
useSeoMeta({
@@ -96,7 +124,7 @@ export default defineNuxtComponent({
// Force to /view if current route is /planner
if (route.path === "/household/mealplan/planner") {
router.push({
name: "household-mealplan-planner-view",
name: TABS.view,
query: route.query,
});
}
@@ -120,8 +148,12 @@ export default defineNuxtComponent({
start: initialStartDate,
picker: false,
end: initialEndDate,
shoppingListDialog: false,
addAllLoading: false,
});
const shoppingLists = ref<ShoppingListSummary[]>();
const firstDayOfWeek = computed(() => {
return household.value?.preferences?.firstDayOfWeek || 0;
});
@@ -145,7 +177,7 @@ export default defineNuxtComponent({
watch(weekRange, (newRange) => {
// Keep current route name and params, just update the query
router.replace({
name: route.name || "household-mealplan-planner-view",
name: route.name || TABS.view,
params: route.params,
query: {
...route.query,
@@ -193,7 +225,41 @@ export default defineNuxtComponent({
});
});
const hasRecipes = computed(() => {
return mealsByDate.value.some(day => day.meals.some(meal => meal.recipe));
});
const weekRecipesWithScales = computed(() => {
const allRecipes: any[] = [];
for (const day of mealsByDate.value) {
for (const meal of day.meals) {
if (meal.recipe) {
allRecipes.push(meal.recipe);
}
}
}
return allRecipes.map(recipe => ({
scale: 1,
...recipe,
}));
});
async function getShoppingLists() {
const { data } = await api.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
if (data) {
shoppingLists.value = data.items as ShoppingListSummary[] ?? [];
}
}
async function addAllToList() {
state.value.addAllLoading = true;
await getShoppingLists();
state.value.shoppingListDialog = true;
state.value.addAllLoading = false;
}
return {
TABS,
route,
state,
actions,
@@ -201,6 +267,10 @@ export default defineNuxtComponent({
weekRange,
firstDayOfWeek,
numberOfDays,
hasRecipes,
shoppingLists,
weekRecipesWithScales,
addAllToList,
};
},
});

View File

@@ -26,7 +26,7 @@
<ToggleState tag="article">
<template #activator="{ toggle, state }">
<v-btn
v-if="!state"
v-if="!state && $appInfo.allowPasswordLogin"
color="info"
class="mt-2 mb-n3"
@click="toggle"
@@ -37,7 +37,7 @@
{{ $t("settings.change-password") }}
</v-btn>
<v-btn
v-else
v-else-if="$appInfo.allowPasswordLogin"
color="info"
class="mt-2 mb-n3"
@click="toggle"
@@ -111,7 +111,7 @@
class="mt-10"
:title="$t('settings.change-password')"
/>
<v-card variant="outlined">
<v-card variant="outlined" style="border-color: lightgrey;">
<v-card-text class="pb-0">
<v-form ref="passChange">
<v-text-field

View File

@@ -295,6 +295,7 @@ export default defineNuxtComponent({
async setup() {
const i18n = useI18n();
const $auth = useMealieAuth();
const { $appInfo } = useNuxtApp();
const route = useRoute();
const groupSlug = computed(() => route.params.groupSlug || $auth.user.value?.groupSlug || "");
@@ -302,7 +303,18 @@ export default defineNuxtComponent({
title: i18n.t("settings.profile"),
});
const user = computed<UserOut | null>(() => $auth.user.value);
const user = computed<UserOut | null>(() => {
const authUser = $auth.user.value;
if (!authUser) return null;
// Override canInvite if password login is disabled
const canInvite = !$appInfo.allowPasswordLogin ? false : authUser.canInvite;
return {
...authUser,
canInvite,
};
});
const inviteDialog = ref(false);
const api = useUserApi();

View File

File diff suppressed because it is too large Load Diff

View File

@@ -412,6 +412,11 @@ class AppSettings(AppLoggingSettings):
"""
The number of seconds to wait for an OpenAI request to complete before cancelling the request
"""
OPENAI_CUSTOM_PROMPT_DIR: str | None = None
"""
Path to a folder containing custom prompt files;
files are individually optional, each prompt name will fall back to the default if no custom file exists
"""
@property
def OPENAI_FEATURE(self) -> FeatureDetails:

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